diff --git a/libs/gw2_analytics/src/gw2_analytics/rotation.py b/libs/gw2_analytics/src/gw2_analytics/rotation.py index 52429ee2..04138008 100644 --- a/libs/gw2_analytics/src/gw2_analytics/rotation.py +++ b/libs/gw2_analytics/src/gw2_analytics/rotation.py @@ -957,9 +957,9 @@ def add_instant(source: int, skill_id: int, time_ms: int, icd: int = 50) -> None add_instant(owner, 12658, event.time_ms) # Spiteful Spirit (29560) - EI has two finders: # 1. DamageCastFinder: disabled when effect data exists - # (UsingDisableWithEffectData) - # 2. EffectCastFinder for UnholyBurst: triggers on effect with - # DesertShroud/related hit checks + # (UsingDisableWithEffectData) + # 2. EffectCastFinder for UnholyBurst: triggers on effect + # with DesertShroud/related hit checks elif isinstance(event, DamageEvent) and event.skill_id == 29560: source_is_necro = ( not professions or professions.get(event.source_agent_id) is Profession.NECROMANCER @@ -974,7 +974,7 @@ def add_instant(source: int, skill_id: int, time_ms: int, icd: int = 50) -> None ) if has_unholy_burst_in_fight: - # EI disables DamageCastFinder when effect data exists (UsingDisableWithEffectData) + # EI disables DamageCastFinder when effect data exists # Let the EffectCastFinder handle it via UnholyBurst effect events continue # No UnholyBurst effect data in fight: use DamageCastFinder @@ -1189,7 +1189,35 @@ def add_instant(source: int, skill_id: int, time_ms: int, icd: int = 50) -> None base_skill = _BASE_SKILL_BY_ENHANCED_EFFECT.get(event.guid) if base_skill is not None and (caster, base_skill) in active: continue - if event.guid != "C4E8DD3234E0C647993857940ED79AC1" or not any( + # Spiteful Spirit (29560) via UnholyBurst effect (EffectCastFinder path) + # EI's EffectCastFinder for Spiteful Spirit triggers on UnholyBurst effect + # with DesertShroud and related hit checks + if event.guid == "C4E8DD3234E0C647993857940ED79AC1": + # DesertShroud check: no DesertShroud buff removal within 50ms + desert_shroud_removal = any( + isinstance(other, BoonApplyEvent) + and other.kind == "remove_all" + and other.skill_id == 40052 # DesertShroudBuff + and other.source_agent_id == caster + and abs(other.time_ms - event.time_ms) < 50 + for other in nearby_events(event.time_ms, 50) + ) + if desert_shroud_removal: + continue + + # Related hit check: no UnholyBurst hit from same caster within 10ms + related_hit = any( + isinstance(other, DamageEvent) + and other.source_agent_id == caster + and other.skill_id == 38767 # UnholyBurst + and abs(other.time_ms - event.time_ms) < 10 + for other in nearby_events(event.time_ms, 10) + ) + if related_hit: + continue + + add_instant(caster, effect_skill_id, event.time_ms) + elif event.guid != "C4E8DD3234E0C647993857940ED79AC1" or not any( isinstance(other, DamageEvent) and other.source_agent_id == caster and other.skill_id == 38767