From b40f2af4eebc4843ec7a9ebf2a2012cd14cc3e1c Mon Sep 17 00:00:00 2001
From: Unbistrackted <112902220+Unbistrackted@users.noreply.github.com>
Date: Mon, 30 Mar 2026 22:11:14 -0300
Subject: [PATCH 1/5] fix: make tesla patches better
---
.../EventArgs/Player/IdledTeslaEventArgs.cs | 43 +++++++
.../EventArgs/Player/IdlingTeslaEventArgs.cs | 48 +++++++
.../Player/TriggeredTeslaEventArgs.cs | 43 +++++++
.../Player/TriggeringTeslaEventArgs.cs | 22 ----
EXILED/Exiled.Events/Handlers/Player.cs | 43 +++++--
.../Patches/Events/Player/IdledTesla.cs | 59 +++++++++
.../Patches/Events/Player/IdlingTesla.cs | 75 +++++++++++
.../Patches/Events/Player/TriggeredTesla.cs | 59 +++++++++
.../Patches/Events/Player/TriggeringTesla.cs | 119 +++++-------------
9 files changed, 395 insertions(+), 116 deletions(-)
create mode 100644 EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs
create mode 100644 EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs
create mode 100644 EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs
create mode 100644 EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs
create mode 100644 EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs
create mode 100644 EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs
diff --git a/EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs
new file mode 100644
index 0000000000..ddb6f4d9af
--- /dev/null
+++ b/EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs
@@ -0,0 +1,43 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) ExMod Team. All rights reserved.
+// Licensed under the CC BY-SA 3.0 license.
+//
+// -----------------------------------------------------------------------
+
+namespace Exiled.Events.EventArgs.Player
+{
+ using API.Features;
+ using Interfaces;
+
+ ///
+ /// Contains all information after Idling a tesla.
+ ///
+ public class IdledTeslaEventArgs : IPlayerEvent, ITeslaEvent
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public IdledTeslaEventArgs(Player player, TeslaGate teslaGate)
+ {
+ Player = player;
+ Tesla = teslaGate;
+ }
+
+ ///
+ /// Gets the player who triggered the tesla.
+ ///
+ public Player Player { get; }
+
+ ///
+ /// Gets the Tesla.
+ ///
+ public TeslaGate Tesla { get; }
+ }
+}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs
new file mode 100644
index 0000000000..8b8864a326
--- /dev/null
+++ b/EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs
@@ -0,0 +1,48 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) ExMod Team. All rights reserved.
+// Licensed under the CC BY-SA 3.0 license.
+//
+// -----------------------------------------------------------------------
+
+namespace Exiled.Events.EventArgs.Player
+{
+ using API.Features;
+ using Interfaces;
+
+ ///
+ /// Contains all information before Idling a tesla.
+ ///
+ public class IdlingTeslaEventArgs : IPlayerEvent, ITeslaEvent, IDeniableEvent
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public IdlingTeslaEventArgs(Player player, TeslaGate teslaGate)
+ {
+ Player = player;
+ Tesla = teslaGate;
+ }
+
+ ///
+ /// Gets the player who triggered the tesla.
+ ///
+ public Player Player { get; }
+
+ ///
+ /// Gets the Tesla.
+ ///
+ public TeslaGate Tesla { get; }
+
+ ///
+ /// Gets or sets a value indicating whether the player will be detected by the tesla.
+ ///
+ public bool IsAllowed { get; set; } = true;
+ }
+}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs
new file mode 100644
index 0000000000..37ce13c5e8
--- /dev/null
+++ b/EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs
@@ -0,0 +1,43 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) ExMod Team. All rights reserved.
+// Licensed under the CC BY-SA 3.0 license.
+//
+// -----------------------------------------------------------------------
+
+namespace Exiled.Events.EventArgs.Player
+{
+ using API.Features;
+ using Interfaces;
+
+ ///
+ /// Contains all information after triggering a tesla.
+ ///
+ public class TriggeredTeslaEventArgs : IPlayerEvent, ITeslaEvent
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public TriggeredTeslaEventArgs(Player player, TeslaGate teslaGate)
+ {
+ Player = player;
+ Tesla = teslaGate;
+ }
+
+ ///
+ /// Gets the player who triggered the tesla.
+ ///
+ public Player Player { get; }
+
+ ///
+ /// Gets the Tesla.
+ ///
+ public TeslaGate Tesla { get; }
+ }
+}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
index 6c897ba955..dfb25f9376 100644
--- a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
+++ b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
@@ -29,25 +29,8 @@ public TriggeringTeslaEventArgs(Player player, TeslaGate teslaGate)
{
Player = player;
Tesla = teslaGate;
- IsInHurtingRange = Tesla.IsPlayerInHurtRange(player);
- IsTriggerable = Tesla.IsPlayerInTriggerRange(player);
}
- ///
- /// Gets or sets a value indicating whether the player is in hurting range.
- ///
- public bool IsInHurtingRange { get; set; }
-
- ///
- /// Gets or sets a value indicating whether the player will cause the tesla going to be idle.
- ///
- public bool IsInIdleRange { get; set; } = true;
-
- ///
- /// Gets or sets a value indicating whether the player will cause the tesla going to be activated.
- ///
- public bool IsTriggerable { get; set; }
-
///
/// Gets the player who triggered the tesla.
///
@@ -62,10 +45,5 @@ public TriggeringTeslaEventArgs(Player player, TeslaGate teslaGate)
/// Gets or sets a value indicating whether the player will be detected by the tesla.
///
public bool IsAllowed { get; set; } = true;
-
- ///
- /// Gets or sets a value indicating whether the tesla will be deactivated.
- ///
- public bool DisableTesla { get; set; }
}
}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Handlers/Player.cs b/EXILED/Exiled.Events/Handlers/Player.cs
index c03bcebebf..7fc3386a7a 100644
--- a/EXILED/Exiled.Events/Handlers/Player.cs
+++ b/EXILED/Exiled.Events/Handlers/Player.cs
@@ -11,15 +11,11 @@ namespace Exiled.Events.Handlers
using Exiled.API.Enums;
using Exiled.API.Features;
-
#pragma warning disable IDE0079
#pragma warning disable IDE0060
#pragma warning disable SA1623 // Property summary documentation should match accessors
-
using Exiled.Events.EventArgs.Player;
-
using Exiled.Events.Features;
-
using LabApi.Events.Arguments.PlayerEvents;
///
@@ -30,7 +26,7 @@ public class Player
///
/// Invoked after a player triggers the attack as an SCP.
///
- public static Event Hit { get; set; } = new ();
+ public static Event Hit { get; set; } = new();
///
/// Invoked before authenticating a .
@@ -87,7 +83,7 @@ public class Player
///
/// Invoked before a finishes using a . In other words, it is invoked after the animation finishes but before the is actually used.
///
- public static Event UsingItemCompleted { get; set; } = new ();
+ public static Event UsingItemCompleted { get; set; } = new();
///
/// Invoked after a uses an .
@@ -365,6 +361,21 @@ public class Player
///
public static Event TriggeringTesla { get; set; } = new();
+ ///
+ /// Invoked after a triggers a tesla gate.
+ ///
+ public static Event TriggeredTesla { get; set; } = new();
+
+ ///
+ /// Invoked before a idles a tesla gate.
+ ///
+ public static Event IdlingTesla { get; set; } = new();
+
+ ///
+ /// Invoked before a idles a tesla gate.
+ ///
+ public static Event IdledTesla { get; set; } = new();
+
///
/// Invoked before a unlocks a generator.
///
@@ -1014,6 +1025,12 @@ public static void OnReloadingWeapon(PlayerReloadingWeaponEventArgs ev)
/// The instance.
public static void OnTriggeringTesla(TriggeringTeslaEventArgs ev) => TriggeringTesla.InvokeSafely(ev);
+ ///
+ /// Called before a idles a tesla.
+ ///
+ /// The instance.
+ public static void OnIdlingTesla(IdlingTeslaEventArgs ev) => IdlingTesla.InvokeSafely(ev);
+
///
/// Called before a receives a status effect.
///
@@ -1434,5 +1451,17 @@ public static void OnItemRemoved(ReferenceHub referenceHub, InventorySystem.Item
///
/// The instance.
public static void OnScp1576TransmissionEnded(Scp1576TransmissionEndedEventArgs ev) => Scp1576TransmissionEnded.InvokeSafely(ev);
+
+ ///
+ /// Called before a triggers a tesla.
+ ///
+ /// The instance.
+ public static void OnTriggeredTesla(TriggeredTeslaEventArgs ev) => TriggeredTesla.InvokeSafely(ev);
+
+ ///
+ /// Called after a idles a tesla.
+ ///
+ /// The instance.
+ public static void OnIdledTesla(IdledTeslaEventArgs ev) => IdledTesla.InvokeSafely(ev);
}
-}
+}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs
new file mode 100644
index 0000000000..91e7a294f0
--- /dev/null
+++ b/EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs
@@ -0,0 +1,59 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) ExMod Team. All rights reserved.
+// Licensed under the CC BY-SA 3.0 license.
+//
+// -----------------------------------------------------------------------
+
+namespace Exiled.Events.Patches.Events.Player
+{
+ using System.Collections.Generic;
+ using System.Reflection.Emit;
+
+ using Attributes;
+ using Exiled.API.Features.Pools;
+ using Exiled.Events.EventArgs.Player;
+ using Handlers;
+ using HarmonyLib;
+
+ using static HarmonyLib.AccessTools;
+
+ ///
+ /// Patches .
+ /// Adds the event.
+ ///
+ [EventPatch(typeof(Player), nameof(Player.IdledTesla))]
+ [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))]
+ public class IdledTesla
+ {
+ private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator)
+ {
+ List newInstructions = ListPool.Pool.Get(instructions);
+
+ int offset = 1;
+ int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.ServerSideIdle)))) + offset;
+
+ newInstructions.InsertRange(index, new CodeInstruction[]
+ {
+ // Player.Get(hub);
+ new(OpCodes.Ldloc_S, 4),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
+
+ // TeslaGate.Get(allGate);
+ new(OpCodes.Ldloc_1),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
+
+ // IdledTeslaEventArgs ev = new(Player, TeslaGate);
+ new(OpCodes.Newobj, GetDeclaredConstructors(typeof(IdledTeslaEventArgs))[0]),
+
+ // Handlers.Player.OnIdledTesla(ev)
+ new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnIdledTesla))),
+ });
+
+ for (int z = 0; z < newInstructions.Count; z++)
+ yield return newInstructions[z];
+
+ ListPool.Pool.Return(newInstructions);
+ }
+ }
+}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs
new file mode 100644
index 0000000000..64db589515
--- /dev/null
+++ b/EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs
@@ -0,0 +1,75 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) ExMod Team. All rights reserved.
+// Licensed under the CC BY-SA 3.0 license.
+//
+// -----------------------------------------------------------------------
+
+namespace Exiled.Events.Patches.Events.Player
+{
+ using System.Collections.Generic;
+ using System.Reflection.Emit;
+
+ using Attributes;
+ using Exiled.API.Features.Pools;
+ using Exiled.Events.EventArgs.Player;
+ using Handlers;
+ using HarmonyLib;
+
+ using static HarmonyLib.AccessTools;
+
+ ///
+ /// Patches .
+ /// Adds the event.
+ ///
+ [EventPatch(typeof(Player), nameof(Player.IdlingTesla))]
+ [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))]
+ internal static class IdlingTesla
+ {
+ private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator)
+ {
+ List newInstructions = ListPool.Pool.Get(instructions);
+
+ LocalBuilder ev = generator.DeclareLocal(typeof(IdlingTeslaEventArgs));
+
+ int offset = 4;
+ int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.IsInIdleRange), new[] { typeof(ReferenceHub) }))) + offset;
+
+ newInstructions.InsertRange(index, new CodeInstruction[]
+ {
+ // Player.Get(allHub);
+ new(OpCodes.Ldloc_S, 7),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
+
+ // TeslaGate.Get(allGate);
+ new(OpCodes.Ldloc_1),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
+
+ // IdlingTeslaEventArgs ev = new(Player, TeslaGate);
+ new(OpCodes.Newobj, GetDeclaredConstructors(typeof(IdlingTeslaEventArgs))[0]),
+ new(OpCodes.Dup),
+ new(OpCodes.Stloc_S, ev.LocalIndex),
+
+ // Handlers.Player.OnIdlingTeslaTesla(ev);
+ new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnIdlingTesla))),
+ });
+
+ int labApiIsAllowedIndex = newInstructions.FindIndex(instruction => instruction.Calls(PropertyGetter(
+ typeof(LabApi.Events.Arguments.PlayerEvents.PlayerIdlingTeslaEventArgs),
+ nameof(LabApi.Events.Arguments.PlayerEvents.PlayerIdlingTeslaEventArgs.IsAllowed)))) + 1;
+
+ newInstructions.InsertRange(labApiIsAllowedIndex, new CodeInstruction[]
+ {
+ // if (e.IsAllowed && ev.IsAllowed)
+ new(OpCodes.Ldloc_S, ev.LocalIndex),
+ new(OpCodes.Callvirt, PropertyGetter(typeof(IdlingTeslaEventArgs), nameof(IdlingTeslaEventArgs.IsAllowed))),
+ new(OpCodes.And),
+ });
+
+ for (int z = 0; z < newInstructions.Count; z++)
+ yield return newInstructions[z];
+
+ ListPool.Pool.Return(newInstructions);
+ }
+ }
+}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs
new file mode 100644
index 0000000000..fd1c518296
--- /dev/null
+++ b/EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs
@@ -0,0 +1,59 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) ExMod Team. All rights reserved.
+// Licensed under the CC BY-SA 3.0 license.
+//
+// -----------------------------------------------------------------------
+
+namespace Exiled.Events.Patches.Events.Player
+{
+ using System.Collections.Generic;
+ using System.Reflection.Emit;
+
+ using Attributes;
+ using Exiled.API.Features.Pools;
+ using Exiled.Events.EventArgs.Player;
+ using Handlers;
+ using HarmonyLib;
+
+ using static HarmonyLib.AccessTools;
+
+ ///
+ /// Patches .
+ /// Adds the event.
+ ///
+ [EventPatch(typeof(Player), nameof(Player.TriggeredTesla))]
+ [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))]
+ internal static class TriggeredTesla
+ {
+ private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator)
+ {
+ List newInstructions = ListPool.Pool.Get(instructions);
+
+ int offset = 1;
+ int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.ServerSideCode)))) + offset;
+
+ newInstructions.InsertRange(index, new CodeInstruction[]
+ {
+ // Player.Get(hub2);
+ new(OpCodes.Ldloc_S, 5),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
+
+ // TeslaGate.Get(allGate);
+ new(OpCodes.Ldloc_1),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
+
+ // TriggeredTeslaEventArgs ev = new(Player, TeslaGate);
+ new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TriggeredTeslaEventArgs))[0]),
+
+ // Handlers.Player.OnTriggeredTesla(ev)
+ new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnTriggeredTesla))),
+ });
+
+ for (int z = 0; z < newInstructions.Count; z++)
+ yield return newInstructions[z];
+
+ ListPool.Pool.Return(newInstructions);
+ }
+ }
+}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
index d14539587e..ab8c81f70f 100644
--- a/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
+++ b/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
@@ -8,25 +8,21 @@
namespace Exiled.Events.Patches.Events.Player
{
using System.Collections.Generic;
- using System.Linq;
using System.Reflection.Emit;
- using API.Features;
+ using Attributes;
using Exiled.API.Features.Pools;
- using Exiled.Events.Attributes;
using Exiled.Events.EventArgs.Player;
+ using Handlers;
using HarmonyLib;
- using LabApi.Events.Arguments.PlayerEvents;
- using LabApi.Events.Handlers;
using static HarmonyLib.AccessTools;
- using BaseTeslaGate = TeslaGate;
-
///
/// Patches .
/// Adds the event.
///
+ [EventPatch(typeof(Player), nameof(Player.TriggeringTesla))]
[HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))]
internal static class TriggeringTesla
{
@@ -34,97 +30,46 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions);
- Label retLabel = generator.DefineLabel();
-
- const int offset = 1;
+ LocalBuilder ev = generator.DeclareLocal(typeof(TriggeringTeslaEventArgs));
- // remove the reference hub Foreach
- int index = newInstructions.FindIndex(instruction => instruction.Calls(PropertyGetter(typeof(ReferenceHub), nameof(ReferenceHub.AllHubs))));
+ int offset = 2;
+ int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.PlayerInRange)))) + offset;
- newInstructions.RemoveRange(index, newInstructions.FindIndex(i => i.opcode == OpCodes.Endfinally) + offset - index);
-
- newInstructions.InsertRange(
- index,
- new[]
- {
- // baseTeslaGate
- new CodeInstruction(OpCodes.Ldloc_1),
+ newInstructions.InsertRange(index, new CodeInstruction[]
+ {
+ // Player.Get(allHub);
+ new(OpCodes.Ldloc_S, 7),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
- // inIdleRange
- new CodeInstruction(OpCodes.Ldloca_S, 2),
+ // TeslaGate.Get(allGate);
+ new(OpCodes.Ldloc_1),
+ new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
- // isTriggerable
- new CodeInstruction(OpCodes.Ldloca_S, 3),
+ // TriggeringTeslaEventArgs ev = new(Player, TeslaGate);
+ new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TriggeringTeslaEventArgs))[0]),
+ new(OpCodes.Dup),
+ new(OpCodes.Stloc_S, ev.LocalIndex),
- // referenceHub
- new CodeInstruction(OpCodes.Ldloca_S, 4),
+ // Handlers.Player.OnTriggeringTesla(ev);
+ new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnTriggeringTesla))),
+ });
- // referenceHub2
- new CodeInstruction(OpCodes.Ldloca_S, 5),
+ int labApiIsAllowedIndex = newInstructions.FindIndex(instruction => instruction.Calls(PropertyGetter(
+ typeof(LabApi.Events.Arguments.PlayerEvents.PlayerTriggeringTeslaEventArgs),
+ nameof(LabApi.Events.Arguments.PlayerEvents.PlayerTriggeringTeslaEventArgs.IsAllowed)))) + 1;
- // TriggeringTesla.TriggeringTeslaEvent(BaseTeslaGate baseTeslaGate, ref bool inIdleRange, ref bool isTriggerable)
- new CodeInstruction(OpCodes.Call, Method(typeof(TriggeringTesla), nameof(TriggeringTeslaEvent), new[] { typeof(BaseTeslaGate), typeof(bool).MakeByRefType(), typeof(bool).MakeByRefType(), typeof(ReferenceHub).MakeByRefType(), typeof(ReferenceHub).MakeByRefType(), })),
- });
+ newInstructions.InsertRange(labApiIsAllowedIndex, new CodeInstruction[]
+ {
+ // if (e2.IsAllowed && ev.IsAllowed)
+ new(OpCodes.Ldloc_S, ev.LocalIndex),
+ new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringTeslaEventArgs), nameof(TriggeringTeslaEventArgs.IsAllowed))),
+ new CodeInstruction(OpCodes.And),
+ });
for (int z = 0; z < newInstructions.Count; z++)
yield return newInstructions[z];
ListPool.Pool.Return(newInstructions);
}
-
- private static void TriggeringTeslaEvent(BaseTeslaGate baseTeslaGate, ref bool inIdleRange, ref bool isTriggerable, ref ReferenceHub referenceHub, ref ReferenceHub referenceHub2)
- {
- TeslaGate teslaGate = TeslaGate.Get(baseTeslaGate);
-
- foreach (Player player in ReferenceHub.AllHubs.Select(Player.Get))
- {
- if (player is null || !teslaGate.CanBeIdle(player))
- continue;
-
- TriggeringTeslaEventArgs ev = new(player, teslaGate);
-
- Handlers.Player.OnTriggeringTesla(ev);
-
- if (ev.DisableTesla)
- {
- isTriggerable = false;
- inIdleRange = false;
- break;
- }
-
- if (!ev.IsAllowed)
- continue;
-
- if (ev.IsTriggerable && !isTriggerable && !teslaGate.IsShocking)
- {
- isTriggerable = ev.IsTriggerable;
- PlayerTriggeringTeslaEventArgs playerTriggeringTeslaEventArgs = new(player.ReferenceHub, teslaGate.Base);
- PlayerEvents.OnTriggeringTesla(playerTriggeringTeslaEventArgs);
- if (!playerTriggeringTeslaEventArgs.IsAllowed)
- {
- isTriggerable = false;
- }
- else
- {
- referenceHub2 = player.ReferenceHub;
- }
- }
-
- if (ev.IsInIdleRange && !inIdleRange)
- {
- inIdleRange = ev.IsInIdleRange;
- PlayerIdlingTeslaEventArgs playerIdlingTeslaEventArgs = new(player.ReferenceHub, teslaGate.Base);
- PlayerEvents.OnIdlingTesla(playerIdlingTeslaEventArgs);
- if (!playerIdlingTeslaEventArgs.IsAllowed)
- {
- inIdleRange = false;
- }
- else
- {
- referenceHub = player.ReferenceHub;
- }
- }
- }
- }
}
-}
+}
\ No newline at end of file
From e8cade2c5e3180a4a81c0a8a0c1aceb8cce2afce Mon Sep 17 00:00:00 2001
From: Unbistrackted <112902220+Unbistrackted@users.noreply.github.com>
Date: Wed, 1 Apr 2026 00:53:38 -0300
Subject: [PATCH 2/5] fix: TriggeringTesla patch simpler
---
.../EventArgs/Player/IdledTeslaEventArgs.cs | 43 -----------
.../EventArgs/Player/IdlingTeslaEventArgs.cs | 48 ------------
.../Player/TriggeredTeslaEventArgs.cs | 43 -----------
.../Player/TriggeringTeslaEventArgs.cs | 16 +++-
EXILED/Exiled.Events/Handlers/Player.cs | 32 --------
.../Patches/Events/Player/IdledTesla.cs | 59 ---------------
.../Patches/Events/Player/IdlingTesla.cs | 75 -------------------
.../Patches/Events/Player/TriggeredTesla.cs | 59 ---------------
.../Patches/Events/Player/TriggeringTesla.cs | 56 ++++++++++----
9 files changed, 58 insertions(+), 373 deletions(-)
delete mode 100644 EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs
delete mode 100644 EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs
delete mode 100644 EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs
delete mode 100644 EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs
delete mode 100644 EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs
delete mode 100644 EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs
diff --git a/EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs
deleted file mode 100644
index ddb6f4d9af..0000000000
--- a/EXILED/Exiled.Events/EventArgs/Player/IdledTeslaEventArgs.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// -----------------------------------------------------------------------
-//
-// Copyright (c) ExMod Team. All rights reserved.
-// Licensed under the CC BY-SA 3.0 license.
-//
-// -----------------------------------------------------------------------
-
-namespace Exiled.Events.EventArgs.Player
-{
- using API.Features;
- using Interfaces;
-
- ///
- /// Contains all information after Idling a tesla.
- ///
- public class IdledTeslaEventArgs : IPlayerEvent, ITeslaEvent
- {
- ///
- /// Initializes a new instance of the class.
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public IdledTeslaEventArgs(Player player, TeslaGate teslaGate)
- {
- Player = player;
- Tesla = teslaGate;
- }
-
- ///
- /// Gets the player who triggered the tesla.
- ///
- public Player Player { get; }
-
- ///
- /// Gets the Tesla.
- ///
- public TeslaGate Tesla { get; }
- }
-}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs
deleted file mode 100644
index 8b8864a326..0000000000
--- a/EXILED/Exiled.Events/EventArgs/Player/IdlingTeslaEventArgs.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-// -----------------------------------------------------------------------
-//
-// Copyright (c) ExMod Team. All rights reserved.
-// Licensed under the CC BY-SA 3.0 license.
-//
-// -----------------------------------------------------------------------
-
-namespace Exiled.Events.EventArgs.Player
-{
- using API.Features;
- using Interfaces;
-
- ///
- /// Contains all information before Idling a tesla.
- ///
- public class IdlingTeslaEventArgs : IPlayerEvent, ITeslaEvent, IDeniableEvent
- {
- ///
- /// Initializes a new instance of the class.
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public IdlingTeslaEventArgs(Player player, TeslaGate teslaGate)
- {
- Player = player;
- Tesla = teslaGate;
- }
-
- ///
- /// Gets the player who triggered the tesla.
- ///
- public Player Player { get; }
-
- ///
- /// Gets the Tesla.
- ///
- public TeslaGate Tesla { get; }
-
- ///
- /// Gets or sets a value indicating whether the player will be detected by the tesla.
- ///
- public bool IsAllowed { get; set; } = true;
- }
-}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs
deleted file mode 100644
index 37ce13c5e8..0000000000
--- a/EXILED/Exiled.Events/EventArgs/Player/TriggeredTeslaEventArgs.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// -----------------------------------------------------------------------
-//
-// Copyright (c) ExMod Team. All rights reserved.
-// Licensed under the CC BY-SA 3.0 license.
-//
-// -----------------------------------------------------------------------
-
-namespace Exiled.Events.EventArgs.Player
-{
- using API.Features;
- using Interfaces;
-
- ///
- /// Contains all information after triggering a tesla.
- ///
- public class TriggeredTeslaEventArgs : IPlayerEvent, ITeslaEvent
- {
- ///
- /// Initializes a new instance of the class.
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public TriggeredTeslaEventArgs(Player player, TeslaGate teslaGate)
- {
- Player = player;
- Tesla = teslaGate;
- }
-
- ///
- /// Gets the player who triggered the tesla.
- ///
- public Player Player { get; }
-
- ///
- /// Gets the Tesla.
- ///
- public TeslaGate Tesla { get; }
- }
-}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
index dfb25f9376..a5aab73f57 100644
--- a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
+++ b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
@@ -8,7 +8,6 @@
namespace Exiled.Events.EventArgs.Player
{
using API.Features;
-
using Interfaces;
///
@@ -45,5 +44,20 @@ public TriggeringTeslaEventArgs(Player player, TeslaGate teslaGate)
/// Gets or sets a value indicating whether the player will be detected by the tesla.
///
public bool IsAllowed { get; set; } = true;
+
+ ///
+ /// Gets or sets a value indicating whether the tesla will be deactivated (Both Idle and Activation).
+ ///
+ public bool DisableTesla { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the player will cause the tesla going to be activated.
+ ///
+ public bool IsTriggerable { get; set; } = true;
+
+ ///
+ /// Gets or sets a value indicating whether the tesla can Idle.
+ ///
+ public bool CanIdle { get; set; } = true;
}
}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Handlers/Player.cs b/EXILED/Exiled.Events/Handlers/Player.cs
index 7fc3386a7a..f11c6e0936 100644
--- a/EXILED/Exiled.Events/Handlers/Player.cs
+++ b/EXILED/Exiled.Events/Handlers/Player.cs
@@ -361,21 +361,6 @@ public class Player
///
public static Event TriggeringTesla { get; set; } = new();
- ///
- /// Invoked after a triggers a tesla gate.
- ///
- public static Event TriggeredTesla { get; set; } = new();
-
- ///
- /// Invoked before a idles a tesla gate.
- ///
- public static Event IdlingTesla { get; set; } = new();
-
- ///
- /// Invoked before a idles a tesla gate.
- ///
- public static Event IdledTesla { get; set; } = new();
-
///
/// Invoked before a unlocks a generator.
///
@@ -1025,12 +1010,6 @@ public static void OnReloadingWeapon(PlayerReloadingWeaponEventArgs ev)
/// The instance.
public static void OnTriggeringTesla(TriggeringTeslaEventArgs ev) => TriggeringTesla.InvokeSafely(ev);
- ///
- /// Called before a idles a tesla.
- ///
- /// The instance.
- public static void OnIdlingTesla(IdlingTeslaEventArgs ev) => IdlingTesla.InvokeSafely(ev);
-
///
/// Called before a receives a status effect.
///
@@ -1452,16 +1431,5 @@ public static void OnItemRemoved(ReferenceHub referenceHub, InventorySystem.Item
/// The instance.
public static void OnScp1576TransmissionEnded(Scp1576TransmissionEndedEventArgs ev) => Scp1576TransmissionEnded.InvokeSafely(ev);
- ///
- /// Called before a triggers a tesla.
- ///
- /// The instance.
- public static void OnTriggeredTesla(TriggeredTeslaEventArgs ev) => TriggeredTesla.InvokeSafely(ev);
-
- ///
- /// Called after a idles a tesla.
- ///
- /// The instance.
- public static void OnIdledTesla(IdledTeslaEventArgs ev) => IdledTesla.InvokeSafely(ev);
}
}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs
deleted file mode 100644
index 91e7a294f0..0000000000
--- a/EXILED/Exiled.Events/Patches/Events/Player/IdledTesla.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-// -----------------------------------------------------------------------
-//
-// Copyright (c) ExMod Team. All rights reserved.
-// Licensed under the CC BY-SA 3.0 license.
-//
-// -----------------------------------------------------------------------
-
-namespace Exiled.Events.Patches.Events.Player
-{
- using System.Collections.Generic;
- using System.Reflection.Emit;
-
- using Attributes;
- using Exiled.API.Features.Pools;
- using Exiled.Events.EventArgs.Player;
- using Handlers;
- using HarmonyLib;
-
- using static HarmonyLib.AccessTools;
-
- ///
- /// Patches .
- /// Adds the event.
- ///
- [EventPatch(typeof(Player), nameof(Player.IdledTesla))]
- [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))]
- public class IdledTesla
- {
- private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator)
- {
- List newInstructions = ListPool.Pool.Get(instructions);
-
- int offset = 1;
- int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.ServerSideIdle)))) + offset;
-
- newInstructions.InsertRange(index, new CodeInstruction[]
- {
- // Player.Get(hub);
- new(OpCodes.Ldloc_S, 4),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
-
- // TeslaGate.Get(allGate);
- new(OpCodes.Ldloc_1),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
-
- // IdledTeslaEventArgs ev = new(Player, TeslaGate);
- new(OpCodes.Newobj, GetDeclaredConstructors(typeof(IdledTeslaEventArgs))[0]),
-
- // Handlers.Player.OnIdledTesla(ev)
- new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnIdledTesla))),
- });
-
- for (int z = 0; z < newInstructions.Count; z++)
- yield return newInstructions[z];
-
- ListPool.Pool.Return(newInstructions);
- }
- }
-}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs
deleted file mode 100644
index 64db589515..0000000000
--- a/EXILED/Exiled.Events/Patches/Events/Player/IdlingTesla.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-// -----------------------------------------------------------------------
-//
-// Copyright (c) ExMod Team. All rights reserved.
-// Licensed under the CC BY-SA 3.0 license.
-//
-// -----------------------------------------------------------------------
-
-namespace Exiled.Events.Patches.Events.Player
-{
- using System.Collections.Generic;
- using System.Reflection.Emit;
-
- using Attributes;
- using Exiled.API.Features.Pools;
- using Exiled.Events.EventArgs.Player;
- using Handlers;
- using HarmonyLib;
-
- using static HarmonyLib.AccessTools;
-
- ///
- /// Patches .
- /// Adds the event.
- ///
- [EventPatch(typeof(Player), nameof(Player.IdlingTesla))]
- [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))]
- internal static class IdlingTesla
- {
- private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator)
- {
- List newInstructions = ListPool.Pool.Get(instructions);
-
- LocalBuilder ev = generator.DeclareLocal(typeof(IdlingTeslaEventArgs));
-
- int offset = 4;
- int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.IsInIdleRange), new[] { typeof(ReferenceHub) }))) + offset;
-
- newInstructions.InsertRange(index, new CodeInstruction[]
- {
- // Player.Get(allHub);
- new(OpCodes.Ldloc_S, 7),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
-
- // TeslaGate.Get(allGate);
- new(OpCodes.Ldloc_1),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
-
- // IdlingTeslaEventArgs ev = new(Player, TeslaGate);
- new(OpCodes.Newobj, GetDeclaredConstructors(typeof(IdlingTeslaEventArgs))[0]),
- new(OpCodes.Dup),
- new(OpCodes.Stloc_S, ev.LocalIndex),
-
- // Handlers.Player.OnIdlingTeslaTesla(ev);
- new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnIdlingTesla))),
- });
-
- int labApiIsAllowedIndex = newInstructions.FindIndex(instruction => instruction.Calls(PropertyGetter(
- typeof(LabApi.Events.Arguments.PlayerEvents.PlayerIdlingTeslaEventArgs),
- nameof(LabApi.Events.Arguments.PlayerEvents.PlayerIdlingTeslaEventArgs.IsAllowed)))) + 1;
-
- newInstructions.InsertRange(labApiIsAllowedIndex, new CodeInstruction[]
- {
- // if (e.IsAllowed && ev.IsAllowed)
- new(OpCodes.Ldloc_S, ev.LocalIndex),
- new(OpCodes.Callvirt, PropertyGetter(typeof(IdlingTeslaEventArgs), nameof(IdlingTeslaEventArgs.IsAllowed))),
- new(OpCodes.And),
- });
-
- for (int z = 0; z < newInstructions.Count; z++)
- yield return newInstructions[z];
-
- ListPool.Pool.Return(newInstructions);
- }
- }
-}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs
deleted file mode 100644
index fd1c518296..0000000000
--- a/EXILED/Exiled.Events/Patches/Events/Player/TriggeredTesla.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-// -----------------------------------------------------------------------
-//
-// Copyright (c) ExMod Team. All rights reserved.
-// Licensed under the CC BY-SA 3.0 license.
-//
-// -----------------------------------------------------------------------
-
-namespace Exiled.Events.Patches.Events.Player
-{
- using System.Collections.Generic;
- using System.Reflection.Emit;
-
- using Attributes;
- using Exiled.API.Features.Pools;
- using Exiled.Events.EventArgs.Player;
- using Handlers;
- using HarmonyLib;
-
- using static HarmonyLib.AccessTools;
-
- ///
- /// Patches .
- /// Adds the event.
- ///
- [EventPatch(typeof(Player), nameof(Player.TriggeredTesla))]
- [HarmonyPatch(typeof(TeslaGateController), nameof(TeslaGateController.FixedUpdate))]
- internal static class TriggeredTesla
- {
- private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator)
- {
- List newInstructions = ListPool.Pool.Get(instructions);
-
- int offset = 1;
- int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.ServerSideCode)))) + offset;
-
- newInstructions.InsertRange(index, new CodeInstruction[]
- {
- // Player.Get(hub2);
- new(OpCodes.Ldloc_S, 5),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
-
- // TeslaGate.Get(allGate);
- new(OpCodes.Ldloc_1),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
-
- // TriggeredTeslaEventArgs ev = new(Player, TeslaGate);
- new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TriggeredTeslaEventArgs))[0]),
-
- // Handlers.Player.OnTriggeredTesla(ev)
- new(OpCodes.Call, Method(typeof(Player), nameof(Player.OnTriggeredTesla))),
- });
-
- for (int z = 0; z < newInstructions.Count; z++)
- yield return newInstructions[z];
-
- ListPool.Pool.Return(newInstructions);
- }
- }
-}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
index ab8c81f70f..282bc2c49b 100644
--- a/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
+++ b/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
@@ -15,6 +15,8 @@ namespace Exiled.Events.Patches.Events.Player
using Exiled.Events.EventArgs.Player;
using Handlers;
using HarmonyLib;
+ using LabApi.Events.Arguments.PlayerEvents;
+ using LabApi.Events.Handlers;
using static HarmonyLib.AccessTools;
@@ -32,18 +34,18 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls(Method(typeof(TeslaGate), nameof(TeslaGate.PlayerInRange)))) + offset;
+ int offset = 1;
+ int index = newInstructions.FindIndex(instruction => instruction.Calls(Method(typeof(PlayerEvents), nameof(PlayerEvents.OnIdlingTesla)))) + offset;
newInstructions.InsertRange(index, new CodeInstruction[]
{
- // Player.Get(allHub);
- new(OpCodes.Ldloc_S, 7),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.Player), nameof(Exiled.API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
-
// TeslaGate.Get(allGate);
new(OpCodes.Ldloc_1),
- new(OpCodes.Call, Method(typeof(Exiled.API.Features.TeslaGate), nameof(Exiled.API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
+ new(OpCodes.Call, Method(typeof(API.Features.TeslaGate), nameof(API.Features.TeslaGate.Get), new[] { typeof(TeslaGate) })),
+
+ // Player.Get(allHub);
+ new(OpCodes.Ldloc_S, 7),
+ new(OpCodes.Call, Method(typeof(API.Features.Player), nameof(API.Features.Player.Get), new[] { typeof(ReferenceHub) })),
// TriggeringTeslaEventArgs ev = new(Player, TeslaGate);
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(TriggeringTeslaEventArgs))[0]),
@@ -54,16 +56,44 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls(PropertyGetter(
- typeof(LabApi.Events.Arguments.PlayerEvents.PlayerTriggeringTeslaEventArgs),
- nameof(LabApi.Events.Arguments.PlayerEvents.PlayerTriggeringTeslaEventArgs.IsAllowed)))) + 1;
+ int index1 = newInstructions.FindIndex(instruction => instruction.Calls(PropertyGetter(typeof(PlayerIdlingTeslaEventArgs), nameof(PlayerIdlingTeslaEventArgs.IsAllowed)))) + offset;
+
+ newInstructions.InsertRange(index1, new CodeInstruction[]
+ {
+ new(OpCodes.Ldloc_S, ev.LocalIndex),
+ new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringTeslaEventArgs), nameof(TriggeringTeslaEventArgs.IsAllowed))),
+ new(OpCodes.And),
+
+ new(OpCodes.Ldloc_S, ev.LocalIndex),
+ new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringTeslaEventArgs), nameof(TriggeringTeslaEventArgs.CanIdle))),
+ new(OpCodes.And),
+
+ new(OpCodes.Ldloc_S, ev.LocalIndex),
+ new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringTeslaEventArgs), nameof(TriggeringTeslaEventArgs.DisableTesla))),
+ new(OpCodes.Not),
+
+ // if (e.IsAllowed && ev.IsAllowed && ev.CanIdle && !ev.DisableTesla)
+ new(OpCodes.And),
+ });
+
+ int index2 = newInstructions.FindIndex(instruction => instruction.Calls(PropertyGetter(typeof(PlayerTriggeringTeslaEventArgs), nameof(PlayerTriggeringTeslaEventArgs.IsAllowed)))) + offset;
- newInstructions.InsertRange(labApiIsAllowedIndex, new CodeInstruction[]
+ newInstructions.InsertRange(index2, new CodeInstruction[]
{
- // if (e2.IsAllowed && ev.IsAllowed)
new(OpCodes.Ldloc_S, ev.LocalIndex),
new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringTeslaEventArgs), nameof(TriggeringTeslaEventArgs.IsAllowed))),
- new CodeInstruction(OpCodes.And),
+ new(OpCodes.And),
+
+ new(OpCodes.Ldloc_S, ev.LocalIndex),
+ new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringTeslaEventArgs), nameof(TriggeringTeslaEventArgs.IsTriggerable))),
+ new(OpCodes.And),
+
+ new(OpCodes.Ldloc_S, ev.LocalIndex),
+ new(OpCodes.Callvirt, PropertyGetter(typeof(TriggeringTeslaEventArgs), nameof(TriggeringTeslaEventArgs.DisableTesla))),
+ new(OpCodes.Not),
+
+ // if (e2.IsAllowed && ev.IsAllowed && ev.IsTriggerable && !ev.DisableTesla)
+ new(OpCodes.And),
});
for (int z = 0; z < newInstructions.Count; z++)
From 98757aa1182e4d9fd7a2a24a3f95e4ade746859f Mon Sep 17 00:00:00 2001
From: Unbistrackted <112902220+Unbistrackted@users.noreply.github.com>
Date: Wed, 1 Apr 2026 00:57:40 -0300
Subject: [PATCH 3/5] fix: remove blank line
---
EXILED/Exiled.Events/Handlers/Player.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/EXILED/Exiled.Events/Handlers/Player.cs b/EXILED/Exiled.Events/Handlers/Player.cs
index f11c6e0936..10cd09c601 100644
--- a/EXILED/Exiled.Events/Handlers/Player.cs
+++ b/EXILED/Exiled.Events/Handlers/Player.cs
@@ -1430,6 +1430,5 @@ public static void OnItemRemoved(ReferenceHub referenceHub, InventorySystem.Item
///
/// The instance.
public static void OnScp1576TransmissionEnded(Scp1576TransmissionEndedEventArgs ev) => Scp1576TransmissionEnded.InvokeSafely(ev);
-
}
}
\ No newline at end of file
From 6742a4a1fd573143c699de26d28a912127fb6ac7 Mon Sep 17 00:00:00 2001
From: Unbistrackted <112902220+Unbistrackted@users.noreply.github.com>
Date: Wed, 1 Apr 2026 10:23:00 -0300
Subject: [PATCH 4/5] fix: revert name changes
---
.../EventArgs/Player/TriggeringTeslaEventArgs.cs | 9 +++++++--
.../Patches/Events/Player/TriggeringTesla.cs | 2 +-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
index a5aab73f57..16c651e75a 100644
--- a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
+++ b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
@@ -56,8 +56,13 @@ public TriggeringTeslaEventArgs(Player player, TeslaGate teslaGate)
public bool IsTriggerable { get; set; } = true;
///
- /// Gets or sets a value indicating whether the tesla can Idle.
+ /// Gets or sets a value indicating whether the player will cause the tesla going to be idle.
+ /// IO
+ public bool IsInIdleRange { get; set; } = true;
+
+ ///
+ /// Gets a value indicating whether the player is in hurting range.
///
- public bool CanIdle { get; set; } = true;
+ public bool IsInHurtingRange => Tesla.IsPlayerInHurtRange(Player);
}
}
\ No newline at end of file
diff --git a/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs b/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
index 282bc2c49b..0c2c8ed002 100644
--- a/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
+++ b/EXILED/Exiled.Events/Patches/Events/Player/TriggeringTesla.cs
@@ -65,7 +65,7 @@ private static IEnumerable Transpiler(IEnumerable
Date: Wed, 1 Apr 2026 10:36:56 -0300
Subject: [PATCH 5/5] revert: ``IsInHurtingRange`` back to the original way
---
.../Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
index 16c651e75a..51755546cb 100644
--- a/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
+++ b/EXILED/Exiled.Events/EventArgs/Player/TriggeringTeslaEventArgs.cs
@@ -28,6 +28,7 @@ public TriggeringTeslaEventArgs(Player player, TeslaGate teslaGate)
{
Player = player;
Tesla = teslaGate;
+ IsInHurtingRange = Tesla.IsPlayerInHurtRange(player);
}
///
@@ -63,6 +64,6 @@ public TriggeringTeslaEventArgs(Player player, TeslaGate teslaGate)
///
/// Gets a value indicating whether the player is in hurting range.
///
- public bool IsInHurtingRange => Tesla.IsPlayerInHurtRange(Player);
+ public bool IsInHurtingRange { get; }
}
}
\ No newline at end of file