#nullable enable using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.EntitySystems; using Content.Server.Utility; using Content.Shared.GameObjects.Components.Power; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.Interfaces.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Power.PowerNetComponents { [RegisterComponent] [ComponentReference(typeof(IActivate))] public class SolarControlConsoleComponent : SharedSolarControlConsoleComponent, IActivate { [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; private PowerSolarSystem _powerSolarSystem = default!; private bool Powered => !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered; [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(SolarControlConsoleUiKey.Key); public override void Initialize() { base.Initialize(); if (UserInterface != null) { UserInterface.OnReceiveMessage += UserInterfaceOnReceiveMessage; } Owner.EnsureComponent(); _powerSolarSystem = _entitySystemManager.GetEntitySystem(); } public void UpdateUIState() { UserInterface?.SetState(new SolarControlConsoleBoundInterfaceState(_powerSolarSystem.TargetPanelRotation, _powerSolarSystem.TargetPanelVelocity, _powerSolarSystem.TotalPanelPower, _powerSolarSystem.TowardsSun)); } private void UserInterfaceOnReceiveMessage(ServerBoundUserInterfaceMessage obj) { switch (obj.Message) { case SolarControlConsoleAdjustMessage msg: if (double.IsFinite(msg.Rotation)) { _powerSolarSystem.TargetPanelRotation = msg.Rotation.Reduced(); } if (double.IsFinite(msg.AngularVelocity)) { _powerSolarSystem.TargetPanelVelocity = msg.AngularVelocity.Reduced(); } break; } } void IActivate.Activate(ActivateEventArgs eventArgs) { if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) { return; } if (!Powered) { return; } // always update the UI immediately before opening, just in case UpdateUIState(); UserInterface?.Open(actor.playerSession); } } }