using Content.Server.Solar.Components;
using Content.Server.UserInterface;
using Content.Shared.Solar;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Content.Server._NF.Solar.Components; // Frontier
using Content.Server._NF.Solar.EntitySystems; // Frontier
namespace Content.Server.Solar.EntitySystems
{
///
/// Responsible for updating solar control consoles.
///
[UsedImplicitly]
internal sealed class PowerSolarControlConsoleSystem : EntitySystem
{
[Dependency] private readonly NFPowerSolarSystem _powerSolarSystem = default!; // Frontier: use NF variant.
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
///
/// Timer used to avoid updating the UI state every frame (which would be overkill)
///
private float _updateTimer;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnUIMessage);
}
public override void Update(float frameTime)
{
_updateTimer += frameTime;
if (_updateTimer >= 1)
{
_updateTimer -= 1;
// Frontier: per-grid state
// var state = new SolarControlConsoleBoundInterfaceState(_powerSolarSystem.TargetPanelRotation, _powerSolarSystem.TargetPanelVelocity, _powerSolarSystem.TotalPanelPower, _powerSolarSystem.TowardsSun);
var query = EntityQueryEnumerator();
while (query.MoveNext(out var uid, out _, out var uiComp, out var xform))
{
SolarControlConsoleBoundInterfaceState state;
if (xform.GridUid != null && TryComp(xform.GridUid, out var gridPower))
state = new SolarControlConsoleBoundInterfaceState(gridPower.TargetPanelRotation, gridPower.TargetPanelVelocity, gridPower.TotalPanelPower, _powerSolarSystem.TowardsSun);
else
state = new SolarControlConsoleBoundInterfaceState(0, 0, 0, _powerSolarSystem.TowardsSun);
_uiSystem.SetUiState((uid, uiComp), SolarControlConsoleUiKey.Key, state);
}
// End Frontier: per-grid state
}
}
private void OnUIMessage(EntityUid uid, SolarControlConsoleComponent component, SolarControlConsoleAdjustMessage msg)
{
// Frontier: ensure we have a powered grid
if (!TryComp(uid, out TransformComponent? xform)
|| xform.GridUid == null
|| !TryComp(xform.GridUid, out SolarPoweredGridComponent? powerComp))
{
return;
}
// End Frontier
if (double.IsFinite(msg.Rotation))
{
powerComp.TargetPanelRotation = msg.Rotation.Reduced(); // Frontier: _powerSolarSystem