起因是1.21.1怎么也没找到添加套装奖励的mod,遂自己写了一个适用于kjs7的脚本
放在startup_scripts下:
const $LivingEquipmentChangeEvent = Java.loadClass("net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent")
/**
* @typedef {{arms: $Item[], bonus: [mobEffect: Special.MobEffect, amplifier: number?, showParticles: boolean?][]}} $ArmorSetBonus_
* @type {Object.<String, $ArmorSetBonus_>}
*/
const bonuses = {
set1: {
arms: [
"minecraft:chainmail_helmet",
"minecraft:chainmail_chestplate",
"minecraft:chainmail_leggings",
"minecraft:chainmail_boots"
],
bonus: [
["kubejs:chainmail_arrow", 0, false]
],
},
set2: {
arms: [
"minecraft:leather_helmet",
"minecraft:leather_chestplate",
"minecraft:leather_leggings",
"minecraft:leather_boots"
],
bonus: [
["farmersdelight:nourishment", 0, false]
],
},
};
function armor_set_bonus(/**@type {$ContextUtils$EntityEquipmentContext_}*/ context) {
const { entity, previousStack, currentStack } = context;
const { potionEffects, armorSlots } = entity;
/** @type {Special.Item[]} */
const currentArmor = armorSlots.toArray()
.map(i => i?.id)
.filter(id => id !== undefined);
Object.entries(bonuses).forEach(([key, data]) => {
let { arms, bonus } = data;
const shouldHaveBonus = arms.every((item) => currentArmor.includes(item));
bonus.forEach(([mobEffect, amplifier, showParticles]) => {
const effectInstance = entity.getEffect(mobEffect);
if (shouldHaveBonus) {
// 如果应该有效果,检查是否是套装效果
const isSetEffect = effectInstance &&
effectInstance.duration === -1 &&
effectInstance.amplifier === (amplifier ?? 0) &&
effectInstance.visible === (showParticles ?? false);
if (!isSetEffect) {
// 移除现有效果(如果不是套装效果),然后添加套装效果
if (effectInstance) {
entity.removeEffect(mobEffect);
}
// 添加套装效果
potionEffects.add(mobEffect, -1, amplifier ?? 0, true, showParticles ?? false);
}
} else if (effectInstance) {
// 检查效果是否来自套装
const isSetEffect = effectInstance.duration === -1 &&
effectInstance.amplifier === (amplifier ?? 0) &&
effectInstance.visible === (showParticles ?? false);
// 如果是套装效果,就移除
if (isSetEffect) {
entity.removeEffect(mobEffect);
}
}
});
});
}
NativeEvents.onEvent($LivingEquipmentChangeEvent, event => {
armor_set_bonus(event);
});

