本篇教程由作者设定未经允许禁止转载。


const weaponBuffConfig = [
    {
        // 使用的武器列表,支持原版和模组物品,使用物品ID
        weapons: ['basicweapons:wooden_dagger', 'basicweapons:stone_dagger', 'basicweapons:iron_dagger', 'basicweapons:bronze_dagger', 'basicweapons:golden_dagger', 'basicweapons:diamond_dagger', 'basicweapons:netherite_dagger'],
        // 触发概率,0.3 = 30%
        probability: 0.3,
        // 要给予的效果列表 (一个武器可以触发多个效果)
        effects: [
            {
                // 效果的目标: 'attacker' 或 'target'
                target: 'attacker',
                // 效果ID (使用效果注册名)
                effect: 'farmersrespite:caffeinated',
                // 效果等级 (0 = 1级, 1 = 2级, 以此类推)
                amplifier: 0,
                // 效果持续时间 (单位: 游戏刻, 20刻 = 1秒)
                duration: 30 // 1.5秒
            }
        ]
    },
    {
        // 使用的武器列表,支持原版和模组物品,使用物品ID
        weapons: [
    'basicweapons:wooden_quarterstaff',
    'basicweapons:stone_quarterstaff',
    'basicweapons:iron_quarterstaff',
    'basicweapons:bronze_quarterstaff',
    'basicweapons:golden_quarterstaff',
    'basicweapons:diamond_quarterstaff',
    'basicweapons:netherite_quarterstaff'
                 ],
        // 触发概率
        probability: 0.2,
        // 要给予的效果列表 (一个武器可以触发多个效果)
        effects: [
            {
                // 效果的目标: 'attacker' 或 'target'
                target: 'target',
                // 效果ID (使用效果注册名)
                effect: 'yungscavebiomes:buffeted',
                // 效果等级 (0 = 1级, 1 = 2级, 以此类推)
                amplifier: 0,
                // 效果持续时间 (单位: 游戏刻, 20刻 = 1秒)
                duration: 20
            }
        ]
    },

    {
        // 另一个配置示例
        weapons: ['minecraft:wooden_axe', 'minecraft:stone_axe', 'minecraft:iron_axe', 'bronze:bronze_axe', 'minecraft:golden_axe', 'minecraft:diamond_axe', 'minecraft:netherite_axe'],
        probability: 0.15,
        effects: [
            {
                target: 'attacker',
                effect: 'minecraft:absorption',
                amplifier: 0,
                duration: 40
            }
        ]
    },
    // 可以继续添加更多配置...
];

// 监听实体受伤事件
EntityEvents.hurt(event => {
    // 1. 获取攻击源信息
    const source = event.source;
    // 获取直接造成伤害的实体 (比如箭、投掷物)
    const immediateAttacker = source.getImmediate();
    // 获取真正的攻击者 (玩家)
    const actualAttacker = source.getActual();

    // 2. 关键判断: 必须是玩家造成的伤害
    //    source.actual 代表最终的伤害来源,对于玩家攻击,这就是玩家实体
    if (!source.actual || !source.actual.isPlayer()) {
        return; // 如果不是玩家造成的伤害,直接退出
    }

    // 3. 获取玩家使用的物品
    const player = source.actual;
    // 获取玩家主手的物品
    const usedItem = player.getMainHandItem();
    // 如果玩家主手没有物品,则退出
    if (usedItem.isEmpty()) return;

    // 4. 获取被攻击的实体
    const targetEntity = event.entity;

    // 5. 寻找匹配的武器
    weaponBuffConfig.forEach(config => {
        // 检查当前使用的武器是否在配置的武器列表中
        // usedItem.id 是获取物品ID的标准方法,例如 'minecraft:iron_sword'
        if (config.weapons.includes(usedItem.id)) {
            // 6. 随机概率判断
            // Math.random() 生成 [0, 1) 之间的随机数
            if (Math.random() < config.probability) {
                // 7. 概率触发,遍历该配置下的所有效果
                config.effects.forEach(effectConfig => {
                    // 确定效果的目标实体
                    let target;
                    if (effectConfig.target === 'attacker') {
                        target = player;
                    } else if (effectConfig.target === 'target') {
                        target = targetEntity;
                    } else {
                        // 如果配置了未知目标,忽略
                        console.warn(`未知的效果目标: ${effectConfig.target}`);
                        return;
                    }

                    // 8. 检查目标实体是否存活 (对于给予实体效果是必要的)
                    if (!target || !target.isLiving()) return;

                    // 9. 为实体施加状态效果
                    target.potionEffects.add(
                        effectConfig.effect, // 效果ID
                        effectConfig.duration, // 持续时间
                        effectConfig.amplifier, // 等级
                        false, // 是否环境效果 (通常false)
                        true   // 是否显示粒子 (true为显示)
                    );
                });
            }
        }
    });
});

文件格式要.js,位置放kubejs的server_scripts文件夹。