Minestom Creating Custom Commands
Create and register custom commands with argument parsing and syntax definitions
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 inputArgumentType.Integer()- Whole numbersArgumentType.Double()- Decimal numbersArgumentType.Boolean()- True/false valuesArgumentType.Word()- Single wordArgumentType.Entity()- Entity selectorArgumentType.Player()- Player selector
Code
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());
// 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!
Please login to leave a comment.