本篇教程由作者设定使用 CC BY-NC-SA 协议。

首先特别鸣谢大佬的文章提供整体思路:

KJS6#进阶实例#Curios实例及ambiguous歧义方法处理 - [KJS]KubeJS - MC百科|最大的Minecraft中文MOD百科 (mcmod.cn)

新人学习者,大佬轻喷。

如标题所示,这是一篇如何在KubeJS6上对饰品进行检测的小教程,也是为loadClass提供一些简单的思路。

版本为1.19.2 forge,示意图如下:

KubeJS6 为依赖[Curios API]的饰品添加检测-第1张图片

整体代码如下:

ItemEvents.rightClicked('minecraft:stick', e => {
    let { player } = e; 

    player.tell(`玩家 ${player.getName().getString()} 右键点击了木棍`);

    let curiosApi = Java.loadClass('top.theillusivec4.curios.api.CuriosApi');
    let curiosHelper = curiosApi.getCuriosHelper();
    let curiosAll = curiosHelper.getEquippedCurios(player).resolve().get();
    for (let i = 0;i < curiosAll.getSlots(); i++) {
        let curiosItem = curiosAll.getStackInSlot(i);
        if (!curiosItem.isEmpty()) {
            if (curiosItem.getItem() == 'vampiric_glove') {
                player.tell('检测到你的吸血手套了哦!!')
            }
            player.tell(`槽位 ${i} 上的物品: ${curiosItem.getDisplayName().getString()}`)
        }
    }
   
});

在开始之前:

如果可以,请尽可能的安装ProbeJS(除非你真的对自己很自信)

使用probeJS的/probejs dump命令,在loadClass的时候就能自动补全所需内容:)


这里我使用的是检测木棍的右键(ItemEvents.rightClicked),具体需求可以自行添加;

.getString() 会输出本地化信息和格式化样式,如果没有此项,仅为player.getName(),则输出为ITextComponent对象,体现在文本上就是literal(名字)

let curiosApi = Java.loadClass('top.theillusivec4.curios.api.CuriosApi');

为引入Curios的API,使用loadClass的方法引入


let curiosHelper = curiosApi.getCuriosHelper();
let curiosAll = curiosHelper.getEquippedCurios(player).resolve().get();

第一行为获取curios的帮助器,该实例提供了对玩家饰品栏curios的访问和操作功能。

*我怎么知道要先引入帮助器呢?

:很抱歉,无论是在什么工作上,‘要做什么’这件事我帮不到您。实际上我也是查阅了大量的文档,问了AI才知道这个功能的。如果遇到要学习的东西,建议去GitHub或者Wiki查阅相关资料,这也是最难的一步。

第二行为使用帮助器的获取装备功能,对象为player,使用.resolve().get()对可能获取到的值进行解析并返回。

此处可以见WiKi,但是教程版本为1.20.x

for (let i = 0;i < curiosAll.getSlots(); i++) {
        let curiosItem = curiosAll.getStackInSlot(i);
        if (!curiosItem.isEmpty()) {
            if (curiosItem.getItem() == 'vampiric_glove') {
                player.tell('检测到你的吸血手套了哦!!')
            }
            player.tell(`槽位 ${i} 上的物品: ${curiosItem.getDisplayName().getString()}`)
        }
    }

既然我们已经拿到了所有的"装备",接下来就要遍历进行检测了。

getSlots() 方法返回一个整数值,表示该饰品栏中可用的槽位总数,但是我们是对curiosAll进行的遍历,curiosAll代表的是玩家装备的饰品的总数,也就是说:

curiosAll.getSlots()返回的是我的总共的装备的饰品个数。

接下来是curiosAll.getStackInSlot(i),他会返回一个对象,用于表示指定索引i的位置是否有东西,配合下面的if (!curiosItem.isEmpty())如果不为空,进行进一步检测。

if (curiosItem.getItem() == 'vampiric_glove')则是进行判断,curiosItem是我们遍历中的每一个索引,使用getItem()获取其Item对象(当然这里就没那么难操作了,你也可以使用下面的curiosItem.getDisplayName().getString()获取名字,或者curiosItem.getId()/curiosItem.getIdLocation()获取Id标签),在获取到对应的内容后执行相应的操作,比如说将其改成玩家tick检测,持续赋予buff等。

听起来......好像没那么难,对吧......

但实际上真正做起来就会发现苦难重重......

附:不同get获取到的内容以及铁魔法的可行性

KubeJS6 为依赖[Curios API]的饰品添加检测-第2张图片

KubeJS6 为依赖[Curios API]的饰品添加检测-第3张图片