From d06a1c4a40542c12f70004664b4a64c65d1b69c4 Mon Sep 17 00:00:00 2001 From: hyperdefined Date: Wed, 15 Jun 2022 23:25:21 -0400 Subject: [PATCH] support for adding lore to minecart items --- .../hyper/toolstats/events/GenerateLoot.java | 94 ++++++++++++------- .../toolstats/events/PlayerInteract.java | 22 ++++- 2 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java b/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java index 121d873..4e538bc 100644 --- a/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java +++ b/src/main/java/lol/hyper/toolstats/events/GenerateLoot.java @@ -23,7 +23,9 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +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.Listener; import org.bukkit.event.world.LootGenerateEvent; @@ -55,45 +57,71 @@ public class GenerateLoot implements Listener { } Location lootLocation = event.getLootContext().getLocation(); Inventory chestInv = inventoryHolder.getInventory(); - Block openedChest = null; - // look at the current list of opened chest and get the distance - // between the lootcontext location and chest location - // if the distance is less than 1, it's the same chest - for (Block chest : toolStats.playerInteract.openedChests.keySet()) { - Location chestLocation = chest.getLocation(); - double distance = lootLocation.distance(chestLocation); - if (distance <= 1.0) { - openedChest = chest; - } - } - // ignore if the chest is not in the same location - if (openedChest == null) { - return; - } - // run task later since if it runs on the same tick it breaks idk - Block finalOpenedChest = openedChest; - Bukkit.getScheduler().runTaskLater(toolStats, () -> { - Player player = toolStats.playerInteract.openedChests.get(finalOpenedChest); - // do a classic for loop, so we 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 (inventoryHolder instanceof Chest) { + Block openedChest = null; + // look at the current list of opened chest and get the distance + // between the lootcontext location and chest location + // if the distance is less than 1, it's the same chest + for (Block chest : toolStats.playerInteract.openedChests.keySet()) { + Location chestLocation = chest.getLocation(); + double distance = lootLocation.distance(chestLocation); + if (distance <= 1.0) { + openedChest = chest; } - String name = itemStack.getType().toString().toLowerCase(Locale.ROOT); - for (String x : toolStats.allValidItems) { - if (name.contains(x)) { - ItemStack newItem = addLore(itemStack, player); - if (newItem != null) { - chestInv.setItem(i, newItem); + } + // ignore if the chest is not in the same location + if (openedChest == null) { + return; + } + + // run task later since if it runs on the same tick it breaks idk + Block finalOpenedChest = openedChest; + Bukkit.getScheduler().runTaskLater(toolStats, () -> { + Player player = toolStats.playerInteract.openedChests.get(finalOpenedChest); + // do a classic for loop, so we 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; + } + String name = itemStack.getType().toString().toLowerCase(Locale.ROOT); + for (String x : toolStats.allValidItems) { + if (name.contains(x)) { + ItemStack newItem = addLore(itemStack, player); + if (newItem != null) { + chestInv.setItem(i, newItem); + } + } + } + } + + }, 1); + } + 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; + } + String name = itemStack.getType().toString().toLowerCase(Locale.ROOT); + for (String x : toolStats.allValidItems) { + if (name.contains(x)) { + ItemStack newItem = addLore(itemStack, player); + if (newItem != null) { + chestInv.setItem(i, newItem); + } } } } } - - }, 1); + } } /** diff --git a/src/main/java/lol/hyper/toolstats/events/PlayerInteract.java b/src/main/java/lol/hyper/toolstats/events/PlayerInteract.java index bfb3062..428197b 100644 --- a/src/main/java/lol/hyper/toolstats/events/PlayerInteract.java +++ b/src/main/java/lol/hyper/toolstats/events/PlayerInteract.java @@ -22,10 +22,14 @@ import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.entity.minecart.StorageMinecart; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import java.util.HashMap; @@ -35,6 +39,7 @@ public class PlayerInteract implements Listener { private final ToolStats toolStats; public final HashMap openedChests = new HashMap<>(); + public final HashMap openedMineCarts = new HashMap<>(); public PlayerInteract(ToolStats toolStats) { this.toolStats = toolStats; @@ -56,11 +61,24 @@ public class PlayerInteract implements Listener { return; } // store when a player opens a chest - // this is used to detect who opens a newly spawned chest - // since that is not really tracked on the lootevent if (block.getType() != Material.AIR && block.getType() == Material.CHEST) { openedChests.put(block, player); Bukkit.getScheduler().runTaskLater(toolStats, () -> openedChests.remove(block), 20); } } + + @EventHandler + public void onInteract(PlayerInteractEntityEvent event) { + Entity clicked = event.getRightClicked(); + Player player = event.getPlayer(); + if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + return; + } + // store when a player opens a minecart + if (clicked.getType() == EntityType.MINECART_CHEST) { + StorageMinecart storageMinecart = (StorageMinecart) clicked; + openedMineCarts.put(storageMinecart, player); + Bukkit.getScheduler().runTaskLater(toolStats, () -> openedMineCarts.remove(storageMinecart), 20); + } + } }