using Content.Shared.Pointing.Components; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; using DrawDepth = Content.Shared.DrawDepth.DrawDepth; namespace Content.Server.Pointing.Components { [RegisterComponent] public class PointingArrowComponent : SharedPointingArrowComponent { /// /// The current amount of seconds left on this arrow. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("duration")] private float _duration = 4; /// /// The amount of seconds before the arrow changes movement direction. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("step")] private float _step = 0.5f; /// /// The amount of units that this arrow will move by when multiplied /// by the frame time. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("speed")] private float _speed = 1; /// /// The current amount of seconds left before the arrow changes /// movement direction. /// [ViewVariables(VVAccess.ReadWrite)] private float _currentStep; /// /// Whether or not this arrow is currently going up. /// [ViewVariables(VVAccess.ReadWrite)] private bool _up; /// /// Whether or not this arrow will convert into a /// when its duration runs out. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("rogue")] private bool _rogue = default; protected override void Startup() { base.Startup(); if (IoCManager.Resolve().TryGetComponent(Owner.Uid, out SpriteComponent? sprite)) { sprite.DrawDepth = (int) DrawDepth.Overlays; } } public void Update(float frameTime) { var movement = _speed * frameTime * (_up ? 1 : -1); IoCManager.Resolve().GetComponent(Owner.Uid).LocalPosition += (0, movement); _duration -= frameTime; _currentStep -= frameTime; if (_duration <= 0) { if (_rogue) { IoCManager.Resolve().RemoveComponent(Owner.Uid); IoCManager.Resolve().AddComponent(Owner); return; } IoCManager.Resolve().DeleteEntity(Owner.Uid); return; } if (_currentStep <= 0) { _currentStep = _step; _up ^= true; } } } }