21f609c6c4
Per Phase1_Combat_Gym_Build_Spec §8 (the "KEEP as-is" feel layer was really a migration): - PlayerAnimationDriveSystem: both jobs (Local/Remote) now read SocketCooldown + DynamicBuffer<AbilitySocket>/<EffectiveSocketStats> instead of the single AbilityCooldown/ AbilityRef/EffectiveAbilityStats; shared SocketFireAndCone helper (any-socket-firing model: IsFiring if any socketed Spark's per-socket cooldown window is mid-fire; IsCone if any such is Cone). - CombatFeedbackSystem: the muzzle-flash + cone-cue blocks unified into one per-socket fire-edge loop over SocketCooldown (per-socket uint cache); non-Cone -> muzzle flash, Cone -> the aimed slash-arc cue. Dropped the now-dead single-cooldown latches. L1 clean; L2 494/494 (no regression). Deferred to the AbilityRef-removal cleanup (surfaced, NOT silent): the FrameId server-writer + the 2 class-HUD re-points (ClassPrepPortalHudSystem/MetaShopHudSystem) + HudSystem's ability bar. Rationale: AbilityRef is still baked + set (EquipSystem/ClassSwapUtil), so ClassForAbility remains a valid class signal through the transition; FrameId is baked ready. No feel regression. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>