diff --git a/Content.Server/Light/Components/EmergencyLightComponent.cs b/Content.Server/Light/Components/EmergencyLightComponent.cs index 1039ccb1e4..094b510be0 100644 --- a/Content.Server/Light/Components/EmergencyLightComponent.cs +++ b/Content.Server/Light/Components/EmergencyLightComponent.cs @@ -1,165 +1,28 @@ -using System; -using System.Collections.Generic; -using Content.Server.Power.Components; -using Content.Shared.Examine; +using Content.Server.Light.EntitySystems; using Content.Shared.Light.Component; -using Robust.Server.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Serialization.Manager.Attributes; -using Robust.Shared.Utility; -using Robust.Shared.ViewVariables; namespace Content.Server.Light.Components { /// /// Component that represents an emergency light, it has an internal battery that charges when the power is on. /// - [RegisterComponent] -#pragma warning disable 618 - public sealed class EmergencyLightComponent : SharedEmergencyLightComponent, IExamine -#pragma warning restore 618 + [RegisterComponent, Friend(typeof(EmergencyLightSystem))] + public sealed class EmergencyLightComponent : SharedEmergencyLightComponent { - [Dependency] private readonly IEntityManager _entMan = default!; - [ViewVariables] - private EmergencyLightState State - { - get => _state; - set - { - if (_state == value) - return; - - _state = value; - _entMan.EventBus.RaiseEvent(EventSource.Local, new EmergencyLightMessage(this, _state)); - } - } - - private EmergencyLightState _state = EmergencyLightState.Empty; + public EmergencyLightState State; [ViewVariables(VVAccess.ReadWrite)] [DataField("wattage")] - private float _wattage = 5; + public float Wattage = 5; + [ViewVariables(VVAccess.ReadWrite)] [DataField("chargingWattage")] - private float _chargingWattage = 60; + public float ChargingWattage = 60; + [ViewVariables(VVAccess.ReadWrite)] [DataField("chargingEfficiency")] - private float _chargingEfficiency = 0.85f; - - /// - /// For attaching UpdateState() to events. - /// - public void UpdateState(PowerChangedMessage e) - { - UpdateState(); - } - - /// - /// Updates the light's power drain, battery drain, sprite and actual light state. - /// - public void UpdateState() - { - if (!_entMan.TryGetComponent(Owner, out ApcPowerReceiverComponent? receiver)) - { - return; - } - - if (receiver.Powered) - { - receiver.Load = (int) Math.Abs(_wattage); - TurnOff(); - State = EmergencyLightState.Charging; - } - else - { - TurnOn(); - State = EmergencyLightState.On; - } - } - - public void OnUpdate(float frameTime) - { - if ((!_entMan.EntityExists(Owner) || !_entMan.TryGetComponent(Owner, out BatteryComponent? battery) || _entMan.GetComponent(Owner).EntityPaused)) - { - return; - } - - if(State == EmergencyLightState.On) - { - if (!battery.TryUseCharge(_wattage * frameTime)) - { - State = EmergencyLightState.Empty; - TurnOff(); - } - } - else - { - battery.CurrentCharge += _chargingWattage * frameTime * _chargingEfficiency; - if (battery.IsFullyCharged) - { - if (_entMan.TryGetComponent(Owner, out ApcPowerReceiverComponent? receiver)) - { - receiver.Load = 1; - } - - State = EmergencyLightState.Full; - } - } - } - - private void TurnOff() - { - if (_entMan.TryGetComponent(Owner, out PointLightComponent? light)) - { - light.Enabled = false; - } - - if (_entMan.TryGetComponent(Owner, out AppearanceComponent? appearance)) - appearance.SetData(EmergencyLightVisuals.On, false); - } - - private void TurnOn() - { - if (_entMan.TryGetComponent(Owner, out PointLightComponent? light)) - { - light.Enabled = true; - } - - if (_entMan.TryGetComponent(Owner, out AppearanceComponent? appearance)) - appearance.SetData(EmergencyLightVisuals.On, true); - } - -#pragma warning disable 618 - [Obsolete("Component Messages are deprecated, use Entity Events instead.")] - public override void HandleMessage(ComponentMessage message, IComponent? component) -#pragma warning restore 618 - { -#pragma warning disable 618 - base.HandleMessage(message, component); -#pragma warning restore 618 - switch (message) - { - case PowerChangedMessage powerChanged: - UpdateState(powerChanged); - break; - } - } - - void IExamine.Examine(FormattedMessage message, bool inDetailsRange) - { - message.AddMarkup(Loc.GetString("emergency-light-component-on-examine",("batteryStateText", Loc.GetString(BatteryStateText[State])))); - } - - public enum EmergencyLightState - { - Charging, - Full, - Empty, - On - } + public float ChargingEfficiency = 0.85f; public Dictionary BatteryStateText = new() { @@ -170,13 +33,21 @@ namespace Content.Server.Light.Components }; } - public sealed class EmergencyLightMessage : EntityEventArgs + public enum EmergencyLightState : byte + { + Charging, + Full, + Empty, + On + } + + public sealed class EmergencyLightEvent : EntityEventArgs { public EmergencyLightComponent Component { get; } - public EmergencyLightComponent.EmergencyLightState State { get; } + public EmergencyLightState State { get; } - public EmergencyLightMessage(EmergencyLightComponent component, EmergencyLightComponent.EmergencyLightState state) + public EmergencyLightEvent(EmergencyLightComponent component, EmergencyLightState state) { Component = component; State = state; diff --git a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs index b66a19c029..54f414a67a 100644 --- a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs +++ b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs @@ -1,10 +1,10 @@ -using System; -using System.Collections.Generic; using Content.Server.Light.Components; +using Content.Server.Power.Components; +using Content.Shared.Examine; using Content.Shared.Light; using Content.Shared.Light.Component; using JetBrains.Annotations; -using Robust.Shared.GameObjects; +using Robust.Server.GameObjects; using Robust.Shared.GameStates; namespace Content.Server.Light.EntitySystems @@ -17,16 +17,31 @@ namespace Content.Server.Light.EntitySystems public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(HandleEmergencyLightMessage); + SubscribeLocalEvent(HandleEmergencyLightMessage); SubscribeLocalEvent(GetCompState); SubscribeLocalEvent(HandleLightToggle); + SubscribeLocalEvent(OnEmergencyExamine); + SubscribeLocalEvent(OnEmergencyPower); + } + + private void OnEmergencyPower(EntityUid uid, EmergencyLightComponent component, PowerChangedEvent args) + { + UpdateState(component); + } + + private void OnEmergencyExamine(EntityUid uid, EmergencyLightComponent component, ExaminedEvent args) + { + args.PushMarkup( + Loc.GetString("emergency-light-component-on-examine", + ("batteryStateText", + Loc.GetString(component.BatteryStateText[component.State])))); } private void HandleLightToggle(EntityUid uid, EmergencyLightComponent component, PointLightToggleEvent args) { if (component.Enabled == args.Enabled) return; component.Enabled = args.Enabled; - component.Dirty(); + Dirty(component); } private void GetCompState(EntityUid uid, EmergencyLightComponent component, ref ComponentGetState args) @@ -34,29 +49,112 @@ namespace Content.Server.Light.EntitySystems args.State = new EmergencyLightComponentState(component.Enabled); } - private void HandleEmergencyLightMessage(EmergencyLightMessage message) + private void HandleEmergencyLightMessage(EmergencyLightEvent @event) { - switch (message.State) + switch (@event.State) { - case EmergencyLightComponent.EmergencyLightState.On: - case EmergencyLightComponent.EmergencyLightState.Charging: - _activeLights.Add(message.Component); + case EmergencyLightState.On: + case EmergencyLightState.Charging: + _activeLights.Add(@event.Component); break; - case EmergencyLightComponent.EmergencyLightState.Full: - case EmergencyLightComponent.EmergencyLightState.Empty: - _activeLights.Remove(message.Component); + case EmergencyLightState.Full: + case EmergencyLightState.Empty: + _activeLights.Remove(@event.Component); break; default: throw new ArgumentOutOfRangeException(); } } + public void SetState(EmergencyLightComponent component, EmergencyLightState state) + { + if (component.State == state) return; + + component.State = state; + RaiseLocalEvent(component.Owner, new EmergencyLightEvent(component, state)); + } + public override void Update(float frameTime) { foreach (var activeLight in _activeLights) { - activeLight.OnUpdate(frameTime); + Update(activeLight, frameTime); } } + + private void Update(EmergencyLightComponent component, float frameTime) + { + if (!EntityManager.EntityExists(component.Owner) || !TryComp(component.Owner, out BatteryComponent? battery) || MetaData(component.Owner).EntityPaused) + { + return; + } + + if (component.State == EmergencyLightState.On) + { + if (!battery.TryUseCharge(component.Wattage * frameTime)) + { + SetState(component, EmergencyLightState.Empty); + TurnOff(component); + } + } + else + { + battery.CurrentCharge += component.ChargingWattage * frameTime * component.ChargingEfficiency; + if (battery.IsFullyCharged) + { + if (TryComp(component.Owner, out ApcPowerReceiverComponent? receiver)) + { + receiver.Load = 1; + } + + SetState(component, EmergencyLightState.Full); + } + } + } + + /// + /// Updates the light's power drain, battery drain, sprite and actual light state. + /// + public void UpdateState(EmergencyLightComponent component) + { + if (!TryComp(component.Owner, out ApcPowerReceiverComponent? receiver)) + { + return; + } + + if (receiver.Powered) + { + receiver.Load = (int) Math.Abs(component.Wattage); + TurnOff(component); + SetState(component, EmergencyLightState.Charging); + } + else + { + TurnOn(component); + SetState(component, EmergencyLightState.On); + } + } + + private void TurnOff(EmergencyLightComponent component) + { + if (TryComp(component.Owner, out PointLightComponent? light)) + { + light.Enabled = false; + } + + if (TryComp(component.Owner, out AppearanceComponent? appearance)) + appearance.SetData(EmergencyLightVisuals.On, false); + } + + private void TurnOn(EmergencyLightComponent component) + { + if (TryComp(component.Owner, out PointLightComponent? light)) + { + light.Enabled = true; + } + + if (TryComp(component.Owner, out AppearanceComponent? appearance)) + appearance.SetData(EmergencyLightVisuals.On, true); + } } }