diff --git a/Content.Client/GameObjects/Components/Atmos/Piping/PipeConnectorVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/Piping/PipeConnectorVisualizer.cs new file mode 100644 index 0000000000..a2f9561ddd --- /dev/null +++ b/Content.Client/GameObjects/Components/Atmos/Piping/PipeConnectorVisualizer.cs @@ -0,0 +1,86 @@ +#nullable enable +using System; +using Content.Shared.GameObjects.Components.Atmos; +using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Serialization; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Atmos +{ + [UsedImplicitly] + public class PipeConnectorVisualizer : AppearanceVisualizer + { + private string _baseState = string.Empty; + + private RSI? _connectorRsi; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + var serializer = YamlObjectSerializer.NewReader(node); + + serializer.DataField(ref _baseState, "baseState", "pipeConnector"); + + var rsiString = SharedSpriteComponent.TextureRoot / serializer.ReadDataField("rsi", "Constructible/Atmos/pipe.rsi"); + var resourceCache = IoCManager.Resolve(); + if (resourceCache.TryGetResource(rsiString, out RSIResource? rsi)) + _connectorRsi = rsi.RSI; + else + Logger.Error($"{nameof(PipeVisualizer)} could not load to load RSI {rsiString}."); + } + + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + + if (!entity.TryGetComponent(out var sprite)) + return; + + if (_connectorRsi == null) + return; + + foreach (Layer layerKey in Enum.GetValues(typeof(Layer))) + { + sprite.LayerMapReserveBlank(layerKey); + var layer = sprite.LayerMapGet(layerKey); + sprite.LayerSetRSI(layer, _connectorRsi); + var layerState = _baseState + ((PipeDirection) layerKey).ToString(); + sprite.LayerSetState(layer, layerState); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (!component.Owner.TryGetComponent(out var sprite)) + return; + + if (!component.TryGetData(PipeVisuals.VisualState, out PipeVisualState state)) + return; + + foreach (Layer layerKey in Enum.GetValues(typeof(Layer))) + { + var dir = (PipeDirection) layerKey; + var layerVisible = state.ConnectedDirections.HasDirection(dir); + + var layer = sprite.LayerMapGet(layerKey); + sprite.LayerSetVisible(layer, layerVisible); + } + } + + private enum Layer : byte + { + NorthConnection = PipeDirection.North, + SouthConnection = PipeDirection.South, + EastConnection = PipeDirection.East, + WestConnection = PipeDirection.West, + } + } +} diff --git a/Content.Client/GameObjects/Components/Atmos/Piping/PipeVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/Piping/PipeVisualizer.cs index 2ac90e484d..90ec516dd0 100644 --- a/Content.Client/GameObjects/Components/Atmos/Piping/PipeVisualizer.cs +++ b/Content.Client/GameObjects/Components/Atmos/Piping/PipeVisualizer.cs @@ -1,4 +1,4 @@ -using System; +#nullable enable using Content.Shared.GameObjects.Components.Atmos; using JetBrains.Annotations; using Robust.Client.GameObjects; @@ -12,47 +12,44 @@ using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Atmos { + /// + /// Sets the state of the sprite based on what shape of pipe it is. + /// [UsedImplicitly] public class PipeVisualizer : AppearanceVisualizer { - private string _rsiString; - - private RSI _pipeRSI; + private RSI? _pipeRSI; public override void LoadData(YamlMappingNode node) { base.LoadData(node); - var serializer = YamlObjectSerializer.NewReader(node); - serializer.DataField(ref _rsiString, "rsiString", "Constructible/Atmos/pipe.rsi"); - - var rsiPath = SharedSpriteComponent.TextureRoot / _rsiString; - try - { - var resourceCache = IoCManager.Resolve(); - var resource = resourceCache.GetResource(rsiPath); - _pipeRSI = resource.RSI; - } - catch (Exception e) - { - Logger.ErrorS("go.ventvisualizer", "Unable to load RSI '{0}'. Trace:\n{1}", rsiPath, e); - } + + var rsiString = SharedSpriteComponent.TextureRoot / serializer.ReadDataField("rsi", "Constructible/Atmos/pipe.rsi"); + var resourceCache = IoCManager.Resolve(); + if (resourceCache.TryGetResource(rsiString, out RSIResource? rsi)) + _pipeRSI = rsi.RSI; + else + Logger.Error($"{nameof(PipeVisualizer)} could not load to load RSI {rsiString}."); } public override void InitializeEntity(IEntity entity) { base.InitializeEntity(entity); - if (!entity.TryGetComponent(out ISpriteComponent sprite)) return; + if (!entity.TryGetComponent(out var sprite)) return; sprite.LayerMapReserveBlank(Layer.PipeBase); var pipeBaseLayer = sprite.LayerMapGet(Layer.PipeBase); - sprite.LayerSetRSI(pipeBaseLayer, _pipeRSI); + + if (_pipeRSI != null) + sprite.LayerSetRSI(pipeBaseLayer, _pipeRSI); + sprite.LayerSetVisible(pipeBaseLayer, true); } public override void OnChangeData(AppearanceComponent component) { base.OnChangeData(component); - if (!component.Owner.TryGetComponent(out ISpriteComponent sprite)) return; + if (!component.Owner.TryGetComponent(out var sprite)) return; if (!component.TryGetData(PipeVisuals.VisualState, out PipeVisualState pipeVisualState)) return; var pipeBase = sprite.LayerMapGet(Layer.PipeBase); var pipeBaseStateId = GetPipeBaseStateId(pipeVisualState); @@ -62,7 +59,7 @@ namespace Content.Client.GameObjects.Components.Atmos private string GetPipeBaseStateId(PipeVisualState pipeVisualState) { var stateId = "pipe"; - stateId += pipeVisualState.PipeDirection.PipeDirectionToPipeShape().ToString(); + stateId += pipeVisualState.PipeShape.ToString(); return stateId; } diff --git a/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs b/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs index 7f0deb81e8..aed1369f8c 100644 --- a/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs +++ b/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs @@ -36,7 +36,7 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes /// /// If this node should be considered for connection by other nodes. /// - private bool Connectable => !_deleting && Anchored; + public bool Connectable => !_deleting && Anchored; private bool Anchored => !Owner.TryGetComponent(out var physics) || physics.Anchored; @@ -55,7 +55,7 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes Owner = owner; } - public void OnContainerStartup() + public virtual void OnContainerStartup() { TryAssignGroupIfNeeded(); CombineGroupWithReachable(); @@ -82,7 +82,7 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes } } - public void OnContainerRemove() + public virtual void OnContainerRemove() { _deleting = true; NodeGroup.RemoveNode(this); diff --git a/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs b/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs index ded93418c0..a4f497de63 100644 --- a/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs +++ b/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs @@ -1,3 +1,4 @@ +#nullable enable using System.Collections.Generic; using Content.Server.Atmos; using Content.Server.GameObjects.Components.NodeContainer.NodeGroups; @@ -5,27 +6,59 @@ using Content.Server.Interfaces; using Content.Shared.GameObjects.Components.Atmos; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; +using Robust.Shared.Maths; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.NodeContainer.Nodes { /// - /// Connects with other s whose + /// Connects with other s whose /// correctly correspond. /// public class PipeNode : Node, IGasMixtureHolder, IRotatableNode { - [ViewVariables] - public PipeDirection PipeDirection { get => _pipeDirection; set => SetPipeDirection(value); } - private PipeDirection _pipeDirection; + /// + /// Modifies the of this pipe, and ensures the sprite is correctly rotated. + /// This is a property for the sake of calling the method via ViewVariables. + /// + [ViewVariables(VVAccess.ReadWrite)] + public PipeDirection SetPipeDirectionAndSprite { get => PipeDirection; set => AdjustPipeDirectionAndSprite(value); } + /// + /// The directions in which this pipe can connect to other pipes around it. + /// Used to check if this pipe can connect to another pipe in a given direction. + /// + [ViewVariables] + public PipeDirection PipeDirection { get; private set; } + + /// + /// The directions in which this node is connected to other nodes. + /// Used by . + /// + [ViewVariables(VVAccess.ReadWrite)] + private PipeDirection ConnectedDirections { get => _connectedDirections; set { _connectedDirections = value; UpdateAppearance(); } } + private PipeDirection _connectedDirections; + + /// + /// The this pipe is a part of. Set to when not in an . + /// [ViewVariables] private IPipeNet _pipeNet = PipeNet.NullNet; + /// + /// If is set to . + /// When true, this pipe may be storing gas in . + /// [ViewVariables] private bool _needsPipeNet = true; + /// + /// Prevents rotation events from re-calculating the . + /// Used while rotating the sprite to the correct orientation while not affecting the pipe. + /// + private bool IgnoreRotation { get; set; } + /// /// The gases in this pipe. /// @@ -47,19 +80,19 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes /// Only for usage by s. /// [ViewVariables] - public GasMixture LocalAir { get; set; } + public GasMixture LocalAir { get; set; } = default!; [ViewVariables] public float Volume => LocalAir.Volume; - private AppearanceComponent _appearance; + private AppearanceComponent? _appearance; private const float DefaultVolume = 1; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); - serializer.DataField(ref _pipeDirection, "pipeDirection", PipeDirection.None); + serializer.DataField(this, x => x.PipeDirection, "pipeDirection", PipeDirection.None); serializer.DataField(this, x => x.LocalAir, "gasMixture", new GasMixture(DefaultVolume)); } @@ -67,9 +100,21 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes { base.Initialize(owner); Owner.TryGetComponent(out _appearance); + } + + public override void OnContainerStartup() + { + base.OnContainerStartup(); + OnConnectedDirectionsNeedsUpdating(); UpdateAppearance(); } + public override void OnContainerRemove() + { + base.OnContainerRemove(); + UpdateAdjacentConnectedDirections(); + } + public void JoinPipeNet(IPipeNet pipeNet) { _pipeNet = pipeNet; @@ -82,61 +127,165 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes _needsPipeNet = true; } + /// + /// Rotates the when the entity is rotated, and re-calculates the . + /// void IRotatableNode.RotateEvent(RotateEvent ev) { + if (IgnoreRotation) + return; + var diff = ev.NewRotation - ev.OldRotation; PipeDirection = PipeDirection.RotatePipeDirection(diff); + RefreshNodeGroup(); + OnConnectedDirectionsNeedsUpdating(); + UpdateAppearance(); } protected override IEnumerable GetReachableNodes() { for (var i = 0; i < PipeDirectionHelpers.PipeDirections; i++) { - var pipeDirection = (PipeDirection) (1 << i); + var pipeDir = (PipeDirection) (1 << i); - var ownNeededConnection = pipeDirection; - var theirNeededConnection = ownNeededConnection.GetOpposite(); - if (!_pipeDirection.HasDirection(ownNeededConnection)) - { + if (!PipeDirection.HasDirection(pipeDir)) continue; - } - var pipeNodesInDirection = new List(); + foreach (var pipe in LinkableNodesInDirection(pipeDir)) + yield return pipe; + } + } - var entities = Owner.GetComponent() - .GetInDir(pipeDirection.ToDirection()); + /// + /// Gets the pipes that can connect to us from entities on the tile adjacent in a direction. + /// + private IEnumerable LinkableNodesInDirection(PipeDirection pipeDir) + { + foreach (var pipe in PipesInDirection(pipeDir)) + { + if (pipe.PipeDirection.HasDirection(pipeDir.GetOpposite())) + yield return pipe; + } + } - foreach (var entity in entities) + /// + /// Gets the pipes from entities on the tile adjacent in a direction. + /// + private IEnumerable PipesInDirection(PipeDirection pipeDir) + { + var entities = Owner.GetComponent() + .GetInDir(pipeDir.ToDirection()); + + foreach (var entity in entities) + { + if (!entity.TryGetComponent(out var container)) + continue; + + foreach (var node in container.Nodes) { - if (entity.TryGetComponent(out var container)) - { - foreach (var node in container.Nodes) - { - if (node is PipeNode pipeNode && pipeNode._pipeDirection.HasDirection(theirNeededConnection)) - { - pipeNodesInDirection.Add(pipeNode); - } - } - } - } - - foreach (var pipeNode in pipeNodesInDirection) - { - yield return pipeNode; + if (node is PipeNode pipe) + yield return pipe; } } } - private void UpdateAppearance() + /// + /// Updates the of this and all sorrounding pipes. + /// + private void OnConnectedDirectionsNeedsUpdating() { - _appearance?.SetData(PipeVisuals.VisualState, new PipeVisualState(PipeDirection)); + UpdateConnectedDirections(); + UpdateAdjacentConnectedDirections(); } - private void SetPipeDirection(PipeDirection pipeDirection) + /// + /// Checks what directions there are connectable pipes in, to update . + /// + private void UpdateConnectedDirections() { - _pipeDirection = pipeDirection; + ConnectedDirections = PipeDirection.None; + for (var i = 0; i < PipeDirectionHelpers.PipeDirections; i++) + { + var pipeDir = (PipeDirection) (1 << i); + + if (!PipeDirection.HasDirection(pipeDir)) + continue; + + foreach (var pipe in LinkableNodesInDirection(pipeDir)) + { + if (pipe.Connectable && pipe.NodeGroupID == NodeGroupID) + { + ConnectedDirections |= pipeDir; + break; + } + } + } + } + + /// + /// Calls on all adjacent pipes, + /// to update their when this pipe is changed. + /// + private void UpdateAdjacentConnectedDirections() + { + for (var i = 0; i < PipeDirectionHelpers.PipeDirections; i++) + { + var pipeDir = (PipeDirection) (1 << i); + foreach (var pipe in LinkableNodesInDirection(pipeDir)) + pipe.UpdateConnectedDirections(); + } + } + + /// + /// Updates the . + /// Gets the combined of every pipe on this entity, so the visualizer on this entity can draw the pipe connections. + /// + private void UpdateAppearance() + { + var netConnectedDirections = PipeDirection.None; + if (Owner.TryGetComponent(out var container)) + { + foreach (var node in container.Nodes) + { + if (node is PipeNode pipe) + { + netConnectedDirections |= pipe.ConnectedDirections; + } + } + } + + _appearance?.SetData(PipeVisuals.VisualState, new PipeVisualState(PipeDirection.PipeDirectionToPipeShape(), netConnectedDirections)); + } + + /// + /// Changes the directions of this pipe while ensuring the sprite is correctly rotated. + /// + public void AdjustPipeDirectionAndSprite(PipeDirection newDir) + { + IgnoreRotation = true; + + var baseDir = newDir.PipeDirectionToPipeShape().ToBaseDirection(); + + var newAngle = Angle.FromDegrees(0); + + for (var i = 0; i < PipeDirectionHelpers.PipeDirections; i++) + { + var pipeDir = (PipeDirection) (1 << i); + var angle = pipeDir.ToAngle(); + if (baseDir.RotatePipeDirection(angle) == newDir) //finds what angle the entity needs to be rotated from the base to be set to the correct direction + { + newAngle = angle; + break; + } + } + + Owner.Transform.LocalRotation = newAngle; //rotate the entity so the sprite's new state will be of the correct direction + PipeDirection = newDir; + RefreshNodeGroup(); + OnConnectedDirectionsNeedsUpdating(); UpdateAppearance(); + IgnoreRotation = false; } } } diff --git a/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs b/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs index 6f24813fcb..141a8fa6cf 100644 --- a/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs +++ b/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs @@ -13,15 +13,19 @@ namespace Content.Shared.GameObjects.Components.Atmos [Serializable, NetSerializable] public class PipeVisualState { - public readonly PipeDirection PipeDirection; + public readonly PipeShape PipeShape; - public PipeVisualState(PipeDirection pipeDirection) + public readonly PipeDirection ConnectedDirections; + + public PipeVisualState(PipeShape pipeShape, PipeDirection connectedDirections) { - PipeDirection = pipeDirection; + PipeShape = pipeShape; + ConnectedDirections = connectedDirections; } } [Flags] + [Serializable, NetSerializable] public enum PipeDirection { None = 0, @@ -63,6 +67,25 @@ namespace Content.Shared.GameObjects.Components.Atmos Fourway } + public static class PipeShapeHelpers + { + /// + /// Gets the direction of a shape when facing 0 degrees (the initial direction of entities). + /// + public static PipeDirection ToBaseDirection(this PipeShape shape) + { + return shape switch + { + PipeShape.Half => PipeDirection.East, + PipeShape.Straight => PipeDirection.Lateral, + PipeShape.Bend => PipeDirection.SEBend, + PipeShape.TJunction => PipeDirection.TEast, + PipeShape.Fourway => PipeDirection.Fourway, + _ => throw new ArgumentOutOfRangeException(nameof(shape), $"{shape} does not have an associated {nameof(PipeDirection)}."), + }; + } + } + public static class PipeDirectionHelpers { public const int PipeDirections = 4; diff --git a/Resources/Prototypes/Entities/Constructible/Ground/gascanisterports.yml b/Resources/Prototypes/Entities/Constructible/Ground/gascanisterports.yml index 130ee8efdc..dee9563f98 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/gascanisterports.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/gascanisterports.yml @@ -16,6 +16,9 @@ - sprite: Constructible/Atmos/pipe.rsi state: pipeHalf - state: gasCanisterPort + - type: Appearance + visuals: + - type: PipeConnectorVisualizer - type: Damageable - type: Destructible thresholds: diff --git a/Resources/Prototypes/Entities/Constructible/Ground/gasfilters.yml b/Resources/Prototypes/Entities/Constructible/Ground/gasfilters.yml index 9c351f2c6d..2c2e20c5ab 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/gasfilters.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/gasfilters.yml @@ -28,6 +28,7 @@ - state: gasFilter - type: Appearance visuals: + - type: PipeConnectorVisualizer - type: GasFilterVisualizer - type: entity diff --git a/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml b/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml index b57e230ce1..6499f2467e 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml @@ -25,6 +25,7 @@ - type: Appearance visuals: - type: PipeVisualizer + - type: PipeConnectorVisualizer - type: Icon sprite: Constructible/Atmos/pipe.rsi @@ -55,7 +56,7 @@ pipeDirection: Lateral - type: Icon state: pipeStraight - + - type: entity parent: PipeBase id: PipeBend @@ -68,7 +69,7 @@ pipeDirection: SEBend - type: Icon state: pipeBend - + - type: entity parent: PipeBase id: PipeTJunction @@ -81,7 +82,7 @@ pipeDirection: TEast - type: Icon state: pipeTJunction - + - type: entity parent: PipeBase id: PipeFourway @@ -93,4 +94,4 @@ nodeGroupID: Pipe pipeDirection: Fourway - type: Icon - state: pipeFourway + state: pipeFourway \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Constructible/Ground/pumps.yml b/Resources/Prototypes/Entities/Constructible/Ground/pumps.yml index e44732f0a4..52ce92b8cb 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/pumps.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/pumps.yml @@ -28,6 +28,7 @@ - state: pumpPressure - type: Appearance visuals: + - type: PipeConnectorVisualizer - type: PumpVisualizer - type: entity diff --git a/Resources/Prototypes/Entities/Constructible/Ground/scrubbers.yml b/Resources/Prototypes/Entities/Constructible/Ground/scrubbers.yml index 88b03d265a..389c02727f 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/scrubbers.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/scrubbers.yml @@ -28,6 +28,7 @@ - state: scrubOff - type: Appearance visuals: + - type: PipeConnectorVisualizer - type: SiphonVisualizer - type: entity diff --git a/Resources/Prototypes/Entities/Constructible/Ground/vents.yml b/Resources/Prototypes/Entities/Constructible/Ground/vents.yml index 59cdf618f7..87bb311852 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/vents.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/vents.yml @@ -28,6 +28,7 @@ - state: ventOff - type: Appearance visuals: + - type: PipeConnectorVisualizer - type: VentVisualizer - type: entity diff --git a/Resources/Textures/Constructible/Atmos/gascanisterport.rsi/meta.json b/Resources/Textures/Constructible/Atmos/gascanisterport.rsi/meta.json index 6cbbd9f2e8..da02e91ee9 100644 --- a/Resources/Textures/Constructible/Atmos/gascanisterport.rsi/meta.json +++ b/Resources/Textures/Constructible/Atmos/gascanisterport.rsi/meta.json @@ -9,7 +9,6 @@ "states":[ { "name":"gasCanisterPort", - "directions":1 } ] } \ No newline at end of file diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json b/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json index d9f1869ab8..727ffdb390 100644 --- a/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json +++ b/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json @@ -21,11 +21,22 @@ }, { "name":"pipeFourway", - "directions":1 }, { "name":"pipeStraight", "directions":4 + }, + { + "name":"pipeConnectorSouth", + }, + { + "name":"pipeConnectorNorth", + }, + { + "name":"pipeConnectorEast", + }, + { + "name":"pipeConnectorWest", } ] } \ No newline at end of file diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeBend.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeBend.png index ad0f05fbd4..b6408718eb 100644 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeBend.png and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeBend.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorEast.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorEast.png new file mode 100644 index 0000000000..c26ad0b9ca Binary files /dev/null and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorEast.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorNorth.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorNorth.png new file mode 100644 index 0000000000..30c6e83d71 Binary files /dev/null and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorNorth.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorSouth.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorSouth.png new file mode 100644 index 0000000000..ac6744d246 Binary files /dev/null and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorSouth.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorWest.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorWest.png new file mode 100644 index 0000000000..53747379bc Binary files /dev/null and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeConnectorWest.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway.png index 7c29562995..2acc665ac9 100644 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway.png and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeHalf.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeHalf.png index 90ef0405e6..a4e2286277 100644 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeHalf.png and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeHalf.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeStraight.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeStraight.png index 83d3938cc0..a2fb4b7ff8 100644 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeStraight.png and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeStraight.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTJunction.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTJunction.png index 84aa87c8b9..69ab21c60f 100644 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTJunction.png and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTJunction.png differ diff --git a/Resources/Textures/Constructible/Atmos/scrubber.rsi/meta.json b/Resources/Textures/Constructible/Atmos/scrubber.rsi/meta.json index 68be919ebc..938ce0b273 100644 --- a/Resources/Textures/Constructible/Atmos/scrubber.rsi/meta.json +++ b/Resources/Textures/Constructible/Atmos/scrubber.rsi/meta.json @@ -9,11 +9,9 @@ "states":[ { "name":"scrubOff", - "directions":4 }, { "name":"scrubOn", - "directions":1, "delays":[ [ 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08 ] ] } ] diff --git a/Resources/Textures/Constructible/Atmos/scrubber.rsi/scrubOff.png b/Resources/Textures/Constructible/Atmos/scrubber.rsi/scrubOff.png index 2cf6dd0f17..f5a52006b5 100644 Binary files a/Resources/Textures/Constructible/Atmos/scrubber.rsi/scrubOff.png and b/Resources/Textures/Constructible/Atmos/scrubber.rsi/scrubOff.png differ diff --git a/Resources/Textures/Constructible/Atmos/vent.rsi/meta.json b/Resources/Textures/Constructible/Atmos/vent.rsi/meta.json index 0346b40ada..d1c58a5057 100644 --- a/Resources/Textures/Constructible/Atmos/vent.rsi/meta.json +++ b/Resources/Textures/Constructible/Atmos/vent.rsi/meta.json @@ -9,11 +9,9 @@ "states":[ { "name":"ventOff", - "directions":4 }, { "name":"ventOn", - "directions":1, "delays":[ [ 0.08, 0.08, 0.08, 0.08 ] ] } ] diff --git a/Resources/Textures/Constructible/Atmos/vent.rsi/ventOff.png b/Resources/Textures/Constructible/Atmos/vent.rsi/ventOff.png index bda0e14826..4b8d5db40e 100644 Binary files a/Resources/Textures/Constructible/Atmos/vent.rsi/ventOff.png and b/Resources/Textures/Constructible/Atmos/vent.rsi/ventOff.png differ