# 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 : 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%}