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

众所周知,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的模块化工具也可以通过农夫乐事砧板来增加打磨值。
(强烈建议配合泰拉饰品的创造之手使用,一直按着右键就可以飞快加工完一组材料,不知道为什么莫名戳中我爽点)