本篇教程由作者设定未经允许禁止转载。
众所周知,tetra的模块化工具虽然可以在砧板上进行加工,但是并不能通过砧板获得打磨进度。
并且目前tetra以及tetra的相关附属模组也未能实现与农夫乐事砧板的兼容。于是自己通过kubejs模组写了一段js脚本进行兼容。
这里先把代码摆出来,有需要的可以直接复制去用。
在server_scripts文件夹里新建一个js后缀的文件,然后放进这个js文件里
let $IModularItem = Java.loadClass("se.mickelus.tetra.items.modular.IModularItem");
let $CuttingBoardBlockEntity = Java.loadClass("vectorwing.farmersdelight.common.block.entity.CuttingBoardBlockEntity");
BlockEvents.rightClicked(event => {
let player = event.player;
let level = event.level;
if (level.isClientSide() || !player.isPlayer()) { return }
let hand = event.hand
if (hand === "OFF_HAND") { return }
let block = event.block;
if (!block || block.id !== "farmersdelight:cutting_board") { return }
let stack = player.mainHandItem;
let item = stack.item
if (!(item instanceof $IModularItem) || stack.isEmpty()) { return }
let cuttingBoard = level.getBlockEntity(block.pos)
if (!(cuttingBoard instanceof $CuttingBoardBlockEntity)) { return }
let postBoardItem = cuttingBoard.getStoredItem()
if (postBoardItem.isEmpty()) { return }
let success = cuttingBoard.processStoredItemUsingTool(stack, player)
if (success) {
item.tickProgression(player, stack, 1)
}
})
接下来我会讲解为什么要这么写。
这里需要通过反射先获取两个必须的类:
let $IModularItem = Java.loadClass("se.mickelus.tetra.items.modular.IModularItem");
let $CuttingBoardBlockEntity = Java.loadClass("vectorwing.farmersdelight.common.block.entity.CuttingBoardBlockEntity");第一个是tetra的IModularItem这个类,第二个是农夫乐事的CuttingBoardBlockEntity类。
这两个类用于判断是否为tetra工具,以及是否为砧方块实体。
并且之后还会调用里面的方法,实现tetra模块化工具通过砧板成功加工物品后,增加增加打磨值。总不可能只要用tetra的模块化工具右键砧板实体,就可以涨打磨进度吧?
反射所需的类之后,我们需要获取一些信息,用于排除掉我们不需要的情况。
例如判断是否为玩家和判断是否为客户端。如果是客户端或者不是玩家实体则返回,阻止非玩家实体。
因为后续调用的农夫乐事的类的方法仅限于玩家实体,这可能也是女仆厨房没了砧板任务的原因吧。
在排除客户端以及排除非玩家实体的情况后,进入下一阶段的判定。
因为砧板是通过主手物品加工的,所以我们可以先排除排除副手右键方块的情况,同时保证右键的方块必须为农夫乐事的砧板。
通过IModularItem这个类来判断主手的物品是否为这个类的实例,从而判断是否为tetra的模块化物品。
接着再获取到砧板方块实体,也是通过是否是CuttingBoardBlockEntity类的实例来判断。
现在我们已经排除了不需要的条件,并且获取了所需的实例。
至于这些“类”啊“实例”啊是什么意思,感兴趣的可以自行了解,这里不多赘述。
(因为本人也只是一个才上手写js没多久的菜鸡,js的语法都是最近现学的,没系统性学完整,怕说错了)
首先调用的第一个方法就是CuttingBoardBlockEntity这个类的getStoredItem()。这个方法用于获取砧板上加工的物品。
至于为什么要先获取砧板上的物品,是为了排除右键时砧板上物品为空的情况。
避免每次右键时砧板上没有物品,就会先给你弹出一条“这东西可不能切啊……”的提示。
接着继续调用农夫乐事的CuttingBoardBlockEntity这个类的processStoredItemUsingTool()方法。
这个方法是判断是否通过砧板成功加工,并返回布尔值true或者false。
这个方法需要传入两个参数,一个是物品实例,一个是玩家实体。
然后我们接下来就用到tetra的类的方法tickProgression()。这个方法是tetra原本的增加打磨进度的方法。
这个方法需要传入三个参数,实体、物品实例、打磨值(数字)。这里的进度和原版tetra的逻辑一样,数字为1时加1点打磨值,而不是像通过指令打磨那样,直接按照百分比设置。
经过一系列操作,最后就通过kjs,使tetra的模块化工具也可以通过农夫乐事砧板来增加打磨值。
(强烈建议配合泰拉饰品的创造之手使用,一直按着右键就可以飞快加工完一组材料,不知道为什么莫名戳中我爽点)


