diff --git a/src/main/java/de/shiewk/smoderation/command/VanishCommand.java b/src/main/java/de/shiewk/smoderation/command/VanishCommand.java index 3d954ed..ec53f08 100644 --- a/src/main/java/de/shiewk/smoderation/command/VanishCommand.java +++ b/src/main/java/de/shiewk/smoderation/command/VanishCommand.java @@ -3,6 +3,9 @@ package de.shiewk.smoderation.command; import de.shiewk.smoderation.SModeration; import de.shiewk.smoderation.util.PlayerUtil; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectListIterator; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -20,14 +23,25 @@ public class VanishCommand implements TabExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - Player player = null; - if (args.length > 0){ - player = PlayerUtil.findOnlinePlayer(args[0]); - } else if (sender instanceof Player){ - player = (Player) sender; - } - if (player != null){ - toggleVanish(player); + if (args.length == 0 || args[0].equalsIgnoreCase("toggle")){ + Player player = null; + if (args.length > 1){ + player = PlayerUtil.findOnlinePlayer(args[1]); + } else if (sender instanceof Player){ + player = (Player) sender; + } + if (player != null){ + toggleVanish(player); + return true; + } else { + return false; + } + } else if (args[0].equalsIgnoreCase("list")) { + if (sender.hasPermission("smod.vanish.see")){ + listVanishedPlayersTo(sender); + } else { + sender.sendMessage(text().color(NamedTextColor.RED).content("You do not have permission to list all vanished players.")); + } return true; } else { return false; @@ -37,7 +51,10 @@ public class VanishCommand implements TabExecutor { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (args.length < 2){ - return PlayerUtil.listPlayerNames(); + return List.of("list", "toggle"); + } + if (args.length < 3 && args[0].equalsIgnoreCase("toggle")){ + return PlayerUtil.listPlayerNames(args[1]); } return List.of(); } @@ -89,4 +106,28 @@ public class VanishCommand implements TabExecutor { public static ObjectArrayList getVanishedPlayers() { return vanishedPlayers.clone(); } + + public static void listVanishedPlayersTo(CommandSender receiver){ + if (vanishedPlayers.isEmpty()){ + receiver.sendMessage(CHAT_PREFIX.append( + text().content("No players are currently vanished.").color(PRIMARY_COLOR) + )); + } else { + Component vanishList = CHAT_PREFIX.append( + text().content("The following players are currently vanished: ").color(PRIMARY_COLOR) + ); + for (ObjectListIterator iterator = vanishedPlayers.iterator(); iterator.hasNext(); ) { + Player vanishedPlayer = iterator.next(); + vanishList = vanishList.append( + vanishedPlayer.displayName().colorIfAbsent(SECONDARY_COLOR) + ); + if (iterator.hasNext()){ + vanishList = vanishList.append( + text().content(", ").color(PRIMARY_COLOR) + ); + } + } + receiver.sendMessage(vanishList); + } + } } diff --git a/src/main/java/de/shiewk/smoderation/listener/VanishListener.java b/src/main/java/de/shiewk/smoderation/listener/VanishListener.java index bd7fd6b..a1bf84e 100644 --- a/src/main/java/de/shiewk/smoderation/listener/VanishListener.java +++ b/src/main/java/de/shiewk/smoderation/listener/VanishListener.java @@ -25,12 +25,14 @@ public class VanishListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent event){ Bukkit.getScheduler().scheduleSyncDelayedTask(SModeration.PLUGIN, () -> { - final Player player = event.getPlayer(); + final Player player = event.getPlayer().getPlayer(); + assert player != null; if (player.hasPermission("smod.vanish.see")){ for (Player vanishedPlayer : VanishCommand.getVanishedPlayers()) { // to show visible vanished players player.showEntity(SModeration.PLUGIN, vanishedPlayer); } + VanishCommand.listVanishedPlayersTo(player); } }); } diff --git a/src/main/java/de/shiewk/smoderation/util/PlayerUtil.java b/src/main/java/de/shiewk/smoderation/util/PlayerUtil.java index 10d59a6..afc6fc5 100644 --- a/src/main/java/de/shiewk/smoderation/util/PlayerUtil.java +++ b/src/main/java/de/shiewk/smoderation/util/PlayerUtil.java @@ -6,6 +6,7 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -71,4 +72,8 @@ public abstract class PlayerUtil { } return List.copyOf(names); } + + public static List listPlayerNames(String search) { + return StringUtil.copyPartialMatches(search, listPlayerNames(), new ArrayList<>()); + } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a25ac28..becbadc 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -72,7 +72,7 @@ commands: permission: smod.enderchestsee description: Views the ender chest of another player. vanish: - usage: "§cUsage: /vanish " + usage: "§cUsage: /vanish list or /vanish toggle " aliases: - smvanish permission: smod.vanish