创建简单命令
这是MzLib命令系统的入门教程
一个命令应该是mz.mzlib.minecraft.command.Command的实例
它的基本设置方法都会返回自身,因此我们可以用链式构造它,但下面的教程中我们会分步创建
创建Command实例
直接调用构造器,第一个参数是命令的名称,后面的参数是它的别名(可选)
Command command = new Command("mzlibdemo", "mzd");
设置命名空间
命令可以以两种名称调用以防重名,/name 和 /namespace:name
其中name是你的命令名,namespace是命令的命名空间,默认是minecraft,一般设置成你的插件名(MOD_ID)
command.setNamespace(Demo.MOD_ID);
设置命令处理器
你当然需要规定如何处理你的命令,使用setHandler
command.setHandler(context->
{
if(!context.successful)
return;
if(context.doExecute)
{
// do sth. on execute
context.source.sendMessage(Text.literal("Hello World!"));
}
});
其中context是一个CommandContext的实例
我们先判断context.successful,它代表命令是否被成功解析
然后我们判断context.doExecute,它表示命令是否应该被执行(否则只是需要补全命令)
示例中我们发送一条Hello World给命令发送者
注册命令
一般地,我们在一个模块中注册这个命令,不需要手动注销
public class Demo extends MzModule
{
public static Demo instance = new Demo();
public Command command;
@Override
public void onLoad()
{
this.register(this.command=new Command("demo", "d").setHandler(context->{/* ... */}));
}
}
添加子命令
使用Command#addChild添加子命令,你可以在父命令创建时直接添加
如果子命令足够复杂,你也可以单独为它创建一个模块,并在onLoad中添加到父命令,并在onUnload中从父命令移除
public class DemoSubcommand extends MzModule
{
public static DemoSubcommand instance = new DemoSubcommand();
public Command command;
@Override
public void onLoad()
{
Demo.instance.command.addChild(this.command=new Command("sub").setHandler(context->{/* ... */}));
}
@Override
public void onUnload()
{
Demo.instance.command.removeChild(this.command);
}
}
然后在父命令注册后注册这个模块
设置命令权限检查器
使用setPermissionChecker方法设置权限检查器
检查命令源的权限,如果权限不足,返回一个Text类型的提示,否则返回null
可以使用预设的静态方法Command#checkPermission,也可以使用Command#permissionChecker直接构造这个检查器
记得注册你的权限到模块中
public class Demo extends MzModule
{
public static Demo instance = new Demo();
public String MOD_ID="mzlibdemo";
public Permission permission=new Permission(this.MOD_ID+".command.demo");
public Command command;
@Override
public void onLoad()
{
// 注册权限
this.register(this.permission);
// 注册命令
this.register(this.command=new Command("demo").setNamespace(this.MOD_ID).setPermissionChecker(Command.permissionChecker(this.permission)));
}
}
可以使用静态方法Command#checkPermissionSenderPlayer要求发送者必须是一个玩家
可以使用setPermissionCheckers方法设置若干个权限检查器,通过全部检查器的发送者才能执行命令
command.setPermissionCheckers(Command::checkPermissionSenderPlayer, Command.permissionChecker(this.permission));
进阶
命令系统的进阶用法参见进阶教程