/// </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 & 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;
}
}
/// <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;
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;
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;