diff --git a/libs/gw2_evtc_parser/src/gw2_evtc_parser/parser.py b/libs/gw2_evtc_parser/src/gw2_evtc_parser/parser.py index fe41d8c2..6f4c65df 100644 --- a/libs/gw2_evtc_parser/src/gw2_evtc_parser/parser.py +++ b/libs/gw2_evtc_parser/src/gw2_evtc_parser/parser.py @@ -1201,6 +1201,9 @@ def parse_events(source: BinaryIO | bytes) -> Iterator[Event]: # noqa: PLR0912, if _iff not in {1, 2} and not is_self_condi_tick: continue if _ev_buff: + # Raw source-less condition ticks with UNKNOWN iff and a master are uncredited. + if _iff == 2 and event_src_agent == 0 and src_master_inst != 0: + continue magnitude = 0 if buff_dmg >= _DAMAGE_SANITY_CAP else max(0, buff_dmg) condition_damage = magnitude is_attempt = magnitude > 0 or _result != 0 diff --git a/libs/gw2_evtc_parser/tests/test_parser_emit_buff.py b/libs/gw2_evtc_parser/tests/test_parser_emit_buff.py index 08c35fa4..868eeefe 100644 --- a/libs/gw2_evtc_parser/tests/test_parser_emit_buff.py +++ b/libs/gw2_evtc_parser/tests/test_parser_emit_buff.py @@ -1115,6 +1115,31 @@ def test_parse_events_2025_keeps_unknown_iff_damage() -> None: assert events[0].iff == 2 +def test_parse_events_2025_drops_unknown_iff_uncredited_master_condition_damage() -> None: + evtc = _build_minimal_evtc( + [(1, 1, 1, "Src", True), (2, 1, 1, "Target", False)], + build="20260618", + skills=[(723, "Bleeding")], + events=[ + _build_event_record_2025( + time_ms=10_000, + src_agent=0, + dst_agent=2, + value=0, + buff_dmg=33, + skill_id=723, + iff=2, + buff=1, + result=14, + src_instid=2437, + src_master_instid=1452, + ), + ], + ) + + assert list(PythonEvtcParser().parse_events(evtc)) == [] + + def test_parse_events_2025_keeps_statechange_on_minion_actor() -> None: evtc = _build_minimal_evtc( [(1, 1, 1, "Owner", True), (2, 1, 1, "Minion", False)],