伤害事件 API
EmakiAttributeDamageEvent 是一个 Bukkit 事件,在属性伤害计算完成后触发。外部插件可以监听此事件来拦截、修改或记录伤害。
事件特性
- 可取消(
Cancellable):取消后不造成伤害。 - 可修改最终伤害(
setFinalDamage)。 - 在伤害实际应用到目标之前触发。
方法列表
| 方法 | 返回值 | 说明 |
|---|---|---|
getAttacker() | LivingEntity | 攻击者(可为 null,如环境伤害)。 |
getTarget() | LivingEntity | 目标实体。 |
getProjectile() | Entity | 投射物(可为 null)。 |
getDamageTypeId() | String | 伤害类型 ID(如 physical、spell)。 |
getBaseDamage() | double | 基础伤害值(计算前)。 |
isCritical() | boolean | 是否暴击。 |
getRoll() | double | 暴击判定骰值。 |
getFinalDamage() | double | 最终伤害值(经过所有阶段计算后)。 |
setFinalDamage(double) | void | 修改最终伤害值。 |
getCause() | DamageCause | Bukkit 伤害原因。 |
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()判断。