using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Movement.EntitySystems; using Robust.Shared.Timing; namespace Content.Server.Chemistry.ReagentEffects { /// /// Default metabolism for stimulants and tranqs. Attempts to find a MovementSpeedModifier on the target, /// adding one if not there and to change the movespeed /// public sealed class MovespeedModifier : ReagentEffect { /// /// How much the entities' walk speed is multiplied by. /// [DataField("walkSpeedModifier")] public float WalkSpeedModifier { get; set; } = 1; /// /// How much the entities' run speed is multiplied by. /// [DataField("sprintSpeedModifier")] public float SprintSpeedModifier { get; set; } = 1; /// /// How long the modifier applies (in seconds) when metabolized. /// [DataField("statusLifetime")] public float StatusLifetime = 2f; /// /// Remove reagent at set rate, changes the movespeed modifiers and adds a MovespeedModifierMetabolismComponent if not already there. /// public override void Effect(ReagentEffectArgs args) { var status = args.EntityManager.EnsureComponent(args.SolutionEntity); // Only refresh movement if we need to. var modified = !status.WalkSpeedModifier.Equals(WalkSpeedModifier) || !status.SprintSpeedModifier.Equals(SprintSpeedModifier); status.WalkSpeedModifier = WalkSpeedModifier; status.SprintSpeedModifier = SprintSpeedModifier; IncreaseTimer(status, StatusLifetime); if (modified) EntitySystem.Get().RefreshMovementSpeedModifiers(args.SolutionEntity); } public void IncreaseTimer(MovespeedModifierMetabolismComponent status, float time) { var gameTiming = IoCManager.Resolve(); var offsetTime = Math.Max(status.ModifierTimer.TotalSeconds, gameTiming.CurTime.TotalSeconds); status.ModifierTimer = TimeSpan.FromSeconds(offsetTime + time); status.Dirty(); } } }