From 6385b4c5e81a04bb30a67b5f82a3db4e6e155b2b Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 25 Mar 2023 12:35:15 +0100 Subject: [PATCH] Implements the remove command --- .../java/net/knarcraft/dropper/Dropper.java | 3 +- .../dropper/arena/DropperArenaHandler.java | 1 + .../arena/DropperArenaPlayerRegistry.java | 15 +++++++++ .../command/JoinArenaTabCompleter.java | 15 +++------ .../dropper/command/RemoveArenaCommand.java | 29 +++++++++++++---- .../command/RemoveArenaTabCompleter.java | 29 +++++++++++++++++ .../dropper/util/TabCompleteHelper.java | 32 +++++++++++++++++++ 7 files changed, 107 insertions(+), 17 deletions(-) create mode 100644 src/main/java/net/knarcraft/dropper/command/RemoveArenaTabCompleter.java create mode 100644 src/main/java/net/knarcraft/dropper/util/TabCompleteHelper.java diff --git a/src/main/java/net/knarcraft/dropper/Dropper.java b/src/main/java/net/knarcraft/dropper/Dropper.java index afa295e..3c93142 100644 --- a/src/main/java/net/knarcraft/dropper/Dropper.java +++ b/src/main/java/net/knarcraft/dropper/Dropper.java @@ -10,6 +10,7 @@ import net.knarcraft.dropper.command.JoinArenaTabCompleter; import net.knarcraft.dropper.command.LeaveArenaCommand; import net.knarcraft.dropper.command.ListArenaCommand; import net.knarcraft.dropper.command.RemoveArenaCommand; +import net.knarcraft.dropper.command.RemoveArenaTabCompleter; import net.knarcraft.dropper.listener.DamageListener; import net.knarcraft.dropper.listener.MoveListener; import net.knarcraft.dropper.listener.PlayerLeaveListener; @@ -88,7 +89,7 @@ public final class Dropper extends JavaPlugin { registerCommand("dropperjoin", new JoinArenaCommand(), new JoinArenaTabCompleter()); registerCommand("dropperleave", new LeaveArenaCommand(), null); registerCommand("dropperedit", new EditArenaCommand(), new EditArenaTabCompleter()); - registerCommand("dropperremove", new RemoveArenaCommand(), null); + registerCommand("dropperremove", new RemoveArenaCommand(), new RemoveArenaTabCompleter()); } @Override diff --git a/src/main/java/net/knarcraft/dropper/arena/DropperArenaHandler.java b/src/main/java/net/knarcraft/dropper/arena/DropperArenaHandler.java index f9196a9..11c75f7 100644 --- a/src/main/java/net/knarcraft/dropper/arena/DropperArenaHandler.java +++ b/src/main/java/net/knarcraft/dropper/arena/DropperArenaHandler.java @@ -65,6 +65,7 @@ public class DropperArenaHandler { * @param arena

The arena to remove

*/ public void removeArena(@NotNull DropperArena arena) { + Dropper.getInstance().getPlayerRegistry().removeForArena(arena); this.arenas.remove(arena); this.saveArenas(); } diff --git a/src/main/java/net/knarcraft/dropper/arena/DropperArenaPlayerRegistry.java b/src/main/java/net/knarcraft/dropper/arena/DropperArenaPlayerRegistry.java index de93bf9..938ed96 100644 --- a/src/main/java/net/knarcraft/dropper/arena/DropperArenaPlayerRegistry.java +++ b/src/main/java/net/knarcraft/dropper/arena/DropperArenaPlayerRegistry.java @@ -43,4 +43,19 @@ public class DropperArenaPlayerRegistry { return this.arenaPlayers.getOrDefault(playerId, null); } + /** + * Removes all active sessions for the given arena + * + * @param arena

The arena to remove sessions for

+ */ + public void removeForArena(DropperArena arena) { + for (Map.Entry entry : this.arenaPlayers.entrySet()) { + if (entry.getValue().getArena() == arena) { + // Kick the player gracefully + entry.getValue().triggerQuit(); + this.arenaPlayers.remove(entry.getKey()); + } + } + } + } diff --git a/src/main/java/net/knarcraft/dropper/command/JoinArenaTabCompleter.java b/src/main/java/net/knarcraft/dropper/command/JoinArenaTabCompleter.java index 1e79043..56066e1 100644 --- a/src/main/java/net/knarcraft/dropper/command/JoinArenaTabCompleter.java +++ b/src/main/java/net/knarcraft/dropper/command/JoinArenaTabCompleter.java @@ -1,7 +1,6 @@ package net.knarcraft.dropper.command; -import net.knarcraft.dropper.Dropper; -import net.knarcraft.dropper.arena.DropperArena; +import net.knarcraft.dropper.util.TabCompleteHelper; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; @@ -18,14 +17,10 @@ public class JoinArenaTabCompleter implements TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, - @NotNull String label, @NotNull String[] args) { - if (args.length == 1) { - List arenaNames = new ArrayList<>(); - for (DropperArena dropperArena : Dropper.getInstance().getArenaHandler().getArenas()) { - arenaNames.add(dropperArena.getArenaName()); - } - return arenaNames; - } else if (args.length == 2) { + @NotNull String label, @NotNull String[] arguments) { + if (arguments.length == 1) { + return TabCompleteHelper.getArenas(); + } else if (arguments.length == 2) { List gameModes = new ArrayList<>(); gameModes.add("default"); gameModes.add("deaths"); diff --git a/src/main/java/net/knarcraft/dropper/command/RemoveArenaCommand.java b/src/main/java/net/knarcraft/dropper/command/RemoveArenaCommand.java index 7c64dff..639c5e1 100644 --- a/src/main/java/net/knarcraft/dropper/command/RemoveArenaCommand.java +++ b/src/main/java/net/knarcraft/dropper/command/RemoveArenaCommand.java @@ -1,5 +1,8 @@ package net.knarcraft.dropper.command; +import net.knarcraft.dropper.Dropper; +import net.knarcraft.dropper.arena.DropperArena; +import net.knarcraft.dropper.util.ArenaStorageHelper; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -12,12 +15,26 @@ public class RemoveArenaCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, - @NotNull String[] strings) { - //TODO: Make sure to kick any playing players if the arena is currently in use, by triggering their sessions' - // triggerQuit() method - //TODO: Remove the arena from DropperArenaHandler - //TODO: Notify the user of success - return false; + @NotNull String[] arguments) { + // Get the specified arena + String arenaName = arguments[0]; + String sanitized = ArenaStorageHelper.sanitizeArenaName(arenaName); + DropperArena targetArena = null; + for (DropperArena arena : Dropper.getInstance().getArenaHandler().getArenas()) { + if (sanitized.equals(ArenaStorageHelper.sanitizeArenaName(arena.getArenaName()))) { + targetArena = arena; + } + } + + if (targetArena == null) { + commandSender.sendMessage("Unable to find the specified arena"); + return false; + } + + // Remove the arena + Dropper.getInstance().getArenaHandler().removeArena(targetArena); + commandSender.sendMessage("The specified arena has been successfully removed"); + return true; } } diff --git a/src/main/java/net/knarcraft/dropper/command/RemoveArenaTabCompleter.java b/src/main/java/net/knarcraft/dropper/command/RemoveArenaTabCompleter.java new file mode 100644 index 0000000..2dd8566 --- /dev/null +++ b/src/main/java/net/knarcraft/dropper/command/RemoveArenaTabCompleter.java @@ -0,0 +1,29 @@ +package net.knarcraft.dropper.command; + +import net.knarcraft.dropper.util.TabCompleteHelper; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +/** + * The tab-completer for the remove arena command + */ +public class RemoveArenaTabCompleter implements TabCompleter { + + @Nullable + @Override + public List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, + @NotNull String[] arguments) { + if (arguments.length == 1) { + return TabCompleteHelper.getArenas(); + } else { + return new ArrayList<>(); + } + } + +} diff --git a/src/main/java/net/knarcraft/dropper/util/TabCompleteHelper.java b/src/main/java/net/knarcraft/dropper/util/TabCompleteHelper.java new file mode 100644 index 0000000..f85766a --- /dev/null +++ b/src/main/java/net/knarcraft/dropper/util/TabCompleteHelper.java @@ -0,0 +1,32 @@ +package net.knarcraft.dropper.util; + +import net.knarcraft.dropper.Dropper; +import net.knarcraft.dropper.arena.DropperArena; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * A helper-class for common tab-completions + */ +public final class TabCompleteHelper { + + private TabCompleteHelper() { + + } + + /** + * Gets the names of all current arenas + * + * @return

All arena names

+ */ + public static @NotNull List getArenas() { + List arenaNames = new ArrayList<>(); + for (DropperArena dropperArena : Dropper.getInstance().getArenaHandler().getArenas()) { + arenaNames.add(dropperArena.getArenaName()); + } + return arenaNames; + } + +}