From 7eeb6daa46aa1717b60b308db2bb4e44bd98fc4e Mon Sep 17 00:00:00 2001 From: Shiewk Date: Tue, 18 Jun 2024 18:26:50 +0200 Subject: [PATCH] Add Enderchest see command and permissions --- .../de/shiewk/smoderation/SModeration.java | 7 ++ .../command/EnderchestSeeCommand.java | 64 +++++++++++++++++++ .../event/EnderchestSeeEvents.java | 26 ++++++++ src/main/resources/plugin.yml | 19 +++++- 4 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/shiewk/smoderation/command/EnderchestSeeCommand.java create mode 100644 src/main/java/de/shiewk/smoderation/event/EnderchestSeeEvents.java diff --git a/src/main/java/de/shiewk/smoderation/SModeration.java b/src/main/java/de/shiewk/smoderation/SModeration.java index bb386ae..63f111a 100644 --- a/src/main/java/de/shiewk/smoderation/SModeration.java +++ b/src/main/java/de/shiewk/smoderation/SModeration.java @@ -2,6 +2,7 @@ package de.shiewk.smoderation; import de.shiewk.smoderation.command.*; import de.shiewk.smoderation.event.CustomInventoryEvents; +import de.shiewk.smoderation.event.EnderchestSeeEvents; import de.shiewk.smoderation.event.InvSeeEvents; import de.shiewk.smoderation.listener.PunishmentListener; import de.shiewk.smoderation.storage.PunishmentContainer; @@ -42,6 +43,7 @@ public final class SModeration extends JavaPlugin { getPluginManager().registerEvents(new PunishmentListener(), this); getPluginManager().registerEvents(new CustomInventoryEvents(), this); getPluginManager().registerEvents(new InvSeeEvents(), this); + getPluginManager().registerEvents(new EnderchestSeeEvents(), this); final PluginCommand mute = getCommand("mute"); assert mute != null; @@ -83,6 +85,11 @@ public final class SModeration extends JavaPlugin { invsee.setExecutor(new InvseeCommand()); invsee.setTabCompleter(new InvseeCommand()); + final PluginCommand ecsee = getCommand("enderchestsee"); + assert ecsee != null; + ecsee.setExecutor(new EnderchestSeeCommand()); + ecsee.setTabCompleter(new EnderchestSeeCommand()); + container.load(SAVE_FILE); } diff --git a/src/main/java/de/shiewk/smoderation/command/EnderchestSeeCommand.java b/src/main/java/de/shiewk/smoderation/command/EnderchestSeeCommand.java new file mode 100644 index 0000000..1553896 --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/command/EnderchestSeeCommand.java @@ -0,0 +1,64 @@ +package de.shiewk.smoderation.command; + +import de.shiewk.smoderation.util.PlayerUtil; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +import static de.shiewk.smoderation.SModeration.*; + +public class EnderchestSeeCommand implements CommandExecutor, TabCompleter { + + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (args.length < 1) { + return false; + } + if (sender instanceof HumanEntity human){ + final Player player = PlayerUtil.findOnlinePlayer(args[0]); + if (player != null) { + if (human.getUniqueId().equals(player.getUniqueId())){ + human.sendMessage(Component.text("You can't open your own ender chest.").color(FAIL_COLOR)); + } else { + human.sendMessage(CHAT_PREFIX.append( + Component.text("Opening ender chest of ").color(PRIMARY_COLOR) + .append(Component.text(player.getName()).color(SECONDARY_COLOR)) + .append(Component.text(".")) + )); + human.openInventory(player.getEnderChest()); + } + } else { + human.sendMessage(Component.text("This player is not online.").color(FAIL_COLOR)); + } + } else { + sender.sendMessage(Component.text("Only an entity that can open inventories can execute this command!").color(FAIL_COLOR)); + } + return true; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (args.length > 1){ + return List.of(); + } + List available = new ArrayList<>(); + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + available.add(onlinePlayer.getName()); + } + List completions = new ArrayList<>(); + StringUtil.copyPartialMatches(args.length > 0 ? args[0] : "", available, completions); + return completions; + } +} diff --git a/src/main/java/de/shiewk/smoderation/event/EnderchestSeeEvents.java b/src/main/java/de/shiewk/smoderation/event/EnderchestSeeEvents.java new file mode 100644 index 0000000..7962e0e --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/event/EnderchestSeeEvents.java @@ -0,0 +1,26 @@ +package de.shiewk.smoderation.event; + +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.PlayerInventory; + +public class EnderchestSeeEvents implements Listener { + + @EventHandler + public void onInventoryClick(InventoryClickEvent event){ + final Inventory clicked = event.getView().getTopInventory(); + if (!(clicked instanceof PlayerInventory)){ + final InventoryHolder holder = clicked.getHolder(); + if (holder instanceof HumanEntity humanHolder){ + if (!event.getWhoClicked().hasPermission("smod.enderchestsee.modify")){ + event.setCancelled(true); + } + } + } + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 4c85e98..1dd8336 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -62,6 +62,15 @@ commands: - invs permission: smod.invsee description: Views the inventory of another player. + enderchestsee: + usage: "§cUsage: /enderchestsee " + aliases: + - secsee + - senderchestsee + - ecsee + - ecs + permission: smod.enderchestsee + description: Views the ender chest of another player. permissions: smod.mute: default: op @@ -99,4 +108,12 @@ permissions: - smod.invsee smod.invsee.preventmodify: default: op - description: When giving this permission to a player, prevents their inventory from being modified. \ No newline at end of file + description: When giving this permission to a player, prevents their inventory from being modified. + smod.enderchestsee: + default: op + description: Allows the player to view other players ender chests. + smod.enderchestsee.modify: + default: op + description: Allows the player to view and modify other players ender chests. + children: + - smod.enderchestsee \ No newline at end of file