1
0

SlidingSystem.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using Content.Shared.Movement.Events;
  2. using Content.Shared.Standing;
  3. using Content.Shared.Stunnable;
  4. using Robust.Shared.Physics.Events;
  5. namespace Content.Shared.Slippery;
  6. public sealed class SlidingSystem : EntitySystem
  7. {
  8. public override void Initialize()
  9. {
  10. base.Initialize();
  11. SubscribeLocalEvent<SlidingComponent, TileFrictionEvent>(OnSlideAttempt);
  12. SubscribeLocalEvent<SlidingComponent, StoodEvent>(OnStand);
  13. SubscribeLocalEvent<SlidingComponent, StartCollideEvent>(OnStartCollide);
  14. SubscribeLocalEvent<SlidingComponent, EndCollideEvent>(OnEndCollide);
  15. }
  16. /// <summary>
  17. /// Modify the friction by the frictionModifier stored on the component.
  18. /// </summary>
  19. private void OnSlideAttempt(EntityUid uid, SlidingComponent component, ref TileFrictionEvent args)
  20. {
  21. args.Modifier = component.FrictionModifier;
  22. }
  23. /// <summary>
  24. /// Remove the component when the entity stands up again.
  25. /// </summary>
  26. private void OnStand(EntityUid uid, SlidingComponent component, ref StoodEvent args)
  27. {
  28. RemComp<SlidingComponent>(uid);
  29. }
  30. /// <summary>
  31. /// Sets friction to 0 if colliding with a SuperSlippery Entity.
  32. /// </summary>
  33. private void OnStartCollide(EntityUid uid, SlidingComponent component, ref StartCollideEvent args)
  34. {
  35. if (!TryComp<SlipperyComponent>(args.OtherEntity, out var slippery) || !slippery.SuperSlippery)
  36. return;
  37. component.CollidingEntities.Add(args.OtherEntity);
  38. component.FrictionModifier = 0;
  39. Dirty(uid, component);
  40. }
  41. /// <summary>
  42. /// Set friction to normal when ending collision with a SuperSlippery entity.
  43. /// </summary>
  44. private void OnEndCollide(EntityUid uid, SlidingComponent component, ref EndCollideEvent args)
  45. {
  46. if (!component.CollidingEntities.Remove(args.OtherEntity))
  47. return;
  48. if (component.CollidingEntities.Count == 0)
  49. component.FrictionModifier = SharedStunSystem.KnockDownModifier;
  50. Dirty(uid, component);
  51. }
  52. }