diff --git a/src/test/java/demo/commands/GamemodeCommand.java b/src/test/java/demo/commands/GamemodeCommand.java index 584c35d79..41847e332 100644 --- a/src/test/java/demo/commands/GamemodeCommand.java +++ b/src/test/java/demo/commands/GamemodeCommand.java @@ -19,12 +19,15 @@ import java.util.Locale; /** * Command that make a player change gamemode, made in * the style of the vanilla /gamemode command. + * + * @see https://minecraft.fandom.com/wiki/Commands/gamemode */ public class GamemodeCommand extends Command { public GamemodeCommand() { super("gamemode", "gm"); + //GameMode parameter ArgumentEnum gamemode = ArgumentType.Enum("gamemode", GameMode.class).setFormat(ArgumentEnum.Format.LOWER_CASED); gamemode.setCallback((sender, exception) -> { sender.sendMessage( @@ -33,57 +36,102 @@ public class GamemodeCommand extends Command { .append(Component.text("!")), MessageType.SYSTEM); }); - + //Targets parameter, can accept multiple players ArgumentEntity player = ArgumentType.Entity("targets").onlyPlayers(true); + //Upon invalid usage, print the correct usage of the command to the sender setDefaultExecutor((sender, context) -> { - sender.sendMessage(Component.text("Usage: /" + context.getCommandName() + " [targets]", NamedTextColor.RED), MessageType.SYSTEM); + //The used alias + String commandName = context.getCommandName(); + + sender.sendMessage(Component.text("Usage: /" + commandName + " [targets]", NamedTextColor.RED), MessageType.SYSTEM); }); + //Command Syntax for /gamemode addSyntax((sender, context) -> { + //Limit execution to players only if (!sender.isPlayer()) { sender.sendMessage(Component.text("Please run this command in-game.", NamedTextColor.RED)); return; } + //Check permission, this could be replaced with hasPermission if (sender.asPlayer().getPermissionLevel() < 2) { sender.sendMessage(Component.text("You don't have permission to use this command.", NamedTextColor.RED)); return; } + + //Arguments GameMode mode = context.get(gamemode); + + //Set the gamemode for the sender executeSelf(sender.asPlayer(), mode); }, gamemode); + //Command Syntax for /gamemode [targets] addSyntax((sender, context) -> { + //Check permission for players only + //This allows the console to use this syntax too if (sender.isPlayer() && sender.asPlayer().getPermissionLevel() < 2) { sender.sendMessage(Component.text("You don't have permission to use this command.", NamedTextColor.RED)); return; } + + //Arguments EntityFinder finder = context.get(player); GameMode mode = context.get(gamemode); - executeOthers(sender.asPlayer(), mode, finder.find(sender)); + + //Set the gamemode for the targets + executeOthers(sender, mode, finder.find(sender)); }, gamemode, player); } + /** + * Sets the gamemode for the specified entities, and + * notifies them (and the sender) in the chat. + */ private void executeOthers(CommandSender sender, GameMode mode, List entities) { if (entities.size() == 0) { + //If there are no players that could be modified, display an error message if (sender.isPlayer()) sender.sendMessage(Component.translatable("argument.entity.notfound.player", NamedTextColor.RED), MessageType.SYSTEM); else sender.sendMessage(Component.text("No player was found", NamedTextColor.RED), MessageType.SYSTEM); } else for (Entity entity : entities) { if (entity instanceof Player) { Player p = (Player) entity; if (p == sender) { + //If the player is the same as the sender, call + //executeSelf to display one message instead of two executeSelf(sender.asPlayer(), mode); } else { p.setGameMode(mode); - p.sendMessage(Component.translatable("gameMode.changed").args(Component.translatable("gameMode." + mode.name().toLowerCase(Locale.ROOT))), MessageType.SYSTEM); - sender.sendMessage(Component.translatable("commands.gamemode.success.other").args(p.getDisplayName() == null ? p.getName() : p.getDisplayName(), Component.translatable("gameMode." + mode.name().toLowerCase(Locale.ROOT))), MessageType.SYSTEM); + + //Create necessary components + String gamemodeString = "gameMode." + mode.name().toLowerCase(Locale.ROOT); + Component gamemodeComponent = Component.translatable(gamemodeString); + Component playerName = p.getDisplayName() == null ? p.getName() : p.getDisplayName(); + + //Send a message to the changed player + p.sendMessage(Component.translatable("gameMode.changed", gamemodeComponent), MessageType.SYSTEM); + + //Send a message to the sender + sender.sendMessage(Component.translatable("commands.gamemode.success.other", playername, gamemodeComponent), MessageType.SYSTEM); } } } } + /** + * Sets the gamemode for the executing Player, and + * notifies them in the chat. + */ private void executeSelf(Player sender, GameMode mode) { sender.setGameMode(mode); - sender.sendMessage(Component.translatable("commands.gamemode.success.self").args(Component.translatable("gameMode." + mode.name().toLowerCase(Locale.ROOT))), MessageType.SYSTEM); + + //The translation keys 'gameMode.survival', 'gameMode.creative', etc. + //correspond to the translated game mode names. + String gamemodeString = "gameMode." + mode.name().toLowerCase(Locale.ROOT); + Component gamemodeComponent = Component.translatable(gamemodeString); + + //Send the translated message to the player. + sender.sendMessage(Component.translatable("commands.gamemode.success.self", gamemodeComponent), MessageType.SYSTEM); } }