From 615c57bf0b52be479946cd3306f089c48751432b Mon Sep 17 00:00:00 2001 From: Mervill Date: Tue, 8 Nov 2022 12:22:50 -0800 Subject: [PATCH] Docking system can no longer forcibly open welded doors. (#12149) * Docking system can no longer forcibly open welded doors. * bolt the doors after trying to open them * more door logic --- .../Shuttles/Systems/DockingSystem.cs | 44 +++++++++++-------- .../Doors/Systems/SharedDoorSystem.cs | 5 +++ 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/Content.Server/Shuttles/Systems/DockingSystem.cs b/Content.Server/Shuttles/Systems/DockingSystem.cs index cc6a573c8e..5a2f7c384f 100644 --- a/Content.Server/Shuttles/Systems/DockingSystem.cs +++ b/Content.Server/Shuttles/Systems/DockingSystem.cs @@ -352,26 +352,28 @@ namespace Content.Server.Shuttles.Systems dockB.DockJoint = joint; dockB.DockJointId = joint.ID; - if (TryComp(dockA.Owner, out var airlockA)) - { - airlockA.SetBoltsWithAudio(true); - } - - if (TryComp(dockB.Owner, out var airlockB)) - { - airlockB.SetBoltsWithAudio(true); - } - if (TryComp(dockA.Owner, out DoorComponent? doorA)) - { - doorA.ChangeAirtight = false; - _doorSystem.StartOpening(doorA.Owner, doorA); + { + if (_doorSystem.TryOpen(doorA.Owner, doorA)) + { + doorA.ChangeAirtight = false; + if (TryComp(dockA.Owner, out var airlockA)) + { + airlockA.SetBoltsWithAudio(true); + } + } } if (TryComp(dockB.Owner, out DoorComponent? doorB)) { - doorB.ChangeAirtight = false; - _doorSystem.StartOpening(doorB.Owner, doorB); + if (_doorSystem.TryOpen(doorB.Owner, doorB)) + { + doorB.ChangeAirtight = false; + if (TryComp(dockB.Owner, out var airlockB)) + { + airlockB.SetBoltsWithAudio(true); + } + } } if (_pathfinding.TryCreatePortal(dockAXform.Coordinates, dockBXform.Coordinates, out var handle)) @@ -464,14 +466,18 @@ namespace Content.Server.Shuttles.Systems if (TryComp(dock.Owner, out DoorComponent? doorA)) { - doorA.ChangeAirtight = true; - _doorSystem.TryClose(doorA.Owner, doorA); + if (_doorSystem.TryClose(doorA.Owner, doorA)) + { + doorA.ChangeAirtight = true; + } } if (TryComp(dock.DockedWith, out DoorComponent? doorB)) { - doorB.ChangeAirtight = true; - _doorSystem.TryClose(doorB.Owner, doorB); + if (_doorSystem.TryClose(doorB.Owner, doorB)) + { + doorB.ChangeAirtight = true; + } } if (LifeStage(dock.Owner) < EntityLifeStage.Terminating) diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index e8cd3c9bf9..18170f4c88 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -316,6 +316,11 @@ public abstract class SharedDoorSystem : EntitySystem if (!Resolve(uid, ref door)) return false; + // since both closing/closed and welded are door states, we need to prevent 'closing' + // a welded door or else there will be weird state bugs + if (door.State == DoorState.Welded) + return false; + var ev = new BeforeDoorClosedEvent(door.PerformCollisionCheck); RaiseLocalEvent(uid, ev, false); if (ev.Cancelled)