1
0

PowerSolarControlConsoleSystem.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Content.Server.Solar.Components;
  2. using Content.Server.UserInterface;
  3. using Content.Shared.Solar;
  4. using JetBrains.Annotations;
  5. using Robust.Server.GameObjects;
  6. namespace Content.Server.Solar.EntitySystems
  7. {
  8. /// <summary>
  9. /// Responsible for updating solar control consoles.
  10. /// </summary>
  11. [UsedImplicitly]
  12. internal sealed class PowerSolarControlConsoleSystem : EntitySystem
  13. {
  14. [Dependency] private readonly PowerSolarSystem _powerSolarSystem = default!;
  15. [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
  16. /// <summary>
  17. /// Timer used to avoid updating the UI state every frame (which would be overkill)
  18. /// </summary>
  19. private float _updateTimer;
  20. public override void Initialize()
  21. {
  22. base.Initialize();
  23. SubscribeLocalEvent<SolarControlConsoleComponent, SolarControlConsoleAdjustMessage>(OnUIMessage);
  24. }
  25. public override void Update(float frameTime)
  26. {
  27. _updateTimer += frameTime;
  28. if (_updateTimer >= 1)
  29. {
  30. _updateTimer -= 1;
  31. var state = new SolarControlConsoleBoundInterfaceState(_powerSolarSystem.TargetPanelRotation, _powerSolarSystem.TargetPanelVelocity, _powerSolarSystem.TotalPanelPower, _powerSolarSystem.TowardsSun);
  32. var query = EntityQueryEnumerator<SolarControlConsoleComponent, UserInterfaceComponent>();
  33. while (query.MoveNext(out var uid, out _, out var uiComp))
  34. {
  35. _uiSystem.SetUiState((uid, uiComp), SolarControlConsoleUiKey.Key, state);
  36. }
  37. }
  38. }
  39. private void OnUIMessage(EntityUid uid, SolarControlConsoleComponent component, SolarControlConsoleAdjustMessage msg)
  40. {
  41. if (double.IsFinite(msg.Rotation))
  42. {
  43. _powerSolarSystem.TargetPanelRotation = msg.Rotation.Reduced();
  44. }
  45. if (double.IsFinite(msg.AngularVelocity))
  46. {
  47. var degrees = msg.AngularVelocity.Degrees;
  48. degrees = Math.Clamp(degrees, -PowerSolarSystem.MaxPanelVelocityDegrees, PowerSolarSystem.MaxPanelVelocityDegrees);
  49. _powerSolarSystem.TargetPanelVelocity = Angle.FromDegrees(degrees);
  50. }
  51. }
  52. }
  53. }