MCmmoGUI.sk

Created by 3meraldK

Other available versions. Ordered by newest to oldest versions:

Just so you know, we don't know the file format for every file. If it's just a bunch of random characters, it's probably a .zip or .jar.

# Author: 3meraldK
# Version: 1.2
# Do not redistribute it for sell. Do not claim script is yours.

options:
	usePerm: mcmmogui.use # Permission to use /mcmmo [your nick]
	usePermOthers: mcmmogui.use.others # Permission to /mcmmo [not your nick]
	managePartyPerm: mcmmogui.party.manage.others # This player can manage other players' parties
	background: true # If GUI background fills with gray stained glass pane
	showInfo: true # If an icon about infos shows in right-top of GUI
	
	guiName: "&cmcMMO Skills" # Name of main GUI
	childSkillGuiName: "&cChild skills" # Name of child skills' GUI
	partyGUI: "&cParty view" # Name of party GUI
	clickForMore: "&aClick to view more!" # More information about skill
	combat: "&7Combat skill"
	gathering: "&7Gathering skill"
	misc: "&7Miscellaneous skill"
	partyManager: "&7Party manager"
	partyViewer: "&7Party viewer"
	
	noPerMsg: &cError: &7Insufficient permissions. # Message when no permissions
	noPlayerFound: "&cError: &7Player &6%arg-1% &7didn't play before." # When database didn't find player
	noParty: "&cError: &7This player has no party." # If targeted player has no party
	PlayerNotInParty: "&cError: &7There's no player named &6%{_message}%" # If there's no specified player-argument in the party. (When setting party's leader)
	argIsPlayer: "&cError: &7You can search more only if skills are your." # If /mcmmo [not sender's nick] clicks skill icon.
	argIsOffline: "&cError: &7Due to mcMMO limitations party viewer of offline player is impossible." # If you click party icon on offline player.
	
	setPartyPassword: "&7Set the new password of your party:"
	setPartyLeader: "&7Set the new leader of your party:"
	setPartyName: "&7Set the new name of your party:"
	successPartyPassword: "&7You've set your new password."
	successPartyLeader: "&7You've set the leader of your party to &a%{_message}%"
	successPartyName: "&7You've set the name of your party to &a%{_message}%"

import:
	com.gmail.nossr50.api.ExperienceAPI
	com.gmail.nossr50.api.DatabaseAPI
	com.gmail.nossr50.api.PartyAPI
	com.gmail.nossr50.util.player.UserManager
	
	org.bukkit.inventory.ItemFlag
	org.bukkit.ChatColor
	
	
local expression %item% without itemflags:
	return type: item
	get:
		set {_item} to expr-1
		set {_meta} to {_item}.getItemMeta()
		{_meta}.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_POTION_EFFECTS)
		{_item}.setItemMeta({_meta})
		return {_item}

function getSkillStats(sender: player, p: offline player, skill: string):
	if ExperienceAPI.isNonChildSkill({_skill}) is true:
		set {mcmmogui::%{_sender}%::%{_skill}%LVL} to ExperienceAPI.getLevelOffline("%{_p}%", {_skill})
		set {mcmmogui::%{_sender}%::%{_skill}%XP} to ExperienceAPI.getOfflineXP("%{_p}%", {_skill})
		set {mcmmogui::%{_sender}%::%{_skill}%MXP} to ExperienceAPI.getXpNeededToLevel({mcmmogui::%{_sender}%::%{_skill}%LVL})
	else:
		set {mcmmogui::%{_sender}%::%{_skill}%LVL} to ExperienceAPI.getLevelOffline("%{_p}%", {_skill})
	wait 1 tick
	delete {mcmmogui::%{_sender}%::*}
	
function getStats(p: player, skill: string) :: strings:
	return "&7&lPROGRESS: &e%{mcmmogui::%{_p}%::%{_skill}%XP}%&e/%{mcmmogui::%{_p}%::%{_skill}%MXP}% &e(%({mcmmogui::%{_p}%::%{_skill}%XP} / {mcmmogui::%{_p}%::%{_skill}%MXP}) * 100%%%)", "&7&lLEVEL: &e%{mcmmogui::%{_p}%::%{_skill}%LVL}%"
	
function showPartyGUI(p: player, target: offline player):
	set {_partyGUI} to chest inventory with 6 rows named {@partyGUI}
			
	if {@background} is true:
		loop 54 times:
			set {_partyGUI}'s slot loop-value - 1 to gray stained glass pane named "&7"
	
	set {_mcMMOplayer} to UserManager.getPlayer({_target})
	set {_party} to {_mcMMOplayer}.getParty()		
			
	set {_name} to {_party}.getName()
	set {_leader} to {_party}.getLeader().getPlayerName()
	set {_members} to PartyAPI.getMembersMap({_target})
	set {_online} to PartyAPI.getOnlineMembers({_name})
	
	set {_onlineList} to {_party}.getOnlinePlayerNames({_target})
	set {_memberList} to {_party}.createMembersList({_target})
	set {_level} to {_party}.getLevel()
	set {_xp} to {_party}.getXp()
	set {_maxXP} to {_party}.getXpToLevel()
	set {_isLocked} to {_party}.isLocked()

	set {_partyGUI}'s slot 10 to end portal frame named "&a&lPARTY" with lore {@partyViewer}, "", "&e&l⭐ %{_name}% ⭐", "", "&8▪ &7Leader: %{_leader}%", "&8▪ &7Members: &a%{_online}.size()% online&7/%{_members}.size()%", "&8▪ &7Progress: %{_xp}%/%{_maxXP}% &e(%({_xp} / {_maxXP}) * 100%%%)", "&8▪ &7Level: %{_level}%"
	
	set {_partyGUI}'s slot 13 to paper named "&a&lSEARCH PARTIES" with lore {@partyViewer}, "", "&aClick to search all parties!"
	
	set {_partyGUI}'s slot 19 to diamond chestplate named "&7&lMEMBERS" with lore {@partyViewer}, "", "&8▪ &7Members online: &a%{_onlineList}%", "&8▪ &7All members: %{_memberList}%" without itemflags
	if PartyAPI.hasAlly({_name}) is true:
		set {_ally} to PartyAPI.getAllyName({_name})
		set {_partyGUI}'s slot 20 to iron helmet named "&7&lALLY" with lore {@partyViewer}, "", "&8▪ &7We have an ally!", "&8▪ &7Their party name: %{_ally}%" without itemflags
		
	set {_partyGUI}'s slot 28 to totem of undying named "&7&lITEM SHARE" with lore {@partyViewer}, "", "&8▪ &7Item share: &a%{_party}.getItemShareCategories()%", "&8▪ &7Mode set: &a%{_party}.getItemShareMode()%", "&8▪ &7Leader of the party can change mode via &b/party itemshare" without itemflags
	
	set {_partyGUI}'s slot 37 to xp bottle named "&7&lXP SHARE" with lore {@partyViewer}, "", "&8▪ &7Mode set: &a%{_party}.getXpShareMode()%", "&8▪ &7Leader of the party can change mode via &b/party xpshare" without itemflags
		
	set {_partyGUI}'s slot 16 to golden hoe named "&7&lSET PASSWORD" with lore {@partyManager}, "", "&8▪ &7Set new party's password by submitting in chat.", "&c▪ &4Requires appriopriate permissions!" without itemflags
		
	set {_partyGUI}'s slot 25 to book named "&7&lSET LEADER" with lore {@partyManager}, "", "&8▪ &7Current leader: %{_leader}%", "&8▪ &7Set your new leader by submitting his name.", "&c▪ &4Requires appriopriate permissions!"
	
	set {_partyGUI}'s slot 34 to paper named "&7&lSET NAME" with lore {@partyManager}, "", "&8▪ &7Current name: %{_name}%", "&8▪ &7Set your new party's name by submitting it in the chat.", "&c▪ &4Requires appriopriate permissions!"
	
	set {_partyGUI}'s slot 43 to conduit named "&7&lSET LOCKED" with lore {@partyManager}, "", "&8▪ &7Is locked now: %{_isLocked}%", "&8▪ &7Set your party's privacy by toggling this option.", "&c▪ &4Requires appriopriate permissions!"
	
	set {_partyGUI}'s slot 40 to arrow named "&cGo back"
	
	open {_partyGUI} to {_p}
	
function showGUI(p: player, arg: offline player):
	set {mcmmoguiTarget::%{_p}%} to {_arg}

	getSkillStats({_p}, {_arg}, "excavation")
	getSkillStats({_p}, {_arg}, "fishing")
	getSkillStats({_p}, {_arg}, "herbalism")
	getSkillStats({_p}, {_arg}, "mining")
	getSkillStats({_p}, {_arg}, "woodcutting")
	getSkillStats({_p}, {_arg}, "acrobatics")
	getSkillStats({_p}, {_arg}, "archery")
	getSkillStats({_p}, {_arg}, "axes")
	getSkillStats({_p}, {_arg}, "swords")
	getSkillStats({_p}, {_arg}, "unarmed")
	getSkillStats({_p}, {_arg}, "alchemy")
	getSkillStats({_p}, {_arg}, "taming")
	getSkillStats({_p}, {_arg}, "repair")
	
	
	if {_arg} is online:
		set {_power} to ExperienceAPI.getPowerLevel({_arg})
	else:
		set {_power} to ExperienceAPI.getPowerLevelOffline("%{_arg}%")
	set {_rankOverall} to ExperienceAPI.getPlayerRankOverall("%{_arg}%")
	
	
	# Creating GUI
	set {_GUI} to chest inventory with 6 rows named {@guiName}
	
	if {@background} is true:
		loop 54 times:
			set {_GUI}'s slot loop-value - 1 to gray stained glass pane named "&7"
			
	if {@showInfo} is true:
		set {_GUI}'s slot 8 to saddle named "&3&lINFO" with lore "&8▪ &7Author: 3meraldK", "&8▪ &7Version: 1.2", "", "&7This script provides an user-friendly", "&7graphical user interface for mcMMO plugin." without itemflags
	
	set {_GUI}'s slot 10 to iron shovel named "&8&lEXCAVATION" with lore {@gathering}, "", "&8▪ &7Excavate dirt, grass, sand, gravel", "&7and other loose blocks to gain experience.", "&8▪ &7Remember to dig them with shovels!", "", getStats({_p}, "excavation"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 11 to fishing rod named "&8&lFISHING" with lore {@gathering}, "", "&8▪ &7Fish to get experienced!", "", getStats({_p}, "fishing"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 12 to iron hoe named "&8&lHERBALISM" with lore {@gathering}, "", "&8▪ &7Harvest any fully grown crops", "&7to gain experience!", "", getStats({_p}, "herbalism"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 19 to iron pickaxe named "&8&lMINING" with lore {@gathering}, "", "&8▪ &7Mine stone and ores to gain experience.", "", getStats({_p}, "mining"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 20 to iron axe named "&8&lWOODCUTTING" with lore {@gathering}, "", "&8▪ &7Chop down trees and collect wood", "&7to get experienced.", "", getStats({_p}, "woodcutting"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 21 to anvil named "&8&lSMITHING" with lore {@gathering}, "", "&8▪ &7Fish and smelt items to get experienced in salvage.", "&8▪ &7Smelt items and mine to gain experience in smelting.", "", "&4A merge of those skills is coming-soon feature", "&4already planned to add in mcMMO plugin.", "", "&aClick here to view child skills!"
	
	set {_GUI}'s slot 14 to leather boots named "&8&lACROBATICS" with lore {@combat}, "", "&8▪ &7All you need to do is jumping", "&7and getting damage from fall distance.", "", getStats({_p}, "acrobatics"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 15 to bow named "&8&lARCHERY" with lore {@combat}, "", "&8▪ &7Master shooting from bow and crossbow,", "&7become a champion at shooting and gain experience.", "", getStats({_p}, "archery"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 23 to diamond axe named "&8&lAXES" with lore {@combat}, "", "&8▪ &7Change your fight-style and use axes.", "&7Fighting with axes allows you to gain more experience!", "", getStats({_p}, "axes"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 24 to diamond sword named "&8&lSWORDS" with lore {@combat}, "", "&8▪ &7Fight with any swords to get experienced.", "&8▪ &7Kill mobs and players.", "", getStats({_p}, "swords"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 26 to crossbow named "&8&lLEADERBOARDS" with lore "&7Ranking viewer", "", "&8▪ &7Power level is a sum of your all primary skills.", "&8▪ &7Get better at everything to levelup!", "&8▪ &7Overall rank shows who's the best in whole mcMMO!", "", "&7&lPOWER LEVEL: &e%{_power}%", "&7&lOVERALL RANK: &e%{_rankOverall}%"
	
	set {_GUI}'s slot 32 to rabbit foot named "&8&lUNARMED" with lore {@combat}, "", "&8▪ &7No weapon in inventory maybe?", "&7Use the last proper source of damage - fists!", "&8▪ &7Fight with fists to get experienced!", "", getStats({_p}, "unarmed"), "", {@clickForMore}
	
	set {_GUI}'s slot 33 to splash potions of health named "&8&lALCHEMY" with lore {@combat}, "", "&8▪ &7Brew variety of potions", "&7to unlock new ones and gain experience!", "", getStats({_p}, "alchemy"), "", {@clickForMore} without itemflags
	
	set {_GUI}'s slot 37 to bone named "&8&lTAMING" with lore {@misc}, "", "&8▪ &7Tame animals and make new friends.", "&8▪ &7Best way to spend life alone and best way", "&7to master Taming Skill!", "", getStats({_p}, "taming"), "", {@clickForMore}
	
	set {_GUI}'s slot 38 to iron ingot named "&8&lREPAIR" with lore {@misc}, "", "&8▪ &7Repair your stuff, get some work and", "&7get experienced in your job!", "", getStats({_p}, "repair"), "", {@clickForMore}
	
	set {_GUI}'s slot 49 to emerald named "&b&lRANKING" with lore "&7Ranking viewer", "", "&8▪ &7Check who leads in the specific skill!", "&8▪ &7Fight with others to be the best in your job!", "&c▪ &4Coming soon in the nearest updates!", "", "&aClick to view rankings!"
	
	set {_GUI}'s slot 50 to {_arg}'s head named "&a&lPARTY" with lore {@partyViewer}, "", "&8▪ &7Check statistics of your party.", "&8▪ &7Manage your party and their members.", "&8▪ &7One click to search all existing parties!", "", "&aClick to view a party!"
	
	set {_GUI}'s slot 52 to barrier named "&cClose"
	
	
	# Opening GUI
	open {_GUI} to {_p}
	

command /mcmmo <offline player=%player%>:
	permission: {@usePerm}
	permission message: {@noPerMsg}
	executable by: player
	trigger:
		if arg-1 isn't player:
			player doesn't have permission "{@usePermOthers}"
			send "{@noPerMsg}"
			stop
		set {_data} to new DatabaseAPI()
		if {_data}.doesPlayerExistInDB(arg-1's uuid) is true:
			showGUI(player, arg-1)
		else:
			send {@noPlayerFound}
			

	
on inventory click:
	player's current inventory's name is {@guiName}, {@partyGUI} or {@childSkillGuiName}
	cancel event
	if event.getView().getTitle() = {@guiName}:
	
		if clicked slot is 10, 11, 12, 19, 20, 14, 15, 23, 24, 32, 33, 37 or 38:
			if {mcmmoguiTarget::%player%} is player:
				set {_meta} to event.getCurrentItem().getItemMeta()
				execute player command "%ChatColor.stripColor({_meta}.getDisplayName().toLowerCase())%"
				close player's inventory
			else:
				send {@argIsPlayer}
				stop
	
		if clicked slot = 21:
			
			set {_childGUI} to chest inventory with 6 rows named {@childSkillGuiName}
		
			if {@background} is true:
				loop 54 times:
					set {_childGUI}'s slot loop-value - 1 to gray stained glass pane named "&7"
			
			getSkillStats(player, {mcmmoguiTarget::%player%}, "salvage")
			getSkillStats(player, {mcmmoguiTarget::%player%}, "smelting")
					
			set {_childGUI}'s slot 21 to golden helmet named "&8&lSALVAGE" with lore {@gathering}, "", "&7&lLEVEL: &e%{mcmmogui::%player%::salvageLVL}%"
		
			set {_childGUI}'s slot 23 to charcoal named "&8&lSMELTING" with lore {@gathering}, "", "&7&lLEVEL: &e%{mcmmogui::%player%::smeltingLVL}%"
		
			set {_childGUI}'s slot 40 to arrow named "&cGo back"
		
			open {_childGUI} to player
			
		if clicked slot = 52:
			close player's inventory
			delete {mcmmoguiTarget::%player%::*}
			delete {mcmmogui::%player%::*}
	
		if clicked slot = 50:
		
			# If player is online (mcMMO has limitations) but gonna fix that in 1.3
			if {mcmmoguiTarget::%player%}.isOnline() is false:
				close player's inventory
				send {@argIsOffline}
				stop
		
			#If player has party
			if PartyAPI.inParty({mcmmoguiTarget::%player%}) is false:
				close player's inventory
				send {@noParty}
				stop
				
			showPartyGUI(player, {mcmmoguiTarget::%player%})
		
	if event.getView().getTitle() = {@childSkillGuiName} or {@partyGUI}:
		clicked slot = 40
		showGUI(player, {mcmmoguiTarget::%player%})
		
	if event.getView().getTitle() = {@childSkillGuiName}:
		clicked slot = 21 or 23
		set {_meta} to event.getCurrentItem().getItemMeta()
		execute player command "%ChatColor.stripColor({_meta}.getDisplayName().toLowerCase())%"
		
	if event.getView().getTitle() = {@partyGUI}:
	
		if clicked slot is arrow named "&aNext page":
			showPaginatedGUI(player, {page::%player%} + 1)
		if clicked slot is arrow named "&cPrevious page":
			showPaginatedGUI(player, {page::%player%} - 1)
		if clicked slot is barrier named "&cGo back":
			showGUI(player, {mcmmoguiTarget::%player%})
	
		if clicked slot = 16, 25 or 34:
			set {mcmmoguiTarget::%player%::chatManaging} to true
			
		if clicked slot = 16, 25, 34 or 43:
			if {mcmmoguiTarget::%player%} isn't player:
				player doesn't have permission "{@managePartyPerm}"
				send "{@noPerMsg}"
				stop
			else:
				player doesn't have permission "mcmmo.commands.party.all"
				send "{@noPerMsg}"
				stop
	
		if clicked slot = 16:
			close player's inventory
			set {mcmmoguiTarget::%player%::chatManaging::password} to true
			send {@setPartyPassword}
			
		if clicked slot = 25:
			close player's inventory
			set {mcmmoguiTarget::%player%::chatManaging::leader} to true
			send {@setPartyLeader}
			
		if clicked slot = 34:
			close player's inventory
			set {mcmmoguiTarget::%player%::chatManaging::name} to true
			send {@setPartyName}
			
		if clicked slot = 43:
			set {_mcMMOplayer} to UserManager.getPlayer({mcmmoguiTarget::%player%})
			set {_party} to {_mcMMOplayer}.getParty()
			if {_party}.isLocked() is true:
				set {_bool} to false
			else:
				set {_bool} to true
			{_party}.setLocked({_bool})
			showPartyGUI(player, {mcmmoguiTarget::%player%})
			
		if clicked slot = 13:
			showPaginatedGUI(player, 1)
			
			
function showPaginatedGUI(p: player, page: number):
	set {_gui} to chest inventory with 6 rows named {@partyGUI}
	
	set {_partyList} to PartyAPI.getParties()
	
	set {page::%{_p}%} to {_page}
	loop 45 times:
		set {_int} to loop-value - 1 + 45 * ({page::%{_p}%} - 1)
		set {_party} to try {_partyList}.get({_int})
		{_partyList}.get({_int}).getName() isn't set:
			stop loop
			
		set {_members} to {_party}.getMembers()
		set {_online} to {_party}.getOnlineMembers()
		set {_level} to {_party}.getLevel()
		
		if {_party}.isLocked():
			set {_gui}'s slot loop-value - 1 to gunpowder named "&a&l%{_party}.getName()% &4(&c&lPRIVATE&4)" with lore {@partyViewer}, "", "&8▪ &7Leader: %{_party}.getLeader().getPlayerName()%", "&8▪ &7Members: &a%{_online}.size()% online&7/%{_members}.size()%", "&8▪ &7Level: %{_level}%"
		else:
			set {_gui}'s slot loop-value - 1 to redstone dust named "&a&l%{_party}.getName()% &2(&a&lPUBLIC&2)" with lore {@partyViewer}, "", "&8▪ &7Leader: %{_party}.getLeader().getPlayerName()%", "&8▪ &7Members: &a%{_online}.size()% online&7/%{_members}.size()%", "&8▪ &7Level: %{_level}%"
		
	if type of {_gui}'s slot 44 isn't air:
		set {_gui}'s slot 54 - 1 to arrow named "&aNext page"
		
	if {page::%{_p}%} > 1:
		set {_gui}'s slot 46 - 1 to arrow named "&cPrevious page"
		
	set {_gui}'s slot 47 - 1 to oak sign named "&aPage &7%{_page}%"
		
	set {_gui}'s slot 50 - 1 to barrier named "&cGo back"
		
	open {_gui} to {_p}
			
			

on chat:
	if {mcmmoguiTarget::%player%::chatManaging} is true:
		set {_message} to message
		set {_mcMMOplayer} to UserManager.getPlayer({mcmmoguiTarget::%player%})
		set {_party} to {_mcMMOplayer}.getParty()
		cancel event
		
		if {mcmmoguiTarget::%player%::chatManaging::password} is set:
			{_party}.setPassword({_message})
			send {@successPartyPassword}
			showPartyGUI(player, {mcmmoguiTarget::%player%})
			
		if {mcmmoguiTarget::%player%::chatManaging::name} is set:
			
			{_party}.setName({_message})
			send {@successPartyName}
			showPartyGUI(player, {mcmmoguiTarget::%player%})
			
		if {mcmmoguiTarget::%player%::chatManaging::leader} is set:
			if {_party}.hasMember({_message}) is false:
				send {@PlayerNotInParty}
				stop
				
			PartyAPI.setPartyLeader({mcmmoguiTarget::%player%}, {_message})
			send {@successPartyLeader}
			showPartyGUI(player, {mcmmoguiTarget::%player%})
			
		delete {mcmmoguiTarget::%player%::chatManaging}
		delete {mcmmoguiTarget::%player%::chatManaging::*}
		
on inventory close:
	event.getView().getTitle() = {@guiName}, {@partyGUI} or {@childSkillGuiName}
	if {mcmmoguiTarget::%player%::chatManaging} isn't set:
		delete {mcmmoguiTarget::%player%::*}
	if {page::%player%} is set:
		player's current inventory contains barrier named "&cGo back"
		delete {page::%player%}