StunOnCollideSystem.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using Content.Server.Stunnable.Components;
  2. using Content.Shared.Standing;
  3. using Content.Shared.StatusEffect;
  4. using JetBrains.Annotations;
  5. using Robust.Shared.Physics.Dynamics;
  6. using Content.Shared.Throwing;
  7. using Robust.Shared.Physics.Events;
  8. namespace Content.Server.Stunnable
  9. {
  10. [UsedImplicitly]
  11. internal sealed class StunOnCollideSystem : EntitySystem
  12. {
  13. [Dependency] private readonly StunSystem _stunSystem = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<StunOnCollideComponent, StartCollideEvent>(HandleCollide);
  18. SubscribeLocalEvent<StunOnCollideComponent, ThrowDoHitEvent>(HandleThrow);
  19. }
  20. private void TryDoCollideStun(EntityUid uid, StunOnCollideComponent component, EntityUid target)
  21. {
  22. if (EntityManager.TryGetComponent<StatusEffectsComponent>(target, out var status))
  23. {
  24. _stunSystem.TryStun(target, TimeSpan.FromSeconds(component.StunAmount), true, status);
  25. _stunSystem.TryKnockdown(target, TimeSpan.FromSeconds(component.KnockdownAmount), true,
  26. status);
  27. _stunSystem.TrySlowdown(target, TimeSpan.FromSeconds(component.SlowdownAmount), true,
  28. component.WalkSpeedMultiplier, component.RunSpeedMultiplier, status);
  29. }
  30. }
  31. private void HandleCollide(EntityUid uid, StunOnCollideComponent component, ref StartCollideEvent args)
  32. {
  33. if (args.OurFixtureId != component.FixtureID)
  34. return;
  35. TryDoCollideStun(uid, component, args.OtherEntity);
  36. }
  37. private void HandleThrow(EntityUid uid, StunOnCollideComponent component, ThrowDoHitEvent args)
  38. {
  39. TryDoCollideStun(uid, component, args.Target);
  40. }
  41. }
  42. }