aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/MylesAndMore/Tumble/commands
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2024-06-27 02:40:06 -0400
committersowgro <tpoke.ferrari@gmail.com>2024-06-27 02:40:06 -0400
commit02cc74cc5ac06a69ec59d6277234ce69031402f4 (patch)
treee213f687ac5fb5731fa7f2ed7420c54028c919b4 /src/main/java/com/MylesAndMore/Tumble/commands
parentd849ab8d085675715622dcef212d32239eb5d4bb (diff)
downloadTumble-02cc74cc5ac06a69ec59d6277234ce69031402f4.tar.gz
Tumble-02cc74cc5ac06a69ec59d6277234ce69031402f4.tar.bz2
Tumble-02cc74cc5ac06a69ec59d6277234ce69031402f4.zip
overhaul command and config formats (again)
Diffstat (limited to 'src/main/java/com/MylesAndMore/Tumble/commands')
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Config.java122
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Create.java44
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java33
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java35
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Join.java50
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Leave.java33
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Reload.java27
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Remove.java53
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/SetGameSpawn.java60
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/SetKillYCordinate.java61
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/SetLobby.java60
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/SetWaitArea.java60
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/SetWinnerLobby.java60
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/commands/Tumble.java85
14 files changed, 593 insertions, 190 deletions
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Config.java b/src/main/java/com/MylesAndMore/Tumble/commands/Config.java
deleted file mode 100644
index 5fc2de6..0000000
--- a/src/main/java/com/MylesAndMore/Tumble/commands/Config.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package com.MylesAndMore.Tumble.commands;
-
-import com.MylesAndMore.Tumble.game.Arena;
-import com.MylesAndMore.Tumble.plugin.ConfigManager;
-import org.bukkit.ChatColor;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.TabCompleter;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class Config implements CommandExecutor, TabCompleter {
- @Override
- public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
- if (!(sender instanceof Player)) {
- sender.sendMessage(ChatColor.RED + "This cannot be run by the console");
- return false;
- }
-
- if (!sender.hasPermission("tumble.config")) {
- sender.sendMessage(ChatColor.RED + "You do not have permission to perform this command!");
- return false;
- }
-
- if (args.length < 2 || args[0] == null || args[1] == null) {
- sender.sendMessage(ChatColor.RED + "Missing arguments");
- return false;
- }
-
- switch (args[0]) {
- case "add" -> {
- String arenaName = args[1];
- ConfigManager.arenas.put(arenaName, new Arena(arenaName, ((Player)sender).getLocation(), null));
- sender.sendMessage(ChatColor.GREEN + "Arena added.");
- }
- case "set" -> {
- String world = args[1];
- if (ConfigManager.arenas.containsKey(world)) {
- ConfigManager.arenas.get(world).location = ((Player)sender).getLocation();
- }
- else if (world.equals("waitArea")) {
- ConfigManager.waitArea = ((Player)sender).getLocation();
- }
- else if (world.equals("lobbySpawn")) {
- ConfigManager.lobby = ((Player)sender).getLocation();
- }
- else if (world.equals("winnerLobbySpawn")) {
- ConfigManager.winnerLobby = ((Player)sender).getLocation();
- }
- else {
- sender.sendMessage(ChatColor.RED + "Invalid parameter");
- return false;
- }
- sender.sendMessage(ChatColor.GREEN + "Location set.");
- }
- case "disable" -> {
- String world = args[1];
- if (world.equals("waitArea")) {
- ConfigManager.waitArea = null;
- }
- else if (world.equals("winnerLobbySpawn")) {
- ConfigManager.winnerLobby = null;
- }
- else {
- sender.sendMessage(ChatColor.RED + "Invalid parameter");
- return false;
- }
- sender.sendMessage(ChatColor.GREEN + "World disabled.");
- }
- case "remove" -> {
- String world = args[1];
- if (ConfigManager.arenas.containsKey(world)) {
- ConfigManager.arenas.remove(world);
- }
- else {
- sender.sendMessage(ChatColor.RED + "Invalid parameter");
- return false;
- }
- sender.sendMessage(ChatColor.GREEN + "Location set");
- }
- default -> {
- sender.sendMessage(ChatColor.RED + "Invalid parameter");
- return false;
- }
- }
-
- ConfigManager.WriteConfig();
- sender.sendMessage(ChatColor.GREEN + "Wrote changes to file.");
- return true;
- }
-
- @Override
- public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
- if (args.length == 1) {
- return new ArrayList<>(Arrays.asList("add", "set", "disable", "remove"));
- }
- if (args.length == 2) {
- switch (args[0]) {
- case "set" -> {
- ArrayList<String> temp = new ArrayList<>(ConfigManager.arenas.keySet());
- temp.addAll(Arrays.asList("waitArea", "lobbySpawn", "winnerLobbySpawn"));
- return temp;
- }
- case "disable" -> {
- return Arrays.asList("waitArea", "winnerLobbySpawn");
- }
- case "delete" -> {
- return ConfigManager.arenas.keySet().stream().toList();
- }
- default -> {
- return new ArrayList<>();
- }
- }
- }
- return new ArrayList<>();
- }
-}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Create.java b/src/main/java/com/MylesAndMore/Tumble/commands/Create.java
new file mode 100644
index 0000000..3340cc6
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/Create.java
@@ -0,0 +1,44 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.game.Arena;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class Create implements SubCommand, CommandExecutor, TabCompleter {
+ @Override
+ public String getCommandName() {
+ return "create";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.create";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 0 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
+ return false;
+ }
+
+ String arenaName = args[0];
+ ArenaManager.arenas.put(arenaName, new Arena(arenaName));
+ sender.sendMessage(LanguageManager.fromKey("create-success"));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java
index bdead44..c8042bc 100644
--- a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStart.java
@@ -1,8 +1,9 @@
package com.MylesAndMore.Tumble.commands;
import com.MylesAndMore.Tumble.game.Game;
-import com.MylesAndMore.Tumble.plugin.ConfigManager;
-import org.bukkit.ChatColor;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -13,36 +14,42 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
-public class ForceStart implements CommandExecutor, TabCompleter {
+public class ForceStart implements SubCommand, CommandExecutor, TabCompleter {
+
@Override
- public boolean onCommand(CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ public String getCommandName() {
+ return "forceStart";
+ }
- if (!sender.hasPermission("tumble.forcestart")) {
- sender.sendMessage(ChatColor.RED + "You do not have permission to perform this command!");
- return false;
- }
+ @Override
+ public String getPermission() {
+ return "tumble.forceStart";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
Game game;
if (args.length < 1 || args[0] == null) {
- game = ConfigManager.findGamePlayerIsIn((Player)sender);
+ game = ArenaManager.findGamePlayerIsIn((Player)sender);
if (game == null) {
- sender.sendMessage(ChatColor.RED + "Missing arena name");
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
return false;
}
}
else {
- game = ConfigManager.arenas.get(args[0]).game;
+ game = ArenaManager.arenas.get(args[0]).game;
}
game.gameStart();
- sender.sendMessage(ChatColor.GREEN + "Starting game");
+ sender.sendMessage(LanguageManager.fromKey("forcestart-success"));
return true;
}
@Override
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length == 1) {
- return ConfigManager.arenas.keySet().stream().toList();
+ return ArenaManager.arenas.keySet().stream().toList();
}
return new ArrayList<>();
}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java
index ddd5826..96e8334 100644
--- a/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/ForceStop.java
@@ -1,8 +1,9 @@
package com.MylesAndMore.Tumble.commands;
import com.MylesAndMore.Tumble.game.Game;
-import com.MylesAndMore.Tumble.plugin.ConfigManager;
-import org.bukkit.ChatColor;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -13,41 +14,47 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
-public class ForceStop implements CommandExecutor, TabCompleter {
+public class ForceStop implements SubCommand, CommandExecutor, TabCompleter {
+
@Override
- public boolean onCommand(CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ public String getCommandName() {
+ return "forcestop";
+ }
- if (!sender.hasPermission("tumble.forcestop")) {
- sender.sendMessage(ChatColor.RED + "You do not have permission to perform this command!");
- return false;
- }
+ @Override
+ public String getPermission() {
+ return "tumble.forcestop";
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
Game game;
if (args.length < 1 || args[0] == null) {
- game = ConfigManager.findGamePlayerIsIn((Player)sender);
+ game = ArenaManager.findGamePlayerIsIn((Player)sender);
if (game == null) {
- sender.sendMessage(ChatColor.RED + "Missing arena name");
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
return false;
}
}
else {
- game = ConfigManager.arenas.get(args[0]).game;
+ game = ArenaManager.arenas.get(args[0]).game;
}
if (game == null) {
- sender.sendMessage(ChatColor.RED + "No game is currently running in this arena");
+ sender.sendMessage(LanguageManager.fromKey("no-game-in-arena"));
return false;
}
game.gameEnd();
- sender.sendMessage(ChatColor.GREEN + "Game stopped.");
+ sender.sendMessage(LanguageManager.fromKey("forcestop-success"));
return true;
}
@Override
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length == 1) {
- return ConfigManager.arenas.keySet().stream().toList();
+ return ArenaManager.arenas.keySet().stream().toList();
}
return new ArrayList<>();
}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Join.java b/src/main/java/com/MylesAndMore/Tumble/commands/Join.java
index de44da1..a887c99 100644
--- a/src/main/java/com/MylesAndMore/Tumble/commands/Join.java
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/Join.java
@@ -1,10 +1,12 @@
package com.MylesAndMore.Tumble.commands;
import com.MylesAndMore.Tumble.game.Arena;
-import com.MylesAndMore.Tumble.plugin.ConfigManager;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
import com.MylesAndMore.Tumble.game.Game;
import com.MylesAndMore.Tumble.plugin.GameState;
import com.MylesAndMore.Tumble.plugin.GameType;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@@ -19,35 +21,41 @@ import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
-public class Join implements CommandExecutor, TabCompleter {
+public class Join implements SubCommand, CommandExecutor, TabCompleter {
+
+ @Override
+ public String getCommandName() {
+ return "join";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.join";
+ }
+
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (!(sender instanceof Player)) {
- sender.sendMessage(ChatColor.RED + "This cannot be run by the console");
- return false;
- }
-
- if (!sender.hasPermission("tumble.join")) {
- sender.sendMessage(ChatColor.RED + "You do not have permission to perform this command!");
+ sender.sendMessage(LanguageManager.fromKey("not-for-console"));
return false;
}
- if (ConfigManager.findGamePlayerIsIn((Player)sender) != null) {
- sender.sendMessage(ChatColor.RED + "You are already in a game! Leave it to join another one");
+ if (ArenaManager.findGamePlayerIsIn((Player)sender) != null) {
+ sender.sendMessage(LanguageManager.fromKey("already-in-game"));
}
if (args.length < 1 || args[0] == null) {
- sender.sendMessage(ChatColor.RED + "Missing arena name");
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
return false;
}
String arenaName = args[0];
- if (!ConfigManager.arenas.containsKey(arenaName))
+ if (!ArenaManager.arenas.containsKey(arenaName))
{
- sender.sendMessage(ChatColor.RED + "This arena does not exist");
+ sender.sendMessage(LanguageManager.fromKey("invalid-arena").replace("%arena%", arenaName));
return false;
}
- Arena arena = ConfigManager.arenas.get(arenaName);
+ Arena arena = ArenaManager.arenas.get(arenaName);
Game game;
if (args.length < 2 || args[1] == null) {
@@ -66,7 +74,7 @@ public class Join implements CommandExecutor, TabCompleter {
case "snowballs", "snowball" -> type = GameType.SNOWBALLS;
case "mix", "mixed" -> type = GameType.MIXED;
default -> {
- sender.sendMessage(ChatColor.RED + "Invalid game type");
+ sender.sendMessage(LanguageManager.fromKey("invalid-type"));
return false;
}
}
@@ -80,26 +88,30 @@ public class Join implements CommandExecutor, TabCompleter {
game = arena.game;
}
else {
- sender.sendMessage(ChatColor.RED + "A game of "+type+" is currently taking place in this arena, choose another arena or join it with /tumble:join "+arena.name+" "+type);
+ sender.sendMessage(LanguageManager.fromKey("another-type-in-arena")
+ .replace("%type%",type.toString())
+ .replace("%arena%",arenaName));
return false;
}
}
}
if (game.gameState != GameState.WAITING) {
- sender.sendMessage(ChatColor.RED + "This game is still in progress, wait until it finishes or join another game");
+ sender.sendMessage(LanguageManager.fromKey("game-in-progress"));
return false;
}
game.addPlayer((Player)sender);
- sender.sendMessage(ChatColor.GREEN + "Joined game " + arena.name + " - " + game.type);
+ sender.sendMessage(LanguageManager.fromKey("join-success")
+ .replace("%type%", game.type.toString())
+ .replace("%arena%", arena.name));
return true;
}
@Override
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length == 1) {
- return ConfigManager.arenas.keySet().stream().toList();
+ return ArenaManager.arenas.keySet().stream().toList();
}
if (args.length == 2) {
return Arrays.stream(GameType.values()).map(Objects::toString).collect(Collectors.toList());
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Leave.java b/src/main/java/com/MylesAndMore/Tumble/commands/Leave.java
index 1d00ca4..0250cc6 100644
--- a/src/main/java/com/MylesAndMore/Tumble/commands/Leave.java
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/Leave.java
@@ -1,8 +1,9 @@
package com.MylesAndMore.Tumble.commands;
import com.MylesAndMore.Tumble.game.Game;
-import com.MylesAndMore.Tumble.plugin.ConfigManager;
-import org.bukkit.ChatColor;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -13,28 +14,36 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
-public class Leave implements CommandExecutor, TabCompleter {
+public class Leave implements SubCommand, CommandExecutor, TabCompleter {
+
+ @Override
+ public String getCommandName() {
+ return "leave";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.leave";
+ }
+
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (!(sender instanceof Player)) {
- sender.sendMessage(ChatColor.RED + "This cannot be run by the console");
- return false;
- }
-
- if (!sender.hasPermission("tumble.leave")) {
- sender.sendMessage(ChatColor.RED + "You do not have permission to perform this command!");
+ sender.sendMessage(LanguageManager.fromKey("not-for-console"));
return false;
}
- Game game = ConfigManager.findGamePlayerIsIn((Player)sender);
+ Game game = ArenaManager.findGamePlayerIsIn((Player)sender);
if (game == null) {
- sender.sendMessage(ChatColor.RED + "You are not in a game.");
+ sender.sendMessage(LanguageManager.fromKey("no-game-in-arena"));
return false;
}
game.removePlayer((Player) sender);
- sender.sendMessage(ChatColor.GREEN + "Game left.");
+ sender.sendMessage(LanguageManager.fromKey("leave-success")
+ .replace("%arena%", game.arena.name)
+ .replace("%type%", game.type.toString()));
return true;
}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java b/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java
index ca67a2e..66535d5 100644
--- a/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/Reload.java
@@ -1,8 +1,9 @@
package com.MylesAndMore.Tumble.commands;
import com.MylesAndMore.Tumble.game.Arena;
-import com.MylesAndMore.Tumble.plugin.ConfigManager;
-import org.bukkit.ChatColor;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -14,23 +15,29 @@ import java.util.List;
import static com.MylesAndMore.Tumble.Main.plugin;
-public class Reload implements CommandExecutor, TabCompleter {
+public class Reload implements SubCommand, CommandExecutor, TabCompleter {
@Override
- public boolean onCommand(CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
- if (!sender.hasPermission("tumble.reload")) {
- sender.sendMessage(ChatColor.RED + "You do not have permission to perform this command!");
- return false;
- }
+ public String getCommandName() {
+ return "reload";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.reload";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
- for (Arena a : ConfigManager.arenas.values()) {
+ for (Arena a : ArenaManager.arenas.values()) {
if (a.game != null) {
a.game.gameEnd();
}
}
plugin.onEnable();
- sender.sendMessage(ChatColor.GREEN + "Tumble configuration reloaded. Check console for errors.");
+ sender.sendMessage(LanguageManager.fromKey("reload-success"));
return true;
}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Remove.java b/src/main/java/com/MylesAndMore/Tumble/commands/Remove.java
new file mode 100644
index 0000000..118aa77
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/Remove.java
@@ -0,0 +1,53 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class Remove implements SubCommand, CommandExecutor, TabCompleter {
+
+ @Override
+ public String getCommandName() {
+ return "remove";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.remove";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 0 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
+ return false;
+ }
+ String arenaName = args[0];
+
+ if (!ArenaManager.arenas.containsKey(arenaName)) {
+ sender.sendMessage(LanguageManager.fromKey("invalid-arena").replace("%arena%",arenaName));
+ return false;
+ }
+
+ ArenaManager.arenas.remove(arenaName);
+ sender.sendMessage(LanguageManager.fromKey("set-success"));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 1) {
+ return ArenaManager.arenas.keySet().stream().toList();
+ }
+
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/SetGameSpawn.java b/src/main/java/com/MylesAndMore/Tumble/commands/SetGameSpawn.java
new file mode 100644
index 0000000..62d22f8
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/SetGameSpawn.java
@@ -0,0 +1,60 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.game.Arena;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class SetGameSpawn implements SubCommand, CommandExecutor, TabCompleter {
+ @Override
+ public String getCommandName() {
+ return "setGameSpawn";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.setGameSpawn";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(LanguageManager.fromKey("not-for-console"));
+ return false;
+ }
+
+ if (args.length == 0 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
+ return false;
+ }
+ String arenaName = args[0];
+
+ if (!ArenaManager.arenas.containsKey(arenaName)) {
+ sender.sendMessage(LanguageManager.fromKey("invalid-arena").replace("%arena%",arenaName));
+ return false;
+ }
+ Arena arena = ArenaManager.arenas.get(arenaName);
+
+ arena.gameSpawn = ((Player)sender).getLocation();
+ sender.sendMessage(LanguageManager.fromKey("set-success"));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 1) {
+ return ArenaManager.arenas.keySet().stream().toList();
+ }
+
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/SetKillYCordinate.java b/src/main/java/com/MylesAndMore/Tumble/commands/SetKillYCordinate.java
new file mode 100644
index 0000000..0be156f
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/SetKillYCordinate.java
@@ -0,0 +1,61 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.game.Arena;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class SetKillYCordinate implements SubCommand, CommandExecutor, TabCompleter {
+
+ @Override
+ public String getCommandName() {
+ return "setKillYLevel";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.setKillYLevel";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(LanguageManager.fromKey("not-for-console"));
+ return false;
+ }
+
+ if (args.length == 0 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
+ return false;
+ }
+ String arenaName = args[0];
+
+ if (!ArenaManager.arenas.containsKey(arenaName)) {
+ sender.sendMessage(LanguageManager.fromKey("invalid-arena").replace("%arena%",arenaName));
+ return false;
+ }
+ Arena arena = ArenaManager.arenas.get(arenaName);
+
+ arena.killAtY = ((int) ((Player) sender).getLocation().getY());
+ sender.sendMessage(LanguageManager.fromKey("set-success"));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 1) {
+ return ArenaManager.arenas.keySet().stream().toList();
+ }
+
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/SetLobby.java b/src/main/java/com/MylesAndMore/Tumble/commands/SetLobby.java
new file mode 100644
index 0000000..dbb6b53
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/SetLobby.java
@@ -0,0 +1,60 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.game.Arena;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class SetLobby implements SubCommand, CommandExecutor, TabCompleter {
+ @Override
+ public String getCommandName() {
+ return "setLobby";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.setLobby";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(LanguageManager.fromKey("not-for-console"));
+ return false;
+ }
+
+ if (args.length == 0 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
+ return false;
+ }
+ String arenaName = args[0];
+
+ if (!ArenaManager.arenas.containsKey(arenaName)) {
+ sender.sendMessage(LanguageManager.fromKey("invalid-arena").replace("%arena%",arenaName));
+ return false;
+ }
+ Arena arena = ArenaManager.arenas.get(arenaName);
+
+ arena.lobby = ((Player)sender).getLocation();
+ sender.sendMessage(LanguageManager.fromKey("set-success"));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 1) {
+ return ArenaManager.arenas.keySet().stream().toList();
+ }
+
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/SetWaitArea.java b/src/main/java/com/MylesAndMore/Tumble/commands/SetWaitArea.java
new file mode 100644
index 0000000..f789658
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/SetWaitArea.java
@@ -0,0 +1,60 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.game.Arena;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class SetWaitArea implements SubCommand, CommandExecutor, TabCompleter {
+ @Override
+ public String getCommandName() {
+ return "setWaitArea";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.setWaitArea";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(LanguageManager.fromKey("not-for-console"));
+ return false;
+ }
+
+ if (args.length == 0 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
+ return false;
+ }
+ String arenaName = args[0];
+
+ if (!ArenaManager.arenas.containsKey(arenaName)) {
+ sender.sendMessage(LanguageManager.fromKey("invalid-arena").replace("%arena%",arenaName));
+ return false;
+ }
+ Arena arena = ArenaManager.arenas.get(arenaName);
+
+ arena.waitArea = ((Player)sender).getLocation();
+ sender.sendMessage(LanguageManager.fromKey("set-success"));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 1) {
+ return ArenaManager.arenas.keySet().stream().toList();
+ }
+
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/SetWinnerLobby.java b/src/main/java/com/MylesAndMore/Tumble/commands/SetWinnerLobby.java
new file mode 100644
index 0000000..01817b0
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/SetWinnerLobby.java
@@ -0,0 +1,60 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.game.Arena;
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.config.ArenaManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class SetWinnerLobby implements SubCommand, CommandExecutor, TabCompleter {
+ @Override
+ public String getCommandName() {
+ return "setWinnerLobby";
+ }
+
+ @Override
+ public String getPermission() {
+ return "tumble.setWinnerLobby";
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(LanguageManager.fromKey("not-for-console"));
+ return false;
+ }
+
+ if (args.length == 0 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(LanguageManager.fromKey("missing-arena-parameter"));
+ return false;
+ }
+ String arenaName = args[0];
+
+ if (!ArenaManager.arenas.containsKey(arenaName)) {
+ sender.sendMessage(LanguageManager.fromKey("invalid-arena").replace("%arena%",arenaName));
+ return false;
+ }
+ Arena arena = ArenaManager.arenas.get(arenaName);
+
+ arena.winnerLobby = ((Player)sender).getLocation();
+ sender.sendMessage(LanguageManager.fromKey("set-success"));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 1) {
+ return ArenaManager.arenas.keySet().stream().toList();
+ }
+
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Tumble.java b/src/main/java/com/MylesAndMore/Tumble/commands/Tumble.java
new file mode 100644
index 0000000..6e44352
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/Tumble.java
@@ -0,0 +1,85 @@
+package com.MylesAndMore.Tumble.commands;
+
+import com.MylesAndMore.Tumble.config.LanguageManager;
+import com.MylesAndMore.Tumble.plugin.SubCommand;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+
+public class Tumble implements CommandExecutor, TabCompleter {
+
+ private static final Map<String, SubCommand> subCommands = Map.ofEntries(
+ CmdNameAsKey(new Create()),
+ CmdNameAsKey(new ForceStart()),
+ CmdNameAsKey(new ForceStop()),
+ CmdNameAsKey(new Join()),
+ CmdNameAsKey(new Leave()),
+ CmdNameAsKey(new Reload()),
+ CmdNameAsKey(new Remove()),
+ CmdNameAsKey(new SetGameSpawn()),
+ CmdNameAsKey(new SetKillYCordinate()),
+ CmdNameAsKey(new SetLobby()),
+ CmdNameAsKey(new SetWaitArea()),
+ CmdNameAsKey(new SetWinnerLobby())
+ );
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (!subCommands.containsKey(args[0])) {
+ sender.sendMessage(LanguageManager.fromKey("unknown-command"));
+ return true;
+ }
+
+ var subCmd = subCommands.get(args[0]);
+
+ if (!sender.hasPermission(subCmd.getPermission())) {
+ sender.sendMessage(LanguageManager.fromKey("no-permission").replace("%permission%", subCmd.getPermission()));
+ return false;
+ }
+
+ subCmd.onCommand(sender, command, args[0], removeFirst(args));
+ return true;
+ }
+
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+ if (args.length == 1) {
+ ArrayList<String> PermittedSubCmds = new ArrayList<>();
+ for (SubCommand subCmd: subCommands.values()) {
+ if (sender.hasPermission(subCmd.getPermission())) {
+ PermittedSubCmds.add(subCmd.getCommandName());
+ }
+ }
+ return PermittedSubCmds;
+ }
+
+ if (args.length > 1) {
+ if (!subCommands.containsKey(args[0])) {
+ return Collections.emptyList();
+ }
+
+ if (subCommands.get(args[0]) instanceof TabCompleter tcmp) {
+ return tcmp.onTabComplete(sender, command, args[0], removeFirst(args));
+ }
+ else {
+ return null;
+ }
+ }
+
+ return Collections.emptyList();
+ }
+
+ private String[] removeFirst(String[] arr) {
+ ArrayList<String> tmp = new ArrayList<>(List.of(arr));
+ tmp.remove(0);
+ return tmp.toArray(new String[0]);
+ }
+
+ private static Map.Entry<String, SubCommand> CmdNameAsKey(SubCommand s) {
+ return Map.entry(s.getCommandName(),s);
+ }
+}