diff --git a/EXILED/Exiled.Events/EventArgs/Player/ChangingDisruptorModeEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/ChangingDisruptorModeEventArgs.cs index 68fe52816d..699848459b 100644 --- a/EXILED/Exiled.Events/EventArgs/Player/ChangingDisruptorModeEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Player/ChangingDisruptorModeEventArgs.cs @@ -11,6 +11,7 @@ namespace Exiled.Events.EventArgs.Player using Exiled.API.Features; using Exiled.API.Features.Items; using Exiled.Events.EventArgs.Interfaces; + using InventorySystem.Items; /// /// Contains all information before disruptor's mode is changed. @@ -22,9 +23,9 @@ public class ChangingDisruptorModeEventArgs : IFirearmEvent /// /// /// - public ChangingDisruptorModeEventArgs(Item firearm, bool mode) + public ChangingDisruptorModeEventArgs(ItemBase firearm, bool mode) { - Firearm = firearm.As(); + Firearm = Item.Get(firearm).As(); NewMode = mode ? DisruptorMode.Disintegrator : DisruptorMode.BurstFire; } @@ -42,4 +43,4 @@ public ChangingDisruptorModeEventArgs(Item firearm, bool mode) /// public Player Player => Item.Owner; } -} \ No newline at end of file +} diff --git a/EXILED/Exiled.Events/Patches/Events/Player/ChangingDisruptorMode.cs b/EXILED/Exiled.Events/Patches/Events/Player/ChangingDisruptorMode.cs index 37aa6376bb..1263f56daa 100644 --- a/EXILED/Exiled.Events/Patches/Events/Player/ChangingDisruptorMode.cs +++ b/EXILED/Exiled.Events/Patches/Events/Player/ChangingDisruptorMode.cs @@ -1,4 +1,4 @@ -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------- // // Copyright (c) ExMod Team. All rights reserved. // Licensed under the CC BY-SA 3.0 license. @@ -8,15 +8,13 @@ namespace Exiled.Events.Patches.Events.Player { using System.Collections.Generic; - using System.Linq; using System.Reflection.Emit; - using Exiled.API.Features.Items; using Exiled.API.Features.Pools; using Exiled.Events.Attributes; using Exiled.Events.EventArgs.Player; using HarmonyLib; - using InventorySystem.Items; + using InventorySystem.Items.Firearms.Modules; using Mirror; @@ -30,36 +28,37 @@ namespace Exiled.Events.Patches.Events.Player [HarmonyPatch(typeof(DisruptorModeSelector), nameof(DisruptorModeSelector.ServerProcessCmd))] internal static class ChangingDisruptorMode { - private static IEnumerable Transpiler(IEnumerable instructions) + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) { List newInstructions = ListPool.Pool.Get(instructions); - int index = newInstructions.FindLastIndex(x => x.opcode == OpCodes.Ldarg_0); + LocalBuilder newMode = generator.DeclareLocal(typeof(bool)); + + int offset = 2; + int index = newInstructions.FindIndex(x => x.Calls(Method(typeof(NetworkReaderExtensions), nameof(NetworkReaderExtensions.ReadBool)))); - newInstructions.InsertRange(index, new CodeInstruction[] + newInstructions.InsertRange(index + offset, new CodeInstruction[] { - // Item.Get(this.Firearm); + // this.Firearm; new(OpCodes.Ldarg_0), new(OpCodes.Callvirt, PropertyGetter(typeof(DisruptorModeSelector), nameof(DisruptorModeSelector.Firearm))), - new(OpCodes.Call, GetDeclaredMethods(typeof(Item)).Find(x => !x.IsGenericMethod && x.GetParameters().FirstOrDefault()?.ParameterType == typeof(ItemBase))), - // reader.ReadBool(); - new(OpCodes.Ldarg_1), - new(OpCodes.Call, Method(typeof(NetworkReaderExtensions), nameof(NetworkReaderExtensions.ReadBool))), + // newMode; + new(OpCodes.Ldloc, newMode), - // ChangerDisruptorModeEventArgs ev = new(Item.Get(this.Firearm), reader.ReadBool(), true); + // ChangerDisruptorModeEventArgs ev = new(this.Firearm, newMode); new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ChangingDisruptorModeEventArgs))[0]), // Handlers.Player.OnChangingDisruptorMode(ev); new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnChangingDisruptorMode))), + }); - // reader.Position--; - new(OpCodes.Ldarg_1), - new(OpCodes.Ldarg_1), - new(OpCodes.Ldfld, Field(typeof(NetworkReader), nameof(NetworkReader.Position))), - new(OpCodes.Ldc_I4_M1), - new(OpCodes.Add), - new(OpCodes.Stfld, Field(typeof(NetworkReader), nameof(NetworkReader.Position))), + offset = 1; + newInstructions.InsertRange(index + offset, new CodeInstruction[] + { + // bool newMode = reader.ReadBool(); + new(OpCodes.Dup), + new(OpCodes.Stloc, newMode), }); for (int z = 0; z < newInstructions.Count; z++) @@ -68,4 +67,4 @@ private static IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); } } -} \ No newline at end of file +}