From ce8a8a44cdd9d57747d4b05bcc2ebe5f64e53575 Mon Sep 17 00:00:00 2001 From: Shiewk Date: Mon, 29 Jul 2024 16:27:42 +0200 Subject: [PATCH] Added Invsee for equipment --- .../smoderation/command/InvseeCommand.java | 26 +++++++- .../AutoUpdatingCustomInventory.java | 3 + .../inventory/InvSeeEquipmentInventory.java | 66 +++++++++++++++++++ .../listener/CustomInventoryListener.java | 20 ++++++ 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/shiewk/smoderation/inventory/AutoUpdatingCustomInventory.java create mode 100644 src/main/java/de/shiewk/smoderation/inventory/InvSeeEquipmentInventory.java diff --git a/src/main/java/de/shiewk/smoderation/command/InvseeCommand.java b/src/main/java/de/shiewk/smoderation/command/InvseeCommand.java index 65cec0a..c929d8f 100644 --- a/src/main/java/de/shiewk/smoderation/command/InvseeCommand.java +++ b/src/main/java/de/shiewk/smoderation/command/InvseeCommand.java @@ -1,5 +1,6 @@ package de.shiewk.smoderation.command; +import de.shiewk.smoderation.inventory.InvSeeEquipmentInventory; import de.shiewk.smoderation.util.PlayerUtil; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -19,16 +20,30 @@ import static de.shiewk.smoderation.SModeration.*; public class InvseeCommand implements TabExecutor { + private enum InvseeType { + INVENTORY, + EQUIPMENT + } + @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (args.length < 1) { return false; } + final InvseeType type; + if (args.length > 1){ + switch (args[1].toLowerCase()){ + case "armor", "equipment" -> type = InvseeType.EQUIPMENT; + default -> type = InvseeType.INVENTORY; + } + } else { + type = InvseeType.INVENTORY; + } if (sender instanceof HumanEntity human){ final Player player = PlayerUtil.findOnlinePlayer(args[0]); if (player != null) { - if (human.getUniqueId().equals(player.getUniqueId())){ + if (human.getUniqueId().equals(player.getUniqueId()) && type != InvseeType.EQUIPMENT){ human.sendMessage(Component.text("You can't open your own inventory.").color(FAIL_COLOR)); } else { human.sendMessage(CHAT_PREFIX.append( @@ -36,7 +51,10 @@ public class InvseeCommand implements TabExecutor { .append(Component.text(player.getName()).color(SECONDARY_COLOR)) .append(Component.text(".")) )); - human.openInventory(player.getInventory()); + switch (type){ + case INVENTORY -> human.openInventory(player.getInventory()); + case EQUIPMENT -> new InvSeeEquipmentInventory(human, player).open(); + } } } else { human.sendMessage(Component.text("This player is not online.").color(FAIL_COLOR)); @@ -49,8 +67,10 @@ public class InvseeCommand implements TabExecutor { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (args.length > 1){ + if (args.length > 2){ return List.of(); + } else if (args.length > 1){ + return List.of("armor", "equipment", "inventory"); } List available = new ArrayList<>(); for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { diff --git a/src/main/java/de/shiewk/smoderation/inventory/AutoUpdatingCustomInventory.java b/src/main/java/de/shiewk/smoderation/inventory/AutoUpdatingCustomInventory.java new file mode 100644 index 0000000..e055a3c --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/inventory/AutoUpdatingCustomInventory.java @@ -0,0 +1,3 @@ +package de.shiewk.smoderation.inventory; + +public interface AutoUpdatingCustomInventory extends CustomInventory { } diff --git a/src/main/java/de/shiewk/smoderation/inventory/InvSeeEquipmentInventory.java b/src/main/java/de/shiewk/smoderation/inventory/InvSeeEquipmentInventory.java new file mode 100644 index 0000000..f208b39 --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/inventory/InvSeeEquipmentInventory.java @@ -0,0 +1,66 @@ +package de.shiewk.smoderation.inventory; + +import de.shiewk.smoderation.SModeration; +import org.bukkit.Bukkit; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import static net.kyori.adventure.text.Component.text; + +public class InvSeeEquipmentInventory implements AutoUpdatingCustomInventory { + private final HumanEntity viewer; + private final HumanEntity subject; + private final Inventory inventory = Bukkit.createInventory(this, InventoryType.HOPPER, text("Player equipment")); + private boolean changing = false; + + public InvSeeEquipmentInventory(HumanEntity viewer, HumanEntity subject) { + this.viewer = viewer; + this.subject = subject; + } + + + @Override + public void refresh() { + if (!changing){ + final EntityEquipment equipment = subject.getEquipment(); + inventory.setItem(0, equipment.getHelmet()); + inventory.setItem(1, equipment.getChestplate()); + inventory.setItem(2, equipment.getLeggings()); + inventory.setItem(3, equipment.getBoots()); + inventory.setItem(4, equipment.getItemInOffHand()); + } + } + + @Override + public void open() { + refresh(); + viewer.openInventory(getInventory()); + } + + @Override + public void click(ItemStack stack, InventoryClickEvent event) { + if (viewer.hasPermission("smod.invsee.modify") && !subject.hasPermission("smod.invsee.preventmodify")){ + event.setCancelled(false); + changing = true; + Bukkit.getScheduler().scheduleSyncDelayedTask(SModeration.PLUGIN, () -> { + changing = false; + final EntityEquipment equipment = subject.getEquipment(); + equipment.setHelmet(inventory.getItem(0)); + equipment.setChestplate(inventory.getItem(1)); + equipment.setLeggings(inventory.getItem(2)); + equipment.setBoots(inventory.getItem(3)); + equipment.setItemInOffHand(inventory.getItem(4)); + }); + } + } + + @Override + public @NotNull Inventory getInventory() { + return inventory; + } +} diff --git a/src/main/java/de/shiewk/smoderation/listener/CustomInventoryListener.java b/src/main/java/de/shiewk/smoderation/listener/CustomInventoryListener.java index 26dcb88..148a857 100644 --- a/src/main/java/de/shiewk/smoderation/listener/CustomInventoryListener.java +++ b/src/main/java/de/shiewk/smoderation/listener/CustomInventoryListener.java @@ -1,17 +1,37 @@ package de.shiewk.smoderation.listener; +import com.destroystokyo.paper.event.server.ServerTickEndEvent; +import de.shiewk.smoderation.inventory.AutoUpdatingCustomInventory; import de.shiewk.smoderation.inventory.CustomInventory; +import org.bukkit.Bukkit; +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.InventoryDragEvent; public class CustomInventoryListener implements Listener { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onInventoryClick(InventoryClickEvent event){ if (event.getInventory().getHolder() instanceof CustomInventory customInventory){ + event.setCancelled(true); customInventory.click(event.getCurrentItem(), event); + } + } + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onInventoryDrag(InventoryDragEvent event){ + if (event.getInventory().getHolder() instanceof CustomInventory){ event.setCancelled(true); } } + + @EventHandler(priority = EventPriority.LOWEST) + public void onServerTickEnd(ServerTickEndEvent event){ + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + if (onlinePlayer.getOpenInventory().getTopInventory().getHolder() instanceof AutoUpdatingCustomInventory ci) { + ci.refresh(); + } + } + } }