低级别命令 API

CommandCallableDispatcher 两个接口可以用于定义命令。这两个接口可以用于自定义命令 API 的基础。

我们强烈地建议使用 Command Builder API 以定义简单的命令。

自定义一个命令

第一步是创建一个命令类,并使其实现 CommandCallable 接口:

import org.spongepowered.api.Sponge;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.command.CommandCallable;
import org.spongepowered.api.command.CommandException;
import org.spongepowered.api.command.CommandResult;
import org.spongepowered.api.command.CommandSource;

import java.util.Collections;
import java.util.List;
import java.util.Optional;

public class MyBroadcastCommand implements CommandCallable {

    private final Optional<Text> desc = Optional.of(Text.of("Displays a message to all players"));
    private final Optional<Text> help = Optional.of(Text.of("Displays a message to all players. It has no color support!"));
    private final Text usage = Text.of("<message>");

    public CommandResult process(CommandSource source, String arguments) throws CommandException {
        Sponge.getServer().getBroadcastChannel().send(Text.of(arguments));
        return CommandResult.success();
    }

    public boolean testPermission(CommandSource source) {
        return source.hasPermission("myplugin.broadcast");
    }

    public Optional<Text> getShortDescription(CommandSource source) {
        return desc;
    }

    public Optional<Text> getHelp(CommandSource source) {
        return help;
    }

    public Text getUsage(CommandSource source) {
        return usage;
    }

    public List<String> getSuggestions(CommandSource source, String arguments) throws CommandException {
        return Collections.emptyList();
    }
}

小技巧

如欲获取这一示例中每个方法的用途,请参阅 CommandCallable

注册这一命令

那么我们现在可以通过 CommandManager 注册这个类了。 CommandManager 用于监视用户在聊天框中输入的命令,并将其重定向到正确的命令处理代码。请使用 CommandManager#register(Object, CommandCallable, String…) 方法,并传入插件的实例、命令的实例、以及所有需要作为命令的别名的字符串,以注册这一命令。

import org.spongepowered.api.command.CommandManager;

CommandManager cmdService = Sponge.getCommandManager();
cmdService.register(plugin, new MyBroadcastCommand(), "message", "broadcast");

注解

命令的实例后的参数就是待注册的命令的所有别名。你可以添加任意多的字符串。没有被其他命令占用的第一个别名将成为命令的主名称。这意味着已被其他命令占用的别名会被忽略。

命令调度器

命令调度可以用于创建分层命令结构(子命令)。

默认的 Dispatcher 接口的实现是 SimpleDispatcher 类。

一个 Dispatcher 同时也是一个 CommandCallable ,因此它可以像其他命令一样注册。

import org.spongepowered.api.command.dispatcher.SimpleDispatcher;

CommandCallable subCommand1 = ...;
CommandCallable subCommand2 = ...;

SimpleDispatcher rootCommand = new SimpleDispatcher();

rootCommand.register(subCommand1, "subcommand1", "sub1");
rootCommand.register(subCommand2, "subcommand2", "sub2");

Sponge.getCommandManager().register(this, rootCommand, "root");