MovementSpeedModifierSystem.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Content.Shared.Inventory;
  2. using Content.Shared.Movement.Components;
  3. using Robust.Shared.Timing;
  4. namespace Content.Shared.Movement.Systems
  5. {
  6. public sealed class MovementSpeedModifierSystem : EntitySystem
  7. {
  8. [Dependency] private readonly IGameTiming _timing = default!;
  9. public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierComponent? move = null)
  10. {
  11. if (!Resolve(uid, ref move, false))
  12. return;
  13. if (_timing.ApplyingState)
  14. return;
  15. var ev = new RefreshMovementSpeedModifiersEvent();
  16. RaiseLocalEvent(uid, ev);
  17. if (MathHelper.CloseTo(ev.WalkSpeedModifier, move.WalkSpeedModifier) &&
  18. MathHelper.CloseTo(ev.SprintSpeedModifier, move.SprintSpeedModifier))
  19. return;
  20. move.WalkSpeedModifier = ev.WalkSpeedModifier;
  21. move.SprintSpeedModifier = ev.SprintSpeedModifier;
  22. Dirty(uid, move);
  23. }
  24. public void ChangeBaseSpeed(EntityUid uid, float baseWalkSpeed, float baseSprintSpeed, float acceleration, MovementSpeedModifierComponent? move = null)
  25. {
  26. if (!Resolve(uid, ref move, false))
  27. return;
  28. move.BaseWalkSpeed = baseWalkSpeed;
  29. move.BaseSprintSpeed = baseSprintSpeed;
  30. move.Acceleration = acceleration;
  31. Dirty(uid, move);
  32. }
  33. // We might want to create separate RefreshMovementFrictionModifiersEvent and RefreshMovementFrictionModifiers function that will call it
  34. public void ChangeFriction(EntityUid uid, float friction, float? frictionNoInput, float acceleration, MovementSpeedModifierComponent? move = null)
  35. {
  36. if (!Resolve(uid, ref move, false))
  37. return;
  38. move.Friction = friction;
  39. move.FrictionNoInput = frictionNoInput;
  40. move.Acceleration = acceleration;
  41. Dirty(uid, move);
  42. }
  43. }
  44. /// <summary>
  45. /// Raised on an entity to determine its new movement speed. Any system that wishes to change movement speed
  46. /// should hook into this event and set it then. If you want this event to be raised,
  47. /// call <see cref="MovementSpeedModifierSystem.RefreshMovementSpeedModifiers"/>.
  48. /// </summary>
  49. public sealed class RefreshMovementSpeedModifiersEvent : EntityEventArgs, IInventoryRelayEvent
  50. {
  51. public SlotFlags TargetSlots { get; } = ~SlotFlags.POCKET;
  52. public float WalkSpeedModifier { get; private set; } = 1.0f;
  53. public float SprintSpeedModifier { get; private set; } = 1.0f;
  54. public void ModifySpeed(float walk, float sprint)
  55. {
  56. WalkSpeedModifier *= walk;
  57. SprintSpeedModifier *= sprint;
  58. }
  59. public void ModifySpeed(float mod)
  60. {
  61. ModifySpeed(mod, mod);
  62. }
  63. }
  64. }