diff --git a/pom.xml b/pom.xml index 11dd6e4..c0a6a37 100644 --- a/pom.xml +++ b/pom.xml @@ -126,7 +126,7 @@ de.tr7zw item-nbt-api - 2.12.2 + 2.12.4-SNAPSHOT compile @@ -150,7 +150,7 @@ org.spigotmc spigot-api - 1.20-R0.1-SNAPSHOT + 1.20.5-R0.1-SNAPSHOT provided @@ -221,7 +221,7 @@ io.papermc paperlib - 1.0.7 + 1.0.8 net.essentialsx diff --git a/resource/plugin.yml b/resource/plugin.yml index 36ec0f5..ae5559a 100644 --- a/resource/plugin.yml +++ b/resource/plugin.yml @@ -1,4 +1,4 @@ -version: 3.20.1.1 +version: 3.21.2.0 main: me.rockyhawk.commandpanels.CommandPanels name: CommandPanels author: RockyHawk diff --git a/resource_example/example_top.yml b/resource_example/example_top.yml index 1185673..e32f936 100644 --- a/resource_example/example_top.yml +++ b/resource_example/example_top.yml @@ -73,12 +73,11 @@ panels: - placeholder= [item:APPLE] - refresh '21': - material: POTION + material: GOLDEN_APPLE name: '&fClick to heal the player' - potion: INSTANT_HEAL lore: - - '&7Uses the /heal command so that' - - '&7the player needs permission' + - '&7Uses the /heal command if' + - '&7the player has permission' commands: - heal '24': diff --git a/src/me/rockyhawk/commandpanels/CommandPanels.java b/src/me/rockyhawk/commandpanels/CommandPanels.java index 63674bd..f697fc7 100644 --- a/src/me/rockyhawk/commandpanels/CommandPanels.java +++ b/src/me/rockyhawk/commandpanels/CommandPanels.java @@ -16,7 +16,7 @@ import me.rockyhawk.commandpanels.classresources.placeholders.CreateText; import me.rockyhawk.commandpanels.classresources.placeholders.HexColours; import me.rockyhawk.commandpanels.classresources.placeholders.Placeholders; import me.rockyhawk.commandpanels.commands.*; -import me.rockyhawk.commandpanels.commandtags.CommandTags; +import me.rockyhawk.commandpanels.commandtags.CommandRunner; import me.rockyhawk.commandpanels.completetabs.CpTabComplete; import me.rockyhawk.commandpanels.completetabs.UpdateTabComplete; import me.rockyhawk.commandpanels.customcommands.Commandpanelcustom; @@ -35,6 +35,7 @@ import me.rockyhawk.commandpanels.ioclasses.nbt.NBTManager; import me.rockyhawk.commandpanels.ioclasses.legacy.LegacyVersion; import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions; import me.rockyhawk.commandpanels.ioclasses.legacy.PlayerHeads; +import me.rockyhawk.commandpanels.ioclasses.potions.LegacyPotionData; import me.rockyhawk.commandpanels.openpanelsmanager.*; import me.rockyhawk.commandpanels.openwithitem.HotbarItemLoader; import me.rockyhawk.commandpanels.openwithitem.SwapItemEvent; @@ -85,7 +86,7 @@ public class CommandPanels extends JavaPlugin{ //get alternate classes public PanelDownloader downloader = new PanelDownloader(this); - public CommandTags commandTags = new CommandTags(this); + public CommandRunner commandRunner = new CommandRunner(this); public PanelDataLoader panelData = new PanelDataLoader(this); public Placeholders placeholders = new Placeholders(this); public DebugManager debug = new DebugManager(this); @@ -98,6 +99,7 @@ public class CommandPanels extends JavaPlugin{ public GetCustomHeads customHeads = new GetCustomHeads(this); public Updater updater = new Updater(this); public PlayerHeads getHeads = new PlayerHeads(this); + public LegacyPotionData legacyPotion = new LegacyPotionData(this); public LegacyVersion legacy = new LegacyVersion(this); public OpenPanelsLoader openPanels = new OpenPanelsLoader(this); @@ -200,7 +202,7 @@ public class CommandPanels extends JavaPlugin{ } //load in all built in command tags - commandTags.registerBuiltInTags(); + commandRunner.registerBuiltInTags(); //if refresh-panels set to false, don't load this if(Objects.requireNonNull(config.getString("config.refresh-panels")).equalsIgnoreCase("true")){ @@ -240,7 +242,7 @@ public class CommandPanels extends JavaPlugin{ //save the example_top.yml file and the template.yml file if (!this.panelsf.exists()) { try { - if(legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ + if(legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ FileConfiguration exampleFileConfiguration = YamlConfiguration.loadConfiguration(getReaderFromStream(this.getResource("exampleLegacy.yml"))); exampleFileConfiguration.save(new File(this.panelsf + File.separator + "example.yml")); }else { @@ -318,14 +320,23 @@ public class CommandPanels extends JavaPlugin{ //hiding attributes will add an NBT tag if(hideAttributes) { renamedMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - renamedMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); renamedMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + //HIDE_ADDITIONAL_TOOLTIP was added into 1.20.5 api + if(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_21) || + (legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20) && legacy.MINOR_VERSION >= 5)){ + renamedMeta.addItemFlags(ItemFlag.valueOf("HIDE_ADDITIONAL_TOOLTIP")); + } + //HIDE_POTION_EFFECTS was removed in the 1.20.5 api + if(legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) || + (legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && legacy.MINOR_VERSION <= 4)){ + renamedMeta.addItemFlags(ItemFlag.valueOf("HIDE_POTION_EFFECTS")); + } //HIDE_ARMOR_TRIM was added into 1.20 api - if(legacy.LOCAL_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20)){ + if(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20)){ renamedMeta.addItemFlags(ItemFlag.HIDE_ARMOR_TRIM); } //HIDE_DYE was added into 1.17 api - if(legacy.LOCAL_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_17)){ + if(legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_17)){ renamedMeta.addItemFlags(ItemFlag.HIDE_DYE); } } @@ -460,7 +471,7 @@ public class CommandPanels extends JavaPlugin{ p.sendMessage(ChatColor.GOLD + "/cpv " + ChatColor.WHITE + "Display the current version."); } if (p.hasPermission("commandpanel.refresh")) { - p.sendMessage(ChatColor.GOLD + "/cpu [player] [position:all] " + ChatColor.WHITE + "Update a panel for a player while it is still open."); + p.sendMessage(ChatColor.GOLD + "/cpu [position:all] " + ChatColor.WHITE + "Update a panel for a player while it is still open."); } if (p.hasPermission("commandpanel.update")) { p.sendMessage(ChatColor.GOLD + "/cpv latest " + ChatColor.WHITE + "Download the latest update upon server reload/restart."); @@ -470,7 +481,7 @@ public class CommandPanels extends JavaPlugin{ p.sendMessage(ChatColor.GOLD + "/cpe " + ChatColor.WHITE + "Export panel to the Online Editor."); } if (p.hasPermission("commandpanel.import")) { - p.sendMessage(ChatColor.GOLD + "/cpi [file name] [URL] " + ChatColor.WHITE + "Downloads a panel from a raw link online."); + p.sendMessage(ChatColor.GOLD + "/cpi " + ChatColor.WHITE + "Downloads a panel from a raw link online."); } if (p.hasPermission("commandpanel.list")) { p.sendMessage(ChatColor.GOLD + "/cpl " + ChatColor.WHITE + "Lists the currently loaded panels."); diff --git a/src/me/rockyhawk/commandpanels/Utils.java b/src/me/rockyhawk/commandpanels/Utils.java index 21b4ad5..68c0b93 100644 --- a/src/me/rockyhawk/commandpanels/Utils.java +++ b/src/me/rockyhawk/commandpanels/Utils.java @@ -45,7 +45,7 @@ public class Utils implements Listener { //if the panel is clicked on the outside area of the GUI if (panel.getConfig().contains("outside-commands")) { try { - plugin.commandTags.runCommands(panel,PanelPosition.Top,p, panel.getConfig().getStringList("outside-commands"),e.getClick()); + plugin.commandRunner.runCommands(panel,PanelPosition.Top,p, panel.getConfig().getStringList("outside-commands"),e.getClick()); }catch(Exception s){ plugin.debug(s,p); } @@ -131,11 +131,11 @@ public class Utils implements Listener { } } if (panel.getConfig().contains("item." + clickedSlot + section + ".multi-paywall")) { - plugin.commandTags.runMultiPaywall(panel,position,p, + plugin.commandRunner.runMultiPaywall(panel,position,p, panel.getConfig().getStringList("item." + clickedSlot + section + ".multi-paywall"), commands,e.getClick()); } else { - plugin.commandTags.runCommands(panel, position, p, commands, e.getClick()); + plugin.commandRunner.runCommands(panel, position, p, commands, e.getClick()); } } } diff --git a/src/me/rockyhawk/commandpanels/api/Panel.java b/src/me/rockyhawk/commandpanels/api/Panel.java index 26369f8..3f76df3 100644 --- a/src/me/rockyhawk/commandpanels/api/Panel.java +++ b/src/me/rockyhawk/commandpanels/api/Panel.java @@ -87,7 +87,7 @@ public class Panel{ public ItemStack getHotbarItem(Player p){ if (this.getConfig().contains("open-with-item.pre-load-commands")) { try { - plugin.commandTags.runCommands(this,PanelPosition.Top,p, this.getConfig().getStringList("open-with-item.pre-load-commands")); + plugin.commandRunner.runCommands(this,PanelPosition.Top,p, this.getConfig().getStringList("open-with-item.pre-load-commands"), null); }catch(Exception s){ plugin.debug(s,p); } diff --git a/src/me/rockyhawk/commandpanels/classresources/ExecuteOpenVoids.java b/src/me/rockyhawk/commandpanels/classresources/ExecuteOpenVoids.java index b0cbda0..2fbdc0f 100644 --- a/src/me/rockyhawk/commandpanels/classresources/ExecuteOpenVoids.java +++ b/src/me/rockyhawk/commandpanels/classresources/ExecuteOpenVoids.java @@ -82,7 +82,7 @@ public class ExecuteOpenVoids { //execute commands once the panel opens if (panel.getConfig().contains("commands-on-open")) { try { - plugin.commandTags.runCommands(panel,position,p, panel.getConfig().getStringList("commands-on-open")); + plugin.commandRunner.runCommands(panel,position,p, panel.getConfig().getStringList("commands-on-open"), null); }catch(Exception s){ p.sendMessage(plugin.tex.colour(plugin.tag + plugin.config.getString("config.format.error") + " " + "commands-on-open: " + panel.getConfig().getString("commands-on-open"))); } @@ -155,7 +155,7 @@ public class ExecuteOpenVoids { public void beforeLoadCommands(Panel panel,PanelPosition pos, Player p){ if (panel.getConfig().contains("pre-load-commands")) { try { - plugin.commandTags.runCommands(panel,pos,p, panel.getConfig().getStringList("pre-load-commands")); + plugin.commandRunner.runCommands(panel,pos,p, panel.getConfig().getStringList("pre-load-commands"), null); }catch(Exception s){ plugin.debug(s,p); } diff --git a/src/me/rockyhawk/commandpanels/classresources/GetCustomHeads.java b/src/me/rockyhawk/commandpanels/classresources/GetCustomHeads.java index 2faff8d..5f05fe9 100644 --- a/src/me/rockyhawk/commandpanels/classresources/GetCustomHeads.java +++ b/src/me/rockyhawk/commandpanels/classresources/GetCustomHeads.java @@ -72,7 +72,7 @@ public class GetCustomHeads { //getting the head from a Player Name public ItemStack getPlayerHead(String name) { byte id = 0; - if (plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)) { + if (plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)) { id = 3; } @@ -123,11 +123,8 @@ public class GetCustomHeads { Bukkit.getScheduler().runTask(plugin, () -> { itemStack.setItemMeta(getCustomHead(value).getItemMeta()); }); - } catch (Exception e) { - // Handle exceptions - if(plugin.debug.consoleDebug) { - plugin.debug(e,null); - } + } catch (Exception ignore) { + // Ignore as errors should be skipped and no need to show in console } }); @@ -145,7 +142,7 @@ public class GetCustomHeads { } else { propertyMap.put("textures", new Property("textures", b64stringtexture)); byte id = 0; - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){ + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){ id = 3; } ItemStack head = new ItemStack(Material.matchMaterial(plugin.getHeads.playerHeadString()), 1,id); diff --git a/src/me/rockyhawk/commandpanels/classresources/HasSections.java b/src/me/rockyhawk/commandpanels/classresources/HasSections.java index 74a34ef..06dcdfb 100644 --- a/src/me/rockyhawk/commandpanels/classresources/HasSections.java +++ b/src/me/rockyhawk/commandpanels/classresources/HasSections.java @@ -106,16 +106,6 @@ public class HasSections { outputValue = false; } - //the original has sections as TinyTank800 wanted to keep them - if(setName.startsWith("hasvalue")) { - return compare.equals(value) == outputValue; - } - if(setName.startsWith("hasperm")) { - return p.hasPermission(value) == outputValue; - } - if(setName.startsWith("hasgreater")) { - return (Long.parseLong(compare) >= Long.parseLong(value)) == outputValue; - } //the current has section with all the functions implemented inside it if(setName.startsWith("has")) { if(value.endsWith(" HASPERM")) { diff --git a/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java b/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java index a6b3ae7..a804dfc 100644 --- a/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java +++ b/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java @@ -1,15 +1,11 @@ package me.rockyhawk.commandpanels.classresources; -import de.tr7zw.changeme.nbtapi.NBT; -import de.tr7zw.changeme.nbtapi.NBTItem; -import de.tr7zw.changeme.nbtapi.iface.ReadWriteNBT; import me.arcaniax.hdb.api.HeadDatabaseAPI; import me.rockyhawk.commandpanels.CommandPanels; import me.rockyhawk.commandpanels.api.Panel; import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions; import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.MMOItemsAPI; import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem; import net.Indyuce.mmoitems.manager.ItemManager; import org.bukkit.*; @@ -28,7 +24,6 @@ import org.bukkit.inventory.meta.*; import org.bukkit.inventory.meta.trim.ArmorTrim; import org.bukkit.inventory.meta.trim.TrimMaterial; import org.bukkit.inventory.meta.trim.TrimPattern; -import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; import java.util.*; @@ -86,7 +81,7 @@ public class ItemCreation { if (matraw.split("\\s")[0].equalsIgnoreCase("cps=") || matraw.split("\\s")[0].toLowerCase().equals("cpo=")) { skullname = p.getUniqueId().toString(); mat = plugin.getHeads.playerHeadString(); - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ id = 3; } } @@ -94,7 +89,7 @@ public class ItemCreation { if (matraw.split("\\s")[0].equalsIgnoreCase("hdb=")) { skullname = "hdb"; mat = plugin.getHeads.playerHeadString(); - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ id = 3; } } @@ -138,7 +133,7 @@ public class ItemCreation { if (matraw.split("\\s")[1].equalsIgnoreCase("self")) { //if cps= self meta = (SkullMeta) s.getItemMeta(); - if(!plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { + if(!plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { try { assert meta != null; meta.setOwningPlayer(Bukkit.getOfflinePlayer(UUID.fromString(skullname))); @@ -286,37 +281,30 @@ public class ItemCreation { if (itemSection.contains("potion")) { //if the item is a potion, give it an effect - try { - PotionMeta potionMeta = (PotionMeta)s.getItemMeta(); - String[] effectType = plugin.tex.placeholdersNoColour(panel,position,p,itemSection.getString("potion")).split("\\s"); - assert potionMeta != null; - boolean extended = false; - boolean upgraded = false; - //create data - if(effectType.length >= 2){ - if(effectType[1].equalsIgnoreCase("true")){ - extended = true; - } - if(effectType.length == 3){ - if(effectType[2].equalsIgnoreCase("true")){ - upgraded = true; - } - } + String[] effectType = plugin.tex.placeholdersNoColour(panel,position,p,itemSection.getString("potion")).split("\\s"); + //potion legacy or current + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) || + (plugin.legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && plugin.legacy.MINOR_VERSION <= 4)){ + plugin.legacyPotion.applyPotionEffect(p,s,effectType); + }else{ + try { + PotionMeta potionMeta = (PotionMeta)s.getItemMeta(); + assert potionMeta != null; + PotionType newData = PotionType.valueOf(effectType[0].toUpperCase()); + //set meta + potionMeta.setBasePotionType(newData); + s.setItemMeta(potionMeta); + } catch (Exception er) { + //don't add the effect + plugin.debug(er,p); + p.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.RED + plugin.config.getString("config.format.error") + " potion: " + itemSection.getString("potion"))); } - PotionData newData = new PotionData(PotionType.valueOf(effectType[0].toUpperCase()),extended,upgraded); - //set meta - potionMeta.setBasePotionData(newData); - s.setItemMeta(potionMeta); - } catch (Exception er) { - //don't add the effect - plugin.debug(er,p); - p.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.RED + plugin.config.getString("config.format.error") + " potion: " + itemSection.getString("potion"))); } } if (itemSection.contains("damage")) { //change the damage amount (placeholders accepted) //if the damage is not unbreakable and should be a value - if (plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { + if (plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { try { s.setDurability(Short.parseShort(Objects.requireNonNull(plugin.tex.placeholders(panel,position,p, itemSection.getString("damage"))))); } catch (Exception e) { @@ -350,7 +338,7 @@ public class ItemCreation { } } // 1.20 Trim Feature for Player Armor - if(plugin.legacy.LOCAL_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20) && itemSection.contains("trim")){ + if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20) && itemSection.contains("trim")){ // trim: String trim = itemSection.getString("trim"); String[] trimList = trim.split("\\s"); @@ -380,7 +368,7 @@ public class ItemCreation { //check that the panel is already open and not running commands when opening if (itemSection.contains("refresh-commands") && plugin.openPanels.hasPanelOpen(p.getName(), panel.getName(), position)) { try { - plugin.commandTags.runCommands(panel,position,p,itemSection.getStringList("refresh-commands")); + plugin.commandRunner.runCommands(panel,position,p,itemSection.getStringList("refresh-commands"), null); }catch(Exception ex){ plugin.debug(ex,p); } @@ -421,7 +409,7 @@ public class ItemCreation { } } } - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ if (cont.getDurability() != 0 && !cont.getType().toString().equals("SKULL_ITEM")) { file.set("panels." + panelName + ".item." + i + ".ID", cont.getDurability()); } @@ -440,7 +428,7 @@ public class ItemCreation { if(plugin.getHeads.ifSkullOrHead(cont.getType().toString())){ if(!Objects.requireNonNull(file.getString("panels." + panelName + ".item." + i + ".material")).contains("%") && !Objects.requireNonNull(file.getString("panels." + panelName + ".item." + i + ".material")).contains("=")) { SkullMeta meta = (SkullMeta) cont.getItemMeta(); - if (plugin.customHeads.getHeadBase64(cont) != null && !plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { + if (plugin.customHeads.getHeadBase64(cont) != null && !plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { //inject base64 here, disable for legacy as is not working file.set("panels." + panelName + ".item." + i + ".material", "cps= " + plugin.customHeads.getHeadBase64(cont)); } else if (meta.hasOwner()) { @@ -461,13 +449,16 @@ public class ItemCreation { file.set("panels." + panelName + ".item." + i + ".banner", null); } try { - PotionMeta potionMeta = (PotionMeta) cont.getItemMeta(); - assert potionMeta != null; - PotionData potionData = potionMeta.getBasePotionData(); - PotionType potionType = potionData.getType(); // Gets the potion type as a string rather than bukkit type - boolean level = potionData.isUpgraded(); // Check if the potion is level II - boolean extended = potionData.isExtended(); // Check if the potion is extended - file.set("panels." + panelName + ".item." + i + ".potion", potionType + " " + extended + " " + level); + //potion legacy PotionData or current PotionType + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) || + (plugin.legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && plugin.legacy.MINOR_VERSION <= 4)){ + file.set("panels." + panelName + ".item." + i + ".potion", plugin.legacyPotion.retrievePotionData(cont)); + }else{ + PotionMeta potionMeta = (PotionMeta) cont.getItemMeta(); + assert potionMeta != null; + String potionType = potionMeta.getBasePotionType().toString(); // Gets the potion type as a string rather than bukkit type + file.set("panels." + panelName + ".item." + i + ".potion", potionType); + } }catch(Exception ignore){ //not a banner file.set("panels." + panelName + ".item." + i + ".potion", null); @@ -483,7 +474,7 @@ public class ItemCreation { } file.set("panels." + panelName + ".item." + i + ".name", Objects.requireNonNull(cont.getItemMeta()).getDisplayName()); file.set("panels." + panelName + ".item." + i + ".lore", Objects.requireNonNull(cont.getItemMeta()).getLore()); - if(plugin.legacy.LOCAL_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_14)){ + if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_14)){ file.set("panels." + panelName + ".item." + i + ".customdata", Objects.requireNonNull(cont.getItemMeta()).getCustomModelData()); } }catch(Exception n){ @@ -534,17 +525,14 @@ public class ItemCreation { //check for nbt if(nbtCheck) { try { - NBTItem nbtitem1 = new NBTItem(one); - NBTItem nbtitem2 = new NBTItem(two); - - if (!nbtitem1.equals(nbtitem2)) { + if (!plugin.nbt.hasSameNBT(one, two)) { return false; } } catch (Exception ignore) {} } //check for damage try { - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ if(one.getDurability() != two.getDurability()) { return false; } @@ -558,19 +546,21 @@ public class ItemCreation { } catch (Exception ignore) {} //check for potions try { - PotionMeta meta1 = (PotionMeta) one.getItemMeta(); - PotionMeta meta2 = (PotionMeta) two.getItemMeta(); - //different duration - if(meta1.getBasePotionData().isExtended() != meta2.getBasePotionData().isExtended()){ - return false; - } - //different upgrade - if(meta1.getBasePotionData().isUpgraded() != meta2.getBasePotionData().isUpgraded()){ - return false; - } - //different potion type - if (meta1.getBasePotionData().getType().compareTo(meta2.getBasePotionData().getType()) != 0){ - return false; + //choose between legacy PotionData (pre 1.20.5) or PotionType + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) || + (plugin.legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && plugin.legacy.MINOR_VERSION <= 4)){ + String potionOne = plugin.legacyPotion.retrievePotionData(one); + String potionTwo = plugin.legacyPotion.retrievePotionData(two); + if(!potionOne.equals(potionTwo)){ + return false; + } + }else{ + //post 1.20.5 compare + PotionMeta meta1 = (PotionMeta) one.getItemMeta(); + PotionMeta meta2 = (PotionMeta) two.getItemMeta(); + if (meta1.getBasePotionType().toString().compareTo(meta2.getBasePotionType().toString()) != 0){ + return false; + } } }catch(Exception ignore){} //check for enchantments diff --git a/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java b/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java index c477ffb..b297e1c 100644 --- a/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java +++ b/src/me/rockyhawk/commandpanels/classresources/placeholders/Placeholders.java @@ -12,7 +12,6 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.PotionEffect; import java.io.IOException; import java.net.InetSocketAddress; @@ -168,10 +167,16 @@ public class Placeholders { // Check if the item is not null and has potion meta if (item != null && item.hasItemMeta() && item.getItemMeta() instanceof PotionMeta) { - PotionMeta potionMeta = (PotionMeta) item.getItemMeta(); - - //Returns the value like this :: Example SLOWNESS:true:false - return potionMeta.getBasePotionData().getType() + ":" + potionMeta.getBasePotionData().isExtended() + ":" + potionMeta.getBasePotionData().isUpgraded(); + //choose between legacy PotionData (pre 1.20.5) or PotionType + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_19) || + (plugin.legacy.MAJOR_VERSION == MinecraftVersions.v1_20 && plugin.legacy.MINOR_VERSION <= 4)){ + //Returns the value like this :: Example SLOWNESS:true:false + return plugin.legacyPotion.retrievePotionData(item).replaceAll("\\s",":"); + }else{ + //post 1.20.5 compare just return PotionType + PotionMeta potionMeta = (PotionMeta) item.getItemMeta(); + return potionMeta.getBasePotionType().toString(); + } } else { return "empty"; // Item is either null or doesn't have potion meta } @@ -189,7 +194,7 @@ public class Placeholders { String material; try { material = p.getOpenInventory().getTopInventory().getItem((int)Double.parseDouble(matNumber)).getType().toString(); - if (plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { + if (plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)) { //add the ID to the end if it is legacy (eg, material:id) material = material + ":" + p.getOpenInventory().getTopInventory().getItem((int)Double.parseDouble(matNumber)).getData().getData(); } @@ -241,7 +246,7 @@ public class Placeholders { boolean damaged = false; ItemStack itm = p.getOpenInventory().getTopInventory().getItem((int)Double.parseDouble(matNumber)); try { - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){ + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){ if(itm.getType().getMaxDurability() != 0) { damaged = (itm.getType().getMaxDurability() - itm.getDurability()) < itm.getType().getMaxDurability(); } @@ -334,7 +339,7 @@ public class Placeholders { try { String point_value = identifier.replace("cp-setdata-", ""); String command = "set-data= " + point_value.split(",")[0] + " " + point_value.split(",")[1]; - plugin.commandTags.runCommand(panel,position,p, command); + plugin.commandRunner.runCommand(panel,position,p, command); return ""; }catch (Exception ex){ plugin.debug(ex,p); @@ -346,7 +351,7 @@ public class Placeholders { try { String point_value = identifier.replace("mathdata-", ""); String command = "math-data= " + point_value.split(",")[0] + " " + point_value.split(",")[1]; - plugin.commandTags.runCommand(panel,position,p,command); + plugin.commandRunner.runCommand(panel,position,p,command); return ""; }catch (Exception ex){ plugin.debug(ex,p); diff --git a/src/me/rockyhawk/commandpanels/commandtags/CommandRunner.java b/src/me/rockyhawk/commandpanels/commandtags/CommandRunner.java new file mode 100644 index 0000000..5765495 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/commandtags/CommandRunner.java @@ -0,0 +1,146 @@ +package me.rockyhawk.commandpanels.commandtags; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.api.Panel; +import me.rockyhawk.commandpanels.commandtags.paywalls.*; +import me.rockyhawk.commandpanels.commandtags.tags.other.DataTags; +import me.rockyhawk.commandpanels.commandtags.tags.other.PlaceholderTags; +import me.rockyhawk.commandpanels.commandtags.tags.other.SpecialTags; +import me.rockyhawk.commandpanels.commandtags.tags.standard.BasicTags; +import me.rockyhawk.commandpanels.commandtags.tags.standard.BungeeTags; +import me.rockyhawk.commandpanels.commandtags.tags.standard.ItemTags; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import java.util.*; + +public class CommandRunner { + CommandPanels plugin; + + public CommandRunner(CommandPanels pl) { + this.plugin = pl; + } + + //with the click type included, use null for no click type check + public void runCommands(Panel panel, PanelPosition position, Player p, List commands, ClickType click) { + for (String command : commands) { + if(click != null) { + command = plugin.commandRunner.hasCorrectClick(command, click); + if (command.equals("")) { + //click type is wrong + continue; + } + } + + //do paywall check + PaywallEvent paywallEvent = new PaywallEvent(plugin, panel, position, p, command); + Bukkit.getPluginManager().callEvent(paywallEvent); + if (paywallEvent.PAYWALL_OUTPUT == PaywallOutput.Blocked) { + break; + } + //not a paywall, run as command + if (paywallEvent.PAYWALL_OUTPUT == PaywallOutput.NotApplicable) { + plugin.commandRunner.runCommand(panel, position, p, command); + } + } + } + + public void runCommand(Panel panel, PanelPosition position, Player p, String commandRAW) { + CommandTagEvent tags = new CommandTagEvent(plugin, panel, position, p, commandRAW); + Bukkit.getPluginManager().callEvent(tags); + if (!tags.commandTagUsed) { + Bukkit.dispatchCommand(p, plugin.tex.placeholders(panel, position, p, commandRAW.trim())); + } + } + + public void runMultiPaywall(Panel panel, PanelPosition position, Player p, List paywalls, List commands, ClickType click) { + boolean allPaywallsValid = true; + + // New list combining paywalls and commands + List allCommands = new ArrayList<>(paywalls); + allCommands.addAll(commands); + + for (String command : allCommands) { + // Trigger the event but do not remove the payment from the player + PaywallEvent paywallEvent = new PaywallEvent(plugin, panel, position, p, command); + paywallEvent.doDelete = false; + Bukkit.getPluginManager().callEvent(paywallEvent); + + if (paywallEvent.PAYWALL_OUTPUT == PaywallOutput.Blocked) { + allPaywallsValid = false; // Set flag to false if any paywall is blocked + break; // Exit the loop if any command is blocked by the paywall + } + } + + // Execute all commands if all paywalls are valid + if (allPaywallsValid) { + plugin.commandRunner.runCommands(panel, position, p, allCommands, click); + } + } + + //do this on startup to load listeners + public void registerBuiltInTags() { + plugin.getServer().getPluginManager().registerEvents(new Paywall(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new ItemPaywall(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new Hasperm(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new XpPaywall(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new DataPaywall(plugin), plugin); + + plugin.getServer().getPluginManager().registerEvents(new DataTags(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new PlaceholderTags(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new SpecialTags(plugin), plugin); + + plugin.getServer().getPluginManager().registerEvents(new BasicTags(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new BungeeTags(plugin), plugin); + plugin.getServer().getPluginManager().registerEvents(new ItemTags(plugin), plugin); + } + + public String hasCorrectClick(String command, ClickType click) { + try { + switch (command.split("\\s")[0]) { + case "right=": { + //if commands is for right-clicking, remove the 'right=' and continue + command = command.replace("right= ", ""); + if (click != ClickType.RIGHT) { + return ""; + } + break; + } + case "rightshift=": { + command = command.replace("rightshift= ", ""); + if (click != ClickType.SHIFT_RIGHT) { + return ""; + } + break; + } + case "left=": { + command = command.replace("left= ", ""); + if (click != ClickType.LEFT) { + return ""; + } + break; + } + case "leftshift=": { + command = command.replace("leftshift= ", ""); + if (click != ClickType.SHIFT_LEFT) { + return ""; + } + break; + } + case "middle=": { + command = command.replace("middle= ", ""); + if (click != ClickType.MIDDLE) { + return ""; + } + break; + } + } + return command; + } catch (Exception ex) { + return ""; + //skip if you can't do this + } + } +} diff --git a/src/me/rockyhawk/commandpanels/commandtags/CommandTagEvent.java b/src/me/rockyhawk/commandpanels/commandtags/CommandTagEvent.java index 5597e13..1c09616 100644 --- a/src/me/rockyhawk/commandpanels/commandtags/CommandTagEvent.java +++ b/src/me/rockyhawk/commandpanels/commandtags/CommandTagEvent.java @@ -23,7 +23,7 @@ public class CommandTagEvent extends Event { this.panel = panel1; this.pos = position; - //do nopapi= tag (donation feature) which will stop PlaceholderAPI placeholders from executing + //do nopapi= tag which will stop PlaceholderAPI placeholders from executing boolean doApiPlaceholders = true; if(rawCommand1.startsWith("nopapi= ")){ rawCommand1 = rawCommand1.replace("nopapi= ",""); diff --git a/src/me/rockyhawk/commandpanels/commandtags/CommandTags.java b/src/me/rockyhawk/commandpanels/commandtags/CommandTags.java deleted file mode 100644 index 565017c..0000000 --- a/src/me/rockyhawk/commandpanels/commandtags/CommandTags.java +++ /dev/null @@ -1,499 +0,0 @@ -package me.rockyhawk.commandpanels.commandtags; - -import me.realized.tokenmanager.api.TokenManager; -import me.rockyhawk.commandpanels.CommandPanels; -import me.rockyhawk.commandpanels.api.Panel; -import me.rockyhawk.commandpanels.commandtags.tags.economy.BuyCommandTags; -import me.rockyhawk.commandpanels.commandtags.tags.economy.BuyItemTags; -import me.rockyhawk.commandpanels.commandtags.tags.economy.SellItemTags; -import me.rockyhawk.commandpanels.commandtags.tags.other.DataTags; -import me.rockyhawk.commandpanels.commandtags.tags.other.PlaceholderTags; -import me.rockyhawk.commandpanels.commandtags.tags.other.SpecialTags; -import me.rockyhawk.commandpanels.commandtags.tags.standard.BasicTags; -import me.rockyhawk.commandpanels.commandtags.tags.standard.BungeeTags; -import me.rockyhawk.commandpanels.commandtags.tags.standard.ItemTags; -import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; - -import java.util.*; - -public class CommandTags { - CommandPanels plugin; - - public CommandTags(CommandPanels pl) { - this.plugin = pl; - } - - //with the click type included - public void runCommands(Panel panel, PanelPosition position, Player p, List commands, ClickType click) { - for (String command : commands) { - command = plugin.commandTags.hasCorrectClick(command, click); - if (command.equals("")) { - //click type is wrong - continue; - } - - PaywallOutput val = plugin.commandTags.commandPayWall(panel, p, command, true); - if (val == PaywallOutput.Blocked) { - break; - } - if (val == PaywallOutput.NotApplicable) { - plugin.commandTags.runCommand(panel, position, p, command); - } - } - } - - public void runCommands(Panel panel, PanelPosition position, Player p, List commands) { - for (String command : commands) { - PaywallOutput val = plugin.commandTags.commandPayWall(panel, p, command, true); - if (val == PaywallOutput.Blocked) { - break; - } - if (val == PaywallOutput.NotApplicable) { - plugin.commandTags.runCommand(panel, position, p, command); - } - } - } - - public void runMultiPaywall(Panel panel, PanelPosition position, Player p, List paywalls, List commands, ClickType click) { - boolean allPaywallsValid = paywalls.stream() - .map(command -> plugin.commandTags.commandPayWall(panel, p, command, false)) - .allMatch(val -> val != PaywallOutput.Blocked); - - if (allPaywallsValid) { - List cmds = new ArrayList<>(); - cmds.addAll(paywalls); - cmds.addAll(commands); - plugin.commandTags.runCommands(panel, position, p, cmds, click); - } - } - - public void runCommand(Panel panel, PanelPosition position, Player p, String commandRAW) { - CommandTagEvent tags = new CommandTagEvent(plugin, panel, position, p, commandRAW); - Bukkit.getPluginManager().callEvent(tags); - if (!tags.commandTagUsed) { - Bukkit.dispatchCommand(p, plugin.tex.placeholders(panel, position, p, commandRAW.trim())); - } - } - - //do this on startup to load listeners - public void registerBuiltInTags() { - plugin.getServer().getPluginManager().registerEvents(new BuyCommandTags(plugin), plugin); - plugin.getServer().getPluginManager().registerEvents(new BuyItemTags(plugin), plugin); - plugin.getServer().getPluginManager().registerEvents(new SellItemTags(plugin), plugin); - - plugin.getServer().getPluginManager().registerEvents(new DataTags(plugin), plugin); - plugin.getServer().getPluginManager().registerEvents(new PlaceholderTags(plugin), plugin); - plugin.getServer().getPluginManager().registerEvents(new SpecialTags(plugin), plugin); - - plugin.getServer().getPluginManager().registerEvents(new BasicTags(plugin), plugin); - plugin.getServer().getPluginManager().registerEvents(new BungeeTags(plugin), plugin); - plugin.getServer().getPluginManager().registerEvents(new ItemTags(plugin), plugin); - } - - public String hasCorrectClick(String command, ClickType click) { - try { - switch (command.split("\\s")[0]) { - case "right=": { - //if commands is for right clicking, remove the 'right=' and continue - command = command.replace("right= ", ""); - if (click != ClickType.RIGHT) { - return ""; - } - break; - } - case "rightshift=": { - command = command.replace("rightshift= ", ""); - if (click != ClickType.SHIFT_RIGHT) { - return ""; - } - break; - } - case "left=": { - command = command.replace("left= ", ""); - if (click != ClickType.LEFT) { - return ""; - } - break; - } - case "leftshift=": { - command = command.replace("leftshift= ", ""); - if (click != ClickType.SHIFT_LEFT) { - return ""; - } - break; - } - case "middle=": { - command = command.replace("middle= ", ""); - if (click != ClickType.MIDDLE) { - return ""; - } - break; - } - } - return command; - } catch (Exception ex) { - return ""; - //skip if you can't do this - } - } - - @SuppressWarnings("deprecation") - public PaywallOutput commandPayWall(Panel panel, Player p, String rawCommand, boolean removal) { //return 0 means no funds, 1 is they passed and 2 means paywall is not this command - - //create new instance of command but with placeholders parsed - switch (rawCommand.split("\\s")[0]) { - default: { - return PaywallOutput.NotApplicable; - } - case "paywall=": { - String command = plugin.tex.placeholders(panel, PanelPosition.Top, p, rawCommand); - //if player uses paywall= [price] - try { - if (plugin.econ != null) { - if (plugin.econ.getBalance(p) >= Double.parseDouble(command.split("\\s")[1])) { - if (removal) plugin.econ.withdrawPlayer(p, Double.parseDouble(command.split("\\s")[1])); - if (plugin.config.getBoolean("purchase.currency.enable") && removal) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.currency.success")).replaceAll("%cp-args%", command.split("\\s")[1])); - } - return PaywallOutput.Passed; - } else { - if (plugin.config.getBoolean("purchase.currency.enable")) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.currency.failure"))); - } - return PaywallOutput.Blocked; - } - } else { - plugin.tex.sendString(p, plugin.tag + ChatColor.RED + "Paying Requires Vault and an Economy to work!"); - return PaywallOutput.Blocked; - } - } catch (Exception buyc) { - plugin.debug(buyc, p); - plugin.tex.sendString(p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + command); - return PaywallOutput.Blocked; - } - } - case "hasperm=": { - String command = plugin.tex.placeholders(panel, PanelPosition.Top, p, rawCommand); - //if player uses hasperm= [perm] - if (p.hasPermission(String.valueOf(command.split("\\s")[1]))) { - if (plugin.config.getBoolean("purchase.permission.enable") && removal) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.permission.success")).replaceAll("%cp-args%", command.split("\\s")[1])); - } - return PaywallOutput.Passed; - } else { - if (plugin.config.getBoolean("purchase.currency.enable")) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.permission.failure"))); - } - return PaywallOutput.Blocked; - } - - - } - case "tokenpaywall=": { - String command = plugin.tex.placeholders(panel, PanelPosition.Top, p, rawCommand); - //if player uses tokenpaywall= [price] - try { - if (plugin.getServer().getPluginManager().isPluginEnabled("TokenManager")) { - final TokenManager api = (TokenManager) Bukkit.getPluginManager().getPlugin("TokenManager"); - assert api != null; - int balance = Integer.parseInt(Long.toString(api.getTokens(p).orElse(0))); - if (balance >= Double.parseDouble(command.split("\\s")[1])) { - if (removal) { - api.removeTokens(p, Long.parseLong(command.split("\\s")[1])); - } - //if the message is empty don't send - if (plugin.config.getBoolean("purchase.tokens.enable") && removal) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.success")).replaceAll("%cp-args%", command.split("\\s")[1])); - } - - return PaywallOutput.Passed; - } else { - if (plugin.config.getBoolean("purchase.tokens.enable")) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.failure"))); - } - return PaywallOutput.Blocked; - } - } else { - plugin.tex.sendString(p, plugin.tag + ChatColor.RED + "Needs TokenManager to work!"); - return PaywallOutput.Blocked; - } - } catch (Exception buyc) { - plugin.debug(buyc, p); - plugin.tex.sendString(p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + command); - return PaywallOutput.Blocked; - } - } - case "item-paywall=": { - String command = plugin.tex.placeholders(panel, PanelPosition.Top, p, rawCommand); - //if player uses item-paywall= [Material] [Amount] WILL NOT TAKE CUSTOM ITEMS. IGNORENBT lets nbt items through. Useful for spawner edge cases. - //player can use item-paywall= [custom-item] [Amount] - List cont = new ArrayList<>(Arrays.asList(plugin.inventorySaver.getNormalInventory(p))); - HashMap remCont = new HashMap<>(); - String[] args = command.split("\\s"); - try { - int id = -1; - for (String val : args) { - if (val.startsWith("id:")) { - id = Integer.parseInt(val.substring(3)); - } - } - - //create the item to be removed - ItemStack sellItem; - if (Material.matchMaterial(args[1]) == null) { - sellItem = plugin.itemCreate.makeCustomItemFromConfig(panel, PanelPosition.Top, panel.getConfig().getConfigurationSection("custom-item." + args[1]), p, true, true, false); - sellItem.setAmount(Integer.parseInt(args[2])); - } else { - sellItem = new ItemStack(Objects.requireNonNull(Material.matchMaterial(args[1])), Integer.parseInt(args[2])); - } - //this is not a boolean because it needs to return an int - PaywallOutput removedItem = PaywallOutput.Blocked; - //This is here for when people want to take nbt items like spawners with types in a check for spawners. - boolean ignoreNBT = command.contains("IGNORENBT"); - - int remainingAmount = sellItem.getAmount(); - //loop through items in the inventory - for (int f = 0; f < 36; f++) { - - if (cont.get(f) == null) { - //skip slot if empty - continue; - } - - ItemStack itm = cont.get(f); - - if (Material.matchMaterial(args[1]) == null) { - //if custom item is a mmo item (1.14+ for the API) - try { - if (plugin.getServer().getPluginManager().isPluginEnabled("MMOItems") && panel.getConfig().getString("custom-item." + args[1] + ".material").startsWith("mmo=")) { - String customItemMaterial = panel.getConfig().getString("custom-item." + args[1] + ".material"); - String mmoType = customItemMaterial.split("\\s")[1]; - String mmoID = customItemMaterial.split("\\s")[2]; - - if (plugin.isMMOItem(itm, mmoType, mmoID)) { - ItemStack add = new ItemStack(p.getInventory().getItem(f).getType(), p.getInventory().getItem(f).getAmount()); - remainingAmount -= add.getAmount(); - if (removal) remCont.put(f,add); - if (remainingAmount <= 0) { - removedItem = PaywallOutput.Passed; - break; - } - } - continue; //This stops the other custom item section from reading and adding false numbers. - } - } catch (Exception ex) { - plugin.debug(ex, p); - } - - //item-paywall is a custom item as it is not a material - if (plugin.itemCreate.isIdentical(sellItem, itm, Objects.requireNonNull(panel.getConfig().getConfigurationSection("custom-item." + args[1])).contains("nbt"))) { - ItemStack add = new ItemStack(p.getInventory().getItem(f).getType(), p.getInventory().getItem(f).getAmount()); - remainingAmount -= add.getAmount(); - if (removal) remCont.put(f,add); - if (remainingAmount <= 0) { - removedItem = PaywallOutput.Passed; - break; - } - } - - } else { - //if the item is a standard material - if (itm.getType() == sellItem.getType()) { - if(itm.hasItemMeta() && !ignoreNBT){ - //If item has custom meta continue to next item. - continue; - } - - //Check if the item matches the id set. If not continue to next in loop. - if (id != -1 && itm.getDurability() != id) { - continue; - } - - //Adding item to the remove list then checking if we have reached the required amount. - ItemStack add = new ItemStack(itm.getType(), itm.getAmount()); - remainingAmount -= add.getAmount(); - if (removal) remCont.put(f,add); - if (remainingAmount <= 0) { - removedItem = PaywallOutput.Passed; - break; - } - } - } - } - - if (remainingAmount <= 0) { - for(Map.Entry entry : remCont.entrySet()) { - ItemStack remItem = entry.getValue(); - - //Check if its the last item in the loop and only subtract the remaining amount. - if (sellItem.getAmount() < remItem.getAmount()) { - if (plugin.inventorySaver.hasNormalInventory(p)) { - if (removal) - p.getInventory().getItem(entry.getKey()).setAmount(remItem.getAmount() - sellItem.getAmount()); - p.updateInventory(); - } else { - if (removal) - cont.get(entry.getKey()).setAmount(remItem.getAmount() - sellItem.getAmount()); - plugin.inventorySaver.inventoryConfig.set(p.getUniqueId().toString(), plugin.itemSerializer.itemStackArrayToBase64(cont.toArray(new ItemStack[0]))); - } - } else { //If its anywhere but the last in loop just get rid of the items. - if (plugin.inventorySaver.hasNormalInventory(p)) { - if (removal) p.getInventory().setItem(entry.getKey(), null); - //p.getInventory().remove(entry.getValue()); - //p.getInventory().getItem(entry.getKey()).setAmount(0); - p.updateInventory(); - } else { - if (removal) cont.remove(entry.getValue()); - //cont.get(entry.getKey()).setAmount(0); - plugin.inventorySaver.inventoryConfig.set(p.getUniqueId().toString(), plugin.itemSerializer.itemStackArrayToBase64(cont.toArray(new ItemStack[0]))); - } - } - - if (removal) sellItem.setAmount(sellItem.getAmount() - remItem.getAmount()); - } - - removedItem = PaywallOutput.Passed; - } - - //send message and return - if (removedItem == PaywallOutput.Blocked) { - if (plugin.config.getBoolean("purchase.item.enable")) { - //no item was found - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.item.failure"))); - } - } else { - if (plugin.config.getBoolean("purchase.item.enable") && removal) { - //item was removed - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.item.success")).replaceAll("%cp-args%", command.split("\\s")[1])); - } - } - return removedItem; - } catch (Exception buyc) { - plugin.debug(buyc, p); - plugin.tex.sendString(p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + command); - return PaywallOutput.Blocked; - } - } - case "xp-paywall=": { - String command = plugin.tex.placeholders(panel, PanelPosition.Top, p, rawCommand); - //if player uses xp-paywall= - try { - int balance; - if (command.split("\\s")[2].startsWith("level")) { - balance = p.getLevel(); - } else { - balance = getPlayerExp(p); - } - if (balance >= Integer.parseInt(command.split("\\s")[1])) { - if (command.split("\\s")[2].startsWith("level")) { - if (removal) p.setLevel(p.getLevel() - Integer.parseInt(command.split("\\s")[1])); - } else { - if (removal) removePlayerExp(p, Integer.parseInt(command.split("\\s")[1])); - } - //if the message is empty don't send - if (plugin.config.getBoolean("purchase.xp.enable") && removal) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.xp.success")).replaceAll("%cp-args%", command.split("\\s")[1])); - } - return PaywallOutput.Passed; - } else { - if (plugin.config.getBoolean("purchase.xp.enable")) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.xp.failure"))); - } - return PaywallOutput.Blocked; - } - } catch (Exception buyc) { - plugin.debug(buyc, p); - plugin.tex.sendString(p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + command); - return PaywallOutput.Blocked; - } - } - case "data-paywall=": { - String command = plugin.tex.placeholders(panel, PanelPosition.Top, p, rawCommand); - //if player uses data-paywall= - try { - if (Double.parseDouble(plugin.panelData.getUserData(p.getUniqueId(), command.split("\\s")[1])) >= Double.parseDouble(command.split("\\s")[2])) { - if (removal) - plugin.panelData.doDataMath(p.getUniqueId(), command.split("\\s")[1], "-" + plugin.tex.placeholdersNoColour(panel, PanelPosition.Top, p, command.split("\\s")[2])); - //if the message is empty don't send - if (plugin.config.getBoolean("purchase.data.enable")) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.data.success")).replaceAll("%cp-args%", command.split("\\s")[1])); - } - return PaywallOutput.Passed; - } else { - if (plugin.config.getBoolean("purchase.data.enable")) { - plugin.tex.sendString(panel, PanelPosition.Top, p, Objects.requireNonNull(plugin.config.getString("purchase.data.failure"))); - } - return PaywallOutput.Blocked; - } - } catch (Exception buyc) { - plugin.debug(buyc, p); - plugin.tex.sendString(p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + command); - return PaywallOutput.Blocked; - } - } - } - } - - //Experience math is a bit doggy doo doo so these will help to calculate values - // Calculate total experience up to a level - - // @author thelonelywolf@https://github.com/TheLonelyWolf1 - // @date 06 August 2021 - private int getExpAtLevel(int level) { - if (level <= 16) { - return (int) (Math.pow(level, 2) + 6 * level); - } else if (level <= 31) { - return (int) (2.5 * Math.pow(level, 2) - 40.5 * level + 360.0); - } else { - return (int) (4.5 * Math.pow(level, 2) - 162.5 * level + 2220.0); - } - } - - // Calculate amount of EXP needed to level up - private int getExpToLevelUp(int level) { - if (level <= 15) { - return 2 * level + 7; - } else if (level <= 30) { - return 5 * level - 38; - } else { - return 9 * level - 158; - } - } - - // Calculate player's current EXP amount - private int getPlayerExp(Player player) { - int exp = 0; - int level = player.getLevel(); - - // Get the amount of XP in past levels - exp += getExpAtLevel(level); - - // Get amount of XP towards next level - exp += Math.round(getExpToLevelUp(level) * player.getExp()); - - return exp; - } - - // Take EXP - private int removePlayerExp(Player player, int exp) { - // Get player's current exp - int currentExp = getPlayerExp(player); - - // Reset player's current exp to 0 - player.setExp(0); - player.setLevel(0); - - // Give the player their exp back, with the difference - int newExp = currentExp - exp; - player.giveExp(newExp); - - // Return the player's new exp amount - return newExp; - } -} diff --git a/src/me/rockyhawk/commandpanels/commandtags/PaywallEvent.java b/src/me/rockyhawk/commandpanels/commandtags/PaywallEvent.java new file mode 100644 index 0000000..b6d5f12 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/commandtags/PaywallEvent.java @@ -0,0 +1,57 @@ +package me.rockyhawk.commandpanels.commandtags; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.api.Panel; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PaywallEvent extends Event { + + public final Player p; + public final Panel panel; + public String[] raw; + public String[] args; + public String name; + public PanelPosition pos; + public boolean doDelete = true; //if payment should be removed or not + public PaywallOutput PAYWALL_OUTPUT = PaywallOutput.NotApplicable; //the final output + + public PaywallEvent(CommandPanels plugin, Panel panel1, PanelPosition position, Player player, String rawCommand1) { + this.p = player; + this.panel = panel1; + this.pos = position; + + //do nopapi= tag which will stop PlaceholderAPI placeholders from executing + boolean doApiPlaceholders = true; + if(rawCommand1.startsWith("nopapi= ")){ + rawCommand1 = rawCommand1.replace("nopapi= ",""); + doApiPlaceholders = false; + } + + String[] split = rawCommand1.split(" ", 2); + if(split.length == 1){ + split = new String[]{split[0],""}; + } + + this.name = split[0].trim(); + this.raw = split[1].trim().split("\\s"); + if(doApiPlaceholders) { + this.args = plugin.tex.attachPlaceholders(panel1,pos, player, split[1].trim()).split("\\s"); + }else{ + this.args = ChatColor.translateAlternateColorCodes('&',plugin.placeholders.setPlaceholders(panel, pos, p,split[1].trim(),false)).split("\\s"); + this.args = ChatColor.translateAlternateColorCodes('&',plugin.placeholders.setPlaceholders(panel, pos, p,split[1].trim(),true)).split("\\s"); + } + } + + private static final HandlerList HANDLERS = new HandlerList(); + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } +} diff --git a/src/me/rockyhawk/commandpanels/commandtags/paywalls/DataPaywall.java b/src/me/rockyhawk/commandpanels/commandtags/paywalls/DataPaywall.java new file mode 100644 index 0000000..fc3227a --- /dev/null +++ b/src/me/rockyhawk/commandpanels/commandtags/paywalls/DataPaywall.java @@ -0,0 +1,44 @@ +package me.rockyhawk.commandpanels.commandtags.paywalls; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.commandtags.PaywallEvent; +import me.rockyhawk.commandpanels.commandtags.PaywallOutput; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.Objects; + +public class DataPaywall implements Listener { + CommandPanels plugin; + public DataPaywall(CommandPanels pl) { + this.plugin = pl; + } + + @EventHandler + public void commandTag(PaywallEvent e){ + if(e.name.equalsIgnoreCase("data-paywall=")){ + //if player uses data-paywall= + try { + if (Double.parseDouble(plugin.panelData.getUserData(e.p.getUniqueId(), e.args[0])) >= Double.parseDouble(e.args[1])) { + if (e.doDelete) + plugin.panelData.doDataMath(e.p.getUniqueId(), e.args[0], "-" + plugin.tex.placeholdersNoColour(e.panel, PanelPosition.Top, e.p, e.args[1])); + //if the message is empty don't send + if (plugin.config.getBoolean("purchase.data.enable")) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.data.success")).replaceAll("%cp-args%", e.args[0])); + } + e.PAYWALL_OUTPUT = PaywallOutput.Passed; + } else { + if (plugin.config.getBoolean("purchase.data.enable")) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.data.failure"))); + } + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } catch (Exception buyc) { + plugin.debug(buyc, e.p); + plugin.tex.sendString(e.p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + e.name); + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } + } +} diff --git a/src/me/rockyhawk/commandpanels/commandtags/paywalls/Hasperm.java b/src/me/rockyhawk/commandpanels/commandtags/paywalls/Hasperm.java new file mode 100644 index 0000000..9e8cf57 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/commandtags/paywalls/Hasperm.java @@ -0,0 +1,35 @@ +package me.rockyhawk.commandpanels.commandtags.paywalls; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.commandtags.PaywallEvent; +import me.rockyhawk.commandpanels.commandtags.PaywallOutput; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.Objects; + +public class Hasperm implements Listener { + CommandPanels plugin; + public Hasperm(CommandPanels pl) { + this.plugin = pl; + } + + @EventHandler + public void commandTag(PaywallEvent e){ + if(e.name.equalsIgnoreCase("hasperm=")){ + //if player uses hasperm= [perm] + if (e.p.hasPermission(e.args[0])) { + if (plugin.config.getBoolean("purchase.permission.enable") && e.doDelete) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.permission.success")).replaceAll("%cp-args%", e.args[0])); + } + e.PAYWALL_OUTPUT = PaywallOutput.Passed; + } else { + if (plugin.config.getBoolean("purchase.currency.enable")) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.permission.failure"))); + } + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } + } +} diff --git a/src/me/rockyhawk/commandpanels/commandtags/paywalls/ItemPaywall.java b/src/me/rockyhawk/commandpanels/commandtags/paywalls/ItemPaywall.java new file mode 100644 index 0000000..5ac038b --- /dev/null +++ b/src/me/rockyhawk/commandpanels/commandtags/paywalls/ItemPaywall.java @@ -0,0 +1,176 @@ +package me.rockyhawk.commandpanels.commandtags.paywalls; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.commandtags.PaywallEvent; +import me.rockyhawk.commandpanels.commandtags.PaywallOutput; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +public class ItemPaywall implements Listener { + CommandPanels plugin; + public ItemPaywall(CommandPanels pl) { + this.plugin = pl; + } + + @EventHandler + public void commandTag(PaywallEvent e){ + if(e.name.equalsIgnoreCase("item-paywall=")){ + //if player uses item-paywall= [Material] [Amount] WILL NOT TAKE CUSTOM ITEMS. IGNORENBT lets nbt items through. Useful for spawner edge cases. + //player can use item-paywall= [custom-item] [Amount] + List cont = new ArrayList<>(Arrays.asList(plugin.inventorySaver.getNormalInventory(e.p))); + HashMap remCont = new HashMap<>(); + try { + int id = -1; + boolean ignoreNBT = false; + for (String val : e.args) { + //item ID for legacy minecraft versions + if (val.startsWith("id:")) { + id = Integer.parseInt(val.substring(3)); + } + //This is here for when people want to take nbt items like spawners with types in a check for spawners. + if(val.equals("IGNORENBT")){ + ignoreNBT = true; + } + } + + //create the item to be removed + ItemStack sellItem; + if (Material.matchMaterial(e.args[0]) == null) { + sellItem = plugin.itemCreate.makeCustomItemFromConfig(e.panel, PanelPosition.Top, e.panel.getConfig().getConfigurationSection("custom-item." + e.args[0]), e.p, true, true, false); + sellItem.setAmount(Integer.parseInt(e.args[1])); + } else { + sellItem = new ItemStack(Objects.requireNonNull(Material.matchMaterial(e.args[1])), Integer.parseInt(e.args[2])); + } + //this is not a boolean because it needs to return an int + PaywallOutput removedItem = PaywallOutput.Blocked; + + int remainingAmount = sellItem.getAmount(); + //loop through items in the inventory + for (int f = 0; f < 36; f++) { + + if (cont.get(f) == null) { + //skip slot if empty + continue; + } + + ItemStack itm = cont.get(f); + + if (Material.matchMaterial(e.args[0]) == null) { + //if custom item is a mmo item (1.14+ for the API) + try { + if (plugin.getServer().getPluginManager().isPluginEnabled("MMOItems") && e.panel.getConfig().getString("custom-item." + e.args[0] + ".material").startsWith("mmo=")) { + String customItemMaterial = e.panel.getConfig().getString("custom-item." + e.args[0] + ".material"); + String mmoType = customItemMaterial.split("\\s")[1]; + String mmoID = customItemMaterial.split("\\s")[2]; + + if (plugin.isMMOItem(itm, mmoType, mmoID)) { + ItemStack add = new ItemStack(e.p.getInventory().getItem(f).getType(), e.p.getInventory().getItem(f).getAmount()); + remainingAmount -= add.getAmount(); + if (e.doDelete) remCont.put(f,add); + if (remainingAmount <= 0) { + removedItem = PaywallOutput.Passed; + break; + } + } + continue; //This stops the other custom item section from reading and adding false numbers. + } + } catch (Exception ex) { + plugin.debug(ex, e.p); + } + + //item-paywall is a custom item as it is not a material + if (plugin.itemCreate.isIdentical(sellItem, itm, Objects.requireNonNull(e.panel.getConfig().getConfigurationSection("custom-item." + e.args[0])).contains("nbt"))) { + ItemStack add = new ItemStack(e.p.getInventory().getItem(f).getType(), e.p.getInventory().getItem(f).getAmount()); + remainingAmount -= add.getAmount(); + if (e.doDelete) remCont.put(f,add); + if (remainingAmount <= 0) { + removedItem = PaywallOutput.Passed; + break; + } + } + + } else { + //if the item is a standard material + if (itm.getType() == sellItem.getType()) { + if(itm.hasItemMeta() && !ignoreNBT){ + //If item has custom meta continue to next item. + continue; + } + + //Check if the item matches the id set. If not continue to next in loop. + if (id != -1 && itm.getDurability() != id) { + continue; + } + + //Adding item to the remove list then checking if we have reached the required amount. + ItemStack add = new ItemStack(itm.getType(), itm.getAmount()); + remainingAmount -= add.getAmount(); + if (e.doDelete) remCont.put(f,add); + if (remainingAmount <= 0) { + removedItem = PaywallOutput.Passed; + break; + } + } + } + } + + if (remainingAmount <= 0) { + for(Map.Entry entry : remCont.entrySet()) { + ItemStack remItem = entry.getValue(); + + //Check if its the last item in the loop and only subtract the remaining amount. + if (sellItem.getAmount() < remItem.getAmount()) { + if (plugin.inventorySaver.hasNormalInventory(e.p)) { + if (e.doDelete) + e.p.getInventory().getItem(entry.getKey()).setAmount(remItem.getAmount() - sellItem.getAmount()); + e.p.updateInventory(); + } else { + if (e.doDelete) + cont.get(entry.getKey()).setAmount(remItem.getAmount() - sellItem.getAmount()); + plugin.inventorySaver.inventoryConfig.set(e.p.getUniqueId().toString(), plugin.itemSerializer.itemStackArrayToBase64(cont.toArray(new ItemStack[0]))); + } + } else { //If its anywhere but the last in loop just get rid of the items. + if (plugin.inventorySaver.hasNormalInventory(e.p)) { + if (e.doDelete) e.p.getInventory().setItem(entry.getKey(), null); + //p.getInventory().remove(entry.getValue()); + //p.getInventory().getItem(entry.getKey()).setAmount(0); + e.p.updateInventory(); + } else { + if (e.doDelete) cont.remove(entry.getValue()); + //cont.get(entry.getKey()).setAmount(0); + plugin.inventorySaver.inventoryConfig.set(e.p.getUniqueId().toString(), plugin.itemSerializer.itemStackArrayToBase64(cont.toArray(new ItemStack[0]))); + } + } + + if (e.doDelete) sellItem.setAmount(sellItem.getAmount() - remItem.getAmount()); + } + + removedItem = PaywallOutput.Passed; + } + + //send message and return + if (removedItem == PaywallOutput.Blocked) { + if (plugin.config.getBoolean("purchase.item.enable")) { + //no item was found + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.failure"))); + } + } else { + if (plugin.config.getBoolean("purchase.item.enable") && e.doDelete) { + //item was removed + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.success")).replaceAll("%cp-args%", e.args[0])); + } + } + e.PAYWALL_OUTPUT = removedItem; + } catch (Exception buyc) { + plugin.debug(buyc, e.p); + plugin.tex.sendString(e.p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + e.name); + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } + } +} diff --git a/src/me/rockyhawk/commandpanels/commandtags/paywalls/Paywall.java b/src/me/rockyhawk/commandpanels/commandtags/paywalls/Paywall.java new file mode 100644 index 0000000..984111b --- /dev/null +++ b/src/me/rockyhawk/commandpanels/commandtags/paywalls/Paywall.java @@ -0,0 +1,49 @@ +package me.rockyhawk.commandpanels.commandtags.paywalls; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.commandtags.PaywallEvent; +import me.rockyhawk.commandpanels.commandtags.PaywallOutput; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.Objects; + +public class Paywall implements Listener { + CommandPanels plugin; + public Paywall(CommandPanels pl) { + this.plugin = pl; + } + + @EventHandler + public void commandTag(PaywallEvent e){ + if(e.name.equalsIgnoreCase("paywall=")){ + //if player uses paywall= [price] + try { + if (plugin.econ != null) { + double paywallAmount = Double.parseDouble(e.args[0]); + if (plugin.econ.getBalance(e.p) >= paywallAmount) { + if (e.doDelete) plugin.econ.withdrawPlayer(e.p, paywallAmount); + if (plugin.config.getBoolean("purchase.currency.enable") && e.doDelete) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.currency.success")).replaceAll("%cp-args%", e.args[0])); + } + e.PAYWALL_OUTPUT = PaywallOutput.Passed; + } else { + if (plugin.config.getBoolean("purchase.currency.enable")) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.currency.failure"))); + } + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } else { + plugin.tex.sendString(e.p, plugin.tag + ChatColor.RED + "Paying Requires Vault and an Economy to work!"); + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } catch (Exception buyc) { + plugin.debug(buyc, e.p); + plugin.tex.sendString(e.p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + e.name); + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } + } +} diff --git a/src/me/rockyhawk/commandpanels/commandtags/paywalls/XpPaywall.java b/src/me/rockyhawk/commandpanels/commandtags/paywalls/XpPaywall.java new file mode 100644 index 0000000..b4a73a9 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/commandtags/paywalls/XpPaywall.java @@ -0,0 +1,111 @@ +package me.rockyhawk.commandpanels.commandtags.paywalls; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.commandtags.PaywallEvent; +import me.rockyhawk.commandpanels.commandtags.PaywallOutput; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.Objects; + +public class XpPaywall implements Listener { + CommandPanels plugin; + public XpPaywall(CommandPanels pl) { + this.plugin = pl; + } + + @EventHandler + public void commandTag(PaywallEvent e){ + if(e.name.equalsIgnoreCase("xp-paywall=")){ + //if player uses xp-paywall= + try { + int balance; + if (e.args[1].startsWith("level")) { + balance = e.p.getLevel(); + } else { + balance = getPlayerExp(e.p); + } + if (balance >= Integer.parseInt(e.args[0])) { + if (e.args[1].startsWith("level")) { + if (e.doDelete) e.p.setLevel(e.p.getLevel() - Integer.parseInt(e.args[0])); + } else { + if (e.doDelete) removePlayerExp(e.p, Integer.parseInt(e.args[0])); + } + //if the message is empty don't send + if (plugin.config.getBoolean("purchase.xp.enable") && e.doDelete) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.xp.success")).replaceAll("%cp-args%", e.args[0])); + } + e.PAYWALL_OUTPUT = PaywallOutput.Passed; + } else { + if (plugin.config.getBoolean("purchase.xp.enable")) { + plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.xp.failure"))); + } + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } catch (Exception buyc) { + plugin.debug(buyc, e.p); + plugin.tex.sendString(e.p, plugin.tag + plugin.config.getString("config.format.error") + " " + "commands: " + e.name); + e.PAYWALL_OUTPUT = PaywallOutput.Blocked; + } + } + } + + //Experience math is a bit doggy doo doo so these will help to calculate values + // Calculate total experience up to a level + + // @author thelonelywolf@https://github.com/TheLonelyWolf1 + // @date 06 August 2021 + private int getExpAtLevel(int level) { + if (level <= 16) { + return (int) (Math.pow(level, 2) + 6 * level); + } else if (level <= 31) { + return (int) (2.5 * Math.pow(level, 2) - 40.5 * level + 360.0); + } else { + return (int) (4.5 * Math.pow(level, 2) - 162.5 * level + 2220.0); + } + } + + // Calculate amount of EXP needed to level up + private int getExpToLevelUp(int level) { + if (level <= 15) { + return 2 * level + 7; + } else if (level <= 30) { + return 5 * level - 38; + } else { + return 9 * level - 158; + } + } + + // Calculate player's current EXP amount + private int getPlayerExp(Player player) { + int exp = 0; + int level = player.getLevel(); + + // Get the amount of XP in past levels + exp += getExpAtLevel(level); + + // Get amount of XP towards next level + exp += Math.round(getExpToLevelUp(level) * player.getExp()); + + return exp; + } + + // Take EXP + private int removePlayerExp(Player player, int exp) { + // Get player's current exp + int currentExp = getPlayerExp(player); + + // Reset player's current exp to 0 + player.setExp(0); + player.setLevel(0); + + // Give the player their exp back, with the difference + int newExp = currentExp - exp; + player.giveExp(newExp); + + // Return the player's new exp amount + return newExp; + } +} diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyCommandTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyCommandTags.java deleted file mode 100644 index 837c85b..0000000 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyCommandTags.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.rockyhawk.commandpanels.commandtags.tags.economy; - -import me.realized.tokenmanager.api.TokenManager; -import me.rockyhawk.commandpanels.CommandPanels; -import me.rockyhawk.commandpanels.commandtags.CommandTagEvent; -import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -import java.util.Arrays; -import java.util.Objects; - -public class BuyCommandTags implements Listener { - CommandPanels plugin; - public BuyCommandTags(CommandPanels pl) { - this.plugin = pl; - } - - @EventHandler - public void commandTag(CommandTagEvent e){ - if(e.name.equalsIgnoreCase("buycommand=")){ - e.commandTagUsed(); - //if player uses buycommand [price] [command] - try { - if (plugin.econ != null) { - if (plugin.econ.getBalance(e.p) >= Double.parseDouble(e.args[0])) { - plugin.econ.withdrawPlayer(e.p, Double.parseDouble(e.args[0])); - //execute command under here - String price = e.args[0]; - String command = String.join(" ",Arrays.copyOfRange(e.raw, 1, e.raw.length)); - plugin.commandTags.runCommand(e.panel,e.pos,e.p,command); - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.currency.success")).replaceAll("%cp-args%", price)); - } else { - String price = e.args[0]; - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.currency.failure"))); - } - } else { - plugin.tex.sendMessage(e.p, ChatColor.RED + "Buying Requires Vault and an Economy to work!"); - } - } catch (Exception buyc) { - plugin.debug(buyc,e.p); - plugin.tex.sendMessage(e.p,plugin.config.getString("config.format.error") + " " + "commands: " + e.name); - } - return; - } - if(e.name.equalsIgnoreCase("tokenbuycommand=")){ - e.commandTagUsed(); - //if player uses tokenbuycommand [price] [command] - try { - if (plugin.getServer().getPluginManager().isPluginEnabled("TokenManager")) { - TokenManager api = (TokenManager) Bukkit.getServer().getPluginManager().getPlugin("TokenManager"); - assert api != null; - int balance = Integer.parseInt(Long.toString(api.getTokens(e.p).orElse(0))); - if (balance >= Double.parseDouble(e.args[0])) { - api.removeTokens(e.p, Long.parseLong(e.args[0])); - //execute command under here - String price = e.args[0]; - String command = String.join(" ",Arrays.copyOfRange(e.raw, 1, e.raw.length)); - plugin.commandTags.runCommand(e.panel,e.pos,e.p,command); - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.success")).replaceAll("%cp-args%", price)); - } else { - String price = e.args[0]; - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.failure"))); - } - } else { - plugin.tex.sendMessage(e.p, ChatColor.RED + "Buying Requires Vault and an Economy to work!"); - } - } catch (Exception buyc) { - plugin.debug(buyc,e.p); - plugin.tex.sendMessage(e.p, plugin.config.getString("config.format.error") + " " + "commands: " + e.name); - } - } - } -} diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyItemTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyItemTags.java deleted file mode 100644 index e606e7e..0000000 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyItemTags.java +++ /dev/null @@ -1,90 +0,0 @@ -package me.rockyhawk.commandpanels.commandtags.tags.economy; - -import me.realized.tokenmanager.api.TokenManager; -import me.rockyhawk.commandpanels.CommandPanels; -import me.rockyhawk.commandpanels.commandtags.CommandTagEvent; -import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions; -import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; - -import java.util.Objects; - -public class BuyItemTags implements Listener { - CommandPanels plugin; - public BuyItemTags(CommandPanels pl) { - this.plugin = pl; - } - - @EventHandler - public void commandTag(CommandTagEvent e){ - if(e.name.equalsIgnoreCase("buy=")){ - e.commandTagUsed(); - //if player uses buy= it will be eg. buy= - try { - if (plugin.econ != null) { - if (plugin.econ.getBalance(e.p) >= Double.parseDouble(e.args[0])) { - plugin.econ.withdrawPlayer(e.p, Double.parseDouble(e.args[0])); - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.currency.success")).replaceAll("%cp-args%", e.args[0])); - giveItem(e.p, e.args); - } else { - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.currency.failure"))); - - } - } else { - plugin.tex.sendMessage(e.p, ChatColor.RED + "Buying Requires Vault and an Economy to work!"); - } - } catch (Exception buy) { - plugin.debug(buy,e.p); - plugin.tex.sendMessage(e.p, plugin.config.getString("config.format.error") + " " + "commands: " + e.name); - } - return; - } - if(e.name.equalsIgnoreCase("tokenbuy=")) { - e.commandTagUsed(); - //if player uses tokenbuy= it will be eg. tokenbuy= - try { - if (plugin.getServer().getPluginManager().isPluginEnabled("TokenManager")) { - final TokenManager api = (TokenManager) Bukkit.getServer().getPluginManager().getPlugin("TokenManager"); - assert api != null; - int balance = Integer.parseInt(Long.toString(api.getTokens(e.p).orElse(0))); - if (balance >= Double.parseDouble(e.args[0])) { - api.removeTokens(e.p, Long.parseLong(e.args[0])); - plugin.tex.sendMessage(e.p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.success")).replaceAll("%cp-args%", e.args[0])); - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.success")).replaceAll("%cp-args%", e.args[0])); - - giveItem(e.p,e.args); - } else { - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.failure"))); - - } - } else { - plugin.tex.sendMessage(e.p, ChatColor.RED + "Buying Requires TokenManager to work!"); - } - } catch (Exception buy) { - plugin.debug(buy, e.p); - plugin.tex.sendMessage(e.p, plugin.config.getString("config.format.error") + " " + "commands: " + e.name); - } - } - } - - @SuppressWarnings("deprecation") - private void giveItem(Player p, String[] args){ - //legacy ID - byte id = 0; - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)) { - for (String argsTemp : args) { - if (argsTemp.startsWith("id:")) { - id = Byte.parseByte(argsTemp.replace("id:", "")); - break; - } - } - } - plugin.inventorySaver.addItem(p,new ItemStack(Objects.requireNonNull(Material.matchMaterial(args[1])), Integer.parseInt(args[2]),id)); - } -} diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/SellItemTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/economy/SellItemTags.java deleted file mode 100644 index 8b2b2d7..0000000 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/SellItemTags.java +++ /dev/null @@ -1,205 +0,0 @@ -package me.rockyhawk.commandpanels.commandtags.tags.economy; - -import me.realized.tokenmanager.api.TokenManager; -import me.rockyhawk.commandpanels.CommandPanels; -import me.rockyhawk.commandpanels.commandtags.CommandTagEvent; -import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions; -import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.PotionMeta; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class SellItemTags implements Listener { - CommandPanels plugin; - public SellItemTags(CommandPanels pl) { - this.plugin = pl; - } - - @EventHandler - public void commandTag(CommandTagEvent e){ - if(e.name.equalsIgnoreCase("sell=")){ - e.commandTagUsed(); - //if player uses sell= it will be eg. sell= [enchanted:KNOCKBACK:1] [potion:JUMP] [custom-data:#] - try { - if (plugin.econ != null) { - int sold = removeItem(e.p, e.args, false); - if (sold <= 0) { - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.failure"))); - } else { - plugin.econ.depositPlayer(e.p, Double.parseDouble(e.args[0])); - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.success")).replaceAll("%cp-args%", e.args[1]).replaceAll("%cp-args2%", "$" + e.args[0])); - } - } else { - plugin.tex.sendMessage(e.p, ChatColor.RED + "Selling Requires Vault and an Economy to work!"); - } - } catch (Exception sell) { - plugin.debug(sell,e.p); - plugin.tex.sendMessage(e.p, plugin.config.getString("config.format.error") + " " + "commands: " + e.name); - } - return; - } - if(e.name.equalsIgnoreCase("sellall=")){ - e.commandTagUsed(); - //if player uses sell-all= it will be eg. sell-all= [enchanted:KNOCKBACK:1] [potion:JUMP] - try { - if (plugin.econ != null) { - int sold = removeItem(e.p, e.args, true); - if (sold <= 0) { - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.failure"))); - } else { - plugin.econ.depositPlayer(e.p, Double.parseDouble(e.args[0]) * sold); - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.success")).replaceAll("%cp-args%", e.args[1]).replaceAll("%cp-args2%", "$" + Double.parseDouble(e.args[0]) * sold)); - } - } else { - plugin.tex.sendMessage(e.p, ChatColor.RED + "Selling Requires Vault and an Economy to work!"); - } - } catch (Exception sell) { - plugin.debug(sell,e.p); - plugin.tex.sendMessage(e.p, plugin.config.getString("config.format.error") + " " + "commands: " + e.name); - } - return; - } - if(e.name.equalsIgnoreCase("tokensell=")) { - e.commandTagUsed(); - //if player uses tokensell= it will be eg. tokensell= [enchanted:KNOCKBACK:1] [potion:JUMP] - try { - if (plugin.getServer().getPluginManager().isPluginEnabled("TokenManager")) { - final TokenManager api = (TokenManager) Bukkit.getServer().getPluginManager().getPlugin("TokenManager"); - int sold = removeItem(e.p, e.args, false); - if (sold <= 0) { - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.failure"))); - } else { - assert api != null; - api.addTokens(e.p, Long.parseLong(e.args[0])); - plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.success")).replaceAll("%cp-args%", e.args[1])); - } - } else { - plugin.tex.sendMessage(e.p, ChatColor.RED + "Selling Requires TokenManager to work!"); - } - } catch (Exception sell) { - plugin.debug(sell,e.p); - plugin.tex.sendMessage(e.p, plugin.config.getString("config.format.error") + " " + "commands: " + e.name); - } - } - } - - //returns false if player does not have item - private int removeItem(Player p, String[] args, boolean removeAll){ - //get inventory slots and then an empty list to store slots that have the item to sell - List cont = new ArrayList<>(Arrays.asList(plugin.inventorySaver.getNormalInventory(p))); - List remCont = new ArrayList<>(); - byte id = -1; - String potion = "false"; - int customData = 0; - boolean noCustom = false; - for(String argsTemp : args){ - if(argsTemp.startsWith("potion:")){ - potion = argsTemp.replace("potion:",""); - } - if (argsTemp.startsWith("id:")) { - id = Byte.parseByte(argsTemp.replace("id:", "")); - } - if (argsTemp.startsWith("custom-data:")) { - customData = Integer.parseInt(argsTemp.replace("custom-data:", "")); - } - if (argsTemp.contains("NOCUSTOMDATA")) { - noCustom = true; - } - } - - //create an itemstack of the item to sell and the amount to sell (0 if all as args[2] will not be an amount) - ItemStack sellItem = new ItemStack(Objects.requireNonNull(Material.matchMaterial(args[1])), removeAll ? 0 : Integer.parseInt(args[2])); - int remainingAmount = removeAll ? 0 : sellItem.getAmount(); - for (int f = 0; f < 36; f++) { - ItemStack itm = cont.get(f); - ItemStack remItm; - if (itm != null && itm.getType().equals(sellItem.getType())) { - remItm = new ItemStack(itm.getType(), itm.getAmount(), (short)f); - //check to ensure any extensions are checked - try { - if (!potion.equals("false")) { - PotionMeta potionMeta = (PotionMeta) itm.getItemMeta(); - assert potionMeta != null; - if (!potionMeta.getBasePotionData().getType().name().equalsIgnoreCase(potion)) { - p.sendMessage(plugin.tex.colour( plugin.tag + ChatColor.RED + "Your item has the wrong potion effect")); - return 0; - } - } - //Check if the item matches the id set. If not continue to next in loop. - if(id != -1 && itm.getDurability() != id){ - continue; - } - //Check if noCustom is set and if the item has custom data. If so continue to next in loop. - if(noCustom && cont.get(f).hasItemMeta()){ - if(Objects.requireNonNull(cont.get(f).getItemMeta()).hasCustomModelData()){ - continue; - } - } - //Check if custom model data is set and if the item has that data. If not continue to next in loop. - if (customData != 0) { - if (!itm.hasItemMeta()) { - continue; - } else { - if(Objects.requireNonNull(itm.getItemMeta()).getCustomModelData() != customData){ - continue; - } - } - } - }catch(Exception exc){ - //skip if it cannot do unless plugin.debug is enabled - plugin.debug(exc,p); - } - - remCont.add(remItm); - - //if the remaining amount has been reached, break otherwise sell all - if (!removeAll) { - remainingAmount -= remItm.getAmount(); - if (remainingAmount <= 0) { - break; - } - } else { - sellItem.setAmount(sellItem.getAmount() + remItm.getAmount()); - } - } - } - - if(remainingAmount <= 0){ - int removedItems = 0; - for (int f = 0; f <= remCont.size() - 1; f++) { - ItemStack remItm = remCont.get(f); - if(f == remCont.size() - 1){ - if(plugin.inventorySaver.hasNormalInventory(p)){ - p.getInventory().getItem(remItm.getDurability()).setAmount(remItm.getAmount() - sellItem.getAmount()); - p.updateInventory(); - }else{ - cont.get(remItm.getDurability()).setAmount(remItm.getAmount() - sellItem.getAmount()); - plugin.inventorySaver.inventoryConfig.set(p.getUniqueId().toString(), plugin.itemSerializer.itemStackArrayToBase64(cont.toArray(new ItemStack[0]))); - } - } else { - if(plugin.inventorySaver.hasNormalInventory(p)){ - p.getInventory().getItem(remItm.getDurability()).setAmount(0); - p.updateInventory(); - }else{ - cont.get(remItm.getDurability()).setAmount(0); - plugin.inventorySaver.inventoryConfig.set(p.getUniqueId().toString(), plugin.itemSerializer.itemStackArrayToBase64(cont.toArray(new ItemStack[0]))); - } - } - removedItems += remItm.getAmount(); - sellItem.setAmount(sellItem.getAmount() - remItm.getAmount()); - } - return removedItems; - } - return 0; - } -} diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/other/SpecialTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/other/SpecialTags.java index a723752..7becdc9 100644 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/other/SpecialTags.java +++ b/src/me/rockyhawk/commandpanels/commandtags/tags/other/SpecialTags.java @@ -66,7 +66,7 @@ public class SpecialTags implements Listener { plugin.openPanels.closePanelForLoader(e.p.getName(),PanelPosition.Bottom); }else if(position == PanelPosition.Top && plugin.openPanels.hasPanelOpen(e.p.getName(),position)){ //closing top closes all - plugin.commandTags.runCommand(e.panel,e.pos,e.p,"cpc"); + plugin.commandRunner.runCommand(e.panel,e.pos,e.p,"cpc"); } return; } @@ -139,7 +139,7 @@ public class SpecialTags implements Listener { @Override public void run() { try { - plugin.commandTags.runCommand(e.panel,e.pos, e.p, finalCommand); + plugin.commandRunner.runCommand(e.panel,e.pos, e.p, finalCommand); } catch (Exception ex) { //if there are any errors, cancel so that it doesn't loop errors plugin.debug(ex, e.p); diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java index a5aab8e..ed42c34 100644 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java +++ b/src/me/rockyhawk/commandpanels/commandtags/tags/standard/BasicTags.java @@ -138,7 +138,7 @@ public class BasicTags implements Listener { if(e.name.equalsIgnoreCase("minimessage=")){ e.commandTagUsed(); //get checks - boolean isVersionCompatible = plugin.legacy.LOCAL_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_18); + boolean isVersionCompatible = plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_18); boolean isPaper = Bukkit.getServer().getVersion().contains("Paper"); boolean allowUnsafeMiniMessage = plugin.config.getBoolean("config.allow-unsafe-mini-message"); //do mini message if conditions are met diff --git a/src/me/rockyhawk/commandpanels/floodgatecp/OpenFloodgateGUI.java b/src/me/rockyhawk/commandpanels/floodgatecp/OpenFloodgateGUI.java index 7af4b5f..e37c899 100644 --- a/src/me/rockyhawk/commandpanels/floodgatecp/OpenFloodgateGUI.java +++ b/src/me/rockyhawk/commandpanels/floodgatecp/OpenFloodgateGUI.java @@ -65,7 +65,7 @@ public class OpenFloodgateGUI implements Listener { int clickedButtonId = response.clickedButtonId(); String configKey = buttonCommands.get(clickedButtonId); if(fgPanel.contains(configKey + ".commands")) { - plugin.commandTags.runCommands(e.getPanel(), PanelPosition.Top, e.getPlayer(), fgPanel.getStringList(configKey + ".commands")); + plugin.commandRunner.runCommands(e.getPanel(), PanelPosition.Top, e.getPlayer(), fgPanel.getStringList(configKey + ".commands"), null); } }); @@ -153,7 +153,7 @@ public class OpenFloodgateGUI implements Listener { for (String command : commands) { processedCommands.add(command.replaceAll("%cp-input%", value)); // Replace the placeholder in each command } - plugin.commandTags.runCommands(e.getPanel(), PanelPosition.Top, e.getPlayer(), processedCommands); // Execute the processed commands + plugin.commandRunner.runCommands(e.getPanel(), PanelPosition.Top, e.getPlayer(), processedCommands, null); // Execute the processed commands } } }); diff --git a/src/me/rockyhawk/commandpanels/generatepanels/GenUtils.java b/src/me/rockyhawk/commandpanels/generatepanels/GenUtils.java index 8ead815..a37eaa0 100644 --- a/src/me/rockyhawk/commandpanels/generatepanels/GenUtils.java +++ b/src/me/rockyhawk/commandpanels/generatepanels/GenUtils.java @@ -96,7 +96,7 @@ public class GenUtils implements Listener { file.set("panels." + date + ".title", "&8Generated " + date); file.addDefault("panels." + date + ".command", date); - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)) { + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)) { file.set("panels." + date + ".empty", "STAINED_GLASS_PANE"); file.set("panels." + date + ".emptyID", "15"); }else{ diff --git a/src/me/rockyhawk/commandpanels/interactives/Commandpanelrefresher.java b/src/me/rockyhawk/commandpanels/interactives/Commandpanelrefresher.java index ea605e5..f91c15a 100644 --- a/src/me/rockyhawk/commandpanels/interactives/Commandpanelrefresher.java +++ b/src/me/rockyhawk/commandpanels/interactives/Commandpanelrefresher.java @@ -115,7 +115,7 @@ public class Commandpanelrefresher implements Listener { if(plugin.inventorySaver.hasNormalInventory(p)) { for (ItemStack itm : p.getInventory().getContents()) { if (itm != null) { - if (plugin.nbt.hasNBT(itm)) { + if (plugin.nbt.hasNBT(itm,"CommandPanelsItem")) { p.getInventory().remove(itm); } } diff --git a/src/me/rockyhawk/commandpanels/interactives/OpenOnJoin.java b/src/me/rockyhawk/commandpanels/interactives/OpenOnJoin.java index 4d932f6..8de105e 100644 --- a/src/me/rockyhawk/commandpanels/interactives/OpenOnJoin.java +++ b/src/me/rockyhawk/commandpanels/interactives/OpenOnJoin.java @@ -40,7 +40,7 @@ public class OpenOnJoin implements Listener { String joinString = joinType + (world.isEmpty() ? "" : "."+ world); if(plugin.config.contains(joinString)){ String command = "open= " + plugin.config.getString(joinString); - plugin.commandTags.runCommand(null, PanelPosition.Top,p, command); + plugin.commandRunner.runCommand(null, PanelPosition.Top,p, command); } } } diff --git a/src/me/rockyhawk/commandpanels/interactives/OutsideClickEvent.java b/src/me/rockyhawk/commandpanels/interactives/OutsideClickEvent.java index 4c3327e..f3e101a 100644 --- a/src/me/rockyhawk/commandpanels/interactives/OutsideClickEvent.java +++ b/src/me/rockyhawk/commandpanels/interactives/OutsideClickEvent.java @@ -28,7 +28,7 @@ public class OutsideClickEvent implements Listener { //if the panel is clicked on the outside area of the GUI if (plugin.config.contains("outside-commands")) { try { - plugin.commandTags.runCommands(null,PanelPosition.Top,p, plugin.config.getStringList("outside-commands"),e.getClick()); + plugin.commandRunner.runCommands(null,PanelPosition.Top,p, plugin.config.getStringList("outside-commands"),e.getClick()); }catch(Exception s){ plugin.debug(s,p); } diff --git a/src/me/rockyhawk/commandpanels/interactives/input/UserInputUtils.java b/src/me/rockyhawk/commandpanels/interactives/input/UserInputUtils.java index 4eabc7f..70c0a31 100644 --- a/src/me/rockyhawk/commandpanels/interactives/input/UserInputUtils.java +++ b/src/me/rockyhawk/commandpanels/interactives/input/UserInputUtils.java @@ -50,7 +50,7 @@ public class UserInputUtils implements Listener { plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { public void run() { - plugin.commandTags.runCommands(playerInput.get(e.getPlayer()).panel, PanelPosition.Top,e.getPlayer(), playerInput.get(e.getPlayer()).commands,playerInput.get(e.getPlayer()).click); //I have to do this to run regular Bukkit voids in an ASYNC Event + plugin.commandRunner.runCommands(playerInput.get(e.getPlayer()).panel, PanelPosition.Top,e.getPlayer(), playerInput.get(e.getPlayer()).commands,playerInput.get(e.getPlayer()).click); //I have to do this to run regular Bukkit voids in an ASYNC Event playerInput.remove(e.getPlayer()); } }); diff --git a/src/me/rockyhawk/commandpanels/ioclasses/GetItemInHand.java b/src/me/rockyhawk/commandpanels/ioclasses/iteminhand/GetItemInHand.java similarity index 86% rename from src/me/rockyhawk/commandpanels/ioclasses/GetItemInHand.java rename to src/me/rockyhawk/commandpanels/ioclasses/iteminhand/GetItemInHand.java index 82b50e9..4b7a9b3 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/GetItemInHand.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/iteminhand/GetItemInHand.java @@ -1,4 +1,4 @@ -package me.rockyhawk.commandpanels.ioclasses; +package me.rockyhawk.commandpanels.ioclasses.iteminhand; import me.rockyhawk.commandpanels.CommandPanels; import org.bukkit.entity.Player; diff --git a/src/me/rockyhawk/commandpanels/ioclasses/GetItemInHand_Legacy.java b/src/me/rockyhawk/commandpanels/ioclasses/iteminhand/GetItemInHand_Legacy.java similarity index 87% rename from src/me/rockyhawk/commandpanels/ioclasses/GetItemInHand_Legacy.java rename to src/me/rockyhawk/commandpanels/ioclasses/iteminhand/GetItemInHand_Legacy.java index 12e550c..d851445 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/GetItemInHand_Legacy.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/iteminhand/GetItemInHand_Legacy.java @@ -1,4 +1,4 @@ -package me.rockyhawk.commandpanels.ioclasses; +package me.rockyhawk.commandpanels.ioclasses.iteminhand; import me.rockyhawk.commandpanels.CommandPanels; import org.bukkit.entity.Player; diff --git a/src/me/rockyhawk/commandpanels/ioclasses/legacy/LegacyVersion.java b/src/me/rockyhawk/commandpanels/ioclasses/legacy/LegacyVersion.java index ed06f56..d586ca3 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/legacy/LegacyVersion.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/legacy/LegacyVersion.java @@ -1,24 +1,47 @@ package me.rockyhawk.commandpanels.ioclasses.legacy; import me.rockyhawk.commandpanels.CommandPanels; -import me.rockyhawk.commandpanels.ioclasses.GetStorageContents; -import me.rockyhawk.commandpanels.ioclasses.GetStorageContents_Legacy; -import org.bukkit.Bukkit; +import me.rockyhawk.commandpanels.ioclasses.storagecontents.GetStorageContents; +import me.rockyhawk.commandpanels.ioclasses.storagecontents.GetStorageContents_Legacy; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; public class LegacyVersion { CommandPanels plugin; - public MinecraftVersions LOCAL_VERSION; + public MinecraftVersions MAJOR_VERSION; //The major version of the server (eg, converts 1.20.5 to 1.20) + public int MINOR_VERSION; //The minor version of the server (1.20.5 to 5) public LegacyVersion(CommandPanels pl) { this.plugin = pl; - String VERSION = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; - LOCAL_VERSION = MinecraftVersions.get(VERSION); + String VERSION = plugin.getServer().getBukkitVersion().split("-")[0]; + MAJOR_VERSION = MinecraftVersions.get(extractMajorVersion(VERSION)); + MINOR_VERSION = extractMinorVersion(VERSION); } + public String extractMajorVersion(String version) { + String[] parts = version.split("\\."); + if (parts.length < 2) { + // Handle the case where there aren't enough parts for a "major.major.minor" format. + return version; // Return the original version. + } + return parts[0] + "." + parts[1]; + } + public Integer extractMinorVersion(String version) { + String[] parts = version.split("\\."); + if (parts.length > 2) { + // Take only the third part and convert it to an integer. + try { + return Integer.parseInt(parts[2]); + } catch (NumberFormatException e) { + return 0; + } + } + return 0; // Return 0 if there are no parts beyond the first two. + } + + public ItemStack[] getStorageContents(Inventory i){ - if(LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ + if(MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ return new GetStorageContents_Legacy(plugin).getStorageContents(i); }else{ return new GetStorageContents(plugin).getStorageContents(i); @@ -26,7 +49,7 @@ public class LegacyVersion { } public void setStorageContents(Player p, ItemStack[] i){ - if(LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){ + if(MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_15)){ new GetStorageContents_Legacy(plugin).setStorageContents(p,i); }else{ new GetStorageContents(plugin).setStorageContents(p,i); diff --git a/src/me/rockyhawk/commandpanels/ioclasses/legacy/MinecraftVersions.java b/src/me/rockyhawk/commandpanels/ioclasses/legacy/MinecraftVersions.java index 9be78e9..698c9ae 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/legacy/MinecraftVersions.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/legacy/MinecraftVersions.java @@ -1,25 +1,20 @@ package me.rockyhawk.commandpanels.ioclasses.legacy; public enum MinecraftVersions { - v1_8( "1_8", 0 ), - v1_9( "1_9", 1 ), - v1_10( "1_10", 2 ), - v1_11( "1_11", 3 ), - v1_12( "1_12", 4 ), - v1_13( "1_13", 5 ), - v1_14( "1_14", 6 ), - v1_15( "1_15", 7 ), - v1_16( "1_16", 8 ), - v1_17( "1_17", 9 ), - v1_18( "1_18", 10 ), - v1_19( "1_19", 11 ), - v1_20( "1_20", 12 ), - v1_21( "1_21", 13 ), - v1_22( "1_22", 14 ), - v1_23( "1_23", 15 ), - v1_24( "1_24", 16 ), - v1_25( "1_25", 17 ), - v1_26( "1_26", 18 ); + v1_8( "1.8", 0 ), + v1_9( "1.9", 1 ), + v1_10( "1.10", 2 ), + v1_11( "1.11", 3 ), + v1_12( "1.12", 4 ), + v1_13( "1.13", 5 ), + v1_14( "1.14", 6 ), + v1_15( "1.15", 7 ), + v1_16( "1.16", 8 ), + v1_17( "1.17", 9 ), + v1_18( "1.18", 10 ), + v1_19( "1.19", 11 ), + v1_20( "1.20", 12 ), + v1_21( "1.21", 13 ); private int order; diff --git a/src/me/rockyhawk/commandpanels/ioclasses/legacy/PlayerHeads.java b/src/me/rockyhawk/commandpanels/ioclasses/legacy/PlayerHeads.java index a3ba583..08d7dc9 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/legacy/PlayerHeads.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/legacy/PlayerHeads.java @@ -13,7 +13,7 @@ public class PlayerHeads { } public String playerHeadString() { - if(plugin.legacy.LOCAL_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ + if(plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12)){ return "SKULL_ITEM"; }else{ return "PLAYER_HEAD"; diff --git a/src/me/rockyhawk/commandpanels/ioclasses/nbt/NBTManager.java b/src/me/rockyhawk/commandpanels/ioclasses/nbt/NBTManager.java index 7f1e1a4..1fe1e88 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/nbt/NBTManager.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/nbt/NBTManager.java @@ -3,6 +3,7 @@ package me.rockyhawk.commandpanels.ioclasses.nbt; import de.tr7zw.changeme.nbtapi.NBT; import de.tr7zw.changeme.nbtapi.NBTItem; import me.rockyhawk.commandpanels.CommandPanels; +import org.bukkit.Material; import org.bukkit.inventory.ItemStack; public class NBTManager { @@ -11,24 +12,11 @@ public class NBTManager { this.plugin = pl; } - //commandpanel item NBT - public boolean hasNBT(ItemStack item){ - NBTItem nbti = new NBTItem(item); - return nbti.hasTag("CommandPanelsItem"); - } + public boolean hasSameNBT(ItemStack one, ItemStack two){ + NBTItem nbtitem1 = new NBTItem(one); + NBTItem nbtitem2 = new NBTItem(two); - public ItemStack setNBT(ItemStack item){ - NBT.modify(item, nbt -> { - nbt.setString("CommandPanelsItem", "1"); - }); - return item; - } - - //custom key NBT - public String getNBT(ItemStack item, String key){ - NBTItem nbti = new NBTItem(item); - if(!nbti.hasNBTData()) return ""; - return nbti.getString(key); + return nbtitem1.equals(nbtitem2); } public ItemStack setNBT(ItemStack item, String key, String value){ @@ -37,4 +25,15 @@ public class NBTManager { }); return item; } -} + + public boolean hasNBT(ItemStack item, String key){ + NBTItem nbti = new NBTItem(item); + return nbti.hasTag(key); + } + + public String getNBT(ItemStack item, String key){ + NBTItem nbti = new NBTItem(item); + if(!nbti.hasNBTData()) return ""; + return nbti.getString(key); + } +} \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/ioclasses/potions/LegacyPotionData.java b/src/me/rockyhawk/commandpanels/ioclasses/potions/LegacyPotionData.java new file mode 100644 index 0000000..4761c75 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/ioclasses/potions/LegacyPotionData.java @@ -0,0 +1,79 @@ +package me.rockyhawk.commandpanels.ioclasses.potions; + +import me.rockyhawk.commandpanels.CommandPanels; +import org.bukkit.ChatColor; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionType; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public class LegacyPotionData { + private CommandPanels plugin; + + public LegacyPotionData(CommandPanels plugin) { + this.plugin = plugin; + } + + //effect type should be PotionType Extended? Upgraded? + public void applyPotionEffect(Player p, ItemStack item, String[] effectType) { + try { + PotionMeta potionMeta = (PotionMeta) item.getItemMeta(); + assert potionMeta != null; + boolean extended = false; + boolean upgraded = false; + + if (effectType.length >= 2) { + extended = effectType[1].equalsIgnoreCase("true"); + if (effectType.length == 3) { + upgraded = effectType[2].equalsIgnoreCase("true"); + } + } + + Class potionDataType = Class.forName("org.bukkit.potion.PotionData"); + Constructor potionDataConstructor = potionDataType.getConstructor(PotionType.class, boolean.class, boolean.class); + Object potionData = potionDataConstructor.newInstance(PotionType.valueOf(effectType[0].toUpperCase()), extended, upgraded); + + Method setBasePotionDataMethod = potionMeta.getClass().getMethod("setBasePotionData", potionDataType); + setBasePotionDataMethod.setAccessible(true); // Setting the method as accessible + setBasePotionDataMethod.invoke(potionMeta, potionData); + + item.setItemMeta(potionMeta); + } catch (Exception er) { + plugin.debug(er, p); + p.sendMessage(plugin.tex.colour(plugin.tag + ChatColor.RED + plugin.config.getString("config.format.error") + " incorrect potion")); + } + } + + //returns PotionType Extended? Upgraded? + public String retrievePotionData(ItemStack item) { + try { + PotionMeta potionMeta = (PotionMeta) item.getItemMeta(); + assert potionMeta != null; + + Method getBasePotionDataMethod = potionMeta.getClass().getMethod("getBasePotionData"); + getBasePotionDataMethod.setAccessible(true); // Set the method as accessible + Object potionData = getBasePotionDataMethod.invoke(potionMeta); + + Class potionDataType = Class.forName("org.bukkit.potion.PotionData"); + Method getTypeMethod = potionDataType.getMethod("getType"); + Method isUpgradedMethod = potionDataType.getMethod("isUpgraded"); + Method isExtendedMethod = potionDataType.getMethod("isExtended"); + + getTypeMethod.setAccessible(true); // Set the method as accessible + isUpgradedMethod.setAccessible(true); // Set the method as accessible + isExtendedMethod.setAccessible(true); // Set the method as accessible + + PotionType potionType = (PotionType) getTypeMethod.invoke(potionData); + boolean level = (boolean) isUpgradedMethod.invoke(potionData); + boolean extended = (boolean) isExtendedMethod.invoke(potionData); + + return potionType.name() + " " + extended + " " + level; + } catch (Exception e) { + plugin.debug(e, null); + return "Failed to retrieve potion data"; + } + } +} diff --git a/src/me/rockyhawk/commandpanels/ioclasses/GetStorageContents.java b/src/me/rockyhawk/commandpanels/ioclasses/storagecontents/GetStorageContents.java similarity index 89% rename from src/me/rockyhawk/commandpanels/ioclasses/GetStorageContents.java rename to src/me/rockyhawk/commandpanels/ioclasses/storagecontents/GetStorageContents.java index 89b3e78..7bbd88a 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/GetStorageContents.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/storagecontents/GetStorageContents.java @@ -1,4 +1,4 @@ -package me.rockyhawk.commandpanels.ioclasses; +package me.rockyhawk.commandpanels.ioclasses.storagecontents; import me.rockyhawk.commandpanels.CommandPanels; import org.bukkit.entity.Player; diff --git a/src/me/rockyhawk/commandpanels/ioclasses/GetStorageContents_Legacy.java b/src/me/rockyhawk/commandpanels/ioclasses/storagecontents/GetStorageContents_Legacy.java similarity index 90% rename from src/me/rockyhawk/commandpanels/ioclasses/GetStorageContents_Legacy.java rename to src/me/rockyhawk/commandpanels/ioclasses/storagecontents/GetStorageContents_Legacy.java index 12b070a..0e65a28 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/GetStorageContents_Legacy.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/storagecontents/GetStorageContents_Legacy.java @@ -1,4 +1,4 @@ -package me.rockyhawk.commandpanels.ioclasses; +package me.rockyhawk.commandpanels.ioclasses.storagecontents; import me.rockyhawk.commandpanels.CommandPanels; import org.bukkit.entity.Player; diff --git a/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenGUI.java b/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenGUI.java index a7aa57b..2b10821 100644 --- a/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenGUI.java +++ b/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenGUI.java @@ -2,12 +2,14 @@ package me.rockyhawk.commandpanels.openpanelsmanager; import me.rockyhawk.commandpanels.CommandPanels; import me.rockyhawk.commandpanels.api.Panel; +import me.rockyhawk.commandpanels.ioclasses.legacy.MinecraftVersions; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -27,15 +29,7 @@ public class OpenGUI { Inventory i; if(position == PanelPosition.Top) { - String title; - if(pconfig.contains("custom-title")) { - //used for titles in the custom-title section, for has sections - String section = plugin.has.hasSection(panel,position,pconfig.getConfigurationSection("custom-title"), p); - title = plugin.tex.placeholders(panel, position, p, pconfig.getString("custom-title" + section + ".title")); - }else { - //regular inventory title - title = plugin.tex.placeholders(panel, position, p, pconfig.getString("title")); - } + String title = getTitle(p, pconfig, panel, position); if (isNumeric(pconfig.getString("rows"))) { i = Bukkit.createInventory(p, Integer.parseInt(pconfig.getString("rows")) * 9, title); @@ -141,7 +135,7 @@ public class OpenGUI { empty = plugin.itemCreate.makeItemFromConfig(panel,position,pconfig.getConfigurationSection("custom-item." + pconfig.getString("empty")),p,true,true,true); }else{ empty = new ItemStack(Objects.requireNonNull(Material.matchMaterial(pconfig.getString("empty").toUpperCase())), 1,id); - empty = plugin.nbt.setNBT(empty); + empty = plugin.nbt.setNBT(empty, "CommandPanelsItem", "true"); ItemMeta renamedMeta = empty.getItemMeta(); assert renamedMeta != null; renamedMeta.setDisplayName(" "); @@ -173,7 +167,12 @@ public class OpenGUI { } plugin.openPanels.skipPanelClose.remove(p.getName()); } else if (openType == PanelOpenType.Refresh) { - //openType 0 will just refresh the panel + //openType Refresh will just refresh the panel + if(plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_21) || + (plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_20) && plugin.legacy.MINOR_VERSION >= 5)){ + //Title refresh ability added in 1.20.5 api + p.getOpenInventory().setTitle(getTitle(p, pconfig, panel, position)); + } if(position == PanelPosition.Top) { plugin.legacy.setStorageContents(p, plugin.legacy.getStorageContents(i)); } @@ -218,4 +217,17 @@ public class OpenGUI { } return true; } + + private String getTitle(Player p, ConfigurationSection pconfig, Panel panel, PanelPosition position){ + String title; + if(pconfig.contains("custom-title")) { + //used for titles in the custom-title section, for has sections + String section = plugin.has.hasSection(panel,position,pconfig.getConfigurationSection("custom-title"), p); + title = plugin.tex.placeholders(panel, position, p, pconfig.getString("custom-title" + section + ".title")); + }else { + //regular inventory title + title = plugin.tex.placeholders(panel, position, p, pconfig.getString("title")); + } + return title; + } } diff --git a/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenPanelsLoader.java b/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenPanelsLoader.java index 930a213..84ca80a 100644 --- a/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenPanelsLoader.java +++ b/src/me/rockyhawk/commandpanels/openpanelsmanager/OpenPanelsLoader.java @@ -123,7 +123,7 @@ public class OpenPanelsLoader { if (panel.getConfig().contains("commands-on-close")) { //execute commands on panel close try { - plugin.commandTags.runCommands(panel,position,Bukkit.getPlayer(playerName),panel.getConfig().getStringList("commands-on-close")); + plugin.commandRunner.runCommands(panel,position,Bukkit.getPlayer(playerName),panel.getConfig().getStringList("commands-on-close"), null); }catch(Exception s){ plugin.debug(s,null); } @@ -132,7 +132,7 @@ public class OpenPanelsLoader { public boolean isNBTInjected(ItemStack itm){ if(itm != null){ - return plugin.nbt.hasNBT(itm); + return plugin.nbt.hasNBT(itm,"CommandPanelsItem"); } return false; } diff --git a/src/me/rockyhawk/commandpanels/openpanelsmanager/UtilsPanelsLoader.java b/src/me/rockyhawk/commandpanels/openpanelsmanager/UtilsPanelsLoader.java index 2a6fc9d..2cf0e55 100644 --- a/src/me/rockyhawk/commandpanels/openpanelsmanager/UtilsPanelsLoader.java +++ b/src/me/rockyhawk/commandpanels/openpanelsmanager/UtilsPanelsLoader.java @@ -32,7 +32,7 @@ public class UtilsPanelsLoader implements Listener { p.updateInventory(); for(ItemStack itm : p.getInventory().getContents()){ if(itm != null){ - if (plugin.nbt.hasNBT(itm)) { + if (plugin.nbt.hasNBT(itm, "CommandPanelsItem")) { p.getInventory().remove(itm); } } diff --git a/src/me/rockyhawk/commandpanels/openwithitem/HotbarItemLoader.java b/src/me/rockyhawk/commandpanels/openwithitem/HotbarItemLoader.java index 035a941..140cac9 100644 --- a/src/me/rockyhawk/commandpanels/openwithitem/HotbarItemLoader.java +++ b/src/me/rockyhawk/commandpanels/openwithitem/HotbarItemLoader.java @@ -51,7 +51,7 @@ public class HotbarItemLoader { return false; } if(panel.getHotbarSection(p).contains("commands")){ - plugin.commandTags.runCommands(panel,PanelPosition.Top,p,panel.getHotbarSection(p).getStringList("commands"),click); + plugin.commandRunner.runCommands(panel,PanelPosition.Top,p,panel.getHotbarSection(p).getStringList("commands"),click); return true; } panel.open(p, PanelPosition.Top); @@ -87,7 +87,7 @@ public class HotbarItemLoader { } if(panel.getHotbarSection(p).contains("commands")){ for(String command : panel.getHotbarSection(p).getStringList("commands")){ - plugin.commandTags.runCommand(panel,PanelPosition.Top,p, command); + plugin.commandRunner.runCommand(panel,PanelPosition.Top,p, command); } return true; } diff --git a/src/me/rockyhawk/commandpanels/openwithitem/UtilsOpenWithItem.java b/src/me/rockyhawk/commandpanels/openwithitem/UtilsOpenWithItem.java index 571ed02..62c6785 100644 --- a/src/me/rockyhawk/commandpanels/openwithitem/UtilsOpenWithItem.java +++ b/src/me/rockyhawk/commandpanels/openwithitem/UtilsOpenWithItem.java @@ -1,8 +1,8 @@ package me.rockyhawk.commandpanels.openwithitem; import me.rockyhawk.commandpanels.CommandPanels; -import me.rockyhawk.commandpanels.ioclasses.GetItemInHand; -import me.rockyhawk.commandpanels.ioclasses.GetItemInHand_Legacy; +import me.rockyhawk.commandpanels.ioclasses.iteminhand.GetItemInHand; +import me.rockyhawk.commandpanels.ioclasses.iteminhand.GetItemInHand_Legacy; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/src/me/rockyhawk/commandpanels/panelblocks/PanelBlockOnClick.java b/src/me/rockyhawk/commandpanels/panelblocks/PanelBlockOnClick.java index 5f47530..b7c6bfc 100644 --- a/src/me/rockyhawk/commandpanels/panelblocks/PanelBlockOnClick.java +++ b/src/me/rockyhawk/commandpanels/panelblocks/PanelBlockOnClick.java @@ -61,7 +61,7 @@ public class PanelBlockOnClick implements Listener { if(plugin.blockConfig.contains("blocks." + configLocation + ".commands")){ if(!isVoid) { for (String command : plugin.blockConfig.getStringList("blocks." + configLocation + ".commands")) { - plugin.commandTags.runCommand(null, PanelPosition.Top, p, command); + plugin.commandRunner.runCommand(null, PanelPosition.Top, p, command); } } return true; @@ -69,7 +69,7 @@ public class PanelBlockOnClick implements Listener { //uses the open= tag because it will open a panel with panel names, but also works with open= features like placeholders if(!isVoid) { String command = "open= " + plugin.blockConfig.getString("blocks." + configLocation + ".panel"); - plugin.commandTags.runCommand(null, PanelPosition.Top, p, command); + plugin.commandRunner.runCommand(null, PanelPosition.Top, p, command); } return true; }