#nullable enable using System; using Content.Server.Power.Components; using Content.Server.Solar.EntitySystems; using Content.Shared.Acts; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Timing; using Robust.Shared.ViewVariables; namespace Content.Server.Solar.Components { /// /// This is a solar panel. /// It generates power from the sun based on coverage. /// [RegisterComponent] public class SolarPanelComponent : Component, IBreakAct { public override string Name => "SolarPanel"; /// /// Maximum supply output by this panel (coverage = 1) /// [DataField("maxsupply")] private int _maxSupply = 1500; [ViewVariables(VVAccess.ReadWrite)] public int MaxSupply { get => _maxSupply; set { _maxSupply = value; UpdateSupply(); } } /// /// Current coverage of this panel (from 0 to 1). /// This is updated by . /// private float _coverage = 0; [ViewVariables] public float Coverage { get => _coverage; set { // This gets updated once-per-tick, so avoid updating it if truly unnecessary if (_coverage != value) { _coverage = value; UpdateSupply(); } } } /// /// The game time () of the next coverage update. /// This may have a random offset applied. /// This is used to reduce solar panel updates and stagger them to prevent lagspikes. /// This should only be updated by the PowerSolarSystem but is viewable for debugging. /// [ViewVariables] public TimeSpan TimeOfNextCoverageUpdate = TimeSpan.MinValue; private void UpdateSupply() { if (Owner.TryGetComponent(out var supplier)) { supplier.MaxSupply = (int) (_maxSupply * _coverage); } } protected override void Initialize() { base.Initialize(); Owner.EnsureComponentWarn(); UpdateSupply(); } public void OnBreak(BreakageEventArgs args) { if (!Owner.TryGetComponent(out var sprite)) return; sprite.LayerSetState(0, "broken"); MaxSupply = 0; } } }