Skip to content
Version 2.11.0
↓ Get the launcher

CombatEvent record

Discriminated event raised by ICombatEvents. Always fires on the main (Unity) thread.

public abstract record CombatEvent
name description
TimestampMs { get; set; }
record BuffChanged A buff on an entity was applied, refreshed, or removed by a LIVE delta. Buffs already present when the entity appeared arrive once, together, in EntityBuffsSeeded — see BuffChangeKind for how their later deltas are reported.
record DamageDealt Damage or healing was dealt between two entities.
record EntityAttributesChanged One entity’s numeric attributes changed in ONE wire packet (AoiSyncDelta attr collection, an appear, or the local player’s enter-scene sheet). Raised for PLAYER entities only, AFTER every value has reached GetAttributes — so a subscriber that reads the sheet on this event already sees the change (late-never-stale). TimestampMs is the packet’s own receive stamp, the same clock its sibling BuffChanged events carry, so a consumer may join the two streams on TimestampMs without a clock conversion (rDPS sheet track, 2026-09-05 spec § 6.1). Carries only the scalar attrs stored in that packet; HP/name/team/skills ride their own events and are not repeated here.
record EntityBuffsSeeded An entity’s COMPLETE buff set arrived as one snapshot — an AOI appear (SyncNearEntities``Entity.buff_infos) or the local player’s EnterScene entity (spec-from-talent-buffs, 2026-09-26). Snapshot semantics: Buffs REPLACES whatever the consumer held for TargetId — buffs it held that are not listed are gone, listed ones are current. Raised once per snapshot — including an empty snapshot when a set WAS held for the entity (so a consumer can clear); an empty snapshot for an entity with nothing held (a mob/NPC appearing buff-less) raises nothing — and INSTEAD of per-buff BuffChanged events: a town crowd of 30 players × ~120 buffs is 30 events, not thousands. Live changes afterwards arrive as per-buff BuffChanged events exactly as before. By the time this event fires, BuffsFor already returns the new set. A snapshot the client could not decode completely is skipped (no event, held set untouched).
record EntityStateChanged An entity’s client-side actor/controller state machine entered a new state Stellar names on ActorState (2026-07-28 entity-state-death-signal spec). This is the client’s OWN death/break signal — read from its state machine, not inferred from HP reaching zero or a damage packet’s death flag — so it fires for scripted kills that never zero the target’s HP. Riding this existing event channel (rather than a new ICombatLookup/ICombatEvents member) is deliberate: it keeps every combat service interface under the STELLAR0005 8-member ceiling.
record EntitySummonAppeared A summon/pet entity entered AOI (SyncNearEntities.appear) carrying a resolvable owner attribution. Fired once per appear, only when the entity’s AttrCollection carries AttrTopSummonerId or AttrSummonerId — most appearing entities (players, unowned mobs) carry neither and never raise this event. Useful as an early, wind-up-free timestamp anchor for a caster’s summon-based action (e.g. a Battle Imagine cast) that is otherwise only observable once the summon lands its first hit.
record SkillUsed A skill was cast or progressed through a phase by the identified caster.
record SpecChanged 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.