Skip to content

伤害事件 API

EmakiAttributeDamageEvent 是一个 Bukkit 事件,在属性伤害计算完成后触发。外部插件可以监听此事件来拦截、修改或记录伤害。

事件特性

  • 可取消(Cancellable):取消后不造成伤害。
  • 可修改最终伤害(setFinalDamage)。
  • 在伤害实际应用到目标之前触发。

方法列表

方法返回值说明
getAttacker()LivingEntity攻击者(可为 null,如环境伤害)。
getTarget()LivingEntity目标实体。
getProjectile()Entity投射物(可为 null)。
getDamageTypeId()String伤害类型 ID(如 physicalspell)。
getBaseDamage()double基础伤害值(计算前)。
isCritical()boolean是否暴击。
getRoll()double暴击判定骰值。
getFinalDamage()double最终伤害值(经过所有阶段计算后)。
setFinalDamage(double)void修改最终伤害值。
getCause()DamageCauseBukkit 伤害原因。
getDamageContext()DamageContext完整伤害上下文。
getDamageResult()DamageResult完整计算结果(含各阶段 stageValues)。
getVariables()DamageContextVariables上下文控制变量。
getContext()Map<String, Object>上下文数据 Map。
isCancelled()boolean是否已取消。
setCancelled(boolean)void取消或恢复事件。

DamageResult 字段

通过 getDamageResult() 可以读取各阶段的计算结果:

方法说明
stageValues()Map<String, Double>,每个 stage id 对应的计算结果。

DamageContextVariables 控制标志

标志说明
allow_critical是否允许暴击判定。
allow_target_dodge是否允许目标闪避。
calculate_target_defense是否计算目标防御。
trigger_mythic_on_damaged是否触发 MythicMobs 的 on_damaged 事件。

监听示例

java
@EventHandler
public void onAttributeDamage(EmakiAttributeDamageEvent event) {
    // 减少 10% 最终伤害
    double finalDamage = event.getFinalDamage();
    event.setFinalDamage(finalDamage * 0.9);

    // 取消暴击伤害
    if (event.isCritical()) {
        event.setCancelled(true);
    }

    // 读取各阶段结果
    Map<String, Double> stages = event.getDamageResult().stageValues();
    double defenseReduction = stages.getOrDefault("target_defense", 0.0);
}

注意事项

  • 事件在主线程触发。
  • setFinalDamage 设置的值会直接应用到目标,不再经过后续计算。
  • 取消事件后,目标不会受到任何伤害,也不会播放受击动画。
  • 投射物伤害(弓箭、三叉戟)也会触发此事件,可通过 getProjectile() 判断。