Fixed incorrect amounts when dispensing items in Paper 1.19.3+
This commit is contained in:
parent
61847f2f8d
commit
97eb0d777b
3 changed files with 71 additions and 20 deletions
|
|
@ -52,6 +52,7 @@ import net.coreprotect.listener.world.ChunkPopulateListener;
|
||||||
import net.coreprotect.listener.world.LeavesDecayListener;
|
import net.coreprotect.listener.world.LeavesDecayListener;
|
||||||
import net.coreprotect.listener.world.PortalCreateListener;
|
import net.coreprotect.listener.world.PortalCreateListener;
|
||||||
import net.coreprotect.listener.world.StructureGrowListener;
|
import net.coreprotect.listener.world.StructureGrowListener;
|
||||||
|
import net.coreprotect.paper.listener.BlockPreDispenseListener;
|
||||||
import net.coreprotect.paper.listener.PaperChatListener;
|
import net.coreprotect.paper.listener.PaperChatListener;
|
||||||
|
|
||||||
public final class ListenerHandler {
|
public final class ListenerHandler {
|
||||||
|
|
@ -60,6 +61,15 @@ public final class ListenerHandler {
|
||||||
|
|
||||||
PluginManager pluginManager = plugin.getServer().getPluginManager();
|
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
|
// Block Listeners
|
||||||
pluginManager.registerEvents(new BlockBreakListener(), plugin);
|
pluginManager.registerEvents(new BlockBreakListener(), plugin);
|
||||||
pluginManager.registerEvents(new BlockBurnListener(), plugin);
|
pluginManager.registerEvents(new BlockBurnListener(), plugin);
|
||||||
|
|
@ -88,6 +98,15 @@ public final class ListenerHandler {
|
||||||
pluginManager.registerEvents(new HangingBreakListener(), plugin);
|
pluginManager.registerEvents(new HangingBreakListener(), plugin);
|
||||||
pluginManager.registerEvents(new HangingBreakByEntityListener(), 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
|
// Player Listeners
|
||||||
pluginManager.registerEvents(new ArmorStandManipulateListener(), plugin);
|
pluginManager.registerEvents(new ArmorStandManipulateListener(), plugin);
|
||||||
pluginManager.registerEvents(new CraftItemListener(), plugin);
|
pluginManager.registerEvents(new CraftItemListener(), plugin);
|
||||||
|
|
@ -115,15 +134,6 @@ public final class ListenerHandler {
|
||||||
pluginManager.registerEvents(new PortalCreateListener(), plugin);
|
pluginManager.registerEvents(new PortalCreateListener(), plugin);
|
||||||
pluginManager.registerEvents(new StructureGrowListener(), 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
|
// Plugin channel events
|
||||||
pluginManager.registerEvents(new PluginChannelListener(), plugin);
|
pluginManager.registerEvents(new PluginChannelListener(), plugin);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ import net.coreprotect.config.Config;
|
||||||
import net.coreprotect.consumer.Queue;
|
import net.coreprotect.consumer.Queue;
|
||||||
import net.coreprotect.listener.player.InventoryChangeListener;
|
import net.coreprotect.listener.player.InventoryChangeListener;
|
||||||
import net.coreprotect.model.BlockGroup;
|
import net.coreprotect.model.BlockGroup;
|
||||||
|
import net.coreprotect.paper.listener.BlockPreDispenseListener;
|
||||||
import net.coreprotect.thread.CacheHandler;
|
import net.coreprotect.thread.CacheHandler;
|
||||||
|
|
||||||
public final class BlockDispenseListener extends Queue implements Listener {
|
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 dispenseSuccess = !event.getVelocity().equals(new Vector()); // true if velocity is set
|
||||||
boolean dispenseRelative = newBlock.getLocation().equals(velocityLocation); // true if velocity location matches relative location
|
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)) {
|
if (!BlockPreDispenseListener.useBlockPreDispenseEvent) {
|
||||||
forceItem = false;
|
if (dispenseRelative || material.equals(Material.FLINT_AND_STEEL) || material.equals(Material.SHEARS)) {
|
||||||
}
|
forceItem = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (block.getType() == Material.DROPPER) {
|
if (block.getType() == Material.DROPPER) {
|
||||||
forceItem = true; // droppers always drop items
|
forceItem = true; // droppers always drop items
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents();
|
ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents();
|
||||||
if (forceItem) {
|
if (forceItem) {
|
||||||
inventory = Arrays.copyOf(inventory, inventory.length + 1);
|
inventory = Arrays.copyOf(inventory, inventory.length + 1);
|
||||||
inventory[inventory.length - 1] = item;
|
inventory[inventory.length - 1] = item;
|
||||||
|
}
|
||||||
|
InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory);
|
||||||
}
|
}
|
||||||
InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory);
|
|
||||||
|
|
||||||
if (material.equals(Material.WATER_BUCKET)) {
|
if (material.equals(Material.WATER_BUCKET)) {
|
||||||
type = Material.WATER;
|
type = Material.WATER;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue