本篇教程由作者设定未经允许禁止转载。
问题
在游玩脆骨症的过程中,我们会获得大量的交货协议。如果不专门加以整理,那么你必然遇到过下面的困境:
你不得不一一取出这些交货协议,再右键查看它们的内容,这是非常令人痛苦的重复工作。
因此我们考虑设法为交货协议添加自定义的Tooltip,使得光标悬停在交货协议上时即可看到其交换内容。效果如下:
解决方法
本篇教程会给出笔者的研究思路,希望这能帮助到同样想要通过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)]);
}
}
});
})
效果
保存文件,启动游戏,这时你会发现鼠标悬停于交货协议上时已经可以看到交易信息。
待解决的问题
由于笔者使用的是displayName来展示物品名,因此对于某些通过nbt来区分的物品,依然存在无法显示具体信息的情况,如下:
如果有更好的解决方案欢迎在评论区指出~