diff --git a/Content.Server/Doors/Components/AirlockComponent.cs b/Content.Server/Doors/Components/AirlockComponent.cs index db82273a27..0a21d3cf44 100644 --- a/Content.Server/Doors/Components/AirlockComponent.cs +++ b/Content.Server/Doors/Components/AirlockComponent.cs @@ -50,6 +50,13 @@ namespace Content.Server.Doors.Components [DataField("openPanelVisible")] public bool OpenPanelVisible = false; + /// + /// Whether the airlock should stay open if the airlock was clicked. + /// If the airlock was bumped into it will still auto close. + /// + [DataField("keepOpenIfClicked")] + public bool KeepOpenIfClicked = false; + private CancellationTokenSource _powerWiresPulsedTimerCancel = new(); private bool _powerWiresPulsed; @@ -105,6 +112,12 @@ namespace Content.Server.Doors.Components } } + /// + /// Whether the airlock should auto close. This value is reset every time the airlock closes. + /// + [ViewVariables(VVAccess.ReadWrite)] + public bool AutoClose = true; + /// /// Delay until an open door automatically closes. /// diff --git a/Content.Server/Doors/Systems/AirlockSystem.cs b/Content.Server/Doors/Systems/AirlockSystem.cs index 38ab19f25c..b807ebf40d 100644 --- a/Content.Server/Doors/Systems/AirlockSystem.cs +++ b/Content.Server/Doors/Systems/AirlockSystem.cs @@ -71,6 +71,10 @@ namespace Content.Server.Doors.Systems component.UpdateBoltLightStatus(); UpdateAutoClose(uid, component); + + // Make sure the airlock auto closes again next time it is opened + if (args.State == DoorState.Closed) + component.AutoClose = true; } /// @@ -84,6 +88,9 @@ namespace Content.Server.Doors.Systems if (door.State != DoorState.Open) return; + if (!airlock.AutoClose) + return; + if (!airlock.CanChangeState()) return; @@ -133,6 +140,13 @@ namespace Content.Server.Doors.Systems { _wiresSystem.OpenUserInterface(uid, actor.PlayerSession); args.Handled = true; + return; + } + + if (component.KeepOpenIfClicked) + { + // Disable auto close + component.AutoClose = false; } } diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index eec19ea444..308cbcb8ad 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -72,6 +72,7 @@ acts: [ "Destruction" ] - type: AccessReader - type: Airlock + keepOpenIfClicked: true openPanelVisible: true # needed so that windoors will close regardless of whether there are people in it; it doesn't crush after all safety: false