玩过意志坚定(Tough As Nails)的大佬们一定都知道,雨天时,当你潜行并仰头空手右键天空,可以补充玩家的纯净水分。然而在稳态(Homeostatic)中,不仅玩家不能实现上述操作,就连玻璃瓶和水袋都不能接水。于是本小白利用KubeJS 6写了以下脚本实现用水袋接纯净水。

        本教程所涉均为forge1.20.1版本。

        以下脚本内容写于kubejs/server_scripts文件夹下

ItemEvents.rightClicked(event => {

    const { player, item, level } = event
    
//玩家事件
    //玩家雨天潜行仰头填充玻璃瓶或皮革水袋
     if (
            player.inRain    //判断玩家是否暴露在雨中
            && player.pitch <= -75    //判断玩家仰角是否大于75°
            && player.shiftKeyDown    //判断玩家是否潜行
        ) {
            
            //纯净水瓶
            if (item.id == 'minecraft:glass_bottle') {
                
                if (item.count == 1) {
                    
                    let bottleSlot = player.selectedSlot
                    
                    player.inventory.setItem(bottleSlot, 'homeostatic:purified_water_bottle')    //替换玻璃瓶为纯净水瓶
                }
                
                else {
                    player.addItem('homeostatic:purified_water_bottle')    //替换玻璃瓶为纯净水瓶
                    item.count--
                }
            }

            //皮革水袋
           if (item.id == 'homeostatic:leather_flask') {
                
                if (item.nbt?.Fluid?.FluidName == 'homeostatic:purified_water') {
                    item.nbt.Fluid.Amount = Math.min(item.nbt?.Fluid?.Amount + 100, 1000)    //设置上限并将每次接水量定位100mb
                    event.cancel()    //取消接水时可能出现的喝水动作
                }
                
                if (item.nbt?.Fluid == undefined) {
                    item.nbt.merge({
                        Fluid: {
                            Amount: 100,
                            FluidName: 'homeostatic:purified_water'
                        }    //插入NBT
                    })
                }
            }
})

        那么,到目前为止,我们对玻璃瓶和水袋的设置就完成了……吗?

        实际上,对于水袋我们还差一步,那就是,如果水袋中原本装的不是纯净水,就不能实现接水的操作了(当然要是你觉得麻烦大可以把上面的条件判断去掉),所以接下来我们就来解决这个问题,本小白的思路是倒空水袋。

        以下脚本依然写在kubejs/server_scripts文件夹中,itemEvents.rightClicked事件下

//玩家潜行倒空水袋
        if (
            item.id == 'homeostatic:leather_flask'
            && item.nbt.Fluid != undefined    //不管是什么水都可以被倒掉
            && player.shiftKeyDown
            
            && player.rayTrace(5).block != null    //获取玩家准星所指方向5格内方块,若无,则中断后续脚本执行
        ) {
            item.nbt.remove('Fluid')    //移除所有流体
            level.spawnParticles('minecraft:splash', false, player.x, player.y + 0.5, player.z, 0.25, 0.25, 0.25, 20, 1)    //倒空水袋时的粒子设置(可选)
            player.runCommandSilent('/title @s times 10 60 10')    //数字代表字幕淡入、显示、淡出时长
            player.runCommandSilent('/title @s actionbar {"text": "水袋已倒空", "color": "green"}')    //提示玩家
            event.cancel()
        }

        好了,现在水袋就可以正常使用了,但是,如果要追求完美,我们依然差一步。在游戏内,如果你用水袋接水,会听见桶被装满的声音(当然开字幕提示会更清楚),所以我们还需要给倒空水袋事件增加音效。

        以下脚本写于kubejs/client_scripts文件夹中。

ItemEvents.rightClicked(event => {

    const { player } = event
    
    //声音播放
        //玩家潜行倒空水袋
        if (
            player.mainHandItem == 'homeostatic:leather_flask'
            && player.getMainHandItem().nbt.Fluid != undefined
            && player.shiftKeyDown
            && player.rayTrace(5).block != null
        ) {
            player.playSound('minecraft:item.bucket.empty')
        }
})