本篇教程由作者设定使用 CC BY-NC-SA 协议。
首先特别鸣谢大佬的文章提供整体思路:
KJS6#进阶实例#Curios实例及ambiguous歧义方法处理 - [KJS]KubeJS - MC百科|最大的Minecraft中文MOD百科 (mcmod.cn)
新人学习者,大佬轻喷。
如标题所示,这是一篇如何在KubeJS6上对饰品进行检测的小教程,也是为loadClass提供一些简单的思路。
版本为1.19.2 forge,示意图如下:
整体代码如下:
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获取到的内容以及铁魔法的可行性