From e7a6f21d88d7ff40e9d94811dec6f2f1f48d739d Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 13 Jul 2023 17:28:14 -0600 Subject: [PATCH] Added inventory transaction logging for placing items on a campfire (#357) --- .../coreprotect/listener/ListenerHandler.java | 6 +++ .../listener/block/CampfireStartListener.java | 48 +++++++++++++++++++ .../player/PlayerDropItemListener.java | 2 +- .../player/PlayerInteractListener.java | 26 ++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/coreprotect/listener/block/CampfireStartListener.java diff --git a/src/main/java/net/coreprotect/listener/ListenerHandler.java b/src/main/java/net/coreprotect/listener/ListenerHandler.java index b31dfd3..2da1162 100644 --- a/src/main/java/net/coreprotect/listener/ListenerHandler.java +++ b/src/main/java/net/coreprotect/listener/ListenerHandler.java @@ -3,6 +3,8 @@ package net.coreprotect.listener; import org.bukkit.plugin.PluginManager; import net.coreprotect.CoreProtect; +import net.coreprotect.bukkit.BukkitAdapter; +import net.coreprotect.config.ConfigHandler; import net.coreprotect.listener.block.BlockBreakListener; import net.coreprotect.listener.block.BlockBurnListener; import net.coreprotect.listener.block.BlockDispenseListener; @@ -15,6 +17,7 @@ import net.coreprotect.listener.block.BlockIgniteListener; import net.coreprotect.listener.block.BlockPistonListener; import net.coreprotect.listener.block.BlockPlaceListener; import net.coreprotect.listener.block.BlockSpreadListener; +import net.coreprotect.listener.block.CampfireStartListener; import net.coreprotect.listener.channel.PluginChannelHandshakeListener; import net.coreprotect.listener.channel.PluginChannelListener; import net.coreprotect.listener.entity.CreatureSpawnListener; @@ -83,6 +86,9 @@ public final class ListenerHandler { pluginManager.registerEvents(new BlockPistonListener(), plugin); pluginManager.registerEvents(new BlockPlaceListener(), plugin); pluginManager.registerEvents(new BlockSpreadListener(), plugin); + if (ConfigHandler.SERVER_VERSION >= BukkitAdapter.BUKKIT_V1_20) { + pluginManager.registerEvents(new CampfireStartListener(), plugin); + } // Entity Listeners pluginManager.registerEvents(new CreatureSpawnListener(), plugin); diff --git a/src/main/java/net/coreprotect/listener/block/CampfireStartListener.java b/src/main/java/net/coreprotect/listener/block/CampfireStartListener.java new file mode 100644 index 0000000..4296e5a --- /dev/null +++ b/src/main/java/net/coreprotect/listener/block/CampfireStartListener.java @@ -0,0 +1,48 @@ +package net.coreprotect.listener.block; + +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.CampfireStartEvent; +import org.bukkit.inventory.ItemStack; + +import net.coreprotect.consumer.Queue; +import net.coreprotect.listener.player.PlayerDropItemListener; +import net.coreprotect.thread.CacheHandler; +import net.coreprotect.utility.Util; + +public final class CampfireStartListener extends Queue implements Listener { + + @EventHandler(priority = EventPriority.MONITOR) + protected void onCampfireStart(CampfireStartEvent event) { + Block block = event.getBlock(); + Location location = block.getLocation(); + int worldId = Util.getWorldId(location.getWorld().getName()); + int x = location.getBlockX(); + int y = location.getBlockY(); + int z = location.getBlockZ(); + String coordinates = x + "." + y + "." + z + "." + worldId + "." + block.getType().name(); + String user = "#entity"; + + Object[] data = CacheHandler.interactCache.get(coordinates); + if (data != null && data[1].equals(event.getSource())) { + long newTime = System.currentTimeMillis(); + long oldTime = (long) data[0]; + if ((newTime - oldTime) < 20) { // 50ms = 1 tick + user = (String) data[2]; + } + CacheHandler.interactCache.remove(coordinates); + } + + if (user.equals("#entity")) { + return; + } + + ItemStack itemStack = event.getSource().clone(); + itemStack.setAmount(1); + PlayerDropItemListener.playerDropItem(event.getBlock().getLocation(), user, itemStack); + } + +} diff --git a/src/main/java/net/coreprotect/listener/player/PlayerDropItemListener.java b/src/main/java/net/coreprotect/listener/player/PlayerDropItemListener.java index 9b9543e..4a92767 100644 --- a/src/main/java/net/coreprotect/listener/player/PlayerDropItemListener.java +++ b/src/main/java/net/coreprotect/listener/player/PlayerDropItemListener.java @@ -18,7 +18,7 @@ import net.coreprotect.consumer.Queue; public final class PlayerDropItemListener extends Queue implements Listener { - protected static void playerDropItem(Location location, String user, ItemStack itemStack) { + public static void playerDropItem(Location location, String user, ItemStack itemStack) { if (!Config.getConfig(location.getWorld()).ITEM_DROPS || itemStack == null) { return; } diff --git a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java index a382f3e..ec0b872 100755 --- a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java +++ b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java @@ -640,6 +640,32 @@ public final class PlayerInteractListener extends Queue implements Listener { }); */ } + else if (type == Material.CAMPFIRE || type == Material.SOUL_CAMPFIRE) { + ItemStack handItem = null; + ItemStack mainHand = player.getInventory().getItemInMainHand(); + ItemStack offHand = player.getInventory().getItemInOffHand(); + + if (event.getHand().equals(EquipmentSlot.HAND) && mainHand != null && mainHand.getType() != Material.BUCKET) { + handItem = mainHand; + } + else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand != null) { + handItem = offHand; + } + else { + return; + } + + if (player.getGameMode() != GameMode.CREATIVE) { + Location location = block.getLocation(); + long time = System.currentTimeMillis(); + int wid = Util.getWorldId(location.getWorld().getName()); + int x = location.getBlockX(); + int y = location.getBlockY(); + int z = location.getBlockZ(); + String coordinates = x + "." + y + "." + z + "." + wid + "." + type.name(); + CacheHandler.interactCache.put(coordinates, new Object[] { time, handItem, player.getName() }); + } + } isCake = type.name().endsWith(Material.CAKE.name()); }