using Unity.Entities; using Unity.Mathematics; namespace ProjectM.Simulation { /// /// MC-1 — predicted, NON-replicated dash window on the owner-predicted player. A SHAPE-clone of /// KnockbackState, but UNLIKE KnockbackState it lives on a PREDICTED player and is re-simulated from /// the replicated InputEvent every predicted tick — so it is authoritative on /// the server at the tick HealthApplyDamageSystem drains damage, even for a melee strike appended a /// tick earlier in the plain group. All ticks routed through TickUtil.NonZero; compared via /// only (never raw uint). NOT a [GhostField] (no player-ghost /// re-bake). Baked all-zero (idle). /// public struct DashState : IComponentData { /// Planar XZ dash heading, captured at dash-start. public float2 Dir; /// Raw ServerTick at dash-start (NonZero-coerced). Lower (inclusive) bound of the i-frame window. public uint StartTick; /// StartTick + i-frame window (NonZero). I-frames cover the HALF-OPEN range [StartTick, IFrameUntilTick). public uint IFrameUntilTick; /// IFrameUntilTick + recovery tail (NonZero). Movement-lock tail (no i-frames) so a panic-dash is punishable. public uint RecoverUntilTick; /// Hits negated by THIS dash's i-frame window. SERVER-written (HealthApplyDamageSystem); /// 0 at window-close = a wasted dash (DevTelemetry.DashesWasted spam signal). The client copy stays 0. public uint NegatedCount; } }