using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Server.Power.EntitySystems; using Content.Shared.Research.Components; using Robust.Shared.Utility; namespace Content.Server.Research.Systems; public sealed partial class ResearchSystem { private void InitializeClient() { SubscribeLocalEvent(OnClientMapInit); SubscribeLocalEvent(OnClientShutdown); SubscribeLocalEvent(OnClientUIOpen); SubscribeLocalEvent(OnConsoleSelect); SubscribeLocalEvent(OnClientAnchorStateChanged); SubscribeLocalEvent(OnClientSyncMessage); SubscribeLocalEvent(OnClientSelected); SubscribeLocalEvent(OnClientDeselected); SubscribeLocalEvent(OnClientRegistrationChanged); } #region UI private void OnClientSelected(EntityUid uid, ResearchClientComponent component, ResearchClientServerSelectedMessage args) { if (!TryGetServerById(uid, args.ServerId, out var serveruid, out var serverComponent)) return; // Validate that we can access this server. if (!GetServers(uid).Contains((serveruid.Value, serverComponent))) return; UnregisterClient(uid, component); RegisterClient(uid, serveruid.Value, component, serverComponent); } private void OnClientDeselected(EntityUid uid, ResearchClientComponent component, ResearchClientServerDeselectedMessage args) { UnregisterClient(uid, clientComponent: component); } private void OnClientSyncMessage(EntityUid uid, ResearchClientComponent component, ResearchClientSyncMessage args) { UpdateClientInterface(uid, component); } private void OnConsoleSelect(EntityUid uid, ResearchClientComponent component, ConsoleServerSelectionMessage args) { if (!this.IsPowered(uid, EntityManager)) return; _uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, args.Actor); } #endregion private void OnClientRegistrationChanged(EntityUid uid, ResearchClientComponent component, ref ResearchRegistrationChangedEvent args) { UpdateClientInterface(uid, component); } private void OnClientMapInit(EntityUid uid, ResearchClientComponent component, MapInitEvent args) { if (GetServers(uid).FirstOrNull() is { } server) RegisterClient(uid, server, component, server); } private void OnClientShutdown(EntityUid uid, ResearchClientComponent component, ComponentShutdown args) { UnregisterClient(uid, component); } private void OnClientUIOpen(EntityUid uid, ResearchClientComponent component, BoundUIOpenedEvent args) { UpdateClientInterface(uid, component); } private void OnClientAnchorStateChanged(Entity ent, ref AnchorStateChangedEvent args) { if (args.Anchored) { if (ent.Comp.Server is not null) return; if (GetServers(ent).FirstOrNull() is { } server) RegisterClient(ent, server, ent, server); } else { UnregisterClient(ent, ent.Comp); } } private void UpdateClientInterface(EntityUid uid, ResearchClientComponent? component = null) { if (!Resolve(uid, ref component, false)) return; TryGetClientServer(uid, out _, out var serverComponent, component); var names = GetServerNames(uid); var state = new ResearchClientBoundInterfaceState( names.Length, names, GetServerIds(uid), serverComponent?.Id ?? -1); _uiSystem.SetUiState(uid, ResearchClientUiKey.Key, state); } /// /// Tries to get the server belonging to a client /// /// The client /// It's server. Null if false. /// The server's ResearchServerComponent. Null if false /// The client's Researchclient component /// If the server was successfully retrieved. public bool TryGetClientServer(EntityUid uid, [NotNullWhen(returnValue: true)] out EntityUid? server, [NotNullWhen(returnValue: true)] out ResearchServerComponent? serverComponent, ResearchClientComponent? component = null) { server = null; serverComponent = null; if (!Resolve(uid, ref component, false)) return false; if (component.Server == null) return false; if (!TryComp(component.Server, out serverComponent)) return false; server = component.Server; return true; } }