diff --git a/Content.Client/Atmos/Piping/EnabledAtmosDeviceVisualizer.cs b/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs similarity index 96% rename from Content.Client/Atmos/Piping/EnabledAtmosDeviceVisualizer.cs rename to Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs index 93b2913567..b39fb9eed8 100644 --- a/Content.Client/Atmos/Piping/EnabledAtmosDeviceVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/EnabledAtmosDeviceVisualizer.cs @@ -4,7 +4,7 @@ using Robust.Client.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Serialization.Manager.Attributes; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public abstract class EnabledAtmosDeviceVisualizer : AppearanceVisualizer diff --git a/Content.Client/Atmos/Piping/OutletInjectorVisualizer.cs b/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs similarity index 90% rename from Content.Client/Atmos/Piping/OutletInjectorVisualizer.cs rename to Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs index 2d4cad5cf6..dc1681c226 100644 --- a/Content.Client/Atmos/Piping/OutletInjectorVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/OutletInjectorVisualizer.cs @@ -2,7 +2,7 @@ using System; using Content.Shared.Atmos.Piping; using JetBrains.Annotations; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public class OutletInjectorVisualizer : EnabledAtmosDeviceVisualizer diff --git a/Content.Client/Atmos/Piping/PassiveVentVisualizer.cs b/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs similarity index 89% rename from Content.Client/Atmos/Piping/PassiveVentVisualizer.cs rename to Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs index a932eb055a..01991d837b 100644 --- a/Content.Client/Atmos/Piping/PassiveVentVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PassiveVentVisualizer.cs @@ -2,7 +2,7 @@ using System; using Content.Shared.Atmos.Piping; using JetBrains.Annotations; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public class PassiveVentVisualizer : EnabledAtmosDeviceVisualizer diff --git a/Content.Client/Atmos/Visualizers/PipeColorVisualizer.cs b/Content.Client/Atmos/Visualizers/PipeColorVisualizer.cs new file mode 100644 index 0000000000..7994a2b7de --- /dev/null +++ b/Content.Client/Atmos/Visualizers/PipeColorVisualizer.cs @@ -0,0 +1,30 @@ +using Content.Shared.Atmos.Piping; +using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Maths; + +namespace Content.Client.Atmos.Visualizers +{ + [UsedImplicitly] + public class PipeColorVisualizer : AppearanceVisualizer + { + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (!component.Owner.TryGetComponent(out SpriteComponent? sprite)) + return; + + if (component.TryGetData(PipeColorVisuals.Color, out Color color)) + { + sprite.LayerSetColor(Layers.Pipe, color); + } + } + + public enum Layers : byte + { + Pipe, + } + } +} diff --git a/Content.Client/Atmos/Piping/PipeConnectorVisualizer.cs b/Content.Client/Atmos/Visualizers/PipeConnectorVisualizer.cs similarity index 91% rename from Content.Client/Atmos/Piping/PipeConnectorVisualizer.cs rename to Content.Client/Atmos/Visualizers/PipeConnectorVisualizer.cs index 93e70bf8d3..5a068b2f0b 100644 --- a/Content.Client/Atmos/Piping/PipeConnectorVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PipeConnectorVisualizer.cs @@ -1,6 +1,7 @@ #nullable enable using System; using Content.Shared.Atmos; +using Content.Shared.Atmos.Piping; using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Graphics; @@ -8,10 +9,11 @@ using Robust.Client.ResourceManagement; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; +using Robust.Shared.Maths; using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager.Attributes; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public class PipeConnectorVisualizer : AppearanceVisualizer, ISerializationHooks @@ -62,6 +64,9 @@ namespace Content.Client.Atmos.Piping if (!component.Owner.TryGetComponent(out var sprite)) return; + if (!component.TryGetData(PipeColorVisuals.Color, out Color color)) + color = Color.White; + if (!component.TryGetData(PipeVisuals.VisualState, out PipeVisualState state)) return; @@ -72,6 +77,7 @@ namespace Content.Client.Atmos.Piping var layer = sprite.LayerMapGet(layerKey); sprite.LayerSetVisible(layer, layerVisible); + sprite.LayerSetColor(layer, color); } } diff --git a/Content.Client/Atmos/Piping/PressurePumpVisualizer.cs b/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs similarity index 89% rename from Content.Client/Atmos/Piping/PressurePumpVisualizer.cs rename to Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs index acdf4350d0..c1441da37b 100644 --- a/Content.Client/Atmos/Piping/PressurePumpVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/PressurePumpVisualizer.cs @@ -2,7 +2,7 @@ using System; using Content.Shared.Atmos.Piping; using JetBrains.Annotations; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public class PressurePumpVisualizer : EnabledAtmosDeviceVisualizer diff --git a/Content.Client/Atmos/Piping/ScrubberVisualizer.cs b/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs similarity index 95% rename from Content.Client/Atmos/Piping/ScrubberVisualizer.cs rename to Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs index b4add93bcd..6568fab771 100644 --- a/Content.Client/Atmos/Piping/ScrubberVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/ScrubberVisualizer.cs @@ -1,9 +1,8 @@ using Content.Shared.Atmos.Piping.Unary.Visuals; -using Content.Shared.Atmos.Visuals; using JetBrains.Annotations; using Robust.Client.GameObjects; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public class ScrubberVisualizer : AppearanceVisualizer diff --git a/Content.Client/Atmos/Piping/ThermoMachineVisualizer.cs b/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs similarity index 89% rename from Content.Client/Atmos/Piping/ThermoMachineVisualizer.cs rename to Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs index 2a1136a951..e9d77226cc 100644 --- a/Content.Client/Atmos/Piping/ThermoMachineVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/ThermoMachineVisualizer.cs @@ -2,7 +2,7 @@ using System; using Content.Shared.Atmos.Piping; using JetBrains.Annotations; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public class ThermoMachineVisualizer : EnabledAtmosDeviceVisualizer diff --git a/Content.Client/Atmos/Piping/VentPumpVisualizer.cs b/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs similarity index 97% rename from Content.Client/Atmos/Piping/VentPumpVisualizer.cs rename to Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs index d31dad27a8..7db4bc7d5f 100644 --- a/Content.Client/Atmos/Piping/VentPumpVisualizer.cs +++ b/Content.Client/Atmos/Visualizers/VentPumpVisualizer.cs @@ -2,7 +2,7 @@ using Content.Shared.Atmos.Visuals; using JetBrains.Annotations; using Robust.Client.GameObjects; -namespace Content.Client.Atmos.Piping +namespace Content.Client.Atmos.Visualizers { [UsedImplicitly] public class VentPumpVisualizer : AppearanceVisualizer diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index b3a76fb612..566e2fd3ef 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -191,6 +191,7 @@ namespace Content.Client.Entry "GasCanisterPort", "GasPort", "GasPortable", + "AtmosPipeColor", "AtmosUnsafeUnanchor", "GasMixer", "Cleanable", diff --git a/Content.Server/Atmos/Piping/Components/AtmosPipeColorComponent.cs b/Content.Server/Atmos/Piping/Components/AtmosPipeColorComponent.cs new file mode 100644 index 0000000000..87439345f5 --- /dev/null +++ b/Content.Server/Atmos/Piping/Components/AtmosPipeColorComponent.cs @@ -0,0 +1,25 @@ +using Content.Server.Atmos.Piping.EntitySystems; +using JetBrains.Annotations; +using Robust.Shared.GameObjects; +using Robust.Shared.Maths; +using Robust.Shared.Serialization.Manager.Attributes; +using Robust.Shared.ViewVariables; + +namespace Content.Server.Atmos.Piping.Components +{ + [RegisterComponent] + public class AtmosPipeColorComponent : Component + { + public override string Name => "AtmosPipeColor"; + + [DataField("color")] + public Color Color { get; set; } = Color.White; + + [ViewVariables(VVAccess.ReadWrite), UsedImplicitly] + public Color ColorVV + { + get => Color; + set => EntitySystem.Get().SetColor(Owner.Uid, this, value); + } + } +} diff --git a/Content.Server/Atmos/Piping/EntitySystems/AtmosPipeColorSystem.cs b/Content.Server/Atmos/Piping/EntitySystems/AtmosPipeColorSystem.cs new file mode 100644 index 0000000000..828cfdfe9c --- /dev/null +++ b/Content.Server/Atmos/Piping/EntitySystems/AtmosPipeColorSystem.cs @@ -0,0 +1,45 @@ +using Content.Server.Atmos.Piping.Components; +using Content.Shared.Atmos.Piping; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Maths; + +namespace Content.Server.Atmos.Piping.EntitySystems +{ + public class AtmosPipeColorSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + } + + private void OnStartup(EntityUid uid, AtmosPipeColorComponent component, ComponentStartup args) + { + if (!ComponentManager.TryGetComponent(uid, out AppearanceComponent? appearance)) + return; + + appearance.SetData(PipeColorVisuals.Color, component.Color); + } + + private void OnShutdown(EntityUid uid, AtmosPipeColorComponent component, ComponentShutdown args) + { + if (!ComponentManager.TryGetComponent(uid, out AppearanceComponent? appearance)) + return; + + appearance.SetData(PipeColorVisuals.Color, Color.White); + } + + public void SetColor(EntityUid uid, AtmosPipeColorComponent component, Color color) + { + component.Color = color; + + if (!ComponentManager.TryGetComponent(uid, out AppearanceComponent? appearance)) + return; + + appearance.SetData(PipeColorVisuals.Color, color); + } + } +} diff --git a/Content.Shared/Atmos/Piping/PipeColorVisuals.cs b/Content.Shared/Atmos/Piping/PipeColorVisuals.cs new file mode 100644 index 0000000000..f579cb1f20 --- /dev/null +++ b/Content.Shared/Atmos/Piping/PipeColorVisuals.cs @@ -0,0 +1,11 @@ +using System; +using Robust.Shared.Serialization; + +namespace Content.Shared.Atmos.Piping +{ + [Serializable, NetSerializable] + public enum PipeColorVisuals + { + Color, + } +} diff --git a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/binary.yml index 5abc5f036f..3260703c01 100644 --- a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/binary.yml @@ -31,10 +31,12 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeStraight + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPressure - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: PressurePumpVisualizer enabledState: pumpPressureOn - type: GasPressurePump @@ -53,10 +55,8 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeStraight + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpVolume - - type: Appearance - visuals: - - type: PipeConnectorVisualizer - type: GasVolumePump - type: entity @@ -73,10 +73,8 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeStraight + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPassiveGate - - type: Appearance - visuals: - - type: PipeConnectorVisualizer - type: GasPassiveGate - type: entity @@ -94,10 +92,8 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeStraight + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: pumpPassiveGate - - type: Appearance - visuals: - - type: PipeConnectorVisualizer - type: GasValve - type: NodeContainer nodes: @@ -120,10 +116,8 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeHalf + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasCanisterPort - - type: Appearance - visuals: - - type: PipeConnectorVisualizer - type: GasPort - type: NodeContainer nodes: diff --git a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/pipes.yml b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/pipes.yml index ac0c0e30f6..75ff476a9d 100644 --- a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/pipes.yml +++ b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/pipes.yml @@ -29,8 +29,10 @@ - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: NodeContainer - type: AtmosUnsafeUnanchor + - type: AtmosPipeColor #Note: The PipeDirection of the PipeNode should be the south-facing version, because the entity starts at an angle of 0 (south) @@ -46,7 +48,9 @@ nodeGroupID: Pipe pipeDirection: South - type: Sprite - state: pipeHalf + layers: + - state: pipeHalf + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: entity parent: GasPipeBase @@ -60,7 +64,9 @@ nodeGroupID: Pipe pipeDirection: Longitudinal - type: Sprite - state: pipeStraight + layers: + - state: pipeStraight + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: entity parent: GasPipeBase @@ -74,7 +80,9 @@ nodeGroupID: Pipe pipeDirection: SWBend - type: Sprite - state: pipeBend + layers: + - state: pipeBend + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: entity parent: GasPipeBase @@ -88,7 +96,9 @@ nodeGroupID: Pipe pipeDirection: TSouth - type: Sprite - state: pipeTJunction + layers: + - state: pipeTJunction + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: entity parent: GasPipeBase @@ -102,4 +112,6 @@ nodeGroupID: Pipe pipeDirection: Fourway - type: Sprite - state: pipeFourway + layers: + - state: pipeFourway + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] diff --git a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/trinary.yml index 641ad7247e..6671265f2f 100644 --- a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/trinary.yml @@ -36,10 +36,8 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeTJunction + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasFilter - - type: Appearance - visuals: - - type: PipeConnectorVisualizer - type: GasFilter - type: entity @@ -57,10 +55,8 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeTJunction + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: gasFilter - - type: Appearance - visuals: - - type: PipeConnectorVisualizer - type: GasMixer inletOne: inlet inletTwo: filter diff --git a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/unary.yml index e46f0bfdb5..936fefc386 100644 --- a/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Constructible/Piping/Atmospherics/unary.yml @@ -27,11 +27,13 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeHalf + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: vent_off map: ["enum.VentVisualLayers.Vent"] - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: VentPumpVisualizer - type: GasVentPump @@ -50,10 +52,12 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeHalf + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: vent_off - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: GasPassiveVent - type: entity @@ -70,11 +74,13 @@ layers: - sprite: Constructible/Atmos/pipe.rsi state: pipeHalf + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - state: scrub_off map: ["enum.ScrubberVisualLayers.Scrubber"] - type: Appearance visuals: - type: PipeConnectorVisualizer + - type: PipeColorVisualizer - type: ScrubberVisualizer - type: AtmosDevice - type: GasVentScrubber @@ -91,9 +97,10 @@ # TODO ATMOS: Actual sprite for this. - type: Sprite netsync: false - sprite: Constructible/Atmos/pipe.rsi - state: pipeHalf - + layers: + - state: pipeHalf + sprite: Constructible/Atmos/pipe.rsi + map: [ "enum.PipeColorVisualizer+Layers.Pipe" ] - type: entity parent: GasUnaryBase @@ -125,6 +132,7 @@ - state: pipe - type: Appearance visuals: + - type: PipeConnectorVisualizer - type: ThermoMachineVisualizer enabledState: freezer_on - type: GasThermoMachine @@ -144,6 +152,7 @@ - state: pipe - type: Appearance visuals: + - type: PipeConnectorVisualizer - type: ThermoMachineVisualizer enabledState: heater_on - type: GasThermoMachine