From 5190c049448f31e208f9b22a249adf9f298c0fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Wed, 19 Aug 2020 12:23:42 +0200 Subject: [PATCH] Some work --- .../Components/Doors/AirlockVisualizer.cs | 12 +- .../Atmos/IGridAtmosphereComponent.cs | 6 + Content.Server/Atmos/TileAtmosphere.cs | 19 ++ .../Components/Atmos/AirtightComponent.cs | 2 +- .../Components/Atmos/FirelockComponent.cs | 85 +++++++++ .../Atmos/GridAtmosphereComponent.cs | 95 +++++----- .../Components/Doors/ServerDoorComponent.cs | 8 +- Content.Shared/Maps/TurfHelpers.cs | 29 +++ .../Constructible/Doors/airlock_base.yml | 1 - .../Entities/Constructible/Doors/firelock.yml | 74 ++++++++ .../Structures/Doors/firelock.rsi/closed.png | Bin 0 -> 1120 bytes .../Structures/Doors/firelock.rsi/closing.png | Bin 0 -> 2976 bytes .../Structures/Doors/firelock.rsi/deny.png | Bin 0 -> 2193 bytes .../Structures/Doors/firelock.rsi/frame1.png | Bin 0 -> 1146 bytes .../Structures/Doors/firelock.rsi/frame2.png | Bin 0 -> 1167 bytes .../Structures/Doors/firelock.rsi/frame3.png | Bin 0 -> 1153 bytes .../Structures/Doors/firelock.rsi/frame4.png | Bin 0 -> 1145 bytes .../Structures/Doors/firelock.rsi/locked.png | Bin 0 -> 1497 bytes .../Structures/Doors/firelock.rsi/meta.json | 170 ++++++++++++++++++ .../Structures/Doors/firelock.rsi/open.png | Bin 0 -> 639 bytes .../Structures/Doors/firelock.rsi/opening.png | Bin 0 -> 2983 bytes .../Doors/firelock.rsi/panel_closing.png | Bin 0 -> 343 bytes .../Doors/firelock.rsi/panel_open.png | Bin 0 -> 193 bytes .../Doors/firelock.rsi/panel_opening.png | Bin 0 -> 329 bytes .../Structures/Doors/firelock.rsi/welded.png | Bin 0 -> 318 bytes .../Doors/firelock.rsi/welded_open.png | Bin 0 -> 321 bytes .../Doors/firelock_glass.rsi/closed.png | Bin 0 -> 1262 bytes .../Doors/firelock_glass.rsi/closing.png | Bin 0 -> 2494 bytes .../Doors/firelock_glass.rsi/deny.png | Bin 0 -> 1734 bytes .../Doors/firelock_glass.rsi/locked.png | Bin 0 -> 1270 bytes .../Doors/firelock_glass.rsi/meta.json | 134 ++++++++++++++ .../Doors/firelock_glass.rsi/open.png | Bin 0 -> 563 bytes .../Doors/firelock_glass.rsi/opening.png | Bin 0 -> 2500 bytes .../firelock_glass.rsi/panel_closing.png | Bin 0 -> 343 bytes .../Doors/firelock_glass.rsi/panel_open.png | Bin 0 -> 193 bytes .../firelock_glass.rsi/panel_opening.png | Bin 0 -> 329 bytes .../Doors/firelock_glass.rsi/welded.png | Bin 0 -> 317 bytes .../Doors/firelock_glass.rsi/welded_open.png | Bin 0 -> 321 bytes RobustToolbox | 2 +- SpaceStation14.sln.DotSettings | 1 + 40 files changed, 586 insertions(+), 52 deletions(-) create mode 100644 Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs create mode 100644 Resources/Prototypes/Entities/Constructible/Doors/firelock.yml create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/closed.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/closing.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/deny.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame1.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame2.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame3.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame4.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/locked.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/meta.json create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/open.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/opening.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/panel_closing.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/panel_open.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/panel_opening.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/welded.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock.rsi/welded_open.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/closed.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/closing.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/deny.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/locked.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/meta.json create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/open.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/opening.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/panel_closing.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/panel_open.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/panel_opening.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/welded.png create mode 100644 Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/welded_open.png diff --git a/Content.Client/GameObjects/Components/Doors/AirlockVisualizer.cs b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer.cs index 622e9d0c23..8501122b59 100644 --- a/Content.Client/GameObjects/Components/Doors/AirlockVisualizer.cs +++ b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer.cs @@ -2,6 +2,7 @@ using Content.Client.GameObjects.Components.Wires; using Content.Shared.Audio; using Content.Shared.GameObjects.Components.Doors; +using JetBrains.Annotations; using Robust.Client.Animations; using Robust.Client.GameObjects; using Robust.Client.GameObjects.Components.Animations; @@ -12,6 +13,7 @@ using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Doors { + [UsedImplicitly] public class AirlockVisualizer : AppearanceVisualizer { private const string AnimationKey = "airlock_animation"; @@ -24,11 +26,17 @@ namespace Content.Client.GameObjects.Components.Doors { base.LoadData(node); + var delay = 0.8f; + var openSound = node.GetNode("open_sound").AsString(); var closeSound = node.GetNode("close_sound").AsString(); var denySound = node.GetNode("deny_sound").AsString(); + if (node.TryGetNode("animation_time", out var yamlNode)) + { + delay = yamlNode.AsFloat(); + } - CloseAnimation = new Animation {Length = TimeSpan.FromSeconds(0.8f)}; + CloseAnimation = new Animation {Length = TimeSpan.FromSeconds(delay)}; { var flick = new AnimationTrackSpriteFlick(); CloseAnimation.AnimationTracks.Add(flick); @@ -50,7 +58,7 @@ namespace Content.Client.GameObjects.Components.Doors sound.KeyFrames.Add(new AnimationTrackPlaySound.KeyFrame(closeSound, 0)); } - OpenAnimation = new Animation {Length = TimeSpan.FromSeconds(0.8f)}; + OpenAnimation = new Animation {Length = TimeSpan.FromSeconds(delay)}; { var flick = new AnimationTrackSpriteFlick(); OpenAnimation.AnimationTracks.Add(flick); diff --git a/Content.Server/Atmos/IGridAtmosphereComponent.cs b/Content.Server/Atmos/IGridAtmosphereComponent.cs index 5518881767..fd5648c091 100644 --- a/Content.Server/Atmos/IGridAtmosphereComponent.cs +++ b/Content.Server/Atmos/IGridAtmosphereComponent.cs @@ -45,6 +45,12 @@ namespace Content.Server.Atmos /// void FixVacuum(MapIndices indices); + /// + /// Revalidates indices immediately. + /// + /// + void Revalidate(MapIndices indices); + /// /// Adds an active tile so it becomes processed every update until it becomes inactive. /// Also makes the tile excited. diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index b1ad2df3cf..10ff57c948 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -1051,6 +1051,25 @@ namespace Content.Server.Atmos private void ConsiderFirelocks(TileAtmosphere other) { // TODO ATMOS firelocks! + var reconsiderAdjacent = false; + + foreach (var entity in GridIndices.GetEntitiesInTile(GridIndex)) + { + if (!entity.TryGetComponent(out FirelockComponent firelock)) continue; + reconsiderAdjacent |= firelock.EmergencyPressureStop(); + } + + foreach (var entity in other.GridIndices.GetEntitiesInTile(other.GridIndex)) + { + if (!entity.TryGetComponent(out FirelockComponent firelock)) continue; + reconsiderAdjacent |= firelock.EmergencyPressureStop(); + } + + if (reconsiderAdjacent) + { + UpdateAdjacent(); + other.UpdateAdjacent(); + } } private void React() diff --git a/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs b/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs index 07c6ed66e9..0d71d0717d 100644 --- a/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs @@ -28,7 +28,7 @@ namespace Content.Server.GameObjects.Components.Atmos set { _airBlocked = value; - EntitySystem.Get().GetGridAtmosphere(Owner.Transform.GridID)?.Invalidate(_snapGrid.Position); + EntitySystem.Get().GetGridAtmosphere(Owner.Transform.GridID)?.Revalidate(_snapGrid.Position); } } diff --git a/Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs b/Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs new file mode 100644 index 0000000000..02d3ac22a5 --- /dev/null +++ b/Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs @@ -0,0 +1,85 @@ +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Doors; +using Content.Server.GameObjects.Components.Interactable; +using Content.Shared.GameObjects.Components.Doors; +using Content.Shared.GameObjects.Components.Interactable; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.GameObjects.Components.Atmos +{ + [RegisterComponent] + public class FirelockComponent : ServerDoorComponent, IInteractUsing, IActivate, ICollideBehavior + { + public override string Name => "Firelock"; + + public override void Initialize() + { + base.Initialize(); + } + + public void CollideWith(IEntity collidedWith) + { + // We do nothing. + } + + public void Activate(ActivateEventArgs eventArgs) + { + // We do nothing. + } + + protected override void Startup() + { + base.Startup(); + + var airtightComponent = Owner.EnsureComponent(); + var collidableComponent = Owner.GetComponent(); + + Safety = false; + airtightComponent.AirBlocked = false; + collidableComponent.Hard = false; + + if (Occludes && Owner.TryGetComponent(out OccluderComponent occluder)) + { + occluder.Enabled = false; + } + + State = DoorState.Open; + SetAppearance(DoorVisualState.Open); + } + + public bool EmergencyPressureStop() + { + var closed = State == DoorState.Open && Close(); + + if(closed) + Owner.GetComponent().AirBlocked = true; + + return closed; + } + + public override void Deny() + { + } + + public override bool CanClose(IEntity user) => true; + public override bool CanOpen(IEntity user) => true; + + public async Task InteractUsing(InteractUsingEventArgs eventArgs) + { + if (!eventArgs.Using.TryGetComponent(out var tool)) + return false; + + if (!await tool.UseTool(eventArgs.User, Owner, 3f, ToolQuality.Prying)) return false; + + if (State == DoorState.Closed) + Open(); + else if (State == DoorState.Open) + Close(); + + return true; + } + } +} diff --git a/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs b/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs index 05ba999b0b..9948bdba90 100644 --- a/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs @@ -147,55 +147,62 @@ namespace Content.Server.GameObjects.Components.Atmos { foreach (var indices in _invalidatedCoords.ToArray()) { - var tile = GetTile(indices); - AddActiveTile(tile); - - if (tile == null) - { - tile = new TileAtmosphere(this, _grid.Index, indices, new GasMixture(GetVolumeForCells(1)){Temperature = Atmospherics.T20C}); - _tiles[indices] = tile; - } - - if (IsSpace(indices)) - { - tile.Air = new GasMixture(GetVolumeForCells(1)); - tile.Air.MarkImmutable(); - _tiles[indices] = tile; - - } else if (IsAirBlocked(indices)) - { - tile.Air = null; - } - else - { - var obs = GetObstructingComponent(indices); - - if (obs != null) - { - if (tile.Air == null && obs.FixVacuum) - { - FixVacuum(tile.GridIndices); - } - } - - tile.Air ??= new GasMixture(GetVolumeForCells(1)){Temperature = Atmospherics.T20C}; - } - - tile.UpdateAdjacent(); - tile.UpdateVisuals(); - - foreach (var direction in Cardinal) - { - var otherIndices = indices.Offset(direction); - var otherTile = GetTile(otherIndices); - AddActiveTile(otherTile); - otherTile?.UpdateAdjacent(direction.GetOpposite()); - } + Revalidate(indices); } _invalidatedCoords.Clear(); } + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Revalidate(MapIndices indices) + { + var tile = GetTile(indices); + AddActiveTile(tile); + + if (tile == null) + { + tile = new TileAtmosphere(this, _grid.Index, indices, new GasMixture(GetVolumeForCells(1)){Temperature = Atmospherics.T20C}); + _tiles[indices] = tile; + } + + if (IsSpace(indices)) + { + tile.Air = new GasMixture(GetVolumeForCells(1)); + tile.Air.MarkImmutable(); + _tiles[indices] = tile; + + } else if (IsAirBlocked(indices)) + { + tile.Air = null; + } + else + { + var obs = GetObstructingComponent(indices); + + if (obs != null) + { + if (tile.Air == null && obs.FixVacuum) + { + FixVacuum(tile.GridIndices); + } + } + + tile.Air ??= new GasMixture(GetVolumeForCells(1)){Temperature = Atmospherics.T20C}; + } + + tile.UpdateAdjacent(); + tile.UpdateVisuals(); + + foreach (var direction in Cardinal) + { + var otherIndices = indices.Offset(direction); + var otherTile = GetTile(otherIndices); + AddActiveTile(otherTile); + otherTile?.UpdateAdjacent(direction.GetOpposite()); + } + } + /// public void FixVacuum(MapIndices indices) { diff --git a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs index ba2bc39377..381f276bd0 100644 --- a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs +++ b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs @@ -61,6 +61,8 @@ namespace Content.Server.GameObjects.Components.Doors [ViewVariables] private bool _occludes; + public bool Occludes => _occludes; + public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -133,7 +135,7 @@ namespace Content.Server.GameObjects.Components.Doors } } - private void SetAppearance(DoorVisualState state) + protected void SetAppearance(DoorVisualState state) { if (_appearance != null || Owner.TryGetComponent(out _appearance)) _appearance.SetData(DoorVisuals.VisualState, state); @@ -144,7 +146,7 @@ namespace Content.Server.GameObjects.Components.Doors return true; } - public bool CanOpen(IEntity user) + public virtual bool CanOpen(IEntity user) { if (!CanOpen()) return false; if (!Owner.TryGetComponent(out AccessReader accessReader)) @@ -205,7 +207,7 @@ namespace Content.Server.GameObjects.Components.Doors return true; } - public bool CanClose(IEntity user) + public virtual bool CanClose(IEntity user) { if (!CanClose()) return false; if (!Owner.TryGetComponent(out AccessReader accessReader)) diff --git a/Content.Shared/Maps/TurfHelpers.cs b/Content.Shared/Maps/TurfHelpers.cs index b02472cfa5..1b1a8695f8 100644 --- a/Content.Shared/Maps/TurfHelpers.cs +++ b/Content.Shared/Maps/TurfHelpers.cs @@ -1,5 +1,7 @@ #nullable enable using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; using Content.Shared.Physics; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; @@ -62,6 +64,7 @@ namespace Content.Shared.Maps /// /// Helper that returns all entities in a turf. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable GetEntitiesInTile(this TileRef turf, bool approximate = false) { var entityManager = IoCManager.Resolve(); @@ -69,6 +72,32 @@ namespace Content.Shared.Maps return entityManager.GetEntitiesIntersecting(turf.MapIndex, GetWorldTileBox(turf), approximate); } + /// + /// Helper that returns all entities in a turf. + /// + public static IEnumerable GetEntitiesInTile(this GridCoordinates coordinates, bool approximate = false) + { + var turf = coordinates.GetTileRef(); + + if (turf == null) + return Enumerable.Empty(); + + return GetEntitiesInTile(turf.Value); + } + + /// + /// Helper that returns all entities in a turf. + /// + public static IEnumerable GetEntitiesInTile(this MapIndices indices, GridId gridId, bool approximate = false) + { + var turf = indices.GetTileRef(gridId); + + if (turf == null) + return Enumerable.Empty(); + + return GetEntitiesInTile(turf.Value); + } + /// /// Checks if a turf has something dense on it. /// diff --git a/Resources/Prototypes/Entities/Constructible/Doors/airlock_base.yml b/Resources/Prototypes/Entities/Constructible/Doors/airlock_base.yml index ad88ad239f..8383ee0575 100644 --- a/Resources/Prototypes/Entities/Constructible/Doors/airlock_base.yml +++ b/Resources/Prototypes/Entities/Constructible/Doors/airlock_base.yml @@ -54,7 +54,6 @@ type: WiresBoundUserInterface - type: Airtight fixVacuum: true - adjacentAtmosphere: true - type: Occluder - type: SnapGrid offset: Center diff --git a/Resources/Prototypes/Entities/Constructible/Doors/firelock.yml b/Resources/Prototypes/Entities/Constructible/Doors/firelock.yml new file mode 100644 index 0000000000..ecfe8b2578 --- /dev/null +++ b/Resources/Prototypes/Entities/Constructible/Doors/firelock.yml @@ -0,0 +1,74 @@ +- type: entity + id: Firelock + name: firelock + description: Apply crowbar. + components: + - type: Clickable + - type: InteractionOutline + - type: Sprite + netsync: false + drawdepth: Mobs # They're on the same layer as mobs, perspective. + sprite: Constructible/Structures/Doors/firelock.rsi + layers: + - state: closed + map: ["enum.DoorVisualLayers.Base"] + - state: closed_unlit + shader: unshaded + map: ["enum.DoorVisualLayers.BaseUnlit"] + - state: bolted + shader: unshaded + map: ["enum.DoorVisualLayers.BaseBolted"] + - state: panel_open + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: Icon + sprite: Constructible/Structures/Doors/firelock.rsi + state: closed + - type: Collidable + shapes: + - !type:PhysShapeAabb + bounds: "-0.49,-0.49,0.49,0.49" # don't want this colliding with walls or they won't close + mask: + - MobImpassable + layer: + - Opaque + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable + - type: Firelock + - type: Appearance + visuals: + - type: AirlockVisualizer + open_sound: /Audio/Machines/airlock_open.ogg + close_sound: /Audio/Machines/airlock_close.ogg + deny_sound: /Audio/Machines/airlock_deny.ogg + animation_time: 0.6 + - type: WiresVisualizer + - type: Wires + BoardName: "Firelock Control" + LayoutId: Firelock + - type: UserInterface + interfaces: + - key: enum.WiresUiKey.Key + type: WiresBoundUserInterface + - type: Airtight + fixVacuum: true + - type: Occluder + - type: SnapGrid + offset: Center + placement: + mode: SnapgridCenter + +- type: entity + id: FirelockGlass + parent: Firelock + name: glass firelock + components: + - type: Firelock + occludes: false + - type: Occluder + enabled: false + - type: Sprite + sprite: Constructible/Structures/Doors/firelock_glass.rsi + - type: Icon + sprite: Constructible/Structures/Doors/firelock_glass.rsi diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/closed.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..8c90b693a4c9a2b9c9e43b8ff4cb9a299a29d8f4 GIT binary patch literal 1120 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame1.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..458698515f18fe40fc9819a3797a907ef8937e74 GIT binary patch literal 1146 zcmV-=1cm#FP)%Fv5!xs4S;`MYbgCb-U2aSR;+b4{(1Nbah_;x#ymH zXRb6jI4A%{Mn*`d)65R1I7>W84HJvSNG6j2$j#)TPKo75eP=>`VJgeSz+XH`*Ey5P zB+~Tsv}h)O)9RZ98@Z{Bvv+VSq9))F2{wbEU_VpkG>ru7K=H`sl?pmBv(}x37Ct=nNii21gzw9@i=Z-X1v$O(j$lsZ7@5W;z3G_ zZG{d=LZa0`(tbT|VInvwqI>novM%V0N^Om;2#N<5_N9`gpS}cEZ~%llB?4iyqACt& zIHRh}Jbv6Z$W>K^Qi&g@rcCk~Rb@t1E&Ha>Ck_*^LWg8skwPZZBKs~L2bYWK#YK~R zE*>}5za83ZngZ$YMx!mIZbVfG3YiSvXw+y%yCfU{JNtr{+pWrcDuu}BfrfQ#BrlaH zq|>JV0NzLhz^rS+&VGFfWTnfV(xOyq7^W^QuQdaPB+*&uI>)eeSc>F16X zrIll&%xYW~!j@2nX&c^Lj^gwA7-#oL$D`oXn)e%z$0YxtSTx4hzmBoDw?{bKP=Q1u zLFM7YBME+4U$@o2)8B85CoW$G;K}^F$tICVFt5pE03ifj;V>JTK_uw34DM4pU>$zg z*|FTCS3)6S_#T*bk)V^J)}&qGFhVpmAwYLe4;#RH%d66rP{=ri_LUl)`NQL)9l4=f zMF8{zD|hdrkMC>x>*vmi?w%gQ$Ff^YBs=ZsY?3$u+Ma~}7mN!0`{Kp1ou0QEvAlp*V5d+SbwX^0N$*`(^d0P>?oC}Y0f&z zLKr9AQE+H`zNSqA%&X(g*5f#!{&6rnp*dr%OTs*0MPql?wL@ z1{$#P`K%@i`KHaQ<2%BCd(*_0^|*uaW(sJY=!N8!RNnr1CY<>`QrTo z0H6F6F&rA@AAj%F0@m^AyPGZYX8T*0@`O7jzWV(&VzC&~;NYOpFQjeyeAB zezMy{uFHGhQcNVrk>9$MC!*B&@{iYz8?t0|JwM$_+e6>L&DZn)0In#^lz|q5SO5S3 M07*qoM6N<$g6e`QrT_o{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame2.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..67f782bd89cfeac1df4d694cbf126bfbd5c2022e GIT binary patch literal 1167 zcmV;A1aSL_P)N{L%~pl!L{qAP`nCQiK$5qNf%C`u~%MX5gGzrh9;X7x@s4t zWYI;tNZc;kfNPpUaGNo7)dpfyI}0NWDWR3+_!-%fEK9mw%)>L%X#Al0VbIli{b$ZS z_s+dicXzh{=joaB><1U^}2u&t5V2N3UBWxRKh zdy9H(C)7z264eHh{_FP%8^LiA+tDJ+hM+wr)iib@$nQDW7YdGk#uPZg1JK+c5enNC zC2{bEW2(y7!-qA4Tvk;m6!>vu#3mn8RmN1+v2Swi;vfMh)Je`2$)!?NvhNZJ@Ol}Y znX$rM9`MOBQ`fH9$bGWRAR=>y!}3$iD)tNdXq-NVT7#v?VC0bfrO&`Z@v5{=mqH{^Yiqe{JOSJbkox=k#m2@4!C;WV?QLEYf>6a8ewoh`^7~N&^-ywu$!JqOPoJ+7^7~Cc zYn)ZRLz3HdNG;rri zl3VAsuc{0XNJ~6gvTwznLV>dGY+zpqbEi8D9(~Q1^_Kwq>;%$U91m!RgYk2^qked( zBtI_7UaxD6ng^1y%ZKEsZ+{$^3H%!>x!Jukmk4!A+jsFb>zz&sx&~Je zGf|e)8D4J>I+&j<2?bbAXYdq@+|A|adR!*lAlVZDxIL|KBdCd%)0q>IxuGn}D2f7P zO__N$`)J@Po4bO~e{BIEo6YjYhdBT~`6+5TSmhsoAJ7A8`1Im>mAuma=7lWb28pl! zc!PL6j?~@VEsV>lk;Lt3h1K7+EW3tVY~+T#?Tlh0Ig0$|g)C8}%$I+@Y2J_}r|bF2 hX4)Ob0BbH;_NognLPMd;(0G$VSM8#d zEV^hHiQ7dRa7|MPZZn3g+AJI@WnqM&B_*<)`W4xdtk>;AGh>Z38b84OVbIli{pX&0 z?wz^Pz`%e27#l;A9JFEKDl=$e|K_Za|ay|K2 zx0n4K6iX#$mX`r=02B($kB@UrRgr-CXq0JHZAidMJ|B(Zl4Zuay(~X~$lwMuLkaFB zwAfZ?kt8G<4J7T??Gh$}lOnuVjV$Yep0L!^*oq*3U}0Y*a{WBr?zo;R%P0X0%Jf0kE?#c(vWA%q9|uY!;|l$6E42 zfm||a`VZgM(7?n=4_wUN2+p9_e@#TD9i=#_cxAKgj2e@%67G?CtFl4AxX2 z7K>53fB#5=U)I-c_3!rf8so=rKZSqb;*0Ypn^-Ky!omWeB_M>LBN${uGYGY}S_bzj zEwBzh?Cen_Ma{)*rBO_vK zYYU&x$Jp*JuL*&_ZV$i8=kdGUD4td*+fOpo-paG*oA}*s!>=~Zb4g;ky`4-ZLq|tP zwE}aOQ{0(7Jh!{rTTz@&)> zVn?AsMRV3s6v8;^j)Ftm^A&9pU|t-G>A=oCF69BlqsBqI)6|JQ+ry{dMMV3(%1;`pQ<7)Qd=rgwW1)u-g z2|zZR<%{=o0DSUO$Z)8YfBd~i3s}Xc?`<~7>+Nq{$r5an`0DpJh(sbt0|Ns>zntnx z++I}JcwEi0f4tK~uFJbGDkhTS$ZuWA5>hIB`Nx~a4Oz0fo}X@|?V)er`s?|B*+kDu ThG~D%00000NkvXXu0mjfi*YNi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame4.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/frame4.png new file mode 100644 index 0000000000000000000000000000000000000000..6252d37d1ed3122d417d384657798753f4153412 GIT binary patch literal 1145 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�k^?V79mjAc&8Ng-_YOcq#xzxU14{OGPL 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/panel_closing.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/panel_closing.png new file mode 100644 index 0000000000000000000000000000000000000000..ae69b8aded52705141caf90baca11d9b6f490f76 GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V3hN8aSW-L^Y*r57L%g@>xC}A z3Hv&&KdLo4D5MK2ok?X;eBkR;cJGMmk#kCcY(AS#`EY)g>)<%_-zRbR%08euK+tw! zTF~ZA>X8R)3>#8FX2Zb$wYp2w-knVU_Cqs&h1}$hj<hZcpxtMC#10s!RRy;u-(lWFf(gQU1Tr{k)uI+k5XOavZyvUt*}mq#1G7gO%sK{!+EaHX%dbA278C8|dw;V0!qbOyy;rXP+`n3X z&wknWw}N;Usr!CE3^ecWXO(BOFF*bJ^5KlDxiROS*Ib+TCn7f2-8w6;Bi`Zv9e$vh b2{Cqz({Gn8Fx05L1+v1^)z4*}Q$iB}3+IzJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/panel_open.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3bfeae15880d37195a14cbfdcb01447290f46c GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ4o?@ykcv6U2@U=;9laSW-L^Y)gb*WmyGwg;Iy z9(k8yU;4&y&T|dmshHNJP$69S+;`Uov)CyuS(oNkF8=o0tlx&||A#oE)tx|d7#JEh z&DxcB{M)f_|DE5hjPiOGcKl%XSG{SgD}R3}x>@%6ZkqAzT^(!g_=V-UxX53-Qu=$( z4~ab=zU`W8T56k_c=~G1hoe(Z$ez}pDJ^JdU$?vIPlRo7S2F4x(g z@=iSVzV*9$)#}8scPpj5R_@E6@~-jb&YQouEv_@4F#Ev_b_t01p&0r3M{JqfyZiuG znP-oC)t;?TQj(Lm+x*%hI`l}Q-8`4)cbYfP?DKoZG-)SX7nJdDn(ZH-I+j^)XXb!J NJYD@<);T3K0RT6Fi?RR! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/welded.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..54de288e54d54f4cc7dc8c62a0127c981a821dcd GIT binary patch literal 318 zcmV-E0m1%>P)YU6bA4wxkE7`q?fKHFCeAO%_0h7ClOkT-OW?vja(IVP>7(o2*u=9=~8g8rQOsP zbds1JCyP}wIH=3{ZRgL&IRImfF~zM!inM`#yv)k!4f3u7jeK z=x7bIP=MAtH@mS}qsxo)x%ph-m&;U?62@DKCCfqz;5a&)?F8Ff)Ex{_TU$k}V<^u@ zoLs}JDvU=XOkPt6VPa|u97WMAx9%%iT(I!)`~rP@lmEbHs!}0o+sF(9UKKh? zu;MIZ@8mQ$7wiVq?P%Dg5{L+n>*B80!&SSToB1_LDGI}o{`@dwj4}2T??$6i`jodk Q8UO$Q07*qoM6N<$fn+a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/welded_open.png b/Resources/Textures/Constructible/Structures/Doors/firelock.rsi/welded_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b1d509b5c48ad1be5dc7c0d597f8736be036e1 GIT binary patch literal 321 zcmV-H0lxl;P)8`+h9Y{Agq2cxniVE&?*s&qA|hG3-AgxUV+9@tVfN`sG)<2i6j_JOrgig zff5*WVDS9L=l#gLzVP2^@nG-ZP@bL~_vJr!YBkw>e8Mnvy4{FeZk9|o%Z(7|ril<@ z;Oy#}Coj&=dg^`68|AXpIw2F5MF?~rE=hgr09fuK_s>ndnjQiHg7>d z>np@CbRykgtX}8CiXa2+qco36?Vwd!Aj@sbnCdX21;=LUl%kSxr7ud?a%agu; zzfZsS-uLvlSS&^WU}$Ivxm*s(!7aQ@$!rZmQ50meSpY!D2`-5o9^95+3iydh9jE$# z!CJ14nayUw&CJXYC-_)jCn^@l1dBZJOzQOW6OkvlSJ=aeNgc`nhxe}!Kv5KgoZ!Pe z?+KjdMDNUkw>m{Ct|Etd9uIEIPzDM}4sIc{bua~f6*nZ!i5S)OLw%_oBg;sUiZ4U` zdjSAc0dkaeYy@5r1dQrBPTkUO7RweQT|DR!fJ+zY;(;l3IxWjc@%}{sKmY(FkwaK= z8)@+Besvv{XRkU(FI{!Ny8im|cQ;3M9cfPVTtAjfngtw2jAG%vaHQ{Z=ji7j>EiuN zj2xC!1^2!UGKPzb%k!Vi&n~7&1u0TNT9$#?iD_RhDRF`~a?w7_ zHvI5G6rG)&7{i~ogJIRiFD@?6r=3L{LQuI966xnhX#^&@D+Q09Y#)F$aL6Y?@B~ z)o-mk;@ht^S)y~y83xvhMf8dyx+MvOkY)h@5b5njfl4%I7);__>Ul))J^+3;O?#ou z!SM8HU^T>b7K{i2)`~^n;1NN9o2RcF_m|I&Q2iwP{kp{0;VdZknI{@%KJ#~-+n{x_i zu`N4c_Ne^BF!23_3oiOHiG=I9BNVc~QfO;qd;s|N0Hy$=1S~yy!diEBd;|ZDyn{A( z0eZf^?c{?a*ECIBK2!g#`skY;JAl@I@Ffp{YRezL^~|Mr`j^XP-2dq>NFuceono3M z3P03oJC=xe>ibR#49H>i<#L(93Mh(##m(ckLf3U{T(j`_Q2>1>*+b{@nWmlw`SJSm zmil9f2n0cZesH;wL=KCa$Dt?+xL7Pk8kf`gH-E*stL{DfU&^&}96q~0Y~PT%|NDCW YH=e40LNT=Zga7~l07*qoM6N<$g4A|Z{Qv*} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/closing.png b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/closing.png new file mode 100644 index 0000000000000000000000000000000000000000..6718ae08e979bc8c73e2ec6081e70f6088157caa GIT binary patch literal 2494 zcmV;v2|@OWP)e6WV7nj25kHs7hFqO^X;_cf4YugJCKB#&1{r=IsZ4fj+GW#edA`zS%zcBpv z@bU3eS^)qsCWP=*Cd2h5uP6#eibVjx8Cf=tl~PrxhraUUe>dC;04S6MoRMWbmC2z0 zqx6U6jq1^9_&t)ouUe`cJ~@72c&zG#Q(6IIio)f9Q(6H92*%{A zrOIKl?Z!+8y!c~62mmmGVvTz&IoNyQQ^YzRUdrZ6hsi5KZA&}Fou*go50RU%=!-?LEy0fQZyOO*>(vSi}g5uE!*+41j6!BU0-$fWdnB zbOahsIDW)*3@3AnKo(!*IiMdFUvFWyPi3=60iXsv2-GI`;#clz=!HjXQ9>UhrK*_9 zX7Nxc0U#O@ z5Q)|`-Yr{6(LiFJ=JT9KJhr*^JrN3NZv3DkknrzW3Uad`&Ou%lR0M8I2i!{wDgud# z0FWzaP;gNQ)FZvpf(a?s}h+M1bfT#LN7zTtq}FN6CjfW>N7ehUD+`RpprrWOMmz}eIy-h6h|_}t8V5dfr&fa!k( zdn+zw1k?NfC;n(W&b(`TePx9^j0nF4&>s%`xSyNf5GyH~>HT)$J54UJ(Rf^o$}(7g zJbkVF`_BUyHX4s>5lM2~UeVa|9FZja?(xTM8(Redxgz^RMSMcjLCrkyp&Eu05F+MVkn)q9f#FEnM^uzjjJFvx7ndL#t1*C6yU@s z7L{cPpeCql#KYg&RXdd11Ovb>(K*o=TQaM`{TlfB7ym^xWL~T^-|rOQ#kVq86a4L6 zMzEF3rjJgJq50eP91v6raI#jRHo-&bw83ZDOV#Zk96f4kC*%0wnP(h1Er~<|KR=J|?rx0F0z-WZ7){4Dx04yk!A{$}`nL9cgYj9rIF|4$Y5liazf!-&?-BK=Qu%ZnpXWqL1g*#sdITCts=@{@d{* zgI5#^1azH$NYc3Y(U5?-Oa43_J8(3EYfBYOt@Jq8 z2lO~x{kat+u=bCI*$3j$=L2S;YdysoMxUzVi6eRVWb*skciZ~W=&oVz!AP?Wq2=uHE@Vi9E%luA(^_pK1=;(l;N_1Fu zFH)eJ`4NG{Z1n*_mFRfY2l$-=z4(4dAmNJuTOS`}ksOO3WD2zMgN#5U1rdFGP$fEE z`h34rpcmio2qb)=x3^cz<#M_{{>~koU0(K8Aai2R9&P4<2desbec93ce-{eqkHs(% ziJ1D48ynsfXuWZwQ=l8aN0KlRiQuQdI`?5jYMr+Jy96F1*Z=e)`2A}?8BD1v{$47X z_(lXoPiw$QuH$dnqNg>iziw}%`F^HA9=@LuNb^OYrjPH%9#=r4OxMRhVtl6gL8L%8 zeh?QSG~bATp!M6KNY}?dVr%2&Z&erM#Xl&^*sLm} zkI~Pn%Aom%1GbAkpXa&qR-Q>OdGLw(smh>Ph68lX`sQxc>$T3QC-5(<+u8`D^tlo4|Ww4w<%&N+u`No!d^zmCw0X+JAKUW|R-%nwdYkfcv(m)=4zMr}v9==tW zHT2nMj>mTsW(}p&u6$;FKoII+FMYnBE0BlpWJL2r+xyk1d;aoe6O)H80#$wd_kdqt zukGNsG?0EE!s7ca4fNtWjeo1cEGysf!DvwG;CihQ(m)>DC5k96EI_M9uJIk{$uE~t zT3j@J1^}t8O&@D@8<#rTs*m?O1z63kKERI^=*9m=Rq@AHU$r@pjzaQ&mna$xdB+Z0 zq&gL60F(o)`uL#K!A^X#0_DdZGd|zl*s!m_ufH~Z2Fxo^N+h@(PnKAhr_0Ataj`EUi?fZgDdZq@XzZlXn)%LlgB$R*4pVw z{`0wSUEB8##30KuGF5RG%{Pg2hYx*;>?iF8up<&NQh8fyyt#>z;@yP4}vE=>PNDL0ssI207*qo IM6N<$f|E$s#Q*>R literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/deny.png b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/deny.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b151c14088c54950b3655357a7f4f7f76654f8 GIT binary patch literal 1734 zcmV;%208hOP)fdS_R!VAN@uM|WE&LCQlrJBxzW(>>>GafHh)KVc$LqAEEoT2sej%DjticbeXYvcsq&sWrBv2GQn~mm8h}J911tD)$AWtTD}Pdp z;5z_dE=`b}<1?HJL7!n@Ow%ygy*E%TSGTPc?pe2SX0m&4U`*4{XBf22HFZ@qJ(nh2 zS`^;_5G5~xy z(TLjGTD0OBEs)GCww)Ll>J6DYu>$pzG}4eLJegT+WAl%m*D*go4|jgnMe?Z!Tn|j+ z)ZhkM$fZ<`vYqHN4D`Xka$=Vo7Vc82Mgh>-yB?UvTSKpMb=%w9v2gKXMfmOQ?YMH~ z3V{3o5JIrpmCGDSB+vtZahU+y_}9NJzax9+wWV2N+vrIqF_K82-s!|@SB_Z_Ap~pO zZp>DQzsBvReCh#pYx#zHl1c9TDU)tdtvBF58wP#Q^dMTBJ`NziS;%G)?&!dwNCXmqu-}ia zNTjGiD|^`Q=g!S607yK3Trob&qKok}ljpcq6%vZ~%7snkD>X~AUa$0nzQd}Gv34#n!&o672x>`i~V&r%bk|$*uJaH0Qd_Y9v((3b6!sV@bEBA zI{@J1o*2#?zQ+}+l9m8nkqEkO+^}p601ibWKsJkSIy*UgS0sY2NTg^6&K$mnlY3(H z{N$b(&h}@BHI^!KTutb;LV$yJ?!@*?Dylv!a`9U zB`$GkQG6N5{W4Ukyl|K4*Y4gt7-~Up9%4|zNe)~z0-CRDEO5yfTf5PqL zmoZU%%bUY649xzJbDPZ_9!q<}E|r6<)Sj~11`6ambX}+SA^^nWag1Ha;MWHZH0FjH2;+@ z9FcJ5b~E>dRwQ5g|MR$D-M@cd${zs$lau8pPGXXQ*djhaq-3j$FWdL|Yq>$#*D;M_ zgSkN{%)BVsB0fN*Y#Sd?DcL4IK$L6|A0SdMO?*JP^isqJlvB2d4-hF^#0Q9!ZQ=t& z$rkYeB4wNS08z32`;j~_2`-*87qQMyK!=`5?OR&iwjl#J1{gKQHY zAWF804-h3=#s^eV!s7#k%j@-$U@%C0J|Fq4M0qI=*Bo57L1;V$r=hYfwIZH&a4f&4Kb~PL`z}xK z`}2N3eeZqWlbGJ#UK0QY1_qGN=aJ~o;YCV1*AGz?kT$ z@A(Cpd<`?3&4QVnoHXs=Bi$XS=nNIiv!?5!c0VuSSrhlR$~Zc%KlTbVNE?kRt$xF4D;Y6H+`S2uQNtBmlq%0AZd% zDC{(n;Kr`8jLP;Q`{<@Kc8%pX7ME@eD+*E!?|Oc8!E6v{MbzTf2cby!7xvN1Khnv1 znJ8(AK(VC54ZPV{-yWcOrT73~r(#0gp$$B1Vph|zA_#aeH5LyBf}^d1NA@4wcrY~< zUl9b%YMQm?%bkAfd8a~bK~LF7oq-g?TVs*Vg;RdDY+KV`T$zc_PwW@8d?4GXJG6Q~x}0UWR#L#%fvtD5dtbBJXz z;u7a)80--JpoVpbCQvHTL8`9f{OT%zy=Gw;NXKG0BgC=)#%}Fe) z6+g9QF3fRY;Oy1)rutHQBMWu_yR--BTc5-|0exOAd`xwGq(lb>k-BxD(hJ9k_c1AsHK3>XH!86T(g30X!$mK_1Y7PKw zSFO|3ZT2l7#jR0$?SX*xmRwsKN`YvJ>{MTusw(<#g?{>XUC9&70JJ^c4$^Xv?3zyY0~1{Y#}1?*H@` z!aQ*Z?V@QKwtlFk?QksOs_#C=Q6R1AOSYEl6Gaj8t4Az_q9|CouH&~yK6D?WFP$r= z8+sDt$AxE2^@n2-a2y9^@8>4WGnijJ0#Ovf^!E0e^`Fz3w|>RBYtEYeFXj3<26OiZ gtv_Vu|NcGy8*%D^Kx|ccGXMYp07*qoM6N<$g8N5G00000 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/meta.json b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/meta.json new file mode 100644 index 0000000000..817344977f --- /dev/null +++ b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/meta.json @@ -0,0 +1,134 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA 3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation at 04e43d8c1d5097fdb697addd4395fb849dd341bd", + "states": [ + { + "name": "closed", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "closing", + "directions": 1, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "deny", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "locked", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "open", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "opening", + "directions": 1, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.07, + 0.27 + ] + ] + }, + { + "name": "panel_open", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "panel_opening", + "directions": 1, + "delays": [ + [ + 0.2, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "welded", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "welded_open", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/open.png b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/open.png new file mode 100644 index 0000000000000000000000000000000000000000..6fcb5b059bd5e888fa554cc84870238315524a50 GIT binary patch literal 563 zcmV-30?hr1P)KR76ox-LS?YwUSEULy3(Ls^$;?{REERi~Fn0hXrb>vR3rkm|ssjrH>e3Ox79eZs zz~E4+^3sKbs1Xh!ZKw1YjExgHxC-Q&fAgL0eZTMCJ-ss=$58;~av9I_sFoT`Q+tgP zQc7Ic1t2>LKYVwC)k0xxfcKpa``vCPX>NUCVUV`AdcVP5BVf9&OEwNaso!M3`!%x; zgK`c=9SRkqzM@XK-=_NSdy?wpt2y!kiTJud@3AIvWlYmyKxB zfXit>Rl*OO03v5FFQ$PUuZyDkW8gY98wUI{MbFm@_RnHRVE0Y!IS?v3g8JKuul__D zx`xj_FO$#bS>cBk_`{cye!q_pu^p&XDq7&9EE7N}#iG!c1dBqT)JPpDEG=m>5NFLs z9heCNozqio&^RkH@ZHx}3gfKEK&@8OW+2Wo0k+m!>~4744D4=rY^}9`-<5E#ZSdh( zZz-N@2Mv%3L38k6RV#l68n0o@HrsHiJ$w^THk)V=;seLB2Eh{XF zX>tL0-Rli~XQhF=3uIo2hr%vMfaIf}MjqNGUNK$5HY3 z;oxKOuYtC0dmt<;an3(KPhFe2*B*Ky8`u3j{{>z0!&oF9kOTk#002ovPDHLkV1m>m B{`>#{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/opening.png b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/opening.png new file mode 100644 index 0000000000000000000000000000000000000000..113ddab7b76361111ebf7c2cb35999c487ced60d GIT binary patch literal 2500 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 b2{Cqz({Gn8Fx05L1+v1^)z4*}Q$iB}3+IzJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/panel_open.png b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3bfeae15880d37195a14cbfdcb01447290f46c GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ4o?@ykcv6U2@U=;9laSW-L^Y)gb*WmyGwg;Iy z9(k8yU;4&y&T|dmshHNJP$69S+;`Uov)CyuS(oNkF8=o0tlx&||A#oE)tx|d7#JEh z&DxcB{M)f_|DE5hjPiOGcKl%XSG{SgD}R3}x>@%6ZkqAzT^(!g_=V-UxX53-Qu=$( z4~ab=zU`W8T56k_c=~G1hoe(Z$ez}pDJ^JdU$?vIPlRo7S2F4x(g z@=iSVzV*9$)#}8scPpj5R_@E6@~-jb&YQouEv_@4F#Ev_b_t01p&0r3M{JqfyZiuG znP-oC)t;?TQj(Lm+x*%hI`l}Q-8`4)cbYfP?DKoZG-)SX7nJdDn(ZH-I+j^)XXb!J NJYD@<);T3K0RT6Fi?RR! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/welded.png b/Resources/Textures/Constructible/Structures/Doors/firelock_glass.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..c44b52966425ff9898d26dfdca5a2c36ae42783e GIT binary patch literal 317 zcmV-D0mA-?P)YU6bA4wxkE7`q?fKHFCeAO%_0h7ClOkT-OW?vja(IVP>7(o2*u=9=~8g8rQOsP zbds1JCyP}wDv0N|oj)Jv0E{ul*nekyZ8UdUba=4;t^c7>uha0p4RuStM%JUH? z*YK(e8`+h9Y{Agq2cxniVE&?*s&qA|hG3-AgxUV+9@tVfN`sG)<2i6j_JOrgig zff5*WVDS9L=l#gLzA$21JlH!pl&2@heff`_T1_?|pD+xaZZ{&An&$$&2%|o_b&NM!77tPRN915dxiuOH!XY0G7MR{c{s<data><IncludeFilters /><ExcludeFilters><Filter ModuleMask="Lidgren.Network" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /></ExcludeFilters></data> True True + True True True True