命令系统
本页面教学您如何使用 MzLib 替代Bukkit繁琐的命令注册方式
创建一个 Comamnd
实例化一个 mz.mzlib.minecraft.command.Command 用于注册您的命令
java
Command command = new Command("cmd","label"); // 构造方法的参数为命令别名命名空间
您可以使用 setNamespace 方法来设置命令的命名空间以防止重名
命令可以以两种方式执行
/cmd以及/namespace:cmd
java
command.setNamespace("yourpluginname");处理您的命令
使用 setHandler 方法来设置您处理命令的逻辑, MzLib 将其简化成了可以用 lambda 表达式编写的方式,提高了代码美观度
java
command.setHandler(context-> {
if(!context.successful || !context.doExecute)
return;
// do sth. on execute
context.sender.sendMessage(Text.literal("Hello World!"));
});context为命令的执行上下文实例, 其中包含了一些常用信息context.successful代表命令是否被成功解析context.doExecute代表命令是否应该被执行 (否即为只需要命令补全)context.sender代表命令发送方, 是mz.mzlib.minecraft.CommandSender的实例对象
注意
context.sender.sendMessage 方法的参数为 mz.mzlib.minecraft.text.Text 实例对象, 并不是JAVA字符串 。您可以通过 literal 方法构建一个实例对象出来
当然, 您可以简写成调用链的写法, 简化代码
java
Command command = new Command("demo", "d").setHandler(context->{/* ... */})注册
在模块中提供了一个 register 方法用于注册您的命令, 该方法注册的命令不需要您手动注销
java
@Override
public void onLoad() {
/* 之前编写的代码 */
this.register(command);
}子命令
Command 类中提供了一个 addChild 方法用于注册子命令, 只需要传入一个 Command 实例即可
类似
/cmd subcommand
java
command.addChild(sub_command);以及您可以通过 removeChild 删除子命令, 用法于 addChild 大致相同
命令参数
该功能与子命令大致相同, 但您有更多的操作空间
java
setHandler(context-> {
// process arg0
String arg0=new ArgumentParserString("arg0", false, "enum1", "enum2").process(context);
// 若arg0解析失败直接返回
if(!context.successful)
return;
switch(arg0) {
case "enum1":
// 第一种用法
if(!context.successful || !context.doExecute)
return;
context.sender.sendMessage(Text.literal("This is the first usage of this command"));
break;
case "enum2":
// 第二种用法
// 再读一个参数
// 后面没有其它参数,可以允许包含空格
String arg1=new ArgumentParserString("arg1", true).process(context);
if(!context.successful || !context.doExecute)
return;
context.sender.sendMessage(Text.literal("Second: "+arg1));
break;
default: // 无效的arg0,命令解析失败
context.successful=false;
break;
}
});权限检查
创建一个 mz.mzlib.minecraft.permission.Permission 权限检查器对象 并在 onLoad方法中将其注册到模块中
java
Permission permission = new Permission("mzlibdemo.command.mzlibdemo");
@Override
public void onLoad() {
this.register(permission);
}使用 Command 中的 setPermissionChecker 方法来设置您的命令权限检查器
java
command.setPermissionChecker(sender->{
Command.checkPermissionAnd(
Command.checkPermissionSenderPlayer(sender),
Command.checkPermission(sender, this.permission))
});本章节所有代码可以在 mz/mzlib/demo/Demo.java 找到
