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

问题

在游玩脆骨症的过程中,我们会获得大量的交货协议。如果不专门加以整理,那么你必然遇到过下面的困境:

[0.3.2/KubeJS]使用KubeJS为交货协议添加额外Tooltip来显示交易信息-第1张图片兄啊这要我怎么找啊(悲)你不得不一一取出这些交货协议,再右键查看它们的内容,这是非常令人痛苦的重复工作。

因此我们考虑设法为交货协议添加自定义的Tooltip,使得光标悬停在交货协议上时即可看到其交换内容。效果如下:

[0.3.2/KubeJS]使用KubeJS为交货协议添加额外Tooltip来显示交易信息-第2张图片

解决方法

本篇教程会给出笔者的研究思路,希望这能帮助到同样想要通过KubeJS进一步魔改脆骨症的朋友。

寻找交货协议物品中的信息

通过模组IBE Editor我们可以查看交货协议的NBT信息:

{
  Count: 1b,
  id: "wares:delivery_agreement",
  tag: {
    experience: 0.0d,
    id: "organ",
    message: '{ "color": "#33333", "text": "这是一些. . .肉制品。
我们保存的相当完好,保证随取随用。" }',
    ordered: 4.0d,
    paymentItems: [
      {
        Count: 1b,
        id: "kubejs:muscle_gold"
      }
    ],
    requestedItems: [
      {
        Count: 1b,
        id: "lightmanscurrency:coin_emerald"
      }
    ],
    title: '{ "color": "#d15492", "text": "器官商人" }'
  }
}

不难看出,其中的 paymentItems 数组表示所需物品,requestedItems 数组表示交易可得到的物品。

因此我们可以通过KubeJS读取交货协议nbt中的对应数据,为其添加自定义的Tooltip。

编写KubeJS代码

我们在kubejs/client_scripts下创建一个wares_tooltip.js(当然你想直接在已有的JS里添加也行),编写KubeJS代码如下:

ItemEvents.tooltip((tooltip) => {
    tooltip.addAdvanced('#wares:agreements',
        /**
         * @param {Internal.ItemStack} item
         */
        (item, advanced, text) => {
            let requestedItems = item.nbt?.requestedItems;
            let paymentItems = item.nbt?.paymentItems;
            if (requestedItems) {
                text.add(Text.yellow('所需物品:'));
                for (let i = 0; i < requestedItems.length; i++) {
                    let requestedItem = requestedItems[i];
                    let stack = Item.of(requestedItem.id).withCount(requestedItem.Count);
                    text.add([stack.displayName, Text.gray(' x' + requestedItem.Count)]);
                }
            }
            if (paymentItems) {
                text.add(Text.green('可交换:'));
                for (let i = 0; i < paymentItems.length; i++) {
                    let paymentItem = paymentItems[i];
                    let stack = Item.of(paymentItem.id).withCount(paymentItem.Count);
                    text.add([stack.displayName, Text.gray(' x' + paymentItem.Count)]);
                }
            }
        });
})

效果

保存文件,启动游戏,这时你会发现鼠标悬停于交货协议上时已经可以看到交易信息。

[0.3.2/KubeJS]使用KubeJS为交货协议添加额外Tooltip来显示交易信息-第3张图片

待解决的问题

由于笔者使用的是displayName来展示物品名,因此对于某些通过nbt来区分的物品,依然存在无法显示具体信息的情况,如下:

[0.3.2/KubeJS]使用KubeJS为交货协议添加额外Tooltip来显示交易信息-第4张图片


[0.3.2/KubeJS]使用KubeJS为交货协议添加额外Tooltip来显示交易信息-第5张图片

如果有更好的解决方案欢迎在评论区指出~