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
+}