1
0

BaseEui.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using Content.Shared.Eui;
  2. using Robust.Shared.Network;
  3. using Robust.Shared.Player;
  4. namespace Content.Server.EUI
  5. {
  6. /// <summary>
  7. /// Base class to implement server-side for an EUI.
  8. /// </summary>
  9. /// <remarks>
  10. /// An EUI is a system for making a relatively-easy connection between client and server
  11. /// for the purposes of UIs.
  12. /// </remarks>
  13. /// <remarks>
  14. /// An equivalently named class much exist server side for an EUI to work.
  15. /// It will be instantiated, opened and closed automatically.
  16. /// </remarks>
  17. public abstract class BaseEui
  18. {
  19. private bool _isStateDirty = false;
  20. /// <summary>
  21. /// The player that this EUI is open for.
  22. /// </summary>
  23. public ICommonSession Player { get; private set; } = default!;
  24. public bool IsShutDown { get; private set; }
  25. public EuiManager Manager { get; private set; } = default!;
  26. public uint Id { get; private set; }
  27. /// <summary>
  28. /// Called when the UI has been opened. Do initializing logic here.
  29. /// </summary>
  30. public virtual void Opened()
  31. {
  32. }
  33. /// <summary>
  34. /// Called when the UI has been closed.
  35. /// </summary>
  36. public virtual void Closed()
  37. {
  38. }
  39. /// <summary>
  40. /// Called when a message comes in from the client.
  41. /// </summary>
  42. public virtual void HandleMessage(EuiMessageBase msg)
  43. {
  44. if (msg is CloseEuiMessage)
  45. Close();
  46. }
  47. /// <summary>
  48. /// Mark the current UI state as dirty and queue for an update.
  49. /// </summary>
  50. /// <seealso cref="GetNewState"/>
  51. public void StateDirty()
  52. {
  53. if (_isStateDirty)
  54. {
  55. return;
  56. }
  57. _isStateDirty = true;
  58. Manager.QueueStateUpdate(this);
  59. }
  60. /// <summary>
  61. /// Called some time after <see cref="StateDirty"/> has been called
  62. /// to get a new UI state that can be sent to the client.
  63. /// </summary>
  64. public virtual EuiStateBase GetNewState()
  65. {
  66. throw new NotSupportedException();
  67. }
  68. /// <summary>
  69. /// Send a message to the client-side EUI.
  70. /// </summary>
  71. public void SendMessage(EuiMessageBase message)
  72. {
  73. var netMgr = IoCManager.Resolve<IServerNetManager>();
  74. var msg = new MsgEuiMessage();
  75. msg.Id = Id;
  76. msg.Message = message;
  77. netMgr.ServerSendMessage(msg, Player.Channel);
  78. }
  79. /// <summary>
  80. /// Close the EUI, breaking the connection between client and server.
  81. /// </summary>
  82. public void Close()
  83. {
  84. Manager.CloseEui(this);
  85. }
  86. internal void Shutdown()
  87. {
  88. Closed();
  89. IsShutDown = true;
  90. }
  91. internal void DoStateUpdate()
  92. {
  93. _isStateDirty = false;
  94. var state = GetNewState();
  95. var netMgr = IoCManager.Resolve<IServerNetManager>();
  96. var msg = new MsgEuiState();
  97. msg.Id = Id;
  98. msg.State = state;
  99. netMgr.ServerSendMessage(msg, Player.Channel);
  100. }
  101. internal void Initialize(EuiManager manager, ICommonSession player, uint id)
  102. {
  103. Manager = manager;
  104. Player = player;
  105. Id = id;
  106. Opened();
  107. }
  108. }
  109. }