Skip to content

使用MethodAnnotationCommand

defoli_ation edited this page Nov 1, 2019 · 10 revisions

MethodAnnotationCommand是为了方便使用而打造的,优点在于快速并让用户只关注命令,在MethodAnnotationCommand中使用了ArgumentManager和CompleteManager以方便自定义,缺点在于有一些注解打破了内聚。

使用MethodAnnotationCommand

首先创建一个类,负责执行命令,我们做一个简单的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);
}

Annotations

@Command

注解一个方法,令其可被MethodAnnotationCommand解析
必须要输入方法名,desc(说明)和helpMessage是可选的

@Permission

注解一个方法,可以输入多个权限,系统将为你自动判断命令的发送者是否含有此权限,权限的具体逻辑参见 权限

@Sender

注解一个参数,这个参数必须是CommandSender及其子类,用于限定这个命令的发送者

@ArgumentHandler

注解一个参数,输入的是注册于ArgumentManager中Argument名字,可将此参数的Argument设置为你所输入的Argument
要使用此注解,请在ArgumentManager注册你的Argument,并在Builder设置ArgumentManager,否则将使用默认的ArgumentManager,默认的Manager可能不具有你所输入的Argument
例子:

@Command("say")
public void say(@ArgumentHandler("myArgument") String message){
    System.out.println(message);
}

@Suggester

注解一个参数,输入的是注册于SuggesterManager中Suggester的名字,设置参数的Suggester为你所设定的Suggester 要使用此注解,请SuggesterManager注册你的Suggester,并在Builder设置SuggesterManager,否则默认的SuggesterManager内可能没有你所指定的Suggester

@Required

注解一个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,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