Skip to content

Commands Cheat Sheet

Quick reference for the MagicUtils command system.

Minimal Registry Setup

CommandRegistry registry = CommandRegistry.create(plugin, "myplugin", logger);
registry.registerCommand(new DonateCommand());

Minimal Annotated Command

@CommandInfo(name = "donate", description = "Main command")
public final class DonateCommand extends MagicCommand {
    public CommandResult execute(@Sender MagicSender sender) {
        return CommandResult.success("ok");
    }
}

Threading (Async)

@CommandInfo(name = "donate", threading = CommandThreading.ASYNC)
public final class DonateCommand extends MagicCommand {
    @SubCommand(name = "give", threading = CommandThreading.ASYNC)
    public CommandResult give(@Sender MagicSender sender, Player target) { ... }
}

Subcommands And Nested Paths

@SubCommand(name = "give")
public CommandResult give(@Sender MagicSender sender, Player target) { ... }

@SubCommand(path = {"npc", "commands"}, name = "add")
public CommandResult addNpcCommand(...) { ... }

Options / Flags

public CommandResult give(
        @Option(shortNames = {"a"}, longNames = {"amount"}) int amount,
        @Option(shortNames = {"s"}, longNames = {"silent"}, flag = true) boolean silent
) { ... }

Accepted forms:

  • --amount 5
  • -a 5
  • --silent / -s

Optional + Default Values

public CommandResult set(
        @DefaultValue("en") String lang,
        @OptionalArgument Player target
) { ... }

Greedy Text

public CommandResult say(@Greedy String message) { ... }

Suggestions

@Suggest("@players") Player target
@Suggest("{easy,hard}") String mode
@Suggest("getItems") String item

Suggestion methods can be:

  • List<String> getItems()
  • List<String> getItems(Player player)
  • List<String> getItems(ServerCommandSource sender)
  • List<String> getItems(CommandSource sender)

Sender Injection

public CommandResult execute(@Sender MagicSender sender) { ... }

Allowed senders:

ANY, PLAYER, CONSOLE, BLOCK, MINECART, PROXIED, REMOTE.

Builder API Snippet

MagicCommand command = MagicCommand.<CommandSender>builder("donate")
        .description("Main command")
        .aliases("d")
        .threading(CommandThreading.ASYNC)
        .execute(ctx -> CommandResult.success("ok"))
        .subCommand(SubCommandSpec.<CommandSender>builder("give")
                .argument(CommandArgument.builder("player", Player.class).build())
                .threading(CommandThreading.ASYNC)
                .execute(ctx -> CommandResult.success("ok"))
                .build())
        .build();

registry.registerCommand(command);

Mount Existing Command Tree

MagicCommand admin = MagicCommand.<CommandSender>builder("admin")
        .mount("punish", new BanCommand())
        .build();