* Transfer most Instrument UI logic to a new component, ActivatableUIComponent * Move more ActivatableUIComponent stuff to ECS * ActivatableUI component ignore on client * ActivatableUI: Get rid of component interfaces where possible * Add in adminOnly attribute for activatable UIs This is so that porting #4926 to this will be easier * Transition Solar Control Computer to ActivatableUI * Move communications console to ActivatableUI * Move cargo console to ActivatableUI * Move ID card console to ActivatableUI * ActivatableUI: Make things more amiable to entity tests adding components weirdly * ActivatableUI: Use handling or lack thereof of events properly * ActivatableUI: component dependency issue resolution stuffs * ActivatableUISystem: Fix #5258 * More fixes because master did stuffo * Check for HandDeselectedEvent again because otherwise active-hand check doesn't work * Move just a bit more code into the system, introduce a workaround for #5258 * Purge the player status detection stuff * Oh and some obsolete stuff too
69 lines
2.5 KiB
C#
69 lines
2.5 KiB
C#
using System;
|
|
using Content.Server.Solar.Components;
|
|
using Content.Server.UserInterface;
|
|
using Content.Shared.Solar;
|
|
using JetBrains.Annotations;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Server.GameObjects;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Maths;
|
|
|
|
namespace Content.Server.Solar.EntitySystems
|
|
{
|
|
/// <summary>
|
|
/// Responsible for updating solar control consoles.
|
|
/// </summary>
|
|
[UsedImplicitly]
|
|
internal sealed class PowerSolarControlConsoleSystem : EntitySystem
|
|
{
|
|
[Dependency] private PowerSolarSystem _powerSolarSystem = default!;
|
|
|
|
/// <summary>
|
|
/// Timer used to avoid updating the UI state every frame (which would be overkill)
|
|
/// </summary>
|
|
private float _updateTimer;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<SolarControlConsoleComponent, ServerBoundUserInterfaceMessage>(OnUIMessage);
|
|
}
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
_updateTimer += frameTime;
|
|
if (_updateTimer >= 1)
|
|
{
|
|
_updateTimer -= 1;
|
|
var state = new SolarControlConsoleBoundInterfaceState(_powerSolarSystem.TargetPanelRotation, _powerSolarSystem.TargetPanelVelocity, _powerSolarSystem.TotalPanelPower, _powerSolarSystem.TowardsSun);
|
|
foreach (var component in EntityManager.EntityQuery<SolarControlConsoleComponent>())
|
|
{
|
|
component.Owner.GetUIOrNull(SolarControlConsoleUiKey.Key)?.SetState(state);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnUIMessage(EntityUid uid, SolarControlConsoleComponent component, ServerBoundUserInterfaceMessage obj)
|
|
{
|
|
if (component.Deleted) return;
|
|
switch (obj.Message)
|
|
{
|
|
case SolarControlConsoleAdjustMessage msg:
|
|
if (double.IsFinite(msg.Rotation))
|
|
{
|
|
_powerSolarSystem.TargetPanelRotation = msg.Rotation.Reduced();
|
|
}
|
|
if (double.IsFinite(msg.AngularVelocity))
|
|
{
|
|
var degrees = msg.AngularVelocity.Degrees;
|
|
degrees = Math.Clamp(degrees, -PowerSolarSystem.MaxPanelVelocityDegrees, PowerSolarSystem.MaxPanelVelocityDegrees);
|
|
_powerSolarSystem.TargetPanelVelocity = Angle.FromDegrees(degrees);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|