From 1cef74311e519908f5209766e37e6547c9481f0d Mon Sep 17 00:00:00 2001 From: hyperdefined Date: Wed, 5 Oct 2022 16:20:36 -0400 Subject: [PATCH] big cleanup --- .../hyper/toolstats/events/BlocksMined.java | 32 ++++++--- .../hyper/toolstats/events/ChunkPopulate.java | 3 +- .../lol/hyper/toolstats/events/CraftItem.java | 4 +- .../hyper/toolstats/events/EntityDamage.java | 23 +++++-- .../hyper/toolstats/events/EntityDeath.java | 25 ++++--- .../hyper/toolstats/events/GenerateLoot.java | 3 +- .../hyper/toolstats/events/PickupItem.java | 3 +- .../hyper/toolstats/events/PlayerFish.java | 69 ++++++++++++------- .../hyper/toolstats/events/SheepShear.java | 32 ++++++--- .../hyper/toolstats/events/VillagerTrade.java | 21 +++--- 10 files changed, 145 insertions(+), 70 deletions(-) diff --git a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java index d31c4ea..814be06 100644 --- a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java +++ b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java @@ -23,6 +23,7 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemStack; @@ -41,7 +42,7 @@ public class BlocksMined implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler (priority = EventPriority.LOWEST) public void onBreak(BlockBreakEvent event) { if (event.isCancelled()) { return; @@ -51,7 +52,8 @@ public class BlocksMined implements Listener { return; } // if the player mines something with their fist - ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); + int heldItemSlot = player.getInventory().getHeldItemSlot(); + ItemStack heldItem = player.getInventory().getItem(heldItemSlot); if (heldItem == null || heldItem.getType() == Material.AIR) { return; } @@ -60,23 +62,32 @@ public class BlocksMined implements Listener { return; } // if it's an item we want, update the stats - updateBlocksMined(heldItem); + ItemStack newTool = updateBlocksMined(heldItem); + if (newTool != null) { + player.getInventory().setItem(heldItemSlot, newTool); + } } - private void updateBlocksMined(ItemStack itemStack) { - ItemMeta meta = itemStack.getItemMeta(); + private ItemStack updateBlocksMined(ItemStack originalTool) { + ItemStack newTool = originalTool.clone(); + ItemMeta meta = newTool.getItemMeta(); if (meta == null) { - return; + toolStats.logger.warning(originalTool + " does NOT have any meta! Unable to update stats."); + return null; } // read the current stats from the item // if they don't exist, then start from 0 - Integer blocksMined = null; + Integer blocksMined = 0; PersistentDataContainer container = meta.getPersistentDataContainer(); if (container.has(toolStats.genericMined, PersistentDataType.INTEGER)) { blocksMined = container.get(toolStats.genericMined, PersistentDataType.INTEGER); + } else { + blocksMined = 0; } + if (blocksMined == null) { blocksMined = 0; + toolStats.logger.warning(originalTool + " does not have valid generic-mined set! Resting to zero. This should NEVER happen."); } blocksMined++; @@ -87,7 +98,7 @@ public class BlocksMined implements Listener { if (configLore == null || configLoreRaw == null) { toolStats.logger.warning("There is no lore message for messages.blocks-mined!"); - return; + return null; } List lore; @@ -113,9 +124,10 @@ public class BlocksMined implements Listener { lore.add(configLoreRaw.replace("{blocks}", toolStats.commaFormat.format(blocksMined))); } // do we add the lore based on the config? - if (toolStats.checkConfig(itemStack, "blocks-mined")) { + if (toolStats.checkConfig(newTool, "blocks-mined")) { meta.setLore(lore); } - itemStack.setItemMeta(meta); + newTool.setItemMeta(meta); + return newTool; } } diff --git a/src/main/java/lol/hyper/toolstats/events/ChunkPopulate.java b/src/main/java/lol/hyper/toolstats/events/ChunkPopulate.java index efb4693..a987811 100644 --- a/src/main/java/lol/hyper/toolstats/events/ChunkPopulate.java +++ b/src/main/java/lol/hyper/toolstats/events/ChunkPopulate.java @@ -25,6 +25,7 @@ import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.ItemFrame; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.world.ChunkPopulateEvent; import org.bukkit.inventory.ItemStack; @@ -43,7 +44,7 @@ public class ChunkPopulate implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onPopulate(ChunkPopulateEvent event) { if (event.getChunk().getWorld().getEnvironment() != World.Environment.THE_END) { return; diff --git a/src/main/java/lol/hyper/toolstats/events/CraftItem.java b/src/main/java/lol/hyper/toolstats/events/CraftItem.java index fc0a12b..3d88d64 100644 --- a/src/main/java/lol/hyper/toolstats/events/CraftItem.java +++ b/src/main/java/lol/hyper/toolstats/events/CraftItem.java @@ -25,6 +25,7 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.inventory.ItemStack; @@ -42,7 +43,7 @@ public class CraftItem implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onCraft(CraftItemEvent event) { if (event.isCancelled()) { return; @@ -89,6 +90,7 @@ public class CraftItem implements Listener { ItemStack newItem = itemStack.clone(); ItemMeta meta = newItem.getItemMeta(); if (meta == null) { + toolStats.logger.warning(itemStack + " does NOT have any meta! Unable to update stats."); return null; } // get the current time diff --git a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java index 5748370..adf3e6a 100644 --- a/src/main/java/lol/hyper/toolstats/events/EntityDamage.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDamage.java @@ -23,6 +23,7 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -45,7 +46,7 @@ public class EntityDamage implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onDamage(EntityDamageByEntityEvent event) { if (event.isCancelled()) { return; @@ -145,7 +146,7 @@ public class EntityDamage implements Listener { } } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onDamage(EntityDamageEvent event) { if (!(event.getEntity() instanceof LivingEntity)) { return; @@ -175,7 +176,7 @@ public class EntityDamage implements Listener { } } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onDamage(EntityDamageByBlockEvent event) { if (!(event.getEntity() instanceof LivingEntity)) { return; @@ -215,15 +216,19 @@ public class EntityDamage implements Listener { ItemStack finalItem = itemStack.clone(); ItemMeta meta = finalItem.getItemMeta(); if (meta == null) { + toolStats.logger.warning(itemStack + " does NOT have any meta! Unable to update stats."); return null; } Integer playerKills = null; PersistentDataContainer container = meta.getPersistentDataContainer(); if (container.has(toolStats.swordPlayerKills, PersistentDataType.INTEGER)) { playerKills = container.get(toolStats.swordPlayerKills, PersistentDataType.INTEGER); + } else { + playerKills = 0; } if (playerKills == null) { playerKills = 0; + toolStats.logger.warning(itemStack + " does not have valid player-kills set! Resting to zero. This should NEVER happen."); } playerKills++; @@ -277,15 +282,20 @@ public class EntityDamage implements Listener { ItemStack finalItem = itemStack.clone(); ItemMeta meta = finalItem.getItemMeta(); if (meta == null) { + toolStats.logger.warning(itemStack + " does NOT have any meta! Unable to update stats."); return null; } Integer mobKills = null; PersistentDataContainer container = meta.getPersistentDataContainer(); if (container.has(toolStats.swordMobKills, PersistentDataType.INTEGER)) { mobKills = container.get(toolStats.swordMobKills, PersistentDataType.INTEGER); + } else { + mobKills = 0; } + if (mobKills == null) { mobKills = 0; + toolStats.logger.warning(itemStack + " does not have valid mob-kills set! Resting to zero. This should NEVER happen."); } mobKills++; @@ -338,15 +348,20 @@ public class EntityDamage implements Listener { private void updateArmorDamage(ItemStack itemStack, double damage) { ItemMeta meta = itemStack.getItemMeta(); if (meta == null) { + toolStats.logger.warning(itemStack + " does NOT have any meta! Unable to update stats."); return; } - Double damageTaken = null; + Double damageTaken; PersistentDataContainer container = meta.getPersistentDataContainer(); if (container.has(toolStats.armorDamage, PersistentDataType.DOUBLE)) { damageTaken = container.get(toolStats.armorDamage, PersistentDataType.DOUBLE); + } else { + damageTaken = 0.0; } + if (damageTaken == null) { damageTaken = 0.0; + toolStats.logger.warning(itemStack + " does not have valid damage-taken set! Resting to zero. This should NEVER happen."); } damageTaken = damageTaken + damage; diff --git a/src/main/java/lol/hyper/toolstats/events/EntityDeath.java b/src/main/java/lol/hyper/toolstats/events/EntityDeath.java index cada023..c758dd7 100644 --- a/src/main/java/lol/hyper/toolstats/events/EntityDeath.java +++ b/src/main/java/lol/hyper/toolstats/events/EntityDeath.java @@ -22,6 +22,7 @@ import lol.hyper.toolstats.tools.ItemChecker; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.inventory.ItemStack; @@ -37,7 +38,7 @@ public class EntityDeath implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onDeath(EntityDeathEvent event) { LivingEntity livingEntity = event.getEntity(); if (livingEntity instanceof Player) { @@ -46,9 +47,13 @@ public class EntityDeath implements Listener { UUID livingEntityUUID = event.getEntity().getUniqueId(); // if it's a mob we are tracking that matters if (toolStats.mobKill.trackedMobs.contains(livingEntityUUID)) { - for (ItemStack current : event.getDrops()) { + for (int i = 0; i < event.getDrops().size(); i++) { + ItemStack current = event.getDrops().get(i); if (ItemChecker.isValidItem(current.getType())) { - addLore(current, livingEntity.getName()); + ItemStack newItem = addLore(current, livingEntity.getName()); + if (newItem != null) { + event.getDrops().set(i, newItem); + } } } toolStats.mobKill.trackedMobs.remove(livingEntityUUID); @@ -58,13 +63,14 @@ public class EntityDeath implements Listener { /** * Adds "drop by" tag to item. * - * @param itemStack The item to add lore to. + * @param oldItem The item to add lore to. * @param mob The mob or player name. */ - private void addLore(ItemStack itemStack, String mob) { - ItemMeta meta = itemStack.getItemMeta(); + private ItemStack addLore(ItemStack oldItem, String mob) { + ItemStack newItem = oldItem.clone(); + ItemMeta meta = newItem.getItemMeta(); if (meta == null) { - return; + return null; } boolean hasTag = false; @@ -73,7 +79,7 @@ public class EntityDeath implements Listener { if (droppedByLore == null || droppedByLoreRaw == null) { toolStats.logger.warning("There is no lore message for messages.dropped-by!"); - return; + return null; } List lore; @@ -96,6 +102,7 @@ public class EntityDeath implements Listener { if (toolStats.config.getBoolean("enabled.dropped-by")) { meta.setLore(lore); } - itemStack.setItemMeta(meta); + newItem.setItemMeta(meta); + return newItem; } } diff --git a/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java b/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java index c55bd40..d9138d6 100644 --- a/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java +++ b/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java @@ -28,6 +28,7 @@ import org.bukkit.block.Chest; import org.bukkit.entity.Player; import org.bukkit.entity.minecart.StorageMinecart; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.world.LootGenerateEvent; import org.bukkit.inventory.Inventory; @@ -49,7 +50,7 @@ public class GenerateLoot implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onGenerateLoot(LootGenerateEvent event) { InventoryHolder inventoryHolder = event.getInventoryHolder(); if (inventoryHolder == null) { diff --git a/src/main/java/lol/hyper/toolstats/events/PickupItem.java b/src/main/java/lol/hyper/toolstats/events/PickupItem.java index 0a3eb9d..ce71347 100644 --- a/src/main/java/lol/hyper/toolstats/events/PickupItem.java +++ b/src/main/java/lol/hyper/toolstats/events/PickupItem.java @@ -23,6 +23,7 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.inventory.ItemStack; @@ -42,7 +43,7 @@ public class PickupItem implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onPickup(EntityPickupItemEvent event) { if (event.isCancelled()) { return; diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerFish.java b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java index 5e87287..beee84f 100644 --- a/src/main/java/lol/hyper/toolstats/events/PlayerFish.java +++ b/src/main/java/lol/hyper/toolstats/events/PlayerFish.java @@ -25,6 +25,7 @@ import org.bukkit.Material; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.inventory.ItemStack; @@ -44,7 +45,7 @@ public class PlayerFish implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onFish(PlayerFishEvent event) { if (event.isCancelled()) { return; @@ -58,37 +59,54 @@ public class PlayerFish implements Listener { if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { return; } + // make sure the player is holding a fishing rod ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); + int heldItemSlot = player.getInventory().getHeldItemSlot(); if (heldItem == null || heldItem.getType() == Material.AIR || heldItem.getType() != Material.FISHING_ROD) { return; } - updateFishCount(heldItem); + // update the fishing rod to the new one + ItemStack newRod = updateFishCount(heldItem); + if (newRod != null) { + player.getInventory().setItem(heldItemSlot, newRod); + } + // check if the player caught an item if (event.getCaught() == null) { return; } ItemStack caughtItem = ((Item) event.getCaught()).getItemStack(); + Item caughtItemEntity = (Item) event.getCaught(); if (ItemChecker.isValidItem(caughtItem.getType())) { - addNewLore(caughtItem, player); + ItemStack newItem = addNewLore(caughtItem, player); + if (newItem != null) { + caughtItemEntity.setItemStack(newItem); + } } } /** - * Updates a fishing rod's count. - * - * @param itemStack The fishing rod to update. + * Update a fishing rod's fish count. + * @param originalRod The fishing rod to update. + * @return A new fishing rod with update counts. */ - private void updateFishCount(ItemStack itemStack) { - ItemMeta meta = itemStack.getItemMeta(); + private ItemStack updateFishCount(ItemStack originalRod) { + ItemStack newRod = originalRod.clone(); + ItemMeta meta = newRod.getItemMeta(); if (meta == null) { - return; + toolStats.logger.warning(originalRod + " does NOT have any meta! Unable to update stats."); + return null; } - Integer fishCaught = null; + Integer fishCaught; PersistentDataContainer container = meta.getPersistentDataContainer(); if (container.has(toolStats.fishingRodCaught, PersistentDataType.INTEGER)) { fishCaught = container.get(toolStats.fishingRodCaught, PersistentDataType.INTEGER); + } else { + fishCaught = 0; } + if (fishCaught == null) { fishCaught = 0; + toolStats.logger.warning(originalRod + " does not have valid fish-caught set! Resting to zero. This should NEVER happen."); } fishCaught++; @@ -99,7 +117,7 @@ public class PlayerFish implements Listener { if (fishCaughtLore == null || fishCaughtLoreRaw == null) { toolStats.logger.warning("There is no lore message for messages.fish-caught!"); - return; + return null; } List lore; @@ -127,26 +145,28 @@ public class PlayerFish implements Listener { if (toolStats.config.getBoolean("enabled.fish-caught")) { meta.setLore(lore); } - itemStack.setItemMeta(meta); + newRod.setItemMeta(meta); + return newRod; } /** - * Adds "caught by" tags to newly fished items. - * - * @param itemStack The item to add lore to. - * @param owner The player who caught the item. + * Add lore to newly caught item. + * @param originalItem The original item to add lore. + * @param owner The player who caught it. + * @return A copy of the new item with lore. */ - private void addNewLore(ItemStack itemStack, Player owner) { - ItemMeta meta = itemStack.getItemMeta(); + private ItemStack addNewLore(ItemStack originalItem, Player owner) { + ItemStack newItem = originalItem.clone(); + ItemMeta meta = originalItem.getItemMeta(); if (meta == null) { - return; + return null; } long timeCreated = System.currentTimeMillis(); Date finalDate = new Date(timeCreated); PersistentDataContainer container = meta.getPersistentDataContainer(); if (container.has(toolStats.timeCreated, PersistentDataType.LONG) || container.has(toolStats.genericOwner, PersistentDataType.LONG)) { - return; + return null; } container.set(toolStats.timeCreated, PersistentDataType.LONG, timeCreated); @@ -157,7 +177,7 @@ public class PlayerFish implements Listener { if (caughtByLoreRaw == null || caughtOnLoreRaw == null) { toolStats.logger.warning("There is no lore message for messages.fished!"); - return; + return null; } List lore; @@ -167,11 +187,12 @@ public class PlayerFish implements Listener { } else { lore = new ArrayList<>(); } - if (toolStats.checkConfig(itemStack, "fished-tag")) { + if (toolStats.checkConfig(newItem, "fished-tag")) { lore.add(caughtOnLoreRaw.replace("{date}", toolStats.dateFormat.format(finalDate))); lore.add(caughtByLoreRaw.replace("{player}", owner.getName())); + meta.setLore(lore); } - meta.setLore(lore); - itemStack.setItemMeta(meta); + newItem.setItemMeta(meta); + return newItem; } } diff --git a/src/main/java/lol/hyper/toolstats/events/SheepShear.java b/src/main/java/lol/hyper/toolstats/events/SheepShear.java index 0401130..1996967 100644 --- a/src/main/java/lol/hyper/toolstats/events/SheepShear.java +++ b/src/main/java/lol/hyper/toolstats/events/SheepShear.java @@ -24,6 +24,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Sheep; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.inventory.ItemStack; @@ -42,7 +43,7 @@ public class SheepShear implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onShear(PlayerInteractEntityEvent event) { if (event.isCancelled()) { return; @@ -56,7 +57,8 @@ public class SheepShear implements Listener { return; } // check if the player is right-clicking with shears only - ItemStack heldItem = player.getInventory().getItem(player.getInventory().getHeldItemSlot()); + int heldItemSlot = player.getInventory().getHeldItemSlot(); + ItemStack heldItem = player.getInventory().getItem(heldItemSlot); if (heldItem == null || heldItem.getType() == Material.AIR || heldItem.getType() != Material.SHEARS) { return; } @@ -64,27 +66,36 @@ public class SheepShear implements Listener { Sheep sheep = (Sheep) entity; // make sure the sheep is not sheared if (!sheep.isSheared()) { - addLore(heldItem); + ItemStack newShears = addLore(heldItem); + if (newShears != null) { + player.getInventory().setItem(heldItemSlot, newShears); + } } } /** * Adds tags to shears. * - * @param itemStack The shears. + * @param oldShears The shears. */ - private void addLore(ItemStack itemStack) { - ItemMeta meta = itemStack.getItemMeta(); + private ItemStack addLore(ItemStack oldShears) { + ItemStack newShears = oldShears.clone(); + ItemMeta meta = newShears.getItemMeta(); if (meta == null) { - return; + toolStats.logger.warning(newShears + " does NOT have any meta! Unable to update stats."); + return null; } - Integer sheepSheared = 0; + Integer sheepSheared; PersistentDataContainer container = meta.getPersistentDataContainer(); if (container.has(toolStats.shearsSheared, PersistentDataType.INTEGER)) { sheepSheared = container.get(toolStats.shearsSheared, PersistentDataType.INTEGER); + } else { + sheepSheared = 0; } + if (sheepSheared == null) { sheepSheared = 0; + toolStats.logger.warning(newShears + " does not have valid sheared set! Resting to zero. This should NEVER happen."); } sheepSheared++; @@ -95,7 +106,7 @@ public class SheepShear implements Listener { if (sheepShearedLore == null || sheepShearedLoreRaw == null) { toolStats.logger.warning("There is no lore message for messages.sheep-sheared!"); - return; + return null; } List lore; @@ -123,6 +134,7 @@ public class SheepShear implements Listener { if (toolStats.config.getBoolean("enabled.sheep-sheared")) { meta.setLore(lore); } - itemStack.setItemMeta(meta); + newShears.setItemMeta(meta); + return newShears; } } diff --git a/src/main/java/lol/hyper/toolstats/events/VillagerTrade.java b/src/main/java/lol/hyper/toolstats/events/VillagerTrade.java index 52e85e4..1297050 100644 --- a/src/main/java/lol/hyper/toolstats/events/VillagerTrade.java +++ b/src/main/java/lol/hyper/toolstats/events/VillagerTrade.java @@ -25,6 +25,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType; @@ -47,7 +48,7 @@ public class VillagerTrade implements Listener { this.toolStats = toolStats; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onTrade(InventoryClickEvent event) { if (event.isCancelled() || event.getCurrentItem() == null) { return; @@ -87,13 +88,15 @@ public class VillagerTrade implements Listener { /** * Adds "traded by" tags to item. * - * @param itemStack The item to add lore. - * @param owner The player who traded. + * @param oldItem The item to add lore. + * @param owner The player who traded. * @return The item with lore. */ - private ItemStack addLore(ItemStack itemStack, Player owner) { - ItemMeta meta = itemStack.getItemMeta(); + private ItemStack addLore(ItemStack oldItem, Player owner) { + ItemStack newItem = oldItem.clone(); + ItemMeta meta = newItem.getItemMeta(); if (meta == null) { + toolStats.logger.warning(newItem + " does NOT have any meta! Unable to update stats."); return null; } long timeCreated = System.currentTimeMillis(); @@ -121,12 +124,12 @@ public class VillagerTrade implements Listener { } else { lore = new ArrayList<>(); } - if (toolStats.checkConfig(itemStack, "traded-tag")) { + if (toolStats.checkConfig(newItem, "traded-tag")) { lore.add(tradedOnLoreRaw.replace("{date}", toolStats.dateFormat.format(finalDate))); lore.add(tradedByLoreRaw.replace("{player}", owner.getName())); + meta.setLore(lore); } - meta.setLore(lore); - itemStack.setItemMeta(meta); - return itemStack; + newItem.setItemMeta(meta); + return newItem; } }