6 min

Commands

Create custom commands with arguments, subcommands, and permission checks.

Command Structure

Hytale commands use a class-based system with Command (parent) and ExecuteCommand (executable) classes.

classpurpose
CommandParent command, contains subcommands
ExecuteCommandExecutable command with arguments
ArgumentsDefine command parameters
Arguments.ParsedArgumentsAccess 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 @Override
8 public Arguments getArguments() {
9 return Arguments.empty(); // No arguments
10 }
11
12 @Override
13 public void execute(Player player, Arguments.ParsedArguments args) {
14 player.sendMessage("Hello, " + player.getName() + "!");
15 }
16}

Registration

1@Override
2protected void start() {
3 // Register the command
4 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 @Override
8 public Arguments getArguments() {
9 return Arguments.args(
10 new DoubleArgument("multiplier", 0.1, 10.0) // min 0.1, max 10.0
11 );
12 }
13
14 @Override
15 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

typeexampledescription
StringArgumentnew StringArgument("name")Any text string
IntegerArgumentnew IntegerArgument("count", 1, 100)Integer with range
DoubleArgumentnew DoubleArgument("value", 0.0, 1.0)Decimal with range
BooleanArgumentnew BooleanArgument("enabled")true/false
PlayerArgumentnew PlayerArgument("target")Online player

Multiple Arguments

1@Override
2public Arguments getArguments() {
3 return Arguments.args(
4 new PlayerArgument("target"),
5 new StringArgument("message"),
6 new IntegerArgument("repeat", 1, 10)
7 );
8}
9
10@Override
11public 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: /admin
2public class AdminCommand extends Command {
3
4 public AdminCommand() {
5 super("admin", "Administration commands");
6 }
7
8 @Override
9 public Command[] getChildCommands() {
10 return new Command[] {
11 new AdminSpeedCommand(), // /admin speed
12 new AdminTeleportCommand(), // /admin teleport
13 new AdminHealCommand() // /admin heal
14 };
15 }
16}
17
18// Subcommand: /admin speed
19public class AdminSpeedCommand extends ExecuteCommand {
20
21 public AdminSpeedCommand() {
22 super("speed", "Set a player's speed");
23 }
24
25 @Override
26 public Arguments getArguments() {
27 return Arguments.args(
28 new PlayerArgument("player"),
29 new DoubleArgument("multiplier", 0.1, 10.0)
30 );
31 }
32
33 @Override
34 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@Override
2public Arguments getArguments() {
3 return Arguments.args(
4 new StringArgument("target").optional(), // Optional with no default
5 new IntegerArgument("amount", 1, 64).defaultValue(1) // Default value
6 );
7}
8
9@Override
10public void execute(Player player, Arguments.ParsedArguments args) {
11 // Check if optional argument was provided
12 String target = args.argumentOrNull("target");
13 int amount = args.argument("amount"); // Will be 1 if not provided
14
15 if (target == null) {
16 // Use sender as target
17 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 @Override
8 public Arguments getArguments() {
9 return Arguments.empty();
10 }
11
12 @Override
13 public void execute(Player player, Arguments.ParsedArguments args) {
14 // Simple permission check
15 if (!isAdmin(player)) {
16 player.sendMessage("&cYou don't have permission!");
17 return;
18 }
19
20 // Execute admin action
21 player.sendMessage("&aSecret admin stuff...");
22 }
23
24 private boolean isAdmin(Player player) {
25 // Implement your permission logic
26 // Example: check UUID against admin list
27 return adminUuids.contains(player.getUuid());
28 }
29}

Complete Example

GameModePlugin.javajava
1public class GameModePlugin extends JavaPlugin {
2
3 @Override
4 protected void start() {
5 getCommandRegistry().register(new GameModeCommand());
6 }
7}
8
9// /gamemode
10public class GameModeCommand extends Command {
11
12 public GameModeCommand() {
13 super("gamemode", "Change game mode");
14 }
15
16 @Override
17 public Command[] getChildCommands() {
18 return new Command[] {
19 new GameModeSurvival(), // /gamemode survival
20 new GameModeCreative(), // /gamemode creative
21 new GameModeSpectator() // /gamemode spectator
22 };
23 }
24}
25
26// /gamemode survival [player]
27public class GameModeSurvival extends ExecuteCommand {
28
29 public GameModeSurvival() {
30 super("survival", "Switch to survival mode");
31 }
32
33 @Override
34 public Arguments getArguments() {
35 return Arguments.args(
36 new PlayerArgument("player").optional()
37 );
38 }
39
40 @Override
41 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}