前言,由于在KUBEJS 6中翻来找去也没找到可以定义CURIO的效果的时间,气到有些红温了,在群友的帮助下解决了一部分问题,并且在此之后在MC百科上找到了相关的方式,因此帮助大家来写一下教程。

事前声明,由于我并不是软件相关专业出身,并且对代码也并不是太了解,只能说能这么写,其中不乏很多地方参考了ChatGPT中给出的解决方案,希望有大佬可以帮忙将代码继续优化。

本文中参考了两位MC百科UU的教程:

[1.18.2]如何用实体伤害事件做出有特殊加成的装备?(Altnoir大佬为该篇提供了如何判断玩家、实体、伤害类型的案例)

纹饰效果与饰品效果 kubejs基础小技巧:利用.nbt后缀读取nbt数据的技巧(木板大佬为该篇提供了如果检索CURIO的判断)

具体的代码如下,其中不乏很多代码是用chatGPT进行修改的,但是这么做确实可以识别出判断本身并输出相应效果。(在此我仅做小部分解释)(具体的演示图片)

EntityEvents.hurt((event) => {
    // 判断攻击来源是玩家,且受伤实体是活着的
    if (
        event.source.actual &&
        event.entity.isLiving() &&
        event.source.actual.isPlayer()
    ) {
        // 检查 damage type 是否为 scguns.bullet
        let damageType = typeof event.source.type === 'function' ? event.source.type() : event.source.type;
        let msgId = typeof damageType.msgId === 'function' ? damageType.msgId() : damageType.msgId;
        if (msgId !== 'scguns.bullet') return;

        // 检查玩家是否有 netherite_quiver
        let playerNBT = event.source.actual.nbt["ForgeCaps"] && event.source.actual.nbt["ForgeCaps"]["curios:inventory"] && event.source.actual.nbt["ForgeCaps"]["curios:inventory"]["Curios"];
        if (!playerNBT) {
            return;
        }

        let playerNBTString = playerNBT.toString();
        if (playerNBTString.indexOf("nyfsquiver:netherite_quiver") === -1) {
            return;
        }

        // 如果玩家装备了 netherite_quiver,输出实体生命值
        let health = Math.floor(event.entity.getHealth());

        // 将信息发送到世界聊天窗口
        let playerName = event.source.actual.getName();
        let entityName = event.entity.getName();
        event.server.runCommandSilent(`/say ${playerName} attacked ${entityName}. Entity health is now ${health}.`);
    }
});

实现了检查玩家是否有netherite_quiver,并且造成bullet伤害时,会对目标entity周围的实体造成额外的范围伤害,并调用粒子效果,让生效范围中存在粒子效果。(把信息发送到窗口事件转化成了造成范围伤害事件)

KubeJS6 设定curio事件效果-第1张图片