From b0733935aecc32431f732d3b87c6ccfdffff49b9 Mon Sep 17 00:00:00 2001 From: hyperdefined Date: Sat, 30 Sep 2023 20:43:54 -0400 Subject: [PATCH] handle loot generation better edit the loot itself, not the contents of chest also handle breaking chest instead of opening it --- .../hyper/toolstats/events/BlocksMined.java | 14 +++++ .../hyper/toolstats/events/GenerateLoot.java | 63 ++++++++----------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java index d0f1d9e..69c3196 100644 --- a/src/main/java/lol/hyper/toolstats/events/BlocksMined.java +++ b/src/main/java/lol/hyper/toolstats/events/BlocksMined.java @@ -20,6 +20,7 @@ package lol.hyper.toolstats.events; import lol.hyper.toolstats.ToolStats; import lol.hyper.toolstats.tools.ItemChecker; import org.bukkit.GameMode; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.Ageable; import org.bukkit.entity.Player; @@ -32,6 +33,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.bukkit.scheduler.BukkitRunnable; import java.util.List; import java.util.Locale; @@ -56,6 +58,18 @@ public class BlocksMined implements Listener { PlayerInventory inventory = player.getInventory(); ItemStack heldItem = inventory.getItemInMainHand(); Block block = event.getBlock(); + + if (block.getType() == Material.CHEST) { + toolStats.playerInteract.openedChests.put(block, player); + BukkitRunnable runnable = new BukkitRunnable() { + @Override + public void run() { + toolStats.playerInteract.openedChests.remove(block); + } + }; + toolStats.scheduleGlobal(runnable, 20); + } + // only check certain items if (!ItemChecker.isMineTool(heldItem.getType())) { return; diff --git a/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java b/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java index fa356a1..a01bb00 100644 --- a/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java +++ b/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java @@ -56,7 +56,6 @@ public class GenerateLoot implements Listener { return; } Location lootLocation = event.getLootContext().getLocation(); - Inventory chestInv = inventoryHolder.getInventory(); if (inventoryHolder instanceof Chest) { Block openedChest = null; @@ -77,48 +76,14 @@ public class GenerateLoot implements Listener { return; } - // run task later since if it runs on the same tick it breaks - Block finalOpenedChest = openedChest; - BukkitRunnable runnable = new BukkitRunnable() { - @Override - public void run() { - Player player = toolStats.playerInteract.openedChests.get(finalOpenedChest); - // keep track of chest index of item - for (int i = 0; i < chestInv.getContents().length; i++) { - ItemStack itemStack = chestInv.getItem(i); - // ignore air - if (itemStack == null || itemStack.getType() == Material.AIR) { - continue; - } - if (ItemChecker.isValidItem(itemStack.getType())) { - ItemStack newItem = addLore(itemStack, player); - if (newItem != null) { - chestInv.setItem(i, newItem); - } - } - } - } - }; - toolStats.scheduleRegion(runnable, lootLocation.getWorld(), lootLocation.getChunk(), 1); + Player player = toolStats.playerInteract.openedChests.get(openedChest); + setLoot(event.getLoot(), player); } if (inventoryHolder instanceof StorageMinecart) { StorageMinecart mineCart = (StorageMinecart) inventoryHolder; if (toolStats.playerInteract.openedMineCarts.containsKey(mineCart)) { Player player = toolStats.playerInteract.openedMineCarts.get(mineCart); - // player clicked this minecart - for (int i = 0; i < chestInv.getContents().length; i++) { - ItemStack itemStack = chestInv.getItem(i); - // ignore air - if (itemStack == null || itemStack.getType() == Material.AIR) { - continue; - } - if (ItemChecker.isValidItem(itemStack.getType())) { - ItemStack newItem = addLore(itemStack, player); - if (newItem != null) { - chestInv.setItem(i, newItem); - } - } - } + setLoot(event.getLoot(), player); } } } @@ -163,4 +128,26 @@ public class GenerateLoot implements Listener { newItem.setItemMeta(meta); return newItem; } + + /** + * Add tags to the generated loot. + * + * @param loot The loot from the event. + * @param player The player triggering the event. + */ + private void setLoot(List loot, Player player) { + for (int i = 0; i < loot.size(); i++) { + ItemStack itemStack = loot.get(i); + // ignore air + if (itemStack == null || itemStack.getType() == Material.AIR) { + continue; + } + if (ItemChecker.isValidItem(itemStack.getType())) { + ItemStack newItem = addLore(itemStack, player); + if (newItem != null) { + loot.set(i, newItem); + } + } + } + } }