using System.Collections.Generic; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.Maths; namespace Content.Shared.Pinpointer { public abstract class SharedPinpointerSystem : EntitySystem { protected readonly HashSet ActivePinpointers = new(); public override void Initialize() { base.Initialize(); SubscribeLocalEvent(GetCompState); SubscribeLocalEvent(OnPinpointerShutdown); } private void GetCompState(EntityUid uid, PinpointerComponent pinpointer, ref ComponentGetState args) { args.State = new PinpointerComponentState { IsActive = pinpointer.IsActive, DirectionToTarget = pinpointer.DirectionToTarget, DistanceToTarget = pinpointer.DistanceToTarget }; } private void OnPinpointerShutdown(EntityUid uid, PinpointerComponent component, ComponentShutdown _) { // no need to dirty it/etc: it's shutting down anyway! ActivePinpointers.Remove(uid); } /// /// Manually set distance from pinpointer to target /// public void SetDistance(EntityUid uid, Distance distance, PinpointerComponent? pinpointer = null) { if (!Resolve(uid, ref pinpointer)) return; if (distance == pinpointer.DistanceToTarget) return; pinpointer.DistanceToTarget = distance; pinpointer.Dirty(); } /// /// Manually set pinpointer arrow direction /// public void SetDirection(EntityUid uid, Direction directionToTarget, PinpointerComponent? pinpointer = null) { if (!Resolve(uid, ref pinpointer)) return; if (directionToTarget == pinpointer.DirectionToTarget) return; pinpointer.DirectionToTarget = directionToTarget; pinpointer.Dirty(); } /// /// Activate/deactivate pinpointer screen. If it has target it will start tracking it. /// public void SetActive(EntityUid uid, bool isActive, PinpointerComponent? pinpointer = null) { if (!Resolve(uid, ref pinpointer)) return; if (isActive == pinpointer.IsActive) return; // add-remove pinpointer from update list if (isActive) ActivePinpointers.Add(uid); else ActivePinpointers.Remove(uid); pinpointer.IsActive = isActive; pinpointer.Dirty(); } /// /// Toggle Pinpointer screen. If it has target it will start tracking it. /// /// True if pinpointer was activated, false otherwise public bool TogglePinpointer(EntityUid uid, PinpointerComponent? pinpointer = null) { if (!Resolve(uid, ref pinpointer)) return false; var isActive = !pinpointer.IsActive; SetActive(uid, isActive, pinpointer); return isActive; } } }