using System; using System.Collections.Generic; using Content.Shared.Eui; using Robust.Client.GameStates; using Robust.Client.State; using Robust.Shared.IoC; using Robust.Shared.Network; using Robust.Shared.Reflection; using Robust.Shared.Utility; namespace Content.Client.Eui { public sealed class EuiManager { [Dependency] private readonly IClientNetManager _net = default!; [Dependency] private readonly IReflectionManager _refl = default!; [Dependency] private readonly IDynamicTypeFactory _dtf = default!; private readonly Dictionary _openUis = new(); public void Initialize() { _net.RegisterNetMessage(RxMsgCtl); _net.RegisterNetMessage(RxMsgState); _net.RegisterNetMessage(RxMsgMessage); _net.Disconnect += NetOnDisconnect; } private void NetOnDisconnect(object? sender, NetDisconnectedArgs e) { foreach (var openUi in _openUis) { openUi.Value.Eui.Closed(); } _openUis.Clear(); } private void RxMsgMessage(MsgEuiMessage message) { var ui = _openUis[message.Id].Eui; ui.HandleMessage(message.Message); } private void RxMsgState(MsgEuiState message) { var ui = _openUis[message.Id].Eui; ui.HandleState(message.State); } private void RxMsgCtl(MsgEuiCtl message) { // Will always close the window first when getting a control message if (_openUis.TryGetValue(message.Id, out var openEui)) { openEui.Eui.Closed(); _openUis.Remove(message.Id); } if (message.Type != MsgEuiCtl.CtlType.Open) return; // Will open/re-open the window if the server wants the eui opened. var euiType = _refl.LooseGetType(message.OpenType); var instance = _dtf.CreateInstance(euiType); instance.Initialize(this, message.Id); instance.Opened(); _openUis.Add(message.Id, new EuiData(instance)); } private sealed class EuiData { public readonly BaseEui Eui; public EuiData(BaseEui eui) { Eui = eui; } } } }