Browse Source

Adding '/mw mapmenu' & '/mw teammenu', Reworking '/mw vote' & '/mw change'

RedstoneFuture 1 year ago
parent
commit
046bf14da6

+ 3 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/MWCommands.java

@@ -43,8 +43,10 @@ public class MWCommands extends BaseCommand {
     @Description("Shows information about the MissileWars Plugin.")
     public void mwCommand(CommandSender sender) {
 
+        sendHelpMessage(sender, "mw.vote", "/mw mapmenu", "Open the map-vote menu.");
         sendHelpMessage(sender, "mw.vote", "/mw vote <arena>", "Vote for a arena.");
-        sendHelpMessage(sender, "mw.change", "/mw change <1|2>", "Changes your team.");
+        sendHelpMessage(sender, "mw.change.use", "/mw teammenu", "Open the team-change menu.");
+        sendHelpMessage(sender, "mw.change.use", "/mw change <1|2|spec>", "Changes your team.");
         sendHelpMessage(sender, "mw.quit", "/mw quit", "Quit a game.");
 
         sendHelpMessage(sender, "mw.stats", "/mw stats [from] [arena]", "Shows stats.");

+ 127 - 27
missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/UserCommands.java

@@ -29,13 +29,15 @@ import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.game.GameManager;
 import de.butzlabben.missilewars.game.Team;
 import de.butzlabben.missilewars.game.enums.GameState;
+import de.butzlabben.missilewars.game.enums.MapChooseProcedure;
+import de.butzlabben.missilewars.game.enums.TeamType;
 import de.butzlabben.missilewars.player.MWPlayer;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
 @CommandAlias("mw|missilewars")
 public class UserCommands extends BaseCommand {
-
+    
     @Subcommand("vote")
     @CommandCompletion("@arenas")
     @CommandPermission("mw.vote")
@@ -60,12 +62,47 @@ public class UserCommands extends BaseCommand {
             return;
         }
         
+        if (game.getLobby().getMapChooseProcedure() != MapChooseProcedure.MAPVOTING) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.VOTE_CANT_VOTE));
+            return;
+        }
+        
         game.getMapVoting().addVote(player, args[0]);
     }
+    
+    @Subcommand("mapmenu")
+    @CommandCompletion("@nothing")
+    @CommandPermission("mw.vote")
+    public void mapmenuCommand(CommandSender sender, String[] args) {
+
+        if (!MWCommands.senderIsPlayer(sender)) return;
+        Player player = (Player) sender;
+
+        if (args.length > 0) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
+            return;
+        }
+        
+        Game game = GameManager.getInstance().getGame(player.getLocation());
+        if (game == null) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
+            return;
+        }
+        
+        if (game.getLobby().getMapChooseProcedure() != MapChooseProcedure.MAPVOTING) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.VOTE_CANT_VOTE));
+            return;
+        }
+        
+        // The GUI can also be opened when it is too late to vote according to the settings.
+        
+        MWPlayer mwPlayer = game.getPlayer(player);
+        mwPlayer.getMapVoteMenu().openMenu();
+    }
 
-    @Subcommand("change")
-    @CommandCompletion("@range:1-2")
-    @CommandPermission("mw.change")
+    @Subcommand("change|switch|team")
+    @CommandCompletion("@teams")
+    @CommandPermission("mw.change.use")
     public void changeCommand(CommandSender sender, String[] args) {
 
         if (!MWCommands.senderIsPlayer(sender)) return;
@@ -86,46 +123,109 @@ public class UserCommands extends BaseCommand {
             player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
             return;
         }
-
+        
+        // Is team change only in lobby allowed?
         if (game.getState() != GameState.LOBBY) {
-            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_CHANGE_TEAM_NOT_NOW));
-            return;
+            if (!game.getArena().isTeamchangeOngoingGame()) {
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_CHANGE_TEAM_NOT_NOW));
+                return;
+            }
+            
+        // Is too late for team change (last seconds of lobby waiting-time)?
+        } else if (game.getArena() != null) {
+            if (!game.getArena().isTeamchangeOngoingGame()) {
+                if (game.getTaskManager().getTimer().getSeconds() < 10) {
+                    player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_CHANGE_TEAM_NO_LONGER_NOW));
+                    return;
+                }
+            }
         }
-
-        // too late for team change:
-        if (game.getTaskManager().getTimer().getSeconds() < 10) {
-            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_CHANGE_TEAM_NO_LONGER_NOW));
-            return;
-        }
-
-        if (!(args[0].equalsIgnoreCase("1") || args[0].equalsIgnoreCase("2"))) {
-            sender.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_TEAM_NUMBER));
-            return;
-        }
-
+        
         MWPlayer mwPlayer = game.getPlayer(player);
-        int teamNumber = Integer.parseInt(args[0]);
-        Team to = teamNumber == 1 ? game.getTeam1() : game.getTeam2();
-
+        
+        Team from = mwPlayer.getTeam();
+        Team to;
+        
+        switch (args[0]) {
+            case "1":
+                if (!player.hasPermission("mw.change.playerteam")) {
+                    Messages.getMessage(true, Messages.MessageEnum.NO_PERMISSION);
+                    return;
+                }
+                to = game.getTeam1();
+                break;
+            case "2":
+                if (!player.hasPermission("mw.change.playerteam")) {
+                    Messages.getMessage(true, Messages.MessageEnum.NO_PERMISSION);
+                    return;
+                }
+                to = game.getTeam2();
+                break;
+            case "spec":
+            case "spectator":
+                if (!player.hasPermission("mw.change.spectator")) {
+                    Messages.getMessage(true, Messages.MessageEnum.NO_PERMISSION);
+                    return;
+                }
+                to = game.getTeamSpec();
+                break;
+            default:
+                sender.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_TEAM));
+                return;
+        }
+        
         // Is the same team?
-        if (to == mwPlayer.getTeam()) {
+        if (from == to) {
             player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_ALREADY_IN_TEAM));
             return;
         }
 
         // Would the number of team members be too far apart?
-        if (!game.isValidTeamSwitch(to)) {
+        if (!game.isValidFairSwitch(from, to)) {
             player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_UNFAIR_TEAM_SIZE));
             return;
         }
-
+        
         // Remove the player from the old team and add him to the new team
         to.addMember(mwPlayer);
-
-        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_TEAM_CHANGED).replace("%team%", to.getFullname()));
+        
+        if (to.getTeamType() == TeamType.SPECTATOR) {
+            if (game.getState() != GameState.LOBBY) {
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_SPECTATOR));
+            }
+        } else {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_TEAM_ASSIGNED).replace("%team%", to.getFullname()));
+        }
+        
         game.getScoreboardManager().updateScoreboard();
+        mwPlayer.getGameJoinMenu().getMenu();
     }
+    
+    @Subcommand("teammenu")
+    @CommandCompletion("@nothing")
+    @CommandPermission("mw.change.use")
+    public void teammenuCommand(CommandSender sender, String[] args) {
 
+        if (!MWCommands.senderIsPlayer(sender)) return;
+        Player player = (Player) sender;
+
+        if (args.length > 0) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
+            return;
+        }
+        
+        Game game = GameManager.getInstance().getGame(player.getLocation());
+        if (game == null) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
+            return;
+        }
+        
+        // The GUI can also be opened if the settings indicate that it is too late to change teams.
+        
+        MWPlayer mwPlayer = game.getPlayer(player);
+        mwPlayer.getTeamSelectionMenu().openMenu();
+    }
+    
     @Subcommand("quit|leave")
     @CommandCompletion("@nothing")
     @CommandPermission("mw.quit")