低级别命令 API
CommandCallable 和 Dispatcher 两个接口可以用于定义命令。这两个接口可以用于自定义命令 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, @Nullable Location<World> targetPosition) throws CommandException {
return Collections.emptyList();
}
}
小技巧
如欲获取这一示例中每个方法的用途,请参阅 CommandCallable 。
注册这一命令
那么我们现在可以通过 CommandManager 注册这个类了。 CommandManager
用于监视用户在聊天框中输入的命令,并将其重定向到正确的命令处理代码。请使用 CommandManager#register(Object, CommandCallable, String…) 方法,并传入插件的实例、命令的实例、以及所有需要作为命令的别名的字符串,以注册这一命令。
import org.spongepowered.api.command.CommandManager;
CommandManager cmdService = Sponge.getCommandManager();
PluginContainer plugin = ...;
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");