MovespeedModifier.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Content.Shared.Chemistry.Components;
  2. using Content.Shared.EntityEffects;
  3. using Content.Shared.Movement.Systems;
  4. using Robust.Shared.Prototypes;
  5. using Robust.Shared.Timing;
  6. namespace Content.Server.EntityEffects.Effects;
  7. /// <summary>
  8. /// Default metabolism for stimulants and tranqs. Attempts to find a MovementSpeedModifier on the target,
  9. /// adding one if not there and to change the movespeed
  10. /// </summary>
  11. public sealed partial class MovespeedModifier : EntityEffect
  12. {
  13. /// <summary>
  14. /// How much the entities' walk speed is multiplied by.
  15. /// </summary>
  16. [DataField]
  17. public float WalkSpeedModifier { get; set; } = 1;
  18. /// <summary>
  19. /// How much the entities' run speed is multiplied by.
  20. /// </summary>
  21. [DataField]
  22. public float SprintSpeedModifier { get; set; } = 1;
  23. /// <summary>
  24. /// How long the modifier applies (in seconds).
  25. /// Is scaled by reagent amount if used with an EntityEffectReagentArgs.
  26. /// </summary>
  27. [DataField]
  28. public float StatusLifetime = 2f;
  29. protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
  30. {
  31. return Loc.GetString("reagent-effect-guidebook-movespeed-modifier",
  32. ("chance", Probability),
  33. ("walkspeed", WalkSpeedModifier),
  34. ("time", StatusLifetime));
  35. }
  36. /// <summary>
  37. /// Remove reagent at set rate, changes the movespeed modifiers and adds a MovespeedModifierMetabolismComponent if not already there.
  38. /// </summary>
  39. public override void Effect(EntityEffectBaseArgs args)
  40. {
  41. var status = args.EntityManager.EnsureComponent<MovespeedModifierMetabolismComponent>(args.TargetEntity);
  42. // Only refresh movement if we need to.
  43. var modified = !status.WalkSpeedModifier.Equals(WalkSpeedModifier) ||
  44. !status.SprintSpeedModifier.Equals(SprintSpeedModifier);
  45. status.WalkSpeedModifier = WalkSpeedModifier;
  46. status.SprintSpeedModifier = SprintSpeedModifier;
  47. // only going to scale application time
  48. var statusLifetime = StatusLifetime;
  49. if (args is EntityEffectReagentArgs reagentArgs)
  50. {
  51. statusLifetime *= reagentArgs.Scale.Float();
  52. }
  53. IncreaseTimer(status, statusLifetime);
  54. if (modified)
  55. args.EntityManager.System<MovementSpeedModifierSystem>().RefreshMovementSpeedModifiers(args.TargetEntity);
  56. }
  57. public void IncreaseTimer(MovespeedModifierMetabolismComponent status, float time)
  58. {
  59. var gameTiming = IoCManager.Resolve<IGameTiming>();
  60. var offsetTime = Math.Max(status.ModifierTimer.TotalSeconds, gameTiming.CurTime.TotalSeconds);
  61. status.ModifierTimer = TimeSpan.FromSeconds(offsetTime + time);
  62. status.Dirty();
  63. }
  64. }