SmesSystem.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Content.Server.Power.Components;
  2. using Content.Server.Power.EntitySystems;
  3. using Content.Shared.Power;
  4. using Content.Shared.Rounding;
  5. using Content.Shared.SMES;
  6. using JetBrains.Annotations;
  7. using Robust.Shared.Timing;
  8. namespace Content.Server.Power.SMES;
  9. [UsedImplicitly]
  10. internal sealed class SmesSystem : EntitySystem
  11. {
  12. [Dependency] private readonly IGameTiming _gameTiming = default!;
  13. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. UpdatesAfter.Add(typeof(PowerNetSystem));
  18. SubscribeLocalEvent<SmesComponent, MapInitEvent>(OnMapInit);
  19. SubscribeLocalEvent<SmesComponent, ChargeChangedEvent>(OnBatteryChargeChanged);
  20. }
  21. private void OnMapInit(EntityUid uid, SmesComponent component, MapInitEvent args)
  22. {
  23. UpdateSmesState(uid, component);
  24. }
  25. private void OnBatteryChargeChanged(EntityUid uid, SmesComponent component, ref ChargeChangedEvent args)
  26. {
  27. UpdateSmesState(uid, component);
  28. }
  29. private void UpdateSmesState(EntityUid uid, SmesComponent smes)
  30. {
  31. var newLevel = CalcChargeLevel(uid);
  32. if (newLevel != smes.LastChargeLevel && smes.LastChargeLevelTime + smes.VisualsChangeDelay < _gameTiming.CurTime)
  33. {
  34. smes.LastChargeLevel = newLevel;
  35. smes.LastChargeLevelTime = _gameTiming.CurTime;
  36. _appearance.SetData(uid, SmesVisuals.LastChargeLevel, newLevel);
  37. }
  38. var newChargeState = CalcChargeState(uid);
  39. if (newChargeState != smes.LastChargeState && smes.LastChargeStateTime + smes.VisualsChangeDelay < _gameTiming.CurTime)
  40. {
  41. smes.LastChargeState = newChargeState;
  42. smes.LastChargeStateTime = _gameTiming.CurTime;
  43. _appearance.SetData(uid, SmesVisuals.LastChargeState, newChargeState);
  44. }
  45. }
  46. private int CalcChargeLevel(EntityUid uid, BatteryComponent? battery = null)
  47. {
  48. if (!Resolve(uid, ref battery, false))
  49. return 0;
  50. return ContentHelpers.RoundToLevels(battery.CurrentCharge, battery.MaxCharge, 6);
  51. }
  52. private ChargeState CalcChargeState(EntityUid uid, PowerNetworkBatteryComponent? netBattery = null)
  53. {
  54. if (!Resolve(uid, ref netBattery, false))
  55. return ChargeState.Still;
  56. return (netBattery.CurrentSupply - netBattery.CurrentReceiving) switch
  57. {
  58. > 0 => ChargeState.Discharging,
  59. < 0 => ChargeState.Charging,
  60. _ => ChargeState.Still
  61. };
  62. }
  63. }