PowerNet.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using Content.Server.NodeContainer.NodeGroups;
  2. using Content.Server.NodeContainer.Nodes;
  3. using Content.Server.Power.Components;
  4. using Content.Server.Power.EntitySystems;
  5. using JetBrains.Annotations;
  6. using Robust.Shared.Utility;
  7. using System.Linq;
  8. namespace Content.Server.Power.NodeGroups
  9. {
  10. public interface IPowerNet : IBasePowerNet
  11. {
  12. void AddDischarger(BatteryDischargerComponent discharger);
  13. void RemoveDischarger(BatteryDischargerComponent discharger);
  14. void AddCharger(BatteryChargerComponent charger);
  15. void RemoveCharger(BatteryChargerComponent charger);
  16. }
  17. [NodeGroup(NodeGroupID.HVPower, NodeGroupID.MVPower)]
  18. [UsedImplicitly]
  19. public sealed partial class PowerNet : BasePowerNet<IPowerNet>, IPowerNet
  20. {
  21. [ViewVariables] public readonly List<BatteryChargerComponent> Chargers = new();
  22. [ViewVariables] public readonly List<BatteryDischargerComponent> Dischargers = new();
  23. public override void Initialize(Node sourceNode, IEntityManager entMan)
  24. {
  25. base.Initialize(sourceNode, entMan);
  26. PowerNetSystem.InitPowerNet(this);
  27. }
  28. public override void AfterRemake(IEnumerable<IGrouping<INodeGroup?, Node>> newGroups)
  29. {
  30. base.AfterRemake(newGroups);
  31. PowerNetSystem?.DestroyPowerNet(this);
  32. }
  33. protected override void SetNetConnectorNet(IBaseNetConnectorComponent<IPowerNet> netConnectorComponent)
  34. {
  35. netConnectorComponent.Net = this;
  36. }
  37. public void AddDischarger(BatteryDischargerComponent discharger)
  38. {
  39. if (EntMan == null)
  40. return;
  41. var battery = EntMan.GetComponent<PowerNetworkBatteryComponent>(discharger.Owner);
  42. DebugTools.Assert(battery.NetworkBattery.LinkedNetworkDischarging == default);
  43. battery.NetworkBattery.LinkedNetworkDischarging = default;
  44. Dischargers.Add(discharger);
  45. QueueNetworkReconnect();
  46. }
  47. public void RemoveDischarger(BatteryDischargerComponent discharger)
  48. {
  49. if (EntMan == null)
  50. return;
  51. // Can be missing if the entity is being deleted, not a big deal.
  52. if (EntMan.TryGetComponent(discharger.Owner, out PowerNetworkBatteryComponent? battery))
  53. {
  54. // Linked network can be default if it was re-connected twice in one tick.
  55. DebugTools.Assert(battery.NetworkBattery.LinkedNetworkDischarging == default || battery.NetworkBattery.LinkedNetworkDischarging == NetworkNode.Id);
  56. battery.NetworkBattery.LinkedNetworkDischarging = default;
  57. }
  58. Dischargers.Remove(discharger);
  59. QueueNetworkReconnect();
  60. }
  61. public void AddCharger(BatteryChargerComponent charger)
  62. {
  63. if (EntMan == null)
  64. return;
  65. var battery = EntMan.GetComponent<PowerNetworkBatteryComponent>(charger.Owner);
  66. DebugTools.Assert(battery.NetworkBattery.LinkedNetworkCharging == default);
  67. battery.NetworkBattery.LinkedNetworkCharging = default;
  68. Chargers.Add(charger);
  69. QueueNetworkReconnect();
  70. }
  71. public void RemoveCharger(BatteryChargerComponent charger)
  72. {
  73. if (EntMan == null)
  74. return;
  75. // Can be missing if the entity is being deleted, not a big deal.
  76. if (EntMan.TryGetComponent(charger.Owner, out PowerNetworkBatteryComponent? battery))
  77. {
  78. // Linked network can be default if it was re-connected twice in one tick.
  79. DebugTools.Assert(battery.NetworkBattery.LinkedNetworkCharging == default || battery.NetworkBattery.LinkedNetworkCharging == NetworkNode.Id);
  80. battery.NetworkBattery.LinkedNetworkCharging = default;
  81. }
  82. Chargers.Remove(charger);
  83. QueueNetworkReconnect();
  84. }
  85. public override void QueueNetworkReconnect()
  86. {
  87. PowerNetSystem?.QueueReconnectPowerNet(this);
  88. }
  89. public override string? GetDebugData()
  90. {
  91. if (PowerNetSystem == null)
  92. return null;
  93. // This is just recycling the multi-tool examine.
  94. var ps = PowerNetSystem.GetNetworkStatistics(NetworkNode);
  95. float storageRatio = ps.InStorageCurrent / Math.Max(ps.InStorageMax, 1.0f);
  96. float outStorageRatio = ps.OutStorageCurrent / Math.Max(ps.OutStorageMax, 1.0f);
  97. return @$"Current Supply: {ps.SupplyCurrent:G3}
  98. From Batteries: {ps.SupplyBatteries:G3}
  99. Theoretical Supply: {ps.SupplyTheoretical:G3}
  100. Ideal Consumption: {ps.Consumption:G3}
  101. Input Storage: {ps.InStorageCurrent:G3} / {ps.InStorageMax:G3} ({storageRatio:P1})
  102. Output Storage: {ps.OutStorageCurrent:G3} / {ps.OutStorageMax:G3} ({outStorageRatio:P1})";
  103. }
  104. }
  105. }