前言,由于在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周围的实体造成额外的范围伤害,并调用粒子效果,让生效范围中存在粒子效果。(把信息发送到窗口事件转化成了造成范围伤害事件)