Skip to content
Closed
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
454871a
interacting door
Misaka-ZeroTwo May 12, 2023
aeef386
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo May 12, 2023
eb85bdc
Update InteractingDoorEventArgs.cs
Misaka-ZeroTwo May 13, 2023
2495896
line
Misaka-ZeroTwo May 13, 2023
b6d3694
base game logic
Misaka-ZeroTwo May 13, 2023
b1c97a3
rename
Misaka-ZeroTwo May 13, 2023
c5b714f
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo May 13, 2023
3b91bc9
Merge branch 'dev' into interacting-door
louis1706 May 14, 2023
054f5dc
Merge branch 'dev' into interacting-door
louis1706 May 22, 2023
11e7290
transpiler
Misaka-ZeroTwo May 22, 2023
1b618d2
better
Misaka-ZeroTwo May 22, 2023
a8e0b25
oopsie
Misaka-ZeroTwo May 22, 2023
33e64e5
fix docs
Misaka-ZeroTwo May 22, 2023
22c4e62
more comments
Misaka-ZeroTwo May 23, 2023
70955b1
Merge branch 'interacting-door' of https://github.com/Misaka-ZeroTwo/…
Misaka-ZeroTwo May 23, 2023
235d45e
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo May 24, 2023
9c57637
Merge branch 'dev' into interacting-door
NaoUnderscore May 25, 2023
cb00541
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo May 26, 2023
f6dfda0
Merge branch 'dev' into interacting-door
louis1706 May 26, 2023
b5cb0bb
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo May 30, 2023
cca1686
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo Sep 1, 2023
e530aaa
Merge branch 'dev' into interacting-door
louis1706 Sep 1, 2023
c64d82a
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo Sep 1, 2023
84d1b65
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo Sep 1, 2023
a0cbe1d
Merge branch 'dev' into interacting-door
Misaka-ZeroTwo Sep 1, 2023
eea1b74
Merge branch 'dev' into interacting-door
louis1706 Sep 5, 2023
29db0c0
Merge branch 'dev' into interacting-door
Thundermaker300 Sep 14, 2023
a03f0ee
Merge branch 'dev' into interacting-door
louis1706 Sep 14, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions Exiled.Events/EventArgs/Player/InteractingDoorEventArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

namespace Exiled.Events.EventArgs.Player
{
using API.Enums;
using API.Features;

using Interactables.Interobjects.DoorUtils;
Expand All @@ -30,11 +31,15 @@ public class InteractingDoorEventArgs : IPlayerEvent, IDoorEvent, IDeniableEvent
/// <param name="isAllowed">
/// <inheritdoc cref="IsAllowed" />
/// </param>
public InteractingDoorEventArgs(Player player, DoorVariant door, bool isAllowed = true)
/// <param name="interactionResult">
/// <inheritdoc cref="InteractionResult" />
/// </param>
public InteractingDoorEventArgs(Player player, DoorVariant door, bool isAllowed = true, DoorBeepType interactionResult = DoorBeepType.InteractionAllowed)
{
Player = player;
Door = Door.Get(door);
IsAllowed = isAllowed;
InteractionResult = interactionResult;
}

/// <summary>
Expand All @@ -51,5 +56,10 @@ public InteractingDoorEventArgs(Player player, DoorVariant door, bool isAllowed
/// Gets the player who's interacting with the door.
/// </summary>
public Player Player { get; }

/// <summary>
/// Gets or sets a value indicating the result of the interaction.
/// </summary>
public DoorBeepType InteractionResult { get; set; }
}
}
}
95 changes: 54 additions & 41 deletions Exiled.Events/Patches/Events/Player/InteractingDoor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace Exiled.Events.Patches.Events.Player
#pragma warning disable SA1512
using System;

using API.Enums;
using API.Features;
using Exiled.Events.EventArgs.Player;

Expand All @@ -36,57 +37,47 @@ private static bool Prefix(DoorVariant __instance, ReferenceHub ply, byte collid
{
try
{
InteractingDoorEventArgs ev = new(Player.Get(ply), __instance, false);

bool bypassDenied = false;
bool allowInteracting = false;
InteractingDoorEventArgs ev = new(Player.Get(ply), __instance, true, DoorBeepType.InteractionAllowed);

if (__instance.ActiveLocks > 0 && !ply.serverRoles.BypassMode)
{
DoorLockMode mode = DoorLockUtils.GetMode((DoorLockReason)__instance.ActiveLocks);
if ((!mode.HasFlagFast(DoorLockMode.CanClose) || !mode.HasFlagFast(DoorLockMode.CanOpen)) &&
(!mode.HasFlagFast(DoorLockMode.ScpOverride) || !ply.IsSCP(true)) &&
(mode == DoorLockMode.FullLock || (__instance.TargetState && !mode.HasFlagFast(DoorLockMode.CanClose)) ||
(!__instance.TargetState && !mode.HasFlagFast(DoorLockMode.CanOpen))))
if ((!mode.HasFlagFast(DoorLockMode.CanClose) || !mode.HasFlagFast(DoorLockMode.CanOpen)) && (!mode.HasFlagFast(DoorLockMode.ScpOverride) || !ply.IsSCP(true)) && (mode == DoorLockMode.FullLock || (__instance.TargetState && !mode.HasFlagFast(DoorLockMode.CanClose)) || (!__instance.TargetState && !mode.HasFlagFast(DoorLockMode.CanOpen))))
{
ev.IsAllowed = false;
bypassDenied = true;
if (!EventManager.ExecuteEvent(PluginAPI.Enums.ServerEventType.PlayerInteractDoor, new object[]
{
ply,
__instance,
false,
}))
{
return false;
}
ev.InteractionResult = DoorBeepType.LockBypassDenied;
Process(__instance, ply, colliderId, ev);
return false;
}
}

if (!bypassDenied && (allowInteracting = __instance.AllowInteracting(ply, colliderId)))
if (!__instance.AllowInteracting(ply, colliderId))
{
if (ply.GetRoleId() == RoleTypeId.Scp079 || __instance.RequiredPermissions.CheckPermissions(ply.inventory.CurInstance, ply))
{
ev.IsAllowed = true;
}
else
{
ev.IsAllowed = false;
}
ev.IsAllowed = false;
ev.InteractionResult = DoorBeepType.InteractionDenied;
Process(__instance, ply, colliderId, ev);
return false;
}

Handlers.Player.OnInteractingDoor(ev);

if (EventManager.ExecuteEvent(PluginAPI.Enums.ServerEventType.PlayerInteractDoor, new object[] { ply, __instance, ev.IsAllowed }))
bool flag = ply.GetRoleId() == RoleTypeId.Scp079 || __instance.RequiredPermissions.CheckPermissions(ply.inventory.CurInstance, ply);
if (!EventManager.ExecuteEvent(PluginAPI.Enums.ServerEventType.PlayerInteractDoor, new object[]
{
if (ev.IsAllowed && allowInteracting)
{
__instance.NetworkTargetState = !__instance.TargetState;
__instance._triggerPlayer = ply;
}
else if (bypassDenied)
{
__instance.LockBypassDenied(ply, colliderId);
}
// Don't call the RPC if the door is still moving
else if (allowInteracting)
{
// To avoid breaking their API, call the access denied event
// when our event prevents the door from opening
__instance.PermissionsDenied(ply, colliderId);
DoorEvents.TriggerAction(__instance, DoorAction.AccessDenied, ply);
}
ply,
__instance,
flag,
}))
{
return false;
}
if (flag)
{
Process(__instance, ply, colliderId, ev);
}
return false;
}
Expand All @@ -96,5 +87,27 @@ private static bool Prefix(DoorVariant __instance, ReferenceHub ply, byte collid
return true;
}
}

private static void Process(DoorVariant __instance, ReferenceHub ply, byte colliderId, InteractingDoorEventArgs ev)
{
Handlers.Player.OnInteractingDoor(ev);
if (ev.IsAllowed)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i am really not sure about this because mostly every plugin use this to just DeniedPermission

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and even in a breaking change update it's will be confusing for people

{
switch (ev.InteractionResult)
{
case DoorBeepType.PermissionDenied:
__instance.PermissionsDenied(ply, colliderId);
DoorEvents.TriggerAction(__instance, DoorAction.AccessDenied, ply);
break;
case DoorBeepType.LockBypassDenied:
__instance.LockBypassDenied(ply, colliderId);
break;
default:
__instance.NetworkTargetState = !__instance.TargetState;
__instance._triggerPlayer = ply;
break;
}
}
}
}
}