Fix improper prediction on unpryable doors (#24738)

Fix improper prediction on unpryable doors.

Entities that had CanPry to false on their components would get
improperly predicted as pryable on the client because the check was only
preformed on the server. Same problem existed for welded doors. Moved
the check from server to shared.
This commit is contained in:
nikthechampiongr
2024-01-30 20:03:15 +02:00
committed by GitHub
parent ff7f7881c8
commit 9bebdf5706
2 changed files with 8 additions and 9 deletions

View File

@@ -28,8 +28,6 @@ public sealed class DoorSystem : SharedDoorSystem
{
base.Initialize();
SubscribeLocalEvent<DoorComponent, BeforePryEvent>(OnBeforeDoorPry);
SubscribeLocalEvent<DoorComponent, WeldableAttemptEvent>(OnWeldAttempt);
SubscribeLocalEvent<DoorComponent, WeldableChangedEvent>(OnWeldChanged);
SubscribeLocalEvent<DoorComponent, GotEmaggedEvent>(OnEmagged);
@@ -124,12 +122,6 @@ public sealed class DoorSystem : SharedDoorSystem
else if (component.State == DoorState.Welded)
SetState(uid, DoorState.Closed, component);
}
private void OnBeforeDoorPry(EntityUid id, DoorComponent door, ref BeforePryEvent args)
{
if (door.State == DoorState.Welded || !door.CanPry)
args.Cancelled = true;
}
#endregion

View File

@@ -60,6 +60,7 @@ public abstract class SharedDoorSystem : EntitySystem
SubscribeLocalEvent<DoorComponent, StartCollideEvent>(HandleCollide);
SubscribeLocalEvent<DoorComponent, PreventCollideEvent>(PreventCollision);
SubscribeLocalEvent<DoorComponent, BeforePryEvent>(OnBeforePry);
SubscribeLocalEvent<DoorComponent, GetPryTimeModifierEvent>(OnPryTimeModifier);
}
@@ -175,6 +176,12 @@ public abstract class SharedDoorSystem : EntitySystem
args.BaseTime = door.PryTime;
}
private void OnBeforePry(EntityUid uid, DoorComponent door, ref BeforePryEvent args)
{
if (door.State == DoorState.Welded || !door.CanPry)
args.Cancelled = true;
}
/// <summary>
/// Update the door state/visuals and play an access denied sound when a user without access interacts with the
/// door.
@@ -460,7 +467,7 @@ public abstract class SharedDoorSystem : EntitySystem
//If the colliding entity is a slippable item ignore it by the airlock
if (otherPhysics.CollisionLayer == (int)CollisionGroup.SlipLayer && otherPhysics.CollisionMask == (int)CollisionGroup.ItemMask)
continue;
//For when doors need to close over conveyor belts
if (otherPhysics.CollisionLayer == (int) CollisionGroup.ConveyorMask)
continue;