本篇教程由作者设定未经允许禁止转载。

前言

KubeJS的脚本文件为.js,放置在游戏目录的kubejs文件夹内,并根据修改内容不同分别放在server_scripts或startup_scripts子文件夹。修改或添加脚本后记得/reload重载。

KubeJS的WIKI内列出了所有可监听事件,但并不是每个事件都给出了对应的范例。

本教程将主要介绍如何用KubeJS监听世界中的交互事件并进行魔改。一个.js文件内,你可以放入多个onEvent分别监听不同事件。本教程中,以方块的左击/右击,用物品对实体进行交互,方块的破坏这四类事件为例。

先来点真实的,如果教程只是给了几个可以代参数的函数,那么看完之后能做出的东西比较有限,对于一个交互事件来说,你可以调用目标的xyz坐标,玩家的主手所持物品等等,但是如何知道这些属性并且知道怎么用呢?好在KubeJS已经提供了命名空间。可以在KubeJS的WIKI2(虽然尚不完善)找到:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第1张图片

点开后可以看到一大串Classes。不过不必担心,本教程主要用到的是:

  • EntityJS

  • BlockContainerJS

  • ItemStackJS

  • PlayerJS

  • SeverJS

  • ServerPlayerJS

这几个基本够用了。

正文

右击/左击方块

这是一个简单的事件:玩家手持钻石右击裂纹石砖,裂纹石砖被修复为石砖,同时服务器显示”Crazy Diamond!“疯狂钻石

其间逻辑:玩家右击方块事件,如果目标方块是裂纹石砖,且玩家主手物品为钻石,则将在裂纹石砖的位置setblock将其替换为石砖,服务器发言。

对该事件,能用event.block(被右击的方块)、event.player(做这个动作的玩家)、event.hand(玩家的手)等。

如何知道玩家的手持物品呢?这时翻开PlayerJS。

在properties内,并未找到表达“玩家手持物品“相关的条目,而在functions内,则找到了:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第2张图片

这表明这是一个函数,需要指定是哪一只手(hand),点击InteractionHand:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第3张图片

此处可以填MAIN_HAND(主手)或OFF_HAND(副手),也可以用event.hand。

要让服务器执行命令,可以用函数:

event.server.runCommand()
event.server.runCommandSilent()

后者不会在聊天栏报出信息。这两个函数在命令方块高手的手下想必能有许多更有趣的玩法。

方块的xyz坐标为event.block.x,event.block.y,event.block.z。

于是有:

onEvent('block.right_click', event => {
if (event.block == 'minecraft:cracked_stone_bricks' && event.player.getHeldItem(event.hand) == 'minecraft:diamond')
{
event.server.runCommandSilent(`particle minecraft:spit ${event.block.x} ${event.block.y + 0.2} ${event.block.z} 1 0.4 0.4 1 1`)
event.server.runCommandSilent(`setblock ${event.block.x} ${event.block.y} ${event.block.z} minecraft:stone_bricks`)
event.server.runCommand(`say Crazy Diamond!`)
}            
})

效果如下:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第4张图片KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第5张图片

裂纹石砖成功变成了石砖。实际上这个机制也作用于假玩家,所以用诸如机械动力的机械手持钻石模拟右击也会生效。

我们还可以添加一个机制:“主手持钻石且副手持金苹果时将裂纹石砖转化为白桦树苗“。

onEvent('block.right_click', event => {
 if (event.block == 'minecraft:cracked_stone_bricks' 
 && event.player.getHeldItem(event.hand) == 'minecraft:diamond'
 && event.player.getHeldItem(OFF_HAND) == 'minecraft:golden_apple')
 {
event.server.runCommandSilent(`particle minecraft:spit ${event.block.x} ${event.block.y + 0.2} ${event.block.z} 1 0.4 0.4 1 1`)
event.server.runCommandSilent(`setblock ${event.block.x} ${event.block.y} ${event.block.z} minecraft:birch_sapling`)
event.server.runCommand(`say Golden Experience!`)
   }            
})

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第6张图片

主手钻石,副手金苹果,对裂纹石砖右击。

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第7张图片

裂纹石砖变成了白桦树苗。

这里忘了去掉之前的”疯狂钻石“了。

左击方块事件也是同理,只需要把事件类型换成block.left_click即可。

基于该事件,可以做出诸如水晶花园中从泥土里挖卵石的效果,只需要判断玩家是否空手且潜行右击泥土,再在指定位置生成卵石即可。

又比如,可以通过简单的坐标计算判断交互的方块的周围方块是否满足条件,从而实现新奇的世界合成。

实体交互事件

对该事件,能得到event.target(交互实体)和event.player(做这个动作的玩家)。

例子:用机械动力的巧克力棒和狼交互(右击),巧克力棒数量减1(被吃了),然后狼死了。

这里需要解决的问题:判断交互的实体的类型是不是狼,让巧克力棒数量减1,让狼死。

在命名空间内,可以找到实体类型的命名为type:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第8张图片

同时找到了杀死该实体的函数:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第9张图片

在ItemStackJS里找到了物品数量count,它是个整型数:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第10张图片

于是就有:

onEvent('item.entity_interact', event => {
              if (event.target.type == 'minecraft:wolf' 
              && event.player.getHeldItem(event.hand) == 'create:bar_of_chocolate')
                     {
                     event.player.mainHandItem.count-=1
                     event.target.kill()
                     event.server.runCommand(`say 狗不能吃巧克力!`)
                     }            
})

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第11张图片

给狼(狗)喂巧克力。

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第12张图片

它死了。

基于这个原理,可以通过在某物品中保存记录实体全部NBT数据,并清除原有实体的方式,来实现捕捉实体的”大师球“。

方块破坏

对该事件,能得到event.block(将被破坏的方块)和event.player(做这个动作的玩家)。

例子:非创造模式的玩家等级小于等于2级时,不能破坏铁矿石。

在PlayerJS下找到玩家等级和是否创造模式:

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第13张图片

同时要阻止破坏该方块,需要用到

event.cancel()

取消该事件。

于是有:

onEvent('block.break', event => {
              if (event.block == 'minecraft:iron_ore' && event.player.xpLevel <= 2 && !event.player.creativeMode)
                     {
                     event.server.runCommand(`say 等级不够!`)
                     event.cancel()
                     }            
})

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第14张图片等级为2,试图破坏铁矿石。

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第15张图片

破坏铁矿石的事件被取消,服务器提示无法破坏。

KubeJS如何操作游戏事件:单击方块、实体交互、方块破坏-第16张图片

等级为3时破坏成功。

总结

监听事件,通过WIKI等方式获取参数、函数、属性并进行操作。