EuiManager.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Collections.Generic;
  3. using Content.Shared.Eui;
  4. using Robust.Client.GameStates;
  5. using Robust.Client.State;
  6. using Robust.Shared.IoC;
  7. using Robust.Shared.Network;
  8. using Robust.Shared.Reflection;
  9. using Robust.Shared.Utility;
  10. namespace Content.Client.Eui
  11. {
  12. public sealed class EuiManager
  13. {
  14. [Dependency] private readonly IClientNetManager _net = default!;
  15. [Dependency] private readonly IReflectionManager _refl = default!;
  16. [Dependency] private readonly IDynamicTypeFactory _dtf = default!;
  17. private readonly Dictionary<uint, EuiData> _openUis = new();
  18. public void Initialize()
  19. {
  20. _net.RegisterNetMessage<MsgEuiCtl>(RxMsgCtl);
  21. _net.RegisterNetMessage<MsgEuiState>(RxMsgState);
  22. _net.RegisterNetMessage<MsgEuiMessage>(RxMsgMessage);
  23. _net.Disconnect += NetOnDisconnect;
  24. }
  25. private void NetOnDisconnect(object? sender, NetDisconnectedArgs e)
  26. {
  27. foreach (var openUi in _openUis)
  28. {
  29. openUi.Value.Eui.Closed();
  30. }
  31. _openUis.Clear();
  32. }
  33. private void RxMsgMessage(MsgEuiMessage message)
  34. {
  35. var ui = _openUis[message.Id].Eui;
  36. ui.HandleMessage(message.Message);
  37. }
  38. private void RxMsgState(MsgEuiState message)
  39. {
  40. var ui = _openUis[message.Id].Eui;
  41. ui.HandleState(message.State);
  42. }
  43. private void RxMsgCtl(MsgEuiCtl message)
  44. {
  45. // Will always close the window first when getting a control message
  46. if (_openUis.TryGetValue(message.Id, out var openEui))
  47. {
  48. openEui.Eui.Closed();
  49. _openUis.Remove(message.Id);
  50. }
  51. if (message.Type != MsgEuiCtl.CtlType.Open)
  52. return;
  53. // Will open/re-open the window if the server wants the eui opened.
  54. var euiType = _refl.LooseGetType(message.OpenType);
  55. var instance = _dtf.CreateInstance<BaseEui>(euiType);
  56. instance.Initialize(this, message.Id);
  57. instance.Opened();
  58. _openUis.Add(message.Id, new EuiData(instance));
  59. }
  60. private sealed class EuiData
  61. {
  62. public readonly BaseEui Eui;
  63. public EuiData(BaseEui eui)
  64. {
  65. Eui = eui;
  66. }
  67. }
  68. }
  69. }