Minestom Creating Custom Commands

Create and register custom commands with argument parsing and syntax definitions

java (17+) 2025-11-03 minestom commands minecraft server

Description

Minestom provides a powerful command system that allows you to create custom commands with complex argument parsing, auto-completion, and multiple syntaxes. Commands extend the Command class and use ArgumentType to define parameters.

Key Features

  • Multiple syntaxes: Define different command variations
  • Argument types: String, Integer, Double, Boolean, Entity, Player, etc.
  • Auto-completion: Built-in tab completion support
  • Conditional execution: Check permissions and sender types
  • Command callbacks: Handle command execution with lambdas

Common Argument Types

  • ArgumentType.String() - Text input
  • ArgumentType.Integer() - Whole numbers
  • ArgumentType.Double() - Decimal numbers
  • ArgumentType.Boolean() - True/false values
  • ArgumentType.Word() - Single word
  • ArgumentType.Entity() - Entity selector
  • ArgumentType.Player() - Player selector

Code

RAW
import net.minestom.server.command.builder.Command;import net.minestom.server.command.builder.arguments.ArgumentType;import net.minestom.server.command.builder.arguments.number.ArgumentNumber;import net.minestom.server.entity.Player;public class CustomCommand extends Command {        public CustomCommand() {        super("mycommand");                // String argument        var nameArg = ArgumentType.String("name");                // Integer argument with range        var countArg = ArgumentType.Integer("count")            .min(1)            .max(100);                // Double argument        var amountArg = ArgumentType.Double("amount");                // Word argument (single word)        var actionArg = ArgumentType.Word("action")            .from("start", "stop", "restart");                // Player argument (optional)        var targetArg = ArgumentType.Entity("target")            .onlyPlayers(true);                // First syntax: command <name> <count>        addSyntax((sender, context) -> {            String name = context.get(nameArg);            int count = context.get(countArg);                        sender.sendMessage("Executing " + name + " " + count + " times");                        if (sender instanceof Player player) {                // Player-specific logic                player.sendMessage("Command executed as player");            }        }, nameArg, countArg);                // Second syntax: command <action> [target]        addSyntax((sender, context) -> {            String action = context.get(actionArg);                        if (context.has(targetArg)) {                var target = context.get(targetArg);                sender.sendMessage("Action " + action + " on " + target);            } else {                sender.sendMessage("Action " + action);            }        }, actionArg, targetArg.setDefaultValue(() -> null));                // Set conditions        setCondition((sender, commandString) -> {            if (!(sender instanceof Player)) {                sender.sendMessage("This command can only be used by players");                return false;            }            return true;        });    }}// Register commandMinecraftServer.getCommandManager().register(new CustomCommand());
RAW
// Simple command with string argumentpublic class GreetCommand extends Command {    public GreetCommand() {        super("greet");                var nameArg = ArgumentType.String("name");                addSyntax((sender, context) -> {            String name = context.get(nameArg);            sender.sendMessage("Hello, " + name + "!");        }, nameArg);    }}// Command with multiple argumentspublic class TeleportCommand extends Command {    public TeleportCommand() {        super("tp");                var xArg = ArgumentType.Double("x");        var yArg = ArgumentType.Double("y");        var zArg = ArgumentType.Double("z");                addSyntax((sender, context) -> {            if (sender instanceof Player player) {                double x = context.get(xArg);                double y = context.get(yArg);                double z = context.get(zArg);                player.teleport(new Pos(x, y, z));                player.sendMessage("Teleported to " + x + ", " + y + ", " + z);            }        }, xArg, yArg, zArg);    }}// Command with player selectorpublic class HealCommand extends Command {    public HealCommand() {        super("heal");                var targetArg = ArgumentType.Entity("target")            .onlyPlayers(true);                addSyntax((sender, context) -> {            if (context.has(targetArg)) {                var target = context.get(targetArg);                if (target instanceof Player player) {                    player.setHealth(player.getMaxHealth());                    player.sendMessage("You have been healed!");                    sender.sendMessage("Healed " + player.getUsername());                }            } else if (sender instanceof Player player) {                player.setHealth(player.getMaxHealth());                player.sendMessage("You have been healed!");            }        }, targetArg.setDefaultValue(() -> null));    }}// Register commandsvar commandManager = MinecraftServer.getCommandManager();commandManager.register(new GreetCommand());commandManager.register(new TeleportCommand());commandManager.register(new HealCommand());

Comments

No comments yet. Be the first to comment!