using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Radio.EntitySystems; using Content.Shared.Access.Systems; using Content.Shared.Popups; using Content.Shared.Research.Components; using Content.Shared.Research.Systems; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.Timing; namespace Content.Server.Research.Systems { [UsedImplicitly] public sealed partial class ResearchSystem : SharedResearchSystem { [Dependency] private readonly IAdminLogManager _adminLog = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly AccessReaderSystem _accessReader = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly RadioSystem _radio = default!; public override void Initialize() { base.Initialize(); InitializeClient(); InitializeConsole(); InitializeSource(); InitializeServer(); SubscribeLocalEvent(OnDatabaseRegistrationChanged); } /// /// Gets a server based on its unique numeric id. /// /// /// /// /// /// public bool TryGetServerById(EntityUid client, int id, [NotNullWhen(true)] out EntityUid? serverUid, [NotNullWhen(true)] out ResearchServerComponent? serverComponent) { serverUid = null; serverComponent = null; var query = GetServers(client); foreach (var (uid, server) in query) { if (server.Id != id) continue; serverUid = uid; serverComponent = server; return true; } return false; } /// /// Gets the names of all the servers. /// /// public string[] GetServerNames(EntityUid client) { return GetServers(client).Select(x => x.Comp.ServerName).ToArray(); } /// /// Gets the ids of all the servers /// /// public int[] GetServerIds(EntityUid client) { return GetServers(client).Select(x => x.Comp.Id).ToArray(); } public HashSet> GetServers(EntityUid client) { var clientXform = Transform(client); if (clientXform.GridUid is not { } grid) return []; var set = new HashSet>(); _lookup.GetGridEntities(grid, set); return set; } public override void Update(float frameTime) { var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var server)) { if (server.NextUpdateTime > _timing.CurTime) continue; server.NextUpdateTime = _timing.CurTime + server.ResearchConsoleUpdateTime; UpdateServer(uid, (int) server.ResearchConsoleUpdateTime.TotalSeconds, server); } } } }