From 7310631d9d996ec8444a770674cadc6cbbd479d7 Mon Sep 17 00:00:00 2001 From: IRacle Date: Tue, 24 Dec 2024 20:39:47 +0300 Subject: [PATCH 1/3] feat/fix: microhid events --- .../ChangingMicroHIDPickupStateEventArgs.cs | 58 +++++++++++++++ EXILED/Exiled.Events/Handlers/Item.cs | 11 +++ .../Events/Player/ChangingMicroHIDState.cs | 70 ++++++++++++------- 3 files changed, 114 insertions(+), 25 deletions(-) create mode 100644 EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs diff --git a/EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs new file mode 100644 index 000000000..17372194a --- /dev/null +++ b/EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs @@ -0,0 +1,58 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) ExMod Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Item +{ + using Exiled.API.Features.Pickups; + + using Interfaces; + using InventorySystem.Items.MicroHID.Modules; + using InventorySystem.Items.Pickups; + + /// + /// Contains all information before MicroHID pickup state is changed. + /// + public class ChangingMicroHIDPickupStateEventArgs : IDeniableEvent, IPickupEvent + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public ChangingMicroHIDPickupStateEventArgs(ItemPickupBase microHID, MicroHidPhase newPhase, bool isAllowed = true) + { + MicroHID = (MicroHIDPickup)Pickup.Get(microHID); + NewPhase = newPhase; + IsAllowed = isAllowed; + } + + /// + /// Gets the MicroHID instance. + /// + public MicroHIDPickup MicroHID { get; } + + /// + /// Gets or sets the new MicroHID state. + /// + public MicroHidPhase NewPhase { get; set; } + + /// + /// Gets or sets a value indicating whether the MicroHID state can be changed. + /// + public bool IsAllowed { get; set; } + + /// + public Pickup Pickup => MicroHID; + } +} \ No newline at end of file diff --git a/EXILED/Exiled.Events/Handlers/Item.cs b/EXILED/Exiled.Events/Handlers/Item.cs index 22c8907a2..1c3f8b15e 100644 --- a/EXILED/Exiled.Events/Handlers/Item.cs +++ b/EXILED/Exiled.Events/Handlers/Item.cs @@ -53,6 +53,11 @@ public static class Item /// public static Event UsingRadioPickupBattery { get; set; } = new(); + /// + /// Invoked before a state is changed. + /// + public static Event ChangingMicroHIDPickupState { get; set; } = new(); + /// /// Called before the ammo of an firearm is changed. /// @@ -94,5 +99,11 @@ public static class Item /// /// The instance. public static void OnUsingRadioPickupBattery(UsingRadioPickupBatteryEventArgs ev) => UsingRadioPickupBattery.InvokeSafely(ev); + + /// + /// Called before a state is changed. + /// + /// The instance. + public static void OnChangingMicroHIDPickupState(ChangingMicroHIDPickupStateEventArgs ev) => ChangingMicroHIDPickupState.InvokeSafely(ev); } } \ No newline at end of file diff --git a/EXILED/Exiled.Events/Patches/Events/Player/ChangingMicroHIDState.cs b/EXILED/Exiled.Events/Patches/Events/Player/ChangingMicroHIDState.cs index c45000b67..fdab78241 100644 --- a/EXILED/Exiled.Events/Patches/Events/Player/ChangingMicroHIDState.cs +++ b/EXILED/Exiled.Events/Patches/Events/Player/ChangingMicroHIDState.cs @@ -14,6 +14,7 @@ namespace Exiled.Events.Patches.Events.Player using API.Features.Items; using API.Features.Pools; using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Item; using Exiled.Events.EventArgs.Player; using HarmonyLib; using InventorySystem.Items.MicroHID; @@ -34,43 +35,43 @@ private static IEnumerable Transpiler(IEnumerable newInstructions = ListPool.Pool.Get(instructions); Label returnLabel = generator.DefineLabel(); + Label pickupLabel = generator.DefineLabel(); + Label continueLabel = generator.DefineLabel(); - LocalBuilder ev = generator.DeclareLocal(typeof(ChangingMicroHIDStateEventArgs)); + LocalBuilder item = generator.DeclareLocal(typeof(MicroHIDItem)); int offset = 1; int index = newInstructions.FindIndex(x => x.opcode == OpCodes.Ret) + offset; newInstructions.InsertRange(index, new[] { - // Item.Get(this.Serial); + // MicroHIDItem item = Item.Get(this._prevItem); + // if (item is null) + // pickup code; + // else + // itemCode; new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Ldfld, Field(typeof(CycleController), nameof(CycleController.Serial))), - new(OpCodes.Call, GetDeclaredMethods(typeof(Item)).Find(x => !x.IsGenericMethod && x.IsStatic && x.GetParameters().FirstOrDefault()?.ParameterType == typeof(ushort))), + new(OpCodes.Ldfld, Field(typeof(CycleController), nameof(CycleController._prevItem))), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, item.LocalIndex), + new(OpCodes.Brfalse_S, pickupLabel), - // value - new(OpCodes.Ldarg_1), + // bool allowed = CallItemEvent(microHidItem, phase) + new(OpCodes.Ldloc_S, item.LocalIndex), + new(OpCodes.Ldarga_S, 1), + new(OpCodes.Call, Method(typeof(ChangingMicroHIDState), nameof(ChangingMicroHIDState.CallItemEvent))), - // true - new(OpCodes.Ldc_I4_1), + new CodeInstruction(OpCodes.Br_S, continueLabel), - // ChangerMicroHIDStateEventArgs ev = new(Item.Get(this.Serial), value, true); - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ChangingMicroHIDStateEventArgs))[0]), - new(OpCodes.Dup), - new(OpCodes.Dup), - new(OpCodes.Stloc_S, ev.LocalIndex), - - // Handlers.Player.OnChangingMicroHIDState(ev); - new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnChangingMicroHIDState))), + // bool allowed = CallPickupEvent(Serial, phase) + new CodeInstruction(OpCodes.Ldarg_0).WithLabels(pickupLabel), + new(OpCodes.Ldfld, Field(typeof(CycleController), nameof(CycleController.Serial))), + new(OpCodes.Ldarga_S, 1), + new(OpCodes.Call, Method(typeof(ChangingMicroHIDState), nameof(ChangingMicroHIDState.CallPickupEvent))), - // if (!ev.IsAllowed) + // if (!allowed) // return; - new(OpCodes.Callvirt, PropertyGetter(typeof(ChangingMicroHIDStateEventArgs), nameof(ChangingMicroHIDStateEventArgs.IsAllowed))), - new(OpCodes.Brfalse_S, returnLabel), - - // value = ev.NewPhase; - new(OpCodes.Ldloc_S, ev.LocalIndex), - new(OpCodes.Callvirt, PropertyGetter(typeof(ChangingMicroHIDStateEventArgs), nameof(ChangingMicroHIDStateEventArgs.NewPhase))), - new(OpCodes.Starg_S, 1), + new CodeInstruction(OpCodes.Brfalse_S, returnLabel).WithLabels(continueLabel), }); newInstructions[newInstructions.Count - 1].labels.Add(returnLabel); @@ -80,5 +81,24 @@ private static IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); } + + private static bool CallItemEvent(MicroHIDItem microHIDItem, ref MicroHidPhase phase) + { + ChangingMicroHIDStateEventArgs ev = new(microHIDItem, phase); + Handlers.Player.OnChangingMicroHIDState(ev); + phase = ev.NewPhase; + return ev.IsAllowed; + } + + private static bool CallPickupEvent(ushort serial, ref MicroHidPhase phase) + { + if (!MicroHIDPickup.PickupsBySerial.TryGetValue(serial, out MicroHIDPickup pickup)) + return true; + + ChangingMicroHIDPickupStateEventArgs ev = new(pickup, phase); + Handlers.Item.OnChangingMicroHIDPickupState(ev); + phase = ev.NewPhase; + return ev.IsAllowed; + } } -} \ No newline at end of file +} From a9ce9b565fc162cc350f59fc56d848a442161368 Mon Sep 17 00:00:00 2001 From: IRacle Date: Tue, 24 Dec 2024 21:21:48 +0300 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20nuh=20that=20build=20error?= =?UTF-8?q?=F0=9F=98=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventArgs/Player/ChangingMicroHIDStateEventArgs.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/EXILED/Exiled.Events/EventArgs/Player/ChangingMicroHIDStateEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/ChangingMicroHIDStateEventArgs.cs index f472a7096..2881241cd 100644 --- a/EXILED/Exiled.Events/EventArgs/Player/ChangingMicroHIDStateEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Player/ChangingMicroHIDStateEventArgs.cs @@ -12,6 +12,8 @@ namespace Exiled.Events.EventArgs.Player using API.Features; using API.Features.Items; using Interfaces; + + using InventorySystem.Items; using InventorySystem.Items.MicroHID; using InventorySystem.Items.MicroHID.Modules; @@ -32,9 +34,9 @@ public class ChangingMicroHIDStateEventArgs : IDeniableEvent, IItemEvent /// /// /// - public ChangingMicroHIDStateEventArgs(Item microHID, MicroHidPhase newPhase, bool isAllowed = true) + public ChangingMicroHIDStateEventArgs(ItemBase microHID, MicroHidPhase newPhase, bool isAllowed = true) { - MicroHID = microHID.As(); + MicroHID = Item.Get(microHID); NewPhase = newPhase; IsAllowed = isAllowed; } From b13cba569709009d1d2bce2cd78f80132c847b91 Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:32:27 +0100 Subject: [PATCH 3/3] Update EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs --- .../EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs index 17372194a..a70c37fde 100644 --- a/EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Item/ChangingMicroHIDPickupStateEventArgs.cs @@ -32,7 +32,7 @@ public class ChangingMicroHIDPickupStateEventArgs : IDeniableEvent, IPickupEvent /// public ChangingMicroHIDPickupStateEventArgs(ItemPickupBase microHID, MicroHidPhase newPhase, bool isAllowed = true) { - MicroHID = (MicroHIDPickup)Pickup.Get(microHID); + MicroHID = Pickup.Get(microHID); NewPhase = newPhase; IsAllowed = isAllowed; }