20.4 命令注册
1.18中KubeJS完善了其命令注册功能。通过监听command.registry
事件,你可以创建你自己的指令:
onEvent("command.registry", event => {//监听命令注册事件
const { commands: Commands, arguments: Arguments} = event;
event.register(// 注册新命令
Commands.literal("myCommand")// 命令名称为myCommand
.requires(src => src.hasPermission(2))//2代表权限需求为管理员权限,该行可以省略。你还可以将其扩写并使用return关键字来实现更加复杂的权限检查。
.then(Commands.argument('arg1', Arguments.STRING.create(event))// 添加字符串类型参数arg1,你可以添加任何数量的参数。
.then(Commands.argument('arg2', Arguments.FLOAT.create(event))// 添加字符串类型参数arg2,你可以添加任何数量的参数。其他类型详见ProbeJS提供的代码提示。
.executes(ctx => {// 执行命令时执行以下内容
const arg1 = Arguments.STRING.getResult(ctx, "arg1");// 获取arg1的值
const arg2 = Arguments.FLOAT.getResult(ctx, "arg2");// 获取arg2的值
if(arg1 == "example")
return 0;// 当arg1的值为"example"时跳出函数。返回0代表命令不生效。
let level = ctx.source.level.asKJS() // 获取当前level
let position = ctx.source.position // 获取当前position
// 对范围内实体造成伤害
let i = 0 // 伤害计数器
level.getEntitiesWithin(AABB.of(position.x()-2,position.y()-2,position.z()-2,position.x()+2,position.y()+2,position.z()+2)).forEach(entity => {// 获取当前position,4*4*4范围内的实体
if (entity.living) {
// 伤害实体,计数器+1
// 伤害值为arg2的数值
entity.attack(arg2)
i++
// 如果实体类型为玩家则告知其arg1的值
if (entity.type == "minecraft:player") entity.tell(arg1)
}
})
return i // 返回计数器
})
)
)
)
})
本节参考了:Command Registry | latvian.dev
另请参阅:ProbeJS。