Fixed incorrect amounts when dispensing items in Paper 1.19.3+

This commit is contained in:
Intelli 2022-12-19 14:57:46 -07:00
parent 61847f2f8d
commit 97eb0d777b
3 changed files with 71 additions and 20 deletions

View File

@ -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);
}

View File

@ -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,6 +49,7 @@ 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 (!BlockPreDispenseListener.useBlockPreDispenseEvent) {
if (dispenseRelative || material.equals(Material.FLINT_AND_STEEL) || material.equals(Material.SHEARS)) {
forceItem = false;
}
@ -62,6 +64,7 @@ public final class BlockDispenseListener extends Queue implements Listener {
inventory[inventory.length - 1] = item;
}
InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory);
}
if (material.equals(Material.WATER_BUCKET)) {
type = Material.WATER;

View File

@ -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);
}
}
}