type, IParameter parameter) {
return Bukkit.getPlayer(message);
}
}
```
### BaseCommand
`com.legendframework.core.cmd.BaseCommand` 是框架定义的一个实现指令树形结构,且封装了**指令帮助输出**抽象逻辑,我们开发者定义的所有指令类都应该是**BaseCommand**的子类
#### 异常处理接口
```java
/**
* 通一的执行成功处理器
* 当某指令方法上被标识了@CmdSuccessHandle时,会触发该处理器
*
* @param sender 指令发送者
* @param method 执行成功的指令方法
* @param params 执行这个指令方法所传入的参数
*/
void successHandle(CommandSender sender , Method method , Object... params);
/**
* 当方法执行异常的处理器,方法执行异常时触发
*
* @param sender 指令发送者
* @param e 异常信息
* @param method 执行失败的指令方法
*/
void failHandle(CommandSender sender ,Throwable e , Method method);
/**
* 当指令参数的个数正确,但与方法所匹配的类型不一致时,会调用该处理器
*
* 例如:参数类型为int类型, 玩家输入的这个参数为 "abc" ,则会调用该处理器
*
* @param sender 指令发送者
* @param e 异常信息
* @param method 封装入参失败的指令方法
* @param parameter 导致参数错误的这个参数,它可能是一个入参 {@link Parameter} 也可能是一个字段 {@link Field}
* @param param 导致错误方法实参
* @param index 参数的索引
*/
void paramsErrorHandle(CommandSender sender , Throwable e, Method method , IParameter parameter , Object param, int index);
```
#### 抽象的指令文档
其实,写指令最没有技术含量又最麻烦的其实就是指令文档了,原生Bukkit插件的指令开发,更改了指令名称,相关参数都会去手动修改指令文档的输出,为了解决这些问题,整个**BaseCommand**中的代码,有四分之三都是在描述指令文档,现在分别介绍指令文档:
> 看到这里,大家都知道每一个BaseCommand的子类都是一个指令类,这个指令类中有N个指令,是封装了N个指令的集合,意味着,我每个BaseCommand的子类都可以修改其父类的默认方法,实现帮助文档的自定义化
##### 默认help指令
这是每一个指令类都会带有一个help指令,这个指令是**BaseCommand**提供的,**help指令会输出当前这个指令类下的所有子指令的help()指令,以及自身定义的指令集合**
具体内容如下:
```java
/**
* 为子类提供的help公用方法
*
* @param page 页码
* {@link Cmd} 中的指令前会拼接子类 {@link Command#cmd()} 参数
*
* 例如有两个子类 分别为:PlayerCmd ,ServerCmd
* 其类上的 {@link Command#cmd()} 参数分别为 'p' , 's'
* 那么这两个子类的help指令的调用为:
* 1. PlayerCmd : '/根指令 p help' or '/根指令 p'
* 2. ServerCmd : '/根指令 s help' or '/根指令 s'
* 执行的help指令会进入到不同的子类对象的该方法 help() 中 , 子类可以复写这个方法
*/
@Cmd({"help", ""})
@CmdFailHandle
@Permission()
public void help(
CommandSender sender,
org.bukkit.command.Command command,
@CmdParam(title = "页码", desc = "数字", demo = "1", required = false) Integer page
) {
page = page == null ? 1 : page;
Command thisCommand = getThisCommandAnnotation();
List cmdHelps = getHelps();
try {
CmdHelp help = createCmdhelp(
BaseCommand.class.getMethod("help", CommandSender.class, org.bukkit.command.Command.class, Integer.class),
thisCommand,
this
);
//分页且渲染
renderingHelp(sender, command, help, PageUtil.page(cmdHelps, page, helpItemNum()));
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
```
> 注:如要复写这个help()方法,需要自行加上@Cmd()等一系列的注解,注解不会继承
##### 建议覆写的方法
> 这些方法均提供了默认实现,如果你需要自定义,可以进行覆写
```java
/**
* 获取指令帮助的每页显示条目数
*/
int helpItemNum();
/**
* 渲染指令help前缀
*
* @param sender 指令执行者
* @param command org.bukkit.command.Command 指令
* @param help 当前准备渲染的指令封装类
* @param cmdHelpPage 需要渲染的指令帮助列表
*/
protected void renderingHelpPrefix(CommandSender sender, Command command, CmdHelp help, Page cmdHelpPage);
/**
* 展示指令帮助的内容部分
*
* 无需关注分页逻辑,只需要自定渲染风格
*
* @param sender 指令执行者
* @param command org.bukkit.command.Command 指令
* @param help 当前准备渲染的指令封装类
* @param cmdHelpPage 需要渲染的指令帮助列表
*/
protected void renderingHelpBody(CommandSender sender, Command command, CmdHelp help, Page cmdHelpPage);
/**
* 渲染指令help后缀
*
* @param sender 指令执行者
* @param command 指令
* @param help 当前准备渲染的指令封装类
* @param cmdHelpPage 需要渲染的指令帮助列表
*/
protected void renderingHelpSuffix(CommandSender sender, org.bukkit.command.Command command, CmdHelp help, Page cmdHelpPage);
```
在执行help()指令后,框架会自动获取相应页码的指令,然后依次调用`前缀,内容,后缀`方法,开发者可以自定义其渲染风格
```java
/**
* 默认渲染风格
*
* @param cmdHelpPage 需要渲染的指令帮助列表
*/
@Override
public void renderingHelp(CommandSender sender, org.bukkit.command.Command command, CmdHelp help, Page cmdHelpPage) {
if (cmdHelpPage.getTotalSum() == 0) {
sender.sendMessage("当前注册的指令: [" + command.getName() + "] , 没有绑定任何子指令");
return;
} else if (cmdHelpPage.getList().size() == 0) {
sender.sendMessage("当前页没有任何数据");
}
renderingHelpPrefix(sender, command, help, cmdHelpPage);
renderingHelpBody(sender, command, help, cmdHelpPage);
renderingHelpSuffix(sender, command, help, cmdHelpPage);
}
```
注:如需在指令参数中插入空格,或传入集合到指令方法参数中,需要用到'{}'符号,例如:
```
/test player {这是一句 含有空 格 的话 这段话 如果指令 方法中的参数是集合 这段话会以空格进行 分割 填充到集合中}
```