using Content.Server.Stunnable.Components; using Content.Shared.Movement.Systems; using JetBrains.Annotations; using Content.Shared.Throwing; using Robust.Shared.Physics.Events; namespace Content.Server.Stunnable.Systems; [UsedImplicitly] internal sealed class StunOnCollideSystem : EntitySystem { [Dependency] private readonly StunSystem _stunSystem = default!; [Dependency] private readonly MovementModStatusSystem _movementMod = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(HandleCollide); SubscribeLocalEvent(HandleThrow); } private void TryDoCollideStun(Entity ent, EntityUid target) { _stunSystem.TryKnockdown(target, ent.Comp.KnockdownAmount, ent.Comp.Refresh, ent.Comp.AutoStand, ent.Comp.Drop); if (ent.Comp.Refresh) { _stunSystem.TryUpdateStunDuration(target, ent.Comp.StunAmount); _movementMod.TryUpdateMovementSpeedModDuration( target, MovementModStatusSystem.TaserSlowdown, ent.Comp.SlowdownAmount, ent.Comp.WalkSpeedModifier, ent.Comp.SprintSpeedModifier ); } else { _stunSystem.TryAddStunDuration(target, ent.Comp.StunAmount); _movementMod.TryAddMovementSpeedModDuration( target, MovementModStatusSystem.TaserSlowdown, ent.Comp.SlowdownAmount, ent.Comp.WalkSpeedModifier, ent.Comp.SprintSpeedModifier ); } } private void HandleCollide(Entity ent, ref StartCollideEvent args) { if (args.OurFixtureId != ent.Comp.FixtureID) return; TryDoCollideStun(ent, args.OtherEntity); } private void HandleThrow(Entity ent, ref ThrowDoHitEvent args) { TryDoCollideStun(ent, args.Target); } }