Files
crystall-punk-14/Content.Client/Eui/EuiManager.cs

81 lines
2.4 KiB
C#
Raw Permalink Normal View History

2020-11-10 16:50:28 +01:00
using System;
using System.Collections.Generic;
2021-06-09 22:19:39 +02:00
using Content.Shared.Eui;
using Robust.Client.GameStates;
using Robust.Client.State;
2020-11-10 16:50:28 +01:00
using Robust.Shared.IoC;
using Robust.Shared.Network;
using Robust.Shared.Reflection;
using Robust.Shared.Utility;
2020-11-10 16:50:28 +01:00
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<uint, EuiData> _openUis = new();
2020-11-10 16:50:28 +01:00
public void Initialize()
{
_net.RegisterNetMessage<MsgEuiCtl>(RxMsgCtl);
_net.RegisterNetMessage<MsgEuiState>(RxMsgState);
_net.RegisterNetMessage<MsgEuiMessage>(RxMsgMessage);
_net.Disconnect += NetOnDisconnect;
}
private void NetOnDisconnect(object? sender, NetDisconnectedArgs e)
{
foreach (var openUi in _openUis)
{
openUi.Value.Eui.Closed();
}
_openUis.Clear();
2020-11-10 16:50:28 +01:00
}
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))
2020-11-10 16:50:28 +01:00
{
openEui.Eui.Closed();
_openUis.Remove(message.Id);
}
2020-11-10 16:50:28 +01:00
if (message.Type != MsgEuiCtl.CtlType.Open)
return;
2020-11-10 16:50:28 +01:00
// Will open/re-open the window if the server wants the eui opened.
var euiType = _refl.LooseGetType(message.OpenType);
var instance = _dtf.CreateInstance<BaseEui>(euiType);
instance.Initialize(this, message.Id);
instance.Opened();
_openUis.Add(message.Id, new EuiData(instance));
2020-11-10 16:50:28 +01:00
}
private sealed class EuiData
{
public readonly BaseEui Eui;
2020-11-10 16:50:28 +01:00
public EuiData(BaseEui eui)
{
Eui = eui;
}
}
}
}