-
Notifications
You must be signed in to change notification settings - Fork 2
使用MethodAnnotationCommand
MethodAnnotationCommand是为了方便使用而打造的,优点在于快速并让用户只关注命令,在MethodAnnotationCommand中使用了ArgumentManager和CompleteManager以方便自定义,缺点在于有一些注解打破了内聚。
首先创建一个类,负责执行命令,我们做一个简单的say命令
@Command("say")
public void say(String message){
System.out.println(message);
}
一个简单的命令执行器就做好了,接下来我们将其注册,并执行,为了保证安全,我们将构造方法隐藏,并对外暴露了Builder,使用Builder进行实例化,获取builder需要给予一个CommandManager
MethodAnnotationCommand.getBuilder(commandManager)
.addCommandHandler(commandHandler) //将带有@Command的类实例化并添加
.register() // 已注册的命令不再注册,未注册的命令将会被注册
commandManager.execute(sender,"say "hello world"") //执行
一个简单的命令就做好并执行了,我觉得,仅仅只是输出message是不够的,我还要知道是谁说了这句话,那么我可以将命令改为
@Command("say")
public void say(@Sender CommandSender sender,String message){
System.out.println(sender.getSenderName()+":"+message);
}
注解一个方法,令其可被MethodAnnotationCommand解析
必须要输入方法名,desc(说明)和helpMessage是可选的
注解一个方法,可以输入多个权限,系统将为你自动判断命令的发送者是否含有此权限,权限的具体逻辑参见 权限
注解一个参数,这个参数必须是CommandSender及其子类,用于限定这个命令的发送者
注解一个参数,输入的是注册于ArgumentManager中Argument名字,可将此参数的Argument设置为你所输入的Argument
要使用此注解,请在ArgumentManager注册你的Argument,并在Builder设置ArgumentManager,否则将使用默认的ArgumentManager,默认的Manager可能不具有你所输入的Argument
例子:
@Command("say")
public void say(@ArgumentHandler("myArgument") String message){
System.out.println(message);
}
注解一个参数,输入的是注册于SuggesterManager中Suggester的名字,设置参数的Suggester为你所设定的Suggester 要使用此注解,请SuggesterManager注册你的Suggester,并在Builder设置SuggesterManager,否则默认的SuggesterManager内可能没有你所指定的Suggester
注解一个String,在以下情形时你可以用到它:
@Command("argument")
public void argument(String value, Argument argument){
if(value.equals("set")){
//TODO
}else if(value.equals("remove")){
//TODO
}else{
//TODO
}
}
使用Required你可以将其更改为
@Command("argument")
public void argumentSet(@Required("set") String value, Argument argument){
//TODO
}
@Command("argument")
public void argumentRemove(@Required("remove") String value, Argument argument){
//TODO
}
被Required注解的String,在执行时只可能是你设置的字符串,Required只能注解String
为一个参数打上tip,tip将会在玩家补全命令时,更好的提示玩家 例:
@Command("teleport")
public void teleport(@Sender CommandSender sender,@Tip("x") int x,@Tip("y") int y,@Tip("z") int z){
sender.teleport(x,y,z)
}
当玩家输入以下命令
/teleport
此时玩家将会看到tips悬浮于输入框上方,当然,我们只是提供这些值,显示与否看客户端是否支持,
x y z
/teleport