From 43d1b221b55405b86559a524bb3dcd1c4989b0c6 Mon Sep 17 00:00:00 2001 From: rockyhawk64 Date: Wed, 8 May 2024 22:25:41 +1000 Subject: [PATCH] 3.21.2.1 --- resource/plugin.yml | 2 +- .../commandpanels/CommandPanels.java | 9 ++ .../classresources/ItemCreation.java | 15 +- .../commandtags/paywalls/ItemPaywall.java | 137 ++++++++---------- .../InventorySaver.java | 15 -- .../pickupevent/EntityPickupEvent.java | 29 ++++ .../pickupevent/legacyPlayerEvent.java | 27 ++++ .../commandpanels/updater/Updater.java | 2 +- 8 files changed, 142 insertions(+), 94 deletions(-) create mode 100644 src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/EntityPickupEvent.java create mode 100644 src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/legacyPlayerEvent.java diff --git a/resource/plugin.yml b/resource/plugin.yml index ae5559a..acb36d9 100644 --- a/resource/plugin.yml +++ b/resource/plugin.yml @@ -1,4 +1,4 @@ -version: 3.21.2.0 +version: 3.21.2.1 main: me.rockyhawk.commandpanels.CommandPanels name: CommandPanels author: RockyHawk diff --git a/src/me/rockyhawk/commandpanels/CommandPanels.java b/src/me/rockyhawk/commandpanels/CommandPanels.java index f697fc7..75eda28 100644 --- a/src/me/rockyhawk/commandpanels/CommandPanels.java +++ b/src/me/rockyhawk/commandpanels/CommandPanels.java @@ -46,6 +46,8 @@ import me.rockyhawk.commandpanels.panelblocks.Commandpanelblocks; import me.rockyhawk.commandpanels.panelblocks.PanelBlockOnClick; import me.rockyhawk.commandpanels.playerinventoryhandler.InventorySaver; import me.rockyhawk.commandpanels.playerinventoryhandler.ItemStackSerializer; +import me.rockyhawk.commandpanels.playerinventoryhandler.pickupevent.EntityPickupEvent; +import me.rockyhawk.commandpanels.playerinventoryhandler.pickupevent.legacyPlayerEvent; import me.rockyhawk.commandpanels.updater.Updater; import net.milkbowl.vault.economy.Economy; import org.apache.commons.io.IOUtils; @@ -179,7 +181,14 @@ public class CommandPanels extends JavaPlugin{ Objects.requireNonNull(this.getCommand("commandpanelversion")).setExecutor(new Commandpanelversion(this)); Objects.requireNonNull(this.getCommand("commandpanellist")).setExecutor(new Commandpanelslist(this)); this.getServer().getPluginManager().registerEvents(new Utils(this), this); + this.getServer().getPluginManager().registerEvents(inventorySaver, this); + if(this.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_12)){ + this.getServer().getPluginManager().registerEvents(new EntityPickupEvent(this), this); + }else{ + this.getServer().getPluginManager().registerEvents(new legacyPlayerEvent(this), this); + } + this.getServer().getPluginManager().registerEvents(inputUtils, this); this.getServer().getPluginManager().registerEvents(new UtilsPanelsLoader(this), this); this.getServer().getPluginManager().registerEvents(new GenUtils(this), this); diff --git a/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java b/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java index 0716281..c09b27f 100644 --- a/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java +++ b/src/me/rockyhawk/commandpanels/classresources/ItemCreation.java @@ -502,6 +502,13 @@ public class ItemCreation { } } }catch(Exception ignore){} + //check for ID 1.12.2 and below + try { + if (plugin.legacy.MAJOR_VERSION.lessThanOrEqualTo(MinecraftVersions.v1_12) && + (one.getDurability() != two.getDurability())) { + return false; + } + }catch(Exception ignore){} //check for lore try { if (!one.getItemMeta().getLore().equals(two.getItemMeta().getLore())) { @@ -512,9 +519,11 @@ public class ItemCreation { }catch(Exception ignore){} //check for custom model data try { - if (one.getItemMeta().getCustomModelData() != (two.getItemMeta().getCustomModelData())) { - if(one.getItemMeta().hasCustomModelData()) { - return false; + if (plugin.legacy.MAJOR_VERSION.greaterThanOrEqualTo(MinecraftVersions.v1_14)){ + if (one.getItemMeta().getCustomModelData() != (two.getItemMeta().getCustomModelData())) { + if(one.getItemMeta().hasCustomModelData()) { + return false; + } } } }catch(Exception ignore){} diff --git a/src/me/rockyhawk/commandpanels/commandtags/paywalls/ItemPaywall.java b/src/me/rockyhawk/commandpanels/commandtags/paywalls/ItemPaywall.java index c9e6e92..6925346 100644 --- a/src/me/rockyhawk/commandpanels/commandtags/paywalls/ItemPaywall.java +++ b/src/me/rockyhawk/commandpanels/commandtags/paywalls/ItemPaywall.java @@ -5,6 +5,7 @@ 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.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; @@ -22,19 +23,13 @@ public class ItemPaywall implements Listener { 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")){ + if (val.equals("IGNORENBT")) { ignoreNBT = true; + break; } } @@ -48,79 +43,19 @@ public class ItemPaywall implements Listener { //If normal just set material. sellItem = new ItemStack(Objects.requireNonNull(Material.matchMaterial(e.args[0])), Integer.parseInt(e.args[1])); } - //this is not a boolean because it needs to return an int + + //try to remove the item and determine outcome 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; + if (e.doDelete){ + if(removeItem(e.p, sellItem, ignoreNBT)){ + removedItem = PaywallOutput.Passed; } - - ItemStack itm = cont.get(f); //Get item/slot - - //Check if the item matches the id set. If not continue to next in loop. - if (id != -1 && itm.getDurability() != id) { - continue; - } - - if(plugin.itemCreate.isIdentical(sellItem,itm, !ignoreNBT)){ //Check if both sell item and item in slot are identical - //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) { - //If we have reached the end of the paywall. - for(Map.Entry entry : remCont.entrySet()) { - ItemStack remItem = entry.getValue(); - - //Check if it's 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) - //Normal inventory - e.p.getInventory().getItem(entry.getKey()).setAmount(remItem.getAmount() - sellItem.getAmount()); - e.p.updateInventory(); - } else { - if (e.doDelete) - //Saved inventory - 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) - //Normal inventory - e.p.getInventory().setItem(entry.getKey(), null); - e.p.updateInventory(); - } else { - if (e.doDelete) - //Saved inventory - cont.remove(entry.getValue()); - 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 + //no item found to remove plugin.tex.sendString(e.panel, PanelPosition.Top, e.p, Objects.requireNonNull(plugin.config.getString("purchase.item.failure"))); } } else { @@ -137,4 +72,58 @@ public class ItemPaywall implements Listener { } } } + + public boolean removeItem(Player p, ItemStack itemToRemove, boolean ignoreNBT) { + boolean result; + + if (plugin.inventorySaver.hasNormalInventory(p)) { + result = removeItemFromInventory(p.getInventory().getContents(), itemToRemove, ignoreNBT); + } else { + // Load the saved inventory from config, manipulate it, and save it back + ItemStack[] savedInventory = plugin.inventorySaver.getNormalInventory(p); + result = removeItemFromInventory(savedInventory, itemToRemove, ignoreNBT); + plugin.inventorySaver.inventoryConfig.set(p.getUniqueId().toString(), plugin.itemSerializer.itemStackArrayToBase64(savedInventory)); + } + + return result; // Return true if the items were successfully removed, otherwise false + } + + private boolean removeItemFromInventory(ItemStack[] inventory, ItemStack itemToRemove, boolean ignoreNBT) { + int amountToRemove = itemToRemove.getAmount(); + int count = 0; // To count how many of the required items are present + + // First pass: count the items to ensure there are enough + for (ItemStack item : inventory) { + if (item != null && plugin.itemCreate.isIdentical(item, itemToRemove, !ignoreNBT)) { + count += item.getAmount(); + } + } + + // If not enough items, return false and do not modify the inventory + if (count < amountToRemove) { + return false; + } + + // Second pass: remove the items if there are enough + for (int i = 0; i < inventory.length; i++) { + ItemStack currentItem = inventory[i]; + if (currentItem != null && plugin.itemCreate.isIdentical(currentItem, itemToRemove, !ignoreNBT)) { + int removeAmount = Math.min(currentItem.getAmount(), amountToRemove); + currentItem.setAmount(currentItem.getAmount() - removeAmount); + amountToRemove -= removeAmount; + + // Remove the item stack if it becomes empty + if (currentItem.getAmount() == 0) { + inventory[i] = null; + } + + // If removed all needed, break out of the loop + if (amountToRemove == 0) { + break; + } + } + } + + return true; // Return true as items were successfully removed + } } diff --git a/src/me/rockyhawk/commandpanels/playerinventoryhandler/InventorySaver.java b/src/me/rockyhawk/commandpanels/playerinventoryhandler/InventorySaver.java index 16569cf..58a44e4 100644 --- a/src/me/rockyhawk/commandpanels/playerinventoryhandler/InventorySaver.java +++ b/src/me/rockyhawk/commandpanels/playerinventoryhandler/InventorySaver.java @@ -4,12 +4,10 @@ import me.rockyhawk.commandpanels.CommandPanels; import me.rockyhawk.commandpanels.api.PanelOpenedEvent; import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; @@ -75,19 +73,6 @@ public class InventorySaver implements Listener { } } - @EventHandler - public void onPickup(EntityPickupItemEvent e){ - if(e.getEntity() instanceof HumanEntity) { - Player p = (Player)e.getEntity(); - //move the item into the players inventory instead of the panel - if (plugin.openPanels.hasPanelOpen(p.getName(), PanelPosition.Middle) || plugin.openPanels.hasPanelOpen(p.getName(), PanelPosition.Bottom)) { - plugin.inventorySaver.addItem(p,e.getItem().getItemStack()); - e.getItem().remove(); - e.setCancelled(true); - } - } - } - @EventHandler public void playerJoined(PlayerJoinEvent e){ restoreInventory(e.getPlayer(), PanelPosition.Top); diff --git a/src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/EntityPickupEvent.java b/src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/EntityPickupEvent.java new file mode 100644 index 0000000..7e3ed69 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/EntityPickupEvent.java @@ -0,0 +1,29 @@ +package me.rockyhawk.commandpanels.playerinventoryhandler.pickupevent; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; + +public class EntityPickupEvent implements Listener { + + CommandPanels plugin; + public EntityPickupEvent(CommandPanels pl) { + this.plugin = pl; + } + @EventHandler + public void onPickup(EntityPickupItemEvent e){ + if(e.getEntity() instanceof HumanEntity) { + Player p = (Player)e.getEntity(); + //move the item into the players inventory instead of the panel + if (plugin.openPanels.hasPanelOpen(p.getName(), PanelPosition.Middle) || plugin.openPanels.hasPanelOpen(p.getName(), PanelPosition.Bottom)) { + plugin.inventorySaver.addItem(p,e.getItem().getItemStack()); + e.getItem().remove(); + e.setCancelled(true); + } + } + } +} diff --git a/src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/legacyPlayerEvent.java b/src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/legacyPlayerEvent.java new file mode 100644 index 0000000..17500a7 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/playerinventoryhandler/pickupevent/legacyPlayerEvent.java @@ -0,0 +1,27 @@ +package me.rockyhawk.commandpanels.playerinventoryhandler.pickupevent; + +import me.rockyhawk.commandpanels.CommandPanels; +import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerPickupItemEvent; + +public class legacyPlayerEvent implements Listener { + + CommandPanels plugin; + public legacyPlayerEvent(CommandPanels pl) { + this.plugin = pl; + } + + @EventHandler + public void onPickup(PlayerPickupItemEvent e){ + Player p = e.getPlayer(); + //move the item into the players inventory instead of the panel + if (plugin.openPanels.hasPanelOpen(p.getName(), PanelPosition.Middle) || plugin.openPanels.hasPanelOpen(p.getName(), PanelPosition.Bottom)) { + plugin.inventorySaver.addItem(p,e.getItem().getItemStack()); + e.getItem().remove(); + e.setCancelled(true); + } + } +} diff --git a/src/me/rockyhawk/commandpanels/updater/Updater.java b/src/me/rockyhawk/commandpanels/updater/Updater.java index 88a84d8..15ce961 100644 --- a/src/me/rockyhawk/commandpanels/updater/Updater.java +++ b/src/me/rockyhawk/commandpanels/updater/Updater.java @@ -83,7 +83,7 @@ public class Updater implements Listener { public void run(){ HttpURLConnection connection; try { - connection = (HttpURLConnection) new URL("https://raw.githubusercontent.com/rockyhawk64/CommandPanels/master/resource/plugin.yml").openConnection(); + connection = (HttpURLConnection) new URL("https://raw.githubusercontent.com/rockyhawk64/CommandPanels/latest/resource/plugin.yml").openConnection(); connection.setConnectTimeout(5000); // 5 seconds connection.setReadTimeout(5000); // 5 seconds connection.connect();