diff --git a/Content.Client/GameObjects/Components/Atmos/PipeVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/PipeVisualizer.cs index fcf8a5b1f9..7bd00e4fac 100644 --- a/Content.Client/GameObjects/Components/Atmos/PipeVisualizer.cs +++ b/Content.Client/GameObjects/Components/Atmos/PipeVisualizer.cs @@ -2,67 +2,44 @@ using Content.Shared.GameObjects.Components.Atmos; using JetBrains.Annotations; using Robust.Client.GameObjects; -using Robust.Client.Graphics; using Robust.Client.Interfaces.GameObjects.Components; -using Robust.Client.Interfaces.ResourceManagement; -using Robust.Client.ResourceManagement; -using Robust.Shared.GameObjects.Components.Renderable; -using Robust.Shared.IoC; -using Robust.Shared.Log; -using Robust.Shared.Utility; -using YamlDotNet.RepresentationModel; +using Robust.Shared.Interfaces.GameObjects; namespace Content.Client.GameObjects.Components.Atmos { [UsedImplicitly] public class PipeVisualizer : AppearanceVisualizer { - private RSI _pipeRSI; - - public override void LoadData(YamlMappingNode node) + public override void InitializeEntity(IEntity entity) { - base.LoadData(node); - - var rsiString = node.GetNode("pipeRSI").ToString(); - var rsiPath = SharedSpriteComponent.TextureRoot / rsiString; - try - { - var resourceCache = IoCManager.Resolve(); - var resource = resourceCache.GetResource(rsiPath); - _pipeRSI = resource.RSI; - } - catch (Exception e) - { - Logger.ErrorS("go.pipevisualizer", "Unable to load RSI '{0}'. Trace:\n{1}", rsiPath, e); - } + base.InitializeEntity(entity); + if (!entity.TryGetComponent(out ISpriteComponent sprite)) return; + sprite.LayerMapReserveBlank(Layer.PipeBase); + var pipeBaseLayer = sprite.LayerMapGet(Layer.PipeBase); + sprite.LayerSetVisible(pipeBaseLayer, true); } public override void OnChangeData(AppearanceComponent component) { base.OnChangeData(component); + if (!component.Owner.TryGetComponent(out ISpriteComponent sprite)) return; + if (!component.TryGetData(PipeVisuals.VisualState, out PipeVisualState pipeVisualState)) return; + var pipeBase = sprite.LayerMapGet(Layer.PipeBase); + var pipeBaseStateId = GetPipeBaseStateId(pipeVisualState); + sprite.LayerSetState(pipeBase, pipeBaseStateId); + } - if (!component.Owner.TryGetComponent(out ISpriteComponent sprite)) - { - return; - } - if (!component.TryGetData(PipeVisuals.VisualState, out PipeVisualStateSet pipeVisualStateSet)) - { - return; - } - for (var i = 0; i < pipeVisualStateSet.PipeVisualStates.Length; i++) - { - var pipeVisualState = pipeVisualStateSet.PipeVisualStates[i]; - var rsiState = "pipe"; - rsiState += pipeVisualState.PipeDirection.ToString(); - rsiState += ((int) pipeVisualState.ConduitLayer).ToString(); + private string GetPipeBaseStateId(PipeVisualState pipeVisualState) + { + var stateId = "pipe"; + stateId += pipeVisualState.PipeDirection.PipeDirectionToPipeShape().ToString(); + stateId += (int) pipeVisualState.ConduitLayer; + return stateId; + } - var pipeLayerKey = "pipeLayer" + i.ToString(); - sprite.LayerMapReserveBlank(pipeLayerKey); - var currentPipeLayer = sprite.LayerMapGet(pipeLayerKey); - sprite.LayerSetRSI(currentPipeLayer, _pipeRSI); - sprite.LayerSetState(currentPipeLayer, rsiState); - sprite.LayerSetVisible(currentPipeLayer, true); - } + private enum Layer + { + PipeBase, } } } diff --git a/Content.Server/GameObjects/Components/NodeContainer/NodeContainerComponent.cs b/Content.Server/GameObjects/Components/NodeContainer/NodeContainerComponent.cs index 23a2d1be45..de72f5b58e 100644 --- a/Content.Server/GameObjects/Components/NodeContainer/NodeContainerComponent.cs +++ b/Content.Server/GameObjects/Components/NodeContainer/NodeContainerComponent.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; +using System.Linq; using Content.Server.GameObjects.Components.NodeContainer.Nodes; using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.Transform; +using Robust.Shared.Maths; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; @@ -31,6 +34,8 @@ namespace Content.Server.GameObjects.Components.NodeContainer { node.Initialize(Owner); } + + Owner.EntityManager.EventBus.SubscribeEvent(EventSource.Local, this, RotateEvent); } protected override void Startup() @@ -50,5 +55,16 @@ namespace Content.Server.GameObjects.Components.NodeContainer } base.OnRemove(); } + + private void RotateEvent(RotateEvent ev) + { + if (ev.Sender != Owner || ev.NewRotation == ev.OldRotation) + return; + + foreach (var rotatableNode in Nodes.OfType()) + { + rotatableNode.RotateEvent(ev); + } + } } } diff --git a/Content.Server/GameObjects/Components/NodeContainer/Nodes/IRotatableNode.cs b/Content.Server/GameObjects/Components/NodeContainer/Nodes/IRotatableNode.cs new file mode 100644 index 0000000000..b03f98c99e --- /dev/null +++ b/Content.Server/GameObjects/Components/NodeContainer/Nodes/IRotatableNode.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameObjects.Components.Transform; + +namespace Content.Server.GameObjects.Components.NodeContainer.Nodes +{ + /// + /// A that implements this will have its called when its + /// is rotated. + /// + public interface IRotatableNode + { + /// + /// Rotates this . + /// + void RotateEvent(RotateEvent ev); + } +} diff --git a/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs b/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs index 02c6ef3cf7..74bee85c84 100644 --- a/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs +++ b/Content.Server/GameObjects/Components/NodeContainer/Nodes/Node.cs @@ -106,6 +106,14 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes _needsGroup = true; } + protected void RefreshNodeGroup() + { + NodeGroup.RemoveNode(this); + ClearNodeGroup(); + TryAssignGroupIfNeeded(); + CombineGroupWithReachable(); + } + /// /// How this node will attempt to find other reachable s to group with. /// Returns a set of s to consider grouping with. Should not return this current . diff --git a/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs b/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs index cfe74999ee..c3bde03905 100644 --- a/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs +++ b/Content.Server/GameObjects/Components/NodeContainer/Nodes/PipeNode.cs @@ -18,10 +18,10 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes /// Connects with other s whose /// correctly correspond. /// - public class PipeNode : Node, IGasMixtureHolder + public class PipeNode : Node, IGasMixtureHolder, IRotatableNode { [ViewVariables] - public PipeDirection PipeDirection => _pipeDirection; + public PipeDirection PipeDirection { get => _pipeDirection; set => SetPipeDirection(value); } private PipeDirection _pipeDirection; /// @@ -64,8 +64,6 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes private AppearanceComponent _appearance; - private PipeVisualState PipeVisualState => new PipeVisualState(PipeDirection, ConduitLayer); - public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -94,22 +92,40 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes _needsPipeNet = true; } + void IRotatableNode.RotateEvent(RotateEvent ev) + { + var diff = ev.NewRotation - ev.OldRotation; + var newPipeDir = PipeDirection.None; + for (var i = 0; i < PipeDirectionHelpers.PipeDirections; i++) + { + var pipeDirection = (PipeDirection) (1 << i); + if (!PipeDirection.HasFlag(pipeDirection)) continue; + var angle = pipeDirection.ToAngle(); + angle += diff; + newPipeDir |= angle.GetCardinalDir().ToPipeDirection(); + } + PipeDirection = newPipeDir; + } + protected override IEnumerable GetReachableNodes() { - foreach (CardinalDirection direction in Enum.GetValues(typeof(CardinalDirection))) + for (var i = 0; i < PipeDirectionHelpers.PipeDirections; i++) { - PipeDirectionFromCardinal(direction, out var ownNeededConnection, out var theirNeededConnection); - if ((_pipeDirection & ownNeededConnection) == PipeDirection.None) + var pipeDirection = (PipeDirection) (1 << i); + + var ownNeededConnection = pipeDirection; + var theirNeededConnection = ownNeededConnection.GetOpposite(); + if (!_pipeDirection.HasFlag(ownNeededConnection)) { continue; } var pipeNodesInDirection = Owner.GetComponent() - .GetInDir((Direction) direction) + .GetInDir(pipeDirection.ToDirection()) .Select(entity => entity.TryGetComponent(out var container) ? container : null) .Where(container => container != null) .SelectMany(container => container.Nodes) .OfType() - .Where(pipeNode => (pipeNode._pipeDirection & theirNeededConnection) != PipeDirection.None); + .Where(pipeNode => pipeNode._pipeDirection.HasFlag(theirNeededConnection)); foreach (var pipeNode in pipeNodesInDirection) { yield return pipeNode; @@ -117,47 +133,16 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes } } - private void PipeDirectionFromCardinal(CardinalDirection direction, out PipeDirection sameDir, out PipeDirection oppDir) - { - switch (direction) - { - case CardinalDirection.North: - sameDir = PipeDirection.North; - oppDir = PipeDirection.South; - break; - case CardinalDirection.South: - sameDir = PipeDirection.South; - oppDir = PipeDirection.North; - break; - case CardinalDirection.East: - sameDir = PipeDirection.East; - oppDir = PipeDirection.West; - break; - case CardinalDirection.West: - sameDir = PipeDirection.West; - oppDir = PipeDirection.East; - break; - default: - throw new ArgumentException("Invalid Direction."); - } - } - private void UpdateAppearance() { - var pipeVisualStates = Owner.GetComponent() - .Nodes - .OfType() - .Select(pipeNode => pipeNode.PipeVisualState) - .ToArray(); - _appearance?.SetData(PipeVisuals.VisualState, new PipeVisualStateSet(pipeVisualStates)); + _appearance?.SetData(PipeVisuals.VisualState, new PipeVisualState(PipeDirection, ConduitLayer)); } - private enum CardinalDirection + private void SetPipeDirection(PipeDirection pipeDirection) { - North = Direction.North, - South = Direction.South, - East = Direction.East, - West = Direction.West, + _pipeDirection = pipeDirection; + RefreshNodeGroup(); + UpdateAppearance(); } } } diff --git a/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs b/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs index 801e8a1b6e..b8e3955d69 100644 --- a/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs +++ b/Content.Shared/GameObjects/Components/Atmos/SharedPipeComponent.cs @@ -1,4 +1,5 @@ using System; +using Robust.Shared.Maths; using Robust.Shared.Serialization; namespace Content.Shared.GameObjects.Components.Atmos @@ -9,17 +10,6 @@ namespace Content.Shared.GameObjects.Components.Atmos VisualState } - [Serializable, NetSerializable] - public class PipeVisualStateSet - { - public readonly PipeVisualState[] PipeVisualStates; - - public PipeVisualStateSet(PipeVisualState[] pipeVisualStates) - { - PipeVisualStates = pipeVisualStates; - } - } - [Serializable, NetSerializable] public class PipeVisualState { @@ -65,10 +55,94 @@ namespace Content.Shared.GameObjects.Components.Atmos All = -1, } + public enum PipeShape + { + Straight, + Bend, + TJunction, + Fourway + } + public enum ConduitLayer { One = 1, Two = 2, Three = 3, } + + public static class PipeDirectionHelpers + { + public const int PipeDirections = 4; + + public static Angle ToAngle(this PipeDirection pipeDirection) + { + return pipeDirection switch + { + PipeDirection.East => Angle.FromDegrees(0), + PipeDirection.North => Angle.FromDegrees(90), + PipeDirection.West => Angle.FromDegrees(180), + PipeDirection.South => Angle.FromDegrees(270), + _ => throw new ArgumentOutOfRangeException(nameof(pipeDirection), $"{pipeDirection} does not have an associated angle."), + }; + } + + public static PipeDirection ToPipeDirection(this Direction direction) + { + return direction switch + { + Direction.North => PipeDirection.North, + Direction.South => PipeDirection.South, + Direction.East => PipeDirection.East, + Direction.West => PipeDirection.West, + _ => throw new ArgumentOutOfRangeException(nameof(direction)), + }; + } + + public static Direction ToDirection(this PipeDirection pipeDirection) + { + return pipeDirection switch + { + PipeDirection.North => Direction.North, + PipeDirection.South => Direction.South, + PipeDirection.East => Direction.East, + PipeDirection.West => Direction.West, + _ => throw new ArgumentOutOfRangeException(nameof(pipeDirection)), + }; + } + + public static PipeDirection GetOpposite(this PipeDirection pipeDirection) + { + return pipeDirection switch + { + PipeDirection.North => PipeDirection.South, + PipeDirection.South => PipeDirection.North, + PipeDirection.East => PipeDirection.West, + PipeDirection.West => PipeDirection.East, + _ => throw new ArgumentOutOfRangeException(nameof(pipeDirection)), + }; + } + + public static PipeShape PipeDirectionToPipeShape(this PipeDirection pipeDirection) + { + return pipeDirection switch + { + PipeDirection.Lateral => PipeShape.Straight, + PipeDirection.Longitudinal => PipeShape.Straight, + + PipeDirection.NEBend => PipeShape.Bend, + PipeDirection.NWBend => PipeShape.Bend, + PipeDirection.SEBend => PipeShape.Bend, + PipeDirection.SWBend => PipeShape.Bend, + + PipeDirection.TNorth => PipeShape.TJunction, + PipeDirection.TSouth => PipeShape.TJunction, + PipeDirection.TEast => PipeShape.TJunction, + PipeDirection.TWest => PipeShape.TJunction, + + PipeDirection.Fourway => PipeShape.Fourway, + + _ => throw new ArgumentOutOfRangeException(nameof(pipeDirection)), + }; + } + } } diff --git a/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml b/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml index 485dc319cd..ae35ad5936 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/pipes.yml @@ -1,6 +1,8 @@ - type: entity abstract: true id: PipeBase + name: Pipe + description: Holds gas. placement: mode: SnapgridCenter components: @@ -9,38 +11,64 @@ - type: Collidable - type: SnapGrid offset: Center - - type: Sprite - type: Destructible thresholdvalue: 100 + - type: Sprite + sprite: Constructible/Atmos/pipe.rsi - type: Appearance visuals: - type: PipeVisualizer - pipeRSI: Constructible/Atmos/pipe.rsi + - type: Icon + sprite: Constructible/Atmos/pipe.rsi - type: entity parent: PipeBase - id: FourwayPipe - name: Fourway Pipe + id: PipeStraight + suffix: Straight components: + - type: NodeContainer + nodes: + - !type:PipeNode + nodeGroupID: Pipe + pipeDirection: Lateral - type: Icon - sprite: Constructible/Atmos/pipe.rsi - state: pipeFourway2 + state: pipeStraight2 + +- type: entity + parent: PipeBase + id: PipeBend + suffix: Bend + components: + - type: NodeContainer + nodes: + - !type:PipeNode + nodeGroupID: Pipe + pipeDirection: SEBend + - type: Icon + state: pipeBend2 + +- type: entity + parent: PipeBase + id: PipeTJunction + suffix: TJunction + components: + - type: NodeContainer + nodes: + - !type:PipeNode + nodeGroupID: Pipe + pipeDirection: TEast + - type: Icon + state: pipeTJunction2 + +- type: entity + parent: PipeBase + id: PipeFourway + suffix: Fourway + components: - type: NodeContainer nodes: - !type:PipeNode nodeGroupID: Pipe pipeDirection: Fourway - -- type: entity - parent: PipeBase - id: LongitudinalPipe - name: Longitudinal Pipe - components: - type: Icon - sprite: Constructible/Atmos/pipe.rsi - state: pipeLongitudinal2 - - type: NodeContainer - nodes: - - !type:PipeNode - nodeGroupID: Pipe - pipeDirection: Longitudinal + state: pipeFourway2 diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json b/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json index 92a08111a2..339b1595b0 100644 --- a/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json +++ b/Resources/Textures/Constructible/Atmos/pipe.rsi/meta.json @@ -8,189 +8,67 @@ "copyright":"Taken from https://github.com/tgstation/tgstation at commit 57cd1d59ca019dd0e7811ac451f295f818e573da", "states":[ { - "name":"pipeEast2", - "directions":1, - "delays":[ [ 1.0 ] ] + "name":"pipeTJunction2", + "directions":4, + "delays":[ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] }, { - "name":"pipeNorth2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeSouth2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeWest2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeFourway1", - "directions":1, - "delays":[ [ 1.0 ] ] + "name":"pipeBend2", + "directions":4, + "delays":[ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] }, { "name":"pipeFourway2", "directions":1, - "delays":[ [ 1.0 ] ] + "delays":[ + [ + 1.0 + ] + ] }, { - "name":"pipeFourway3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeLateral1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeLateral2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeLateral3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeLongitudinal1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeLongitudinal2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeLongitudinal3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeNEBend1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeNEBend2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeNEBend3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeNWBend1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeNWBend2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeNWBend3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeSEBend1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeSEBend2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeSEBend3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeSWBend1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeSWBend2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeSWBend3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTEast1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTEast2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTEast3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTNorth1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTNorth2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTNorth3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTSouth1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTSouth2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTSouth3", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTWest1", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTWest2", - "directions":1, - "delays":[ [ 1.0 ] ] - }, - { - "name":"pipeTWest3", - "directions":1, - "delays":[ [ 1.0 ] ] + "name":"pipeStraight2", + "directions":4, + "delays":[ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] } ] } \ No newline at end of file diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeBend2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeBend2.png new file mode 100644 index 0000000000..ad0f05fbd4 Binary files /dev/null and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeBend2.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeEast2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeEast2.png deleted file mode 100644 index a44e27011f..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeEast2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway1.png deleted file mode 100644 index 3da5ae8a6a..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway3.png deleted file mode 100644 index 069f5e6573..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeFourway3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral1.png deleted file mode 100644 index b8f1f66190..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral2.png deleted file mode 100644 index aad6e9f0f6..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral3.png deleted file mode 100644 index e715454f7e..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLateral3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal1.png deleted file mode 100644 index 92bbfb0722..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal2.png deleted file mode 100644 index 9bc0fd7997..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal3.png deleted file mode 100644 index 3666086c91..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeLongitudinal3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend1.png deleted file mode 100644 index 54b5c5782a..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend2.png deleted file mode 100644 index e5766e903b..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend3.png deleted file mode 100644 index f861f8b49e..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNEBend3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend1.png deleted file mode 100644 index 2d02ced038..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend2.png deleted file mode 100644 index f88805cd27..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend3.png deleted file mode 100644 index 36061210b8..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNWBend3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNorth2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNorth2.png deleted file mode 100644 index 2dbddd2c44..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeNorth2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend1.png deleted file mode 100644 index 568023bc17..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend2.png deleted file mode 100644 index e81dfe290c..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend3.png deleted file mode 100644 index 496ab8c7a8..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSEBend3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend1.png deleted file mode 100644 index ca044b85d3..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend2.png deleted file mode 100644 index 7ea0ed3efe..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend3.png deleted file mode 100644 index 902c626149..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSWBend3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSouth2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSouth2.png deleted file mode 100644 index ba98a65841..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeSouth2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeStraight2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeStraight2.png new file mode 100644 index 0000000000..83d3938cc0 Binary files /dev/null and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeStraight2.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast1.png deleted file mode 100644 index 083cbfc9ea..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast2.png deleted file mode 100644 index 60b75434b0..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast3.png deleted file mode 100644 index 817e74e7fb..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTEast3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTJunction2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTJunction2.png new file mode 100644 index 0000000000..84aa87c8b9 Binary files /dev/null and b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTJunction2.png differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth1.png deleted file mode 100644 index e082a773c5..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth2.png deleted file mode 100644 index 0557b014c5..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth3.png deleted file mode 100644 index 2780655438..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTNorth3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth1.png deleted file mode 100644 index 04e434edcf..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth2.png deleted file mode 100644 index 21517957ee..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth3.png deleted file mode 100644 index 51fa53dde6..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTSouth3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest1.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest1.png deleted file mode 100644 index 4711725c00..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest1.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest2.png deleted file mode 100644 index bf87ae1f25..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest2.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest3.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest3.png deleted file mode 100644 index 2a4bf92267..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeTWest3.png and /dev/null differ diff --git a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeWest2.png b/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeWest2.png deleted file mode 100644 index bac3e06608..0000000000 Binary files a/Resources/Textures/Constructible/Atmos/pipe.rsi/pipeWest2.png and /dev/null differ