using Content.Shared.Chemistry.Components; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.IoC; using Robust.Shared.Timing; using System.Collections.Generic; using System.Linq; using Content.Shared.Movement.Components; using Content.Shared.Movement.EntitySystems; using static Content.Shared.Chemistry.Components.MovespeedModifierMetabolismComponent; namespace Content.Shared.Chemistry { // TODO CONVERT THIS TO A STATUS EFFECT!!!!!!!!!!!!!!!!!!!!!!!! public sealed class MetabolismMovespeedModifierSystem : EntitySystem { [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly MovementSpeedModifierSystem _movespeed = default!; private readonly List _components = new(); public override void Initialize() { base.Initialize(); UpdatesOutsidePrediction = true; SubscribeLocalEvent(OnMovespeedHandleState); SubscribeLocalEvent(AddComponent); SubscribeLocalEvent(OnRefreshMovespeed); } private void OnMovespeedHandleState(EntityUid uid, MovespeedModifierMetabolismComponent component, ref ComponentHandleState args) { if (args.Current is not MovespeedModifierMetabolismComponentState cast) return; if (EntityManager.TryGetComponent(uid, out var modifier) && (!component.WalkSpeedModifier.Equals(cast.WalkSpeedModifier) || !component.SprintSpeedModifier.Equals(cast.SprintSpeedModifier))) { _movespeed.RefreshMovementSpeedModifiers(uid); } component.WalkSpeedModifier = cast.WalkSpeedModifier; component.SprintSpeedModifier = cast.SprintSpeedModifier; component.ModifierTimer = cast.ModifierTimer; } private void OnRefreshMovespeed(EntityUid uid, MovespeedModifierMetabolismComponent component, RefreshMovementSpeedModifiersEvent args) { args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); } private void AddComponent(EntityUid uid, MovespeedModifierMetabolismComponent component, ComponentStartup args) { _components.Add(component); } public override void Update(float frameTime) { base.Update(frameTime); var currentTime = _gameTiming.CurTime; for (var i = _components.Count - 1; i >= 0; i--) { var component = _components[i]; if (component.Deleted) { _components.RemoveAt(i); continue; } if (component.ModifierTimer > currentTime) continue; _components.RemoveAt(i); EntityManager.RemoveComponent(component.Owner); _movespeed.RefreshMovementSpeedModifiers(component.Owner); } } } }