Fix prying shut unpowered doors (#35380)

This commit is contained in:
Pieter-Jan Briers
2025-02-22 04:05:22 +01:00
committed by GitHub
parent 7f8f1bfb94
commit 732d9dc2b7
3 changed files with 11 additions and 6 deletions

View File

@@ -44,15 +44,20 @@ namespace Content.Shared.Doors
/// </summary>
/// <remarks>
/// This event is raised both when the door is initially closed, and when it is just about to become "partially"
/// closed (opaque & collidable). If canceled while partially closing, it will start opening again. Useful in case
/// closed (opaque &amp; collidable). If canceled while partially closing, it will start opening again. Useful in case
/// an entity entered the door just as it was about to become "solid".
/// </remarks>
public sealed class BeforeDoorClosedEvent : CancellableEntityEventArgs
{
/// <summary>
/// If true, this check is being performed when the door is partially closing.
/// </summary>
public bool Partial;
public bool PerformCollisionCheck;
public BeforeDoorClosedEvent(bool performCollisionCheck)
public BeforeDoorClosedEvent(bool performCollisionCheck, bool partial = false)
{
Partial = partial;
PerformCollisionCheck = performCollisionCheck;
}
}

View File

@@ -42,7 +42,7 @@ public abstract class SharedAirlockSystem : EntitySystem
// the initial power-check.
if (TryComp(uid, out DoorComponent? door)
&& !door.Partial
&& !args.Partial
&& !CanChangeState(uid, airlock))
{
args.Cancel();

View File

@@ -427,7 +427,7 @@ public abstract partial class SharedDoorSystem : EntitySystem
/// <param name="uid"> The uid of the door</param>
/// <param name="door"> The doorcomponent of the door</param>
/// <param name="user"> The user (if any) opening the door</param>
public bool CanClose(EntityUid uid, DoorComponent? door = null, EntityUid? user = null)
public bool CanClose(EntityUid uid, DoorComponent? door = null, EntityUid? user = null, bool partial = false)
{
if (!Resolve(uid, ref door))
return false;
@@ -437,7 +437,7 @@ public abstract partial class SharedDoorSystem : EntitySystem
if (door.State is DoorState.Welded or DoorState.Closed)
return false;
var ev = new BeforeDoorClosedEvent(door.PerformCollisionCheck);
var ev = new BeforeDoorClosedEvent(door.PerformCollisionCheck, partial);
RaiseLocalEvent(uid, ev);
if (ev.Cancelled)
return false;
@@ -472,7 +472,7 @@ public abstract partial class SharedDoorSystem : EntitySystem
return false;
// Make sure no entity walked into the airlock when it started closing.
if (!CanClose(uid, door))
if (!CanClose(uid, door, partial: true))
{
door.NextStateChange = GameTiming.CurTime + door.OpenTimeTwo;
door.State = DoorState.Open;