using System.Linq; using Content.Server.DeviceNetwork.Systems; using Content.Server.CartridgeLoader; using Content.Server.PDA.Ringer; using Content.Server.Station.Systems; using Content.Shared.CartridgeLoader; using Content.Shared.DeviceNetwork; using Content.Shared.DeviceNetwork.Components; using Robust.Shared.Timing; using Robust.Shared.Prototypes; namespace Content.Server._Sunrise.CartridgeLoader.Cartridges; /// /// Система картриджа мессенджера для КПК /// public sealed partial class MessengerCartridgeSystem : EntitySystem { [Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!; [Dependency] private readonly DeviceNetworkSystem _deviceNetwork = default!; [Dependency] private readonly SingletonDeviceNetServerSystem _singletonServer = default!; [Dependency] private readonly StationSystem _stationSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly ILogManager _logManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly RingerSystem _ringer = default!; private ISawmill Sawmill { get; set; } = default!; private const string MessengerFrequencyId = "Messenger"; public override void Initialize() { base.Initialize(); Sawmill = _logManager.GetSawmill("messenger.cartridge"); SubscribeLocalEvent(OnUiMessage); SubscribeLocalEvent(OnUiReady); SubscribeLocalEvent(OnCartridgeActivated); SubscribeLocalEvent(OnCartridgeAdded); SubscribeLocalEvent(OnPacketReceived); } public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); var currentTime = _gameTiming.CurTime; while (query.MoveNext(out var uid, out var component)) { if (component.LoaderUid == null) continue; if (!TryComp(component.LoaderUid.Value, out var loader)) continue; var isActive = loader.ActiveProgram == uid; var isBackground = loader.BackgroundPrograms.Contains(uid); if (!isActive && !isBackground) continue; if (component.LastStatusCheck.HasValue) { var timeSinceLastCheck = currentTime - component.LastStatusCheck.Value; if (timeSinceLastCheck.TotalSeconds < 2.0) continue; } component.LastStatusCheck = currentTime; CheckServerStatus(uid, component, component.LoaderUid.Value); } } private bool TryGetPdaAndDeviceNetwork(EntityUid loaderUid, out EntityUid pdaUid, out DeviceNetworkComponent deviceNetwork) { pdaUid = EntityUid.Invalid; deviceNetwork = null!; if (!TryComp(loaderUid, out var device)) return false; pdaUid = loaderUid; deviceNetwork = device; return true; } private EntityUid GetEntity(NetEntity netEntity) { return EntityManager.GetEntity(netEntity); } /// /// Получает частоту Messenger /// private uint? GetMessengerFrequency() { if (_prototypeManager.TryIndex(MessengerFrequencyId, out var messengerFrequency)) { return messengerFrequency.Frequency; } Sawmill.Error($"Messenger frequency prototype not found: {MessengerFrequencyId}"); return null; } /// /// Устанавливает частоту передачи на Messenger /// private void SetMessengerFrequency(EntityUid loaderUid, DeviceNetworkComponent deviceNetwork, out uint? originalFrequency) { originalFrequency = deviceNetwork.TransmitFrequency; var messengerFreq = GetMessengerFrequency(); if (messengerFreq.HasValue) { _deviceNetwork.SetTransmitFrequency(loaderUid, messengerFreq.Value, deviceNetwork); } } /// /// Восстанавливает исходную частоту передачи /// private void RestoreFrequency(EntityUid loaderUid, DeviceNetworkComponent deviceNetwork, uint? originalFrequency) { if (originalFrequency.HasValue) { _deviceNetwork.SetTransmitFrequency(loaderUid, originalFrequency.Value, deviceNetwork); } } /// /// Пытается найти станцию для КПК. Если КПК не на станции, ищет любую станцию на той же карте. /// private EntityUid? GetBestStation(EntityUid pdaUid) { var station = _stationSystem.GetOwningStation(pdaUid); if (station != null) return station; var xform = Transform(pdaUid); var mapId = xform.MapID; foreach (var s in _stationSystem.GetStations()) { if (Transform(s).MapID == mapId) return s; } return _stationSystem.GetStations().FirstOrDefault(); } }