1
0

ResearchSystem.Server.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using System.Linq;
  2. using Content.Server.Power.EntitySystems;
  3. using Content.Shared.Research.Components;
  4. namespace Content.Server.Research.Systems;
  5. public sealed partial class ResearchSystem
  6. {
  7. private void InitializeServer()
  8. {
  9. SubscribeLocalEvent<ResearchServerComponent, ComponentStartup>(OnServerStartup);
  10. SubscribeLocalEvent<ResearchServerComponent, ComponentShutdown>(OnServerShutdown);
  11. SubscribeLocalEvent<ResearchServerComponent, TechnologyDatabaseModifiedEvent>(OnServerDatabaseModified);
  12. }
  13. private void OnServerStartup(EntityUid uid, ResearchServerComponent component, ComponentStartup args)
  14. {
  15. var unusedId = EntityQuery<ResearchServerComponent>(true)
  16. .Max(s => s.Id) + 1;
  17. component.Id = unusedId;
  18. Dirty(uid, component);
  19. }
  20. private void OnServerShutdown(EntityUid uid, ResearchServerComponent component, ComponentShutdown args)
  21. {
  22. foreach (var client in new List<EntityUid>(component.Clients))
  23. {
  24. UnregisterClient(client, uid, serverComponent: component, dirtyServer: false);
  25. }
  26. }
  27. private void OnServerDatabaseModified(EntityUid uid, ResearchServerComponent component, ref TechnologyDatabaseModifiedEvent args)
  28. {
  29. foreach (var client in component.Clients)
  30. {
  31. RaiseLocalEvent(client, ref args);
  32. }
  33. }
  34. private bool CanRun(EntityUid uid)
  35. {
  36. return this.IsPowered(uid, EntityManager);
  37. }
  38. private void UpdateServer(EntityUid uid, int time, ResearchServerComponent? component = null)
  39. {
  40. if (!Resolve(uid, ref component))
  41. return;
  42. if (!CanRun(uid))
  43. return;
  44. ModifyServerPoints(uid, GetPointsPerSecond(uid, component) * time, component);
  45. }
  46. /// <summary>
  47. /// Registers a client to the specified server.
  48. /// </summary>
  49. /// <param name="client">The client being registered</param>
  50. /// <param name="server">The server the client is being registered to</param>
  51. /// <param name="clientComponent"></param>
  52. /// <param name="serverComponent"></param>
  53. /// <param name="dirtyServer">Whether or not to dirty the server component after registration</param>
  54. public void RegisterClient(EntityUid client, EntityUid server, ResearchClientComponent? clientComponent = null,
  55. ResearchServerComponent? serverComponent = null, bool dirtyServer = true)
  56. {
  57. if (!Resolve(client, ref clientComponent) || !Resolve(server, ref serverComponent))
  58. return;
  59. if (serverComponent.Clients.Contains(client))
  60. return;
  61. serverComponent.Clients.Add(client);
  62. clientComponent.Server = server;
  63. SyncClientWithServer(client, clientComponent: clientComponent);
  64. if (dirtyServer)
  65. Dirty(server, serverComponent);
  66. var ev = new ResearchRegistrationChangedEvent(server);
  67. RaiseLocalEvent(client, ref ev);
  68. }
  69. /// <summary>
  70. /// Unregisterse a client from its server
  71. /// </summary>
  72. /// <param name="client"></param>
  73. /// <param name="clientComponent"></param>
  74. /// <param name="dirtyServer"></param>
  75. public void UnregisterClient(EntityUid client, ResearchClientComponent? clientComponent = null, bool dirtyServer = true)
  76. {
  77. if (!Resolve(client, ref clientComponent))
  78. return;
  79. if (clientComponent.Server is not { } server)
  80. return;
  81. UnregisterClient(client, server, clientComponent, dirtyServer: dirtyServer);
  82. }
  83. /// <summary>
  84. /// Unregisters a client from its server
  85. /// </summary>
  86. /// <param name="client"></param>
  87. /// <param name="server"></param>
  88. /// <param name="clientComponent"></param>
  89. /// <param name="serverComponent"></param>
  90. /// <param name="dirtyServer"></param>
  91. public void UnregisterClient(EntityUid client, EntityUid server, ResearchClientComponent? clientComponent = null,
  92. ResearchServerComponent? serverComponent = null, bool dirtyServer = true)
  93. {
  94. if (!Resolve(client, ref clientComponent) || !Resolve(server, ref serverComponent))
  95. return;
  96. serverComponent.Clients.Remove(client);
  97. clientComponent.Server = null;
  98. SyncClientWithServer(client, clientComponent: clientComponent);
  99. if (dirtyServer)
  100. {
  101. Dirty(server, serverComponent);
  102. }
  103. var ev = new ResearchRegistrationChangedEvent(null);
  104. RaiseLocalEvent(client, ref ev);
  105. }
  106. /// <summary>
  107. /// Gets the amount of points generated by all the server's sources in a second.
  108. /// </summary>
  109. /// <param name="uid"></param>
  110. /// <param name="component"></param>
  111. /// <returns></returns>
  112. public int GetPointsPerSecond(EntityUid uid, ResearchServerComponent? component = null)
  113. {
  114. var points = 0;
  115. if (!Resolve(uid, ref component))
  116. return points;
  117. if (!CanRun(uid))
  118. return points;
  119. var ev = new ResearchServerGetPointsPerSecondEvent(uid, points);
  120. foreach (var client in component.Clients)
  121. {
  122. RaiseLocalEvent(client, ref ev);
  123. }
  124. return ev.Points;
  125. }
  126. /// <summary>
  127. /// Adds a specified number of points to a server.
  128. /// </summary>
  129. /// <param name="uid">The server</param>
  130. /// <param name="points">The amount of points being added</param>
  131. /// <param name="component"></param>
  132. public void ModifyServerPoints(EntityUid uid, int points, ResearchServerComponent? component = null)
  133. {
  134. if (points == 0)
  135. return;
  136. if (!Resolve(uid, ref component))
  137. return;
  138. component.Points += points;
  139. var ev = new ResearchServerPointsChangedEvent(uid, component.Points, points);
  140. foreach (var client in component.Clients)
  141. {
  142. RaiseLocalEvent(client, ref ev);
  143. }
  144. Dirty(uid, component);
  145. }
  146. }