Command Structure
Hytale commands use a class-based system with Command (parent) and ExecuteCommand (executable) classes.
| class | purpose |
|---|---|
| Command | Parent command, contains subcommands |
| ExecuteCommand | Executable command with arguments |
| Arguments | Define command parameters |
| Arguments.ParsedArguments | Access parsed argument values |
Basic Command
HelloCommand.javajava
1public class HelloCommand extends ExecuteCommand {2 3 public HelloCommand() {4 super("hello", "Say hello to the world");5 }6 7 @Override8 public Arguments getArguments() {9 return Arguments.empty(); // No arguments10 }11 12 @Override13 public void execute(Player player, Arguments.ParsedArguments args) {14 player.sendMessage("Hello, " + player.getName() + "!");15 }16}Registration
1@Override2protected void start() {3 // Register the command4 getCommandRegistry().register(new HelloCommand());5}Command with Arguments
GiveSpeedCommand.javajava
1public class GiveSpeedCommand extends ExecuteCommand {2 3 public GiveSpeedCommand() {4 super("speed", "Set player speed multiplier");5 }6 7 @Override8 public Arguments getArguments() {9 return Arguments.args(10 new DoubleArgument("multiplier", 0.1, 10.0) // min 0.1, max 10.011 );12 }13 14 @Override15 public void execute(Player player, Arguments.ParsedArguments args) {16 double multiplier = args.argument("multiplier");17 18 // Apply speed (see Movement docs)19 setPlayerSpeed(player, (float) multiplier);20 21 player.sendMessage("Speed set to " + multiplier + "x");22 }23}Argument Types
| type | example | description |
|---|---|---|
| StringArgument | new StringArgument("name") | Any text string |
| IntegerArgument | new IntegerArgument("count", 1, 100) | Integer with range |
| DoubleArgument | new DoubleArgument("value", 0.0, 1.0) | Decimal with range |
| BooleanArgument | new BooleanArgument("enabled") | true/false |
| PlayerArgument | new PlayerArgument("target") | Online player |
Multiple Arguments
1@Override2public Arguments getArguments() {3 return Arguments.args(4 new PlayerArgument("target"),5 new StringArgument("message"),6 new IntegerArgument("repeat", 1, 10)7 );8}910@Override11public void execute(Player player, Arguments.ParsedArguments args) {12 Player target = args.argument("target");13 String message = args.argument("message");14 int repeat = args.argument("repeat");15 16 for (int i = 0; i < repeat; i++) {17 target.sendMessage(message);18 }19}Subcommands
Create command hierarchies with parent commands:
AdminCommand.javajava
1// Parent command: /admin2public class AdminCommand extends Command {3 4 public AdminCommand() {5 super("admin", "Administration commands");6 }7 8 @Override9 public Command[] getChildCommands() {10 return new Command[] {11 new AdminSpeedCommand(), // /admin speed12 new AdminTeleportCommand(), // /admin teleport13 new AdminHealCommand() // /admin heal14 };15 }16}1718// Subcommand: /admin speed 19public class AdminSpeedCommand extends ExecuteCommand {20 21 public AdminSpeedCommand() {22 super("speed", "Set a player's speed");23 }24 25 @Override26 public Arguments getArguments() {27 return Arguments.args(28 new PlayerArgument("player"),29 new DoubleArgument("multiplier", 0.1, 10.0)30 );31 }32 33 @Override34 public void execute(Player player, Arguments.ParsedArguments args) {35 Player target = args.argument("player");36 double mult = args.argument("multiplier");37 38 setPlayerSpeed(target, (float) mult);39 player.sendMessage("Set " + target.getName() + "'s speed to " + mult);40 }41}Optional Arguments
1@Override2public Arguments getArguments() {3 return Arguments.args(4 new StringArgument("target").optional(), // Optional with no default5 new IntegerArgument("amount", 1, 64).defaultValue(1) // Default value6 );7}89@Override10public void execute(Player player, Arguments.ParsedArguments args) {11 // Check if optional argument was provided12 String target = args.argumentOrNull("target");13 int amount = args.argument("amount"); // Will be 1 if not provided14 15 if (target == null) {16 // Use sender as target17 target = player.getName();18 }19}Permission Checks
1public class AdminOnlyCommand extends ExecuteCommand {2 3 public AdminOnlyCommand() {4 super("secret", "Admin only command");5 }6 7 @Override8 public Arguments getArguments() {9 return Arguments.empty();10 }11 12 @Override13 public void execute(Player player, Arguments.ParsedArguments args) {14 // Simple permission check15 if (!isAdmin(player)) {16 player.sendMessage("&cYou don't have permission!");17 return;18 }19 20 // Execute admin action21 player.sendMessage("&aSecret admin stuff...");22 }23 24 private boolean isAdmin(Player player) {25 // Implement your permission logic26 // Example: check UUID against admin list27 return adminUuids.contains(player.getUuid());28 }29}Complete Example
GameModePlugin.javajava
1public class GameModePlugin extends JavaPlugin {2 3 @Override4 protected void start() {5 getCommandRegistry().register(new GameModeCommand());6 }7}89// /gamemode10public class GameModeCommand extends Command {11 12 public GameModeCommand() {13 super("gamemode", "Change game mode");14 }15 16 @Override17 public Command[] getChildCommands() {18 return new Command[] {19 new GameModeSurvival(), // /gamemode survival20 new GameModeCreative(), // /gamemode creative21 new GameModeSpectator() // /gamemode spectator22 };23 }24}2526// /gamemode survival [player]27public class GameModeSurvival extends ExecuteCommand {28 29 public GameModeSurvival() {30 super("survival", "Switch to survival mode");31 }32 33 @Override34 public Arguments getArguments() {35 return Arguments.args(36 new PlayerArgument("player").optional()37 );38 }39 40 @Override41 public void execute(Player player, Arguments.ParsedArguments args) {42 Player target = args.argumentOrNull("player");43 if (target == null) target = player;44 45 setGameMode(target, GameMode.SURVIVAL);46 player.sendMessage("Set " + target.getName() + " to survival mode");47 }48}