From 45f9f4316e44d450f6c867ffafb7c15e834dee89 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 24 Feb 2022 20:03:28 -0700 Subject: [PATCH] Added logging and inventory rollback support for players breaking items --- .../coreprotect/listener/ListenerHandler.java | 6 ++- .../player/PlayerItemBreakListener.java | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/coreprotect/listener/player/PlayerItemBreakListener.java diff --git a/src/main/java/net/coreprotect/listener/ListenerHandler.java b/src/main/java/net/coreprotect/listener/ListenerHandler.java index b83e856..0709b06 100644 --- a/src/main/java/net/coreprotect/listener/ListenerHandler.java +++ b/src/main/java/net/coreprotect/listener/ListenerHandler.java @@ -39,6 +39,7 @@ import net.coreprotect.listener.player.PlayerDeathListener; import net.coreprotect.listener.player.PlayerDropItemListener; import net.coreprotect.listener.player.PlayerInteractEntityListener; import net.coreprotect.listener.player.PlayerInteractListener; +import net.coreprotect.listener.player.PlayerItemBreakListener; import net.coreprotect.listener.player.PlayerJoinListener; import net.coreprotect.listener.player.PlayerQuitListener; import net.coreprotect.listener.player.PlayerTakeLecternBookListener; @@ -86,6 +87,7 @@ public final class ListenerHandler { // Player Listeners pluginManager.registerEvents(new ArmorStandManipulateListener(), plugin); pluginManager.registerEvents(new CraftItemListener(), plugin); + pluginManager.registerEvents(new FoodLevelChangeListener(), plugin); pluginManager.registerEvents(new InventoryChangeListener(), plugin); pluginManager.registerEvents(new PlayerBucketEmptyListener(), plugin); pluginManager.registerEvents(new PlayerBucketFillListener(), plugin); @@ -93,12 +95,12 @@ public final class ListenerHandler { pluginManager.registerEvents(new PlayerDeathListener(), plugin); pluginManager.registerEvents(new PlayerDropItemListener(), plugin); pluginManager.registerEvents(new PlayerPickupArrowListener(), plugin); - pluginManager.registerEvents(new FoodLevelChangeListener(), plugin); pluginManager.registerEvents(new PlayerInteractEntityListener(), plugin); + pluginManager.registerEvents(new PlayerInteractListener(), plugin); + pluginManager.registerEvents(new PlayerItemBreakListener(), plugin); pluginManager.registerEvents(new PlayerJoinListener(), plugin); pluginManager.registerEvents(new PlayerQuitListener(), plugin); pluginManager.registerEvents(new SignChangeListener(), plugin); - pluginManager.registerEvents(new PlayerInteractListener(), plugin); pluginManager.registerEvents(new PlayerTakeLecternBookListener(), plugin); pluginManager.registerEvents(new ProjectileLaunchListener(), plugin); diff --git a/src/main/java/net/coreprotect/listener/player/PlayerItemBreakListener.java b/src/main/java/net/coreprotect/listener/player/PlayerItemBreakListener.java new file mode 100644 index 0000000..4564856 --- /dev/null +++ b/src/main/java/net/coreprotect/listener/player/PlayerItemBreakListener.java @@ -0,0 +1,42 @@ +package net.coreprotect.listener.player; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemBreakEvent; +import org.bukkit.inventory.ItemStack; + +import net.coreprotect.config.Config; +import net.coreprotect.config.ConfigHandler; +import net.coreprotect.consumer.Queue; + +public final class PlayerItemBreakListener extends Queue implements Listener { + + protected static void playerBreakItem(Location location, String user, ItemStack itemStack) { + if (!Config.getConfig(location.getWorld()).ITEM_TRANSACTIONS || itemStack == null) { + return; + } + + String loggingItemId = user.toLowerCase(Locale.ROOT) + "." + location.getBlockX() + "." + location.getBlockY() + "." + location.getBlockZ(); + int itemId = getItemId(loggingItemId); + + List list = ConfigHandler.itemsBreak.getOrDefault(loggingItemId, new ArrayList<>()); + list.add(itemStack.clone()); + ConfigHandler.itemsBreak.put(loggingItemId, list); + + int time = (int) (System.currentTimeMillis() / 1000L) + 1; + Queue.queueItemTransaction(user, location.clone(), time, 0, itemId); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + protected void onPlayerItemBreak(PlayerItemBreakEvent event) { + ItemStack itemStack = event.getBrokenItem(); + playerBreakItem(event.getPlayer().getLocation(), event.getPlayer().getName(), itemStack); + } + +}