using Unity.Entities; namespace ProjectM.Simulation { /// 07-21 G6 (socket honesty, design review wf_98bf1268): SERVER-ONLY scheduled Cone-socket cleave — /// the schedule-and-consume idiom applied to the SpecialSlam (Cone archetype) /// socket, so its damage lands at the animation's visual contact instead of the fire tick. Stamped by /// AbilityFireSystem when a Cone socket fires (ResolveTick = fire + TuningConfig.ConeContactTicks; knob 0 = /// legacy immediate, no stamp), fired on a wrap-safe elapsed compare from LIVE state (cast-turn steers the /// cone until contact; stats re-folded at resolve), CONSUMED by zeroing. A still-armed pending is FLUSHED /// (fired early) before a recast overwrites it. Cleared on death (PlayerDeathStateSystem — an armed pending /// must never fire from the respawn position) and by the dev SetClass swap (socket identity changes). /// At resolve the socket is re-validated (bounds + still a Cone Spark) — consume-drop on mismatch. /// Not replicated; client contact cues are presentation-side (CombatFeedbackSystem). Baked zeroed. public struct ConeContactPending : IComponentData { /// NonZero tick the armed cone's slam lands; 0 = nothing pending. public uint ResolveTick; /// Socket index (0..SocketId.Count-1) of the ARMED cast — stats/aim re-read live at resolve. public byte Socket; } }