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。