using Content.Shared._CP14.Actions.Components; using Content.Shared.Actions.Events; using Content.Shared.Movement.Systems; namespace Content.Shared._CP14.Actions; public abstract partial class CP14SharedActionSystem { private void InitializeDoAfter() { SubscribeLocalEvent(OnStartDoAfter); SubscribeLocalEvent(OnEndDoAfter); SubscribeLocalEvent(OnRefreshMovespeed); } private void OnStartDoAfter(Entity ent, ref CP14ActionStartDoAfterEvent args) { var performer = GetEntity(args.Performer); EnsureComp(performer, out var slowdown); slowdown.SpeedAffectors.TryAdd(GetNetEntity(ent), ent.Comp.SpeedMultiplier); Dirty(performer, slowdown); _movement.RefreshMovementSpeedModifiers(performer); } private void OnEndDoAfter(Entity ent, ref ActionDoAfterEvent args) { if (args.Repeat) return; var performer = GetEntity(args.Performer); if (!TryComp(performer, out var slowdown)) return; slowdown.SpeedAffectors.Remove(GetNetEntity(ent)); Dirty(performer, slowdown); _movement.RefreshMovementSpeedModifiers(performer); if (slowdown.SpeedAffectors.Count == 0) RemCompDeferred(performer); } private void OnRefreshMovespeed(Entity ent, ref RefreshMovementSpeedModifiersEvent args) { var targetSpeedModifier = 1f; foreach (var (_, affector) in ent.Comp.SpeedAffectors) { targetSpeedModifier *= affector; } args.ModifySpeed(targetSpeedModifier); } }