diff --git a/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs b/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs index b39fb9eed8..24af950e1e 100644 --- a/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs @@ -9,22 +9,13 @@ namespace Content.Client.Atmos.Visualizers [UsedImplicitly] public abstract class EnabledAtmosDeviceVisualizer : AppearanceVisualizer { + [DataField("disabledState")] + private string _disabledState = string.Empty; [DataField("enabledState")] private string _enabledState = string.Empty; protected abstract object LayerMap { get; } protected abstract Enum DataKey { get; } - public override void InitializeEntity(IEntity entity) - { - base.InitializeEntity(entity); - - if (!entity.TryGetComponent(out ISpriteComponent? sprite)) - return; - - sprite.LayerMapSet(LayerMap, sprite.AddLayerState(_enabledState)); - sprite.LayerSetVisible(LayerMap, false); - } - public override void OnChangeData(AppearanceComponent component) { base.OnChangeData(component); @@ -32,8 +23,8 @@ namespace Content.Client.Atmos.Visualizers if (!component.Owner.TryGetComponent(out ISpriteComponent? sprite)) return; - if(component.TryGetData(DataKey, out bool enabled)) - sprite.LayerSetVisible(LayerMap, enabled); + if(component.TryGetData(DataKey, out bool enabled) && sprite.LayerMapTryGet(LayerMap, out var layer)) + sprite.LayerSetState(layer, enabled ? _enabledState : _disabledState); } } } diff --git a/Content.Client/Atmos/Visualizers/GasFilterVisualizer.cs b/Content.Client/Atmos/Visualizers/GasFilterVisualizer.cs new file mode 100644 index 0000000000..5ad5468c42 --- /dev/null +++ b/Content.Client/Atmos/Visualizers/GasFilterVisualizer.cs @@ -0,0 +1,18 @@ +using System; +using Content.Shared.Atmos.Piping; +using JetBrains.Annotations; + +namespace Content.Client.Atmos.Visualizers +{ + [UsedImplicitly] + public class GasFilterVisualizer : EnabledAtmosDeviceVisualizer + { + protected override object LayerMap => Layers.Enabled; + protected override Enum DataKey => FilterVisuals.Enabled; + + enum Layers : byte + { + Enabled, + } + } +} diff --git a/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs b/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs index 07e62b5d59..77804494ce 100644 --- a/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/GasPortableVisualizer.cs @@ -46,7 +46,7 @@ namespace Content.Client.Atmos.Visualizers } } - private enum Layers + private enum Layers : byte { ConnectedToPort, } diff --git a/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs b/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs index dc1681c226..ec23d7b503 100644 --- a/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => OutletInjectorVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs b/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs index 01991d837b..d2d08244bc 100644 --- a/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => PassiveVentVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs b/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs index c1441da37b..e0b5db06d3 100644 --- a/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => PressurePumpVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs b/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs index 6568fab771..e58b0bf8e7 100644 --- a/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs @@ -44,7 +44,7 @@ namespace Content.Client.Atmos.Visualizers } } - public enum ScrubberVisualLayers + public enum ScrubberVisualLayers : byte { Scrubber, } diff --git a/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs b/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs index e9d77226cc..ab7db6ae92 100644 --- a/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs @@ -10,7 +10,7 @@ namespace Content.Client.Atmos.Visualizers protected override object LayerMap => Layers.Enabled; protected override Enum DataKey => ThermoMachineVisuals.Enabled; - enum Layers + enum Layers : byte { Enabled, } diff --git a/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs b/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs index 7db4bc7d5f..cecc544b57 100644 --- a/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs @@ -40,7 +40,7 @@ namespace Content.Client.Atmos.Visualizers } } - public enum VentVisualLayers + public enum VentVisualLayers : byte { Vent, } diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs index a2db87f7bc..2d24c80fdf 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs @@ -3,7 +3,9 @@ using Content.Server.Atmos.Piping.Trinary.Components; using Content.Server.NodeContainer; using Content.Server.NodeContainer.Nodes; using Content.Shared.Atmos; +using Content.Shared.Atmos.Piping; using JetBrains.Annotations; +using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Timing; @@ -24,33 +26,35 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems private void OnFilterUpdated(EntityUid uid, GasFilterComponent filter, AtmosDeviceUpdateEvent args) { - if (!filter.Enabled) - return; + var appearance = filter.Owner.GetComponentOrNull(); - if (!ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer)) + if (!filter.Enabled + || !ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) + || !ComponentManager.TryGetComponent(uid, out AtmosDeviceComponent? device) + || !nodeContainer.TryGetNode(filter.InletName, out PipeNode? inletNode) + || !nodeContainer.TryGetNode(filter.FilterName, out PipeNode? filterNode) + || !nodeContainer.TryGetNode(filter.OutletName, out PipeNode? outletNode) + || outletNode.Air.Pressure >= Atmospherics.MaxOutputPressure) // No need to transfer if target is full. + { + appearance?.SetData(FilterVisuals.Enabled, false); return; - - if (!ComponentManager.TryGetComponent(uid, out AtmosDeviceComponent? device)) - return; - - if (!nodeContainer.TryGetNode(filter.InletName, out PipeNode? inletNode) - || !nodeContainer.TryGetNode(filter.FilterName, out PipeNode? filterNode) - || !nodeContainer.TryGetNode(filter.OutletName, out PipeNode? outletNode)) - return; - - if (outletNode.Air.Pressure >= Atmospherics.MaxOutputPressure) - return; // No need to transfer if target is full. + } // We multiply the transfer rate in L/s by the seconds passed since the last process to get the liters. var transferRatio = (float)(filter.TransferRate * (_gameTiming.CurTime - device.LastProcess).TotalSeconds) / inletNode.Air.Volume; if (transferRatio <= 0) + { + appearance?.SetData(FilterVisuals.Enabled, false); return; + } var removed = inletNode.Air.RemoveRatio(transferRatio); if (filter.FilteredGas.HasValue) { + appearance?.SetData(FilterVisuals.Enabled, true); + var filteredOut = new GasMixture() {Temperature = removed.Temperature}; filteredOut.SetMoles(filter.FilteredGas.Value, removed.GetMoles(filter.FilteredGas.Value)); diff --git a/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs b/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs index e95188cc0b..5f3883a25c 100644 --- a/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs +++ b/Content.Shared/Atmos/Piping/EnabledAtmosDeviceVisuals.cs @@ -4,31 +4,37 @@ using Robust.Shared.Serialization; namespace Content.Shared.Atmos.Piping { [Serializable, NetSerializable] - public enum OutletInjectorVisuals + public enum OutletInjectorVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum PassiveVentVisuals + public enum PassiveVentVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum VentScrubberVisuals + public enum VentScrubberVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum ThermoMachineVisuals + public enum ThermoMachineVisuals : byte { Enabled, } [Serializable, NetSerializable] - public enum PressurePumpVisuals + public enum PressurePumpVisuals : byte + { + Enabled, + } + + [Serializable, NetSerializable] + public enum FilterVisuals : byte { Enabled, } diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index d52e24f2fa..c62a227933 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -33,13 +33,14 @@ state: pipeStraight map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPressure - map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer", "enum.PressurePumpVisualizer+Layers.Enabled" ] - type: Appearance visuals: - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: PressurePumpVisualizer + disabledState: pumpPressure enabledState: pumpPressureOn - type: GasPressurePump diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml index f8b5414d4f..55b541dd2a 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml @@ -38,12 +38,15 @@ state: pipeTJunction map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasFilter - map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer" ] + map: [ "enum.SubFloorShowLayerVisualizer+Layers.FirstLayer", "enum.GasFilterVisualizer+Layers.Enabled" ] - type: Appearance visuals: - type: SubFloorShowLayerVisualizer - type: PipeConnectorVisualizer - type: PipeColorVisualizer + - type: GasFilterVisualizer + disabledState: gasFilter + enabledState: gasFilterOn - type: GasFilter - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index b85e71e3af..f628e58595 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -148,6 +148,7 @@ - type: Sprite layers: - state: freezer_off + map: [ "enum.ThermoMachineVisualizer+Layers.Enabled" ] - state: pipe map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: Appearance @@ -155,6 +156,7 @@ - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: ThermoMachineVisualizer + disabledState: freezer_off enabledState: freezer_on - type: GasThermoMachine mode: Freezer @@ -170,6 +172,7 @@ - type: Sprite layers: - state: heater_off + map: [ "enum.ThermoMachineVisualizer+Layers.Enabled" ] - state: pipe map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: Appearance @@ -177,6 +180,7 @@ - type: PipeConnectorVisualizer - type: PipeColorVisualizer - type: ThermoMachineVisualizer + disabledState: heater_off enabledState: heater_on - type: GasThermoMachine mode: Heater diff --git a/Resources/Textures/Structures/Piping/Atmospherics/gasfilter.rsi/gasFilterOn.png b/Resources/Textures/Structures/Piping/Atmospherics/gasfilter.rsi/gasFilterOn.png index 891eface87..06cdacf03e 100644 Binary files a/Resources/Textures/Structures/Piping/Atmospherics/gasfilter.rsi/gasFilterOn.png and b/Resources/Textures/Structures/Piping/Atmospherics/gasfilter.rsi/gasFilterOn.png differ