Skip to content
Version 2.11.0
↓ Get the launcher

CombatEvent.SpecChanged constructor

The value GetSubProfession returns for an entity changed (spec-from-talent-buffs, 2026-09-26). Raised exactly once per REAL change of that value, whether it came from a talent root buff or from cast inference — never for a no-op re-resolution. Holding the previous spec across a same-class swap gap (the root buff removed before the new one arrives) is not a change, so Smite → gap → Lifebind raises ONE event, Smite → Lifebind; a gap that outlives 10 s drops the talent spec and raises one if the reported value changes. A class change (attr 220) with no root buff of the new class yet DOES raise one (old spec → the new class’s cast-derived spec, or 0). Changes are evaluated on the main-thread drain, never while a wire packet is mid-ingest, so the whole-packet net change is reported (a class swap delivering attr 220 and the new talent set together raises one event, not an intermediate old→0→new pair). Not raised when a scene change resets every spec to 0; specs re-announce (0 → spec) as entities reappear. Rides the existing ICombatEvents stream so no combat service interface gains a member.

public SpecChanged(long TimestampMs, EntityId TargetId, int OldSubProfessionId,
int NewSubProfessionId, bool FromTalent)
parameter description
TimestampMs Wire receive time (client wall clock, Unix ms) of the update that caused the change — the buff/attr packet, or the damage event whose cast resolved the spec.
TargetId The entity whose spec changed (named to match the TargetId convention of its siblings).
OldSubProfessionId The previously reported sub-profession id (0 = none).
NewSubProfessionId The sub-profession id now returned by GetSubProfession (0 = none).
FromTalent true when the new value is talent-derived — the same meaning as TryGetTalentSpec returning true.