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