diff --git a/Exiled.Events/Patches/Generic/Scp173BeingLooked.cs b/Exiled.Events/Patches/Generic/Scp173BeingLooked.cs index 343de298af..6e0e0d0be5 100644 --- a/Exiled.Events/Patches/Generic/Scp173BeingLooked.cs +++ b/Exiled.Events/Patches/Generic/Scp173BeingLooked.cs @@ -7,14 +7,19 @@ namespace Exiled.Events.Patches.Generic { -#pragma warning disable SA1313 + using System.Collections.Generic; + using System.Reflection.Emit; + using API.Features; + using Exiled.API.Features.Pools; using HarmonyLib; using PlayerRoles; using PlayerRoles.PlayableScps.Scp173; + using static HarmonyLib.AccessTools; + using ExiledEvents = Exiled.Events.Events; using Scp173Role = API.Features.Roles.Scp173Role; @@ -24,19 +29,47 @@ namespace Exiled.Events.Patches.Generic [HarmonyPatch(typeof(Scp173ObserversTracker), nameof(Scp173ObserversTracker.UpdateObserver))] internal static class Scp173BeingLooked { - private static bool Prefix(Scp173ObserversTracker __instance, ReferenceHub targetHub, ref int __result) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { - if (Player.Get(targetHub) is Player player && - ((player.Role.Type == RoleTypeId.Tutorial && - !ExiledEvents.Instance.Config.CanTutorialBlockScp173) || - Scp173Role.TurnedPlayers.Contains(player)) && - __instance.IsObservedBy(targetHub, 0.2f)) + List newInstructions = ListPool.Pool.Get(instructions); + + Label continueLabel = generator.DefineLabel(); + Label skipLabel = generator.DefineLabel(); + + newInstructions.InsertRange(0, new CodeInstruction[] { - __result = __instance.Observers.Remove(targetHub) ? -1 : 0; - return false; - } + // if(Scp173BeingLooked.HelpMethod(Scp173BeingLooked, ReferenceHub)) + // return this.Observers.Remove(ReferenceHub) ? -1 : 0; + new(OpCodes.Ldarg_0), + new(OpCodes.Ldarg_1), + new(OpCodes.Call, Method(typeof(Scp173BeingLooked), nameof(HelpMethod))), + + new(OpCodes.Brfalse_S, continueLabel), + + new(OpCodes.Ldarg_0), + new(OpCodes.Ldfld, Field(typeof(Scp173ObserversTracker), nameof(Scp173ObserversTracker.Observers))), + new(OpCodes.Ldarg_1), + new(OpCodes.Callvirt, Method(typeof(HashSet), nameof(HashSet.Remove))), + new(OpCodes.Brtrue_S, skipLabel), + + new(OpCodes.Ldc_I4_0), + new(OpCodes.Ret), - return true; + new CodeInstruction(OpCodes.Ldc_I4_M1).WithLabels(skipLabel), + new(OpCodes.Ret), + + new CodeInstruction(OpCodes.Nop).WithLabels(continueLabel), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + + private static bool HelpMethod(Scp173ObserversTracker instance, ReferenceHub targetHub) + { + return Player.Get(targetHub) is Player player && ((player.Role.Type == RoleTypeId.Tutorial && !ExiledEvents.Instance.Config.CanTutorialBlockScp173) || Scp173Role.TurnedPlayers.Contains(player)) && instance.IsObservedBy(targetHub, Scp173ObserversTracker.WidthMultiplier); } } } \ No newline at end of file