From 97eb0d777b5f5aad399a85db55b5404e81bbdbfc Mon Sep 17 00:00:00 2001 From: Intelli Date: Mon, 19 Dec 2022 14:57:46 -0700 Subject: [PATCH] Fixed incorrect amounts when dispensing items in Paper 1.19.3+ --- .../coreprotect/listener/ListenerHandler.java | 28 +++++++++----- .../listener/block/BlockDispenseListener.java | 25 ++++++------ .../listener/BlockPreDispenseListener.java | 38 +++++++++++++++++++ 3 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 src/main/java/net/coreprotect/paper/listener/BlockPreDispenseListener.java diff --git a/src/main/java/net/coreprotect/listener/ListenerHandler.java b/src/main/java/net/coreprotect/listener/ListenerHandler.java index b18753f..b31dfd3 100644 --- a/src/main/java/net/coreprotect/listener/ListenerHandler.java +++ b/src/main/java/net/coreprotect/listener/ListenerHandler.java @@ -52,6 +52,7 @@ import net.coreprotect.listener.world.ChunkPopulateListener; import net.coreprotect.listener.world.LeavesDecayListener; import net.coreprotect.listener.world.PortalCreateListener; import net.coreprotect.listener.world.StructureGrowListener; +import net.coreprotect.paper.listener.BlockPreDispenseListener; import net.coreprotect.paper.listener.PaperChatListener; public final class ListenerHandler { @@ -60,6 +61,15 @@ public final class ListenerHandler { PluginManager pluginManager = plugin.getServer().getPluginManager(); + // Paper Listeners / Fallbacks (Block Listeners) + try { + Class.forName("io.papermc.paper.event.block.BlockPreDispenseEvent"); // Paper 1.16+ + pluginManager.registerEvents(new BlockPreDispenseListener(), plugin); + } + catch (Exception e) { + BlockPreDispenseListener.useBlockPreDispenseEvent = false; + } + // Block Listeners pluginManager.registerEvents(new BlockBreakListener(), plugin); pluginManager.registerEvents(new BlockBurnListener(), plugin); @@ -88,6 +98,15 @@ public final class ListenerHandler { pluginManager.registerEvents(new HangingBreakListener(), plugin); pluginManager.registerEvents(new HangingBreakByEntityListener(), plugin); + // Paper Listeners / Fallbacks (Player Listeners) + try { + Class.forName("net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer"); // Paper 1.16+ + pluginManager.registerEvents(new PaperChatListener(), plugin); + } + catch (Exception e) { + pluginManager.registerEvents(new PlayerChatListener(), plugin); + } + // Player Listeners pluginManager.registerEvents(new ArmorStandManipulateListener(), plugin); pluginManager.registerEvents(new CraftItemListener(), plugin); @@ -115,15 +134,6 @@ public final class ListenerHandler { pluginManager.registerEvents(new PortalCreateListener(), plugin); pluginManager.registerEvents(new StructureGrowListener(), plugin); - // Paper Listeners / Fallbacks - try { - Class.forName("net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer"); - pluginManager.registerEvents(new PaperChatListener(), plugin); - } - catch (Exception e) { - pluginManager.registerEvents(new PlayerChatListener(), plugin); - } - // Plugin channel events pluginManager.registerEvents(new PluginChannelListener(), plugin); } diff --git a/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java b/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java index 5fe40b2..73cb04d 100644 --- a/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java +++ b/src/main/java/net/coreprotect/listener/block/BlockDispenseListener.java @@ -24,6 +24,7 @@ import net.coreprotect.config.Config; import net.coreprotect.consumer.Queue; import net.coreprotect.listener.player.InventoryChangeListener; import net.coreprotect.model.BlockGroup; +import net.coreprotect.paper.listener.BlockPreDispenseListener; import net.coreprotect.thread.CacheHandler; public final class BlockDispenseListener extends Queue implements Listener { @@ -48,20 +49,22 @@ public final class BlockDispenseListener extends Queue implements Listener { boolean dispenseSuccess = !event.getVelocity().equals(new Vector()); // true if velocity is set boolean dispenseRelative = newBlock.getLocation().equals(velocityLocation); // true if velocity location matches relative location - if (dispenseRelative || material.equals(Material.FLINT_AND_STEEL) || material.equals(Material.SHEARS)) { - forceItem = false; - } + if (!BlockPreDispenseListener.useBlockPreDispenseEvent) { + if (dispenseRelative || material.equals(Material.FLINT_AND_STEEL) || material.equals(Material.SHEARS)) { + forceItem = false; + } - if (block.getType() == Material.DROPPER) { - forceItem = true; // droppers always drop items - } + if (block.getType() == Material.DROPPER) { + forceItem = true; // droppers always drop items + } - ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents(); - if (forceItem) { - inventory = Arrays.copyOf(inventory, inventory.length + 1); - inventory[inventory.length - 1] = item; + ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents(); + if (forceItem) { + inventory = Arrays.copyOf(inventory, inventory.length + 1); + inventory[inventory.length - 1] = item; + } + InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory); } - InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory); if (material.equals(Material.WATER_BUCKET)) { type = Material.WATER; diff --git a/src/main/java/net/coreprotect/paper/listener/BlockPreDispenseListener.java b/src/main/java/net/coreprotect/paper/listener/BlockPreDispenseListener.java new file mode 100644 index 0000000..6a12f33 --- /dev/null +++ b/src/main/java/net/coreprotect/paper/listener/BlockPreDispenseListener.java @@ -0,0 +1,38 @@ +package net.coreprotect.paper.listener; + +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Dispenser; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; + +import io.papermc.paper.event.block.BlockPreDispenseEvent; +import net.coreprotect.config.Config; +import net.coreprotect.consumer.Queue; +import net.coreprotect.listener.player.InventoryChangeListener; + +public final class BlockPreDispenseListener extends Queue implements Listener { + + public static boolean useBlockPreDispenseEvent = true; + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPreDispense(BlockPreDispenseEvent event) { + Block block = event.getBlock(); + World world = block.getWorld(); + if (!Config.getConfig(world).BLOCK_PLACE) { + return; + } + + BlockData blockData = block.getBlockData(); + if (blockData instanceof Dispenser) { + String user = "#dispenser"; + ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents(); + InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory); + } + } + +}