diff --git a/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs b/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs index 733e6317d2..9053cf2d66 100644 --- a/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs +++ b/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs @@ -221,7 +221,7 @@ protected virtual void OnChangingAttachment(ChangingAttachmentsEventArgs ev) private void OnInternalReloading(ReloadingWeaponEventArgs ev) { - if (!Check(ev.Player.CurrentItem)) + if (!Check(ev.Item)) return; if (ClipSize > 0 && ev.Firearm.TotalAmmo >= ClipSize) @@ -266,7 +266,7 @@ private void OnInternalReloaded(ReloadedWeaponEventArgs ev) private void OnInternalShooting(ShootingEventArgs ev) { - if (!Check(ev.Player.CurrentItem)) + if (!Check(ev.Item)) return; OnShooting(ev); @@ -274,7 +274,7 @@ private void OnInternalShooting(ShootingEventArgs ev) private void OnInternalShot(ShotEventArgs ev) { - if (!Check(ev.Player.CurrentItem)) + if (!Check(ev.Item)) return; OnShot(ev); @@ -340,4 +340,4 @@ private void OnInternalChangingAttachment(ChangingAttachmentsEventArgs ev) OnChangingAttachment(ev); } } -} \ No newline at end of file +} diff --git a/EXILED/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs index e35fc9f412..a33a3cabbc 100644 --- a/EXILED/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Player/ReloadingWeaponEventArgs.cs @@ -20,13 +20,13 @@ public class ReloadingWeaponEventArgs : IPlayerEvent, IFirearmEvent, IDeniableEv /// /// Initializes a new instance of the class. /// - /// - /// - /// - public ReloadingWeaponEventArgs(InventorySystem.Items.Firearms.Firearm firearm) + /// The firearm being reloaded. + /// A value indicating whether the weapon can be reloaded. + public ReloadingWeaponEventArgs(InventorySystem.Items.Firearms.Firearm firearm, bool isAllowed) { Firearm = Item.Get(firearm); Player = Firearm.Owner; + IsAllowed = isAllowed; } /// @@ -47,4 +47,4 @@ public ReloadingWeaponEventArgs(InventorySystem.Items.Firearms.Firearm firearm) /// public Player Player { get; } } -} \ No newline at end of file +} diff --git a/EXILED/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs index 68fc0df47c..2ac5ce4a2f 100644 --- a/EXILED/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Player/UnloadingWeaponEventArgs.cs @@ -21,12 +21,16 @@ public class UnloadingWeaponEventArgs : IPlayerEvent, IFirearmEvent, IDeniableEv /// Initializes a new instance of the class. /// /// - /// + /// The firearm being unloaded. /// - public UnloadingWeaponEventArgs(InventorySystem.Items.Firearms.Firearm firearm) + /// + /// Indicates whether the weapon unloading is allowed. + /// + public UnloadingWeaponEventArgs(InventorySystem.Items.Firearms.Firearm firearm, bool isAllowed) { Firearm = Item.Get(firearm); Player = Firearm.Owner; + IsAllowed = isAllowed; } /// @@ -47,4 +51,4 @@ public UnloadingWeaponEventArgs(InventorySystem.Items.Firearms.Firearm firearm) /// public Player Player { get; } } -} \ No newline at end of file +} diff --git a/EXILED/Exiled.Events/Events.cs b/EXILED/Exiled.Events/Events.cs index b2c8e47e19..1645fe20a1 100644 --- a/EXILED/Exiled.Events/Events.cs +++ b/EXILED/Exiled.Events/Events.cs @@ -89,6 +89,9 @@ public override void OnEnabled() ServerSpecificSettingsSync.ServerOnSettingValueReceived += SettingBase.OnSettingUpdated; + LabApi.Events.Handlers.PlayerEvents.ReloadingWeapon += Handlers.Player.OnReloadingWeapon; + LabApi.Events.Handlers.PlayerEvents.UnloadingWeapon += Handlers.Player.OnUnloadingWeapon; + ServerConsole.ReloadServerName(); } @@ -123,6 +126,9 @@ public override void OnDisabled() ItemPickupBase.OnPickupDestroyed -= Handlers.Internal.PickupEvent.OnRemovedPickup; ServerSpecificSettingsSync.ServerOnSettingValueReceived -= SettingBase.OnSettingUpdated; + + LabApi.Events.Handlers.PlayerEvents.ReloadingWeapon -= Handlers.Player.OnReloadingWeapon; + LabApi.Events.Handlers.PlayerEvents.UnloadingWeapon -= Handlers.Player.OnUnloadingWeapon; } /// diff --git a/EXILED/Exiled.Events/Handlers/Player.cs b/EXILED/Exiled.Events/Handlers/Player.cs index 590e4924d1..90c721dfd8 100644 --- a/EXILED/Exiled.Events/Handlers/Player.cs +++ b/EXILED/Exiled.Events/Handlers/Player.cs @@ -16,6 +16,7 @@ namespace Exiled.Events.Handlers using Exiled.Events.EventArgs.Player; using Exiled.Events.Features; + using LabApi.Events.Arguments.PlayerEvents; /// /// Player related events. @@ -884,7 +885,12 @@ public class Player /// Called before a reloads a weapon. /// /// The instance. - public static void OnReloadingWeapon(ReloadingWeaponEventArgs ev) => ReloadingWeapon.InvokeSafely(ev); + public static void OnReloadingWeapon(PlayerReloadingWeaponEventArgs ev) + { + ReloadingWeaponEventArgs exiledEv = new(ev.FirearmItem.Base, ev.IsAllowed); + ReloadingWeapon.InvokeSafely(exiledEv); + ev.IsAllowed = exiledEv.IsAllowed; + } /// /// Called after a reloads a weapon. @@ -992,7 +998,12 @@ public class Player /// Called before a unloads a weapon. /// /// The instance. - public static void OnUnloadingWeapon(UnloadingWeaponEventArgs ev) => UnloadingWeapon.InvokeSafely(ev); + public static void OnUnloadingWeapon(PlayerUnloadingWeaponEventArgs ev) + { + UnloadingWeaponEventArgs exiledEv = new(ev.FirearmItem.Base, ev.IsAllowed); + UnloadingWeapon.InvokeSafely(exiledEv); + ev.IsAllowed = exiledEv.IsAllowed; + } /// /// Called after a unloads a weapon. diff --git a/EXILED/Exiled.Events/Patches/Events/Player/ReloadingWeapon.cs b/EXILED/Exiled.Events/Patches/Events/Player/ReloadingWeapon.cs deleted file mode 100644 index 347e82bad1..0000000000 --- a/EXILED/Exiled.Events/Patches/Events/Player/ReloadingWeapon.cs +++ /dev/null @@ -1,103 +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 API.Features.Pools; - - using Exiled.API.Extensions; - using Exiled.Events.Attributes; - using Exiled.Events.EventArgs.Player; - using HarmonyLib; - using InventorySystem.Items.Firearms.Modules; - - using static HarmonyLib.AccessTools; - - /// - /// Patches . - /// Adds the and event. - /// - [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.ReloadingWeapon))] - [EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.UnloadingWeapon))] - [HarmonyPatch(typeof(AnimatorReloaderModuleBase), nameof(AnimatorReloaderModuleBase.ServerProcessCmd))] - internal static class ReloadingWeapon - { - private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) - { - List newInstructions = ListPool.Pool.Get(instructions); - - int offset = -2; - int index = newInstructions.FindIndex(x => x.Calls(Method(typeof(IReloadUnloadValidatorModule), nameof(IReloadUnloadValidatorModule.ValidateReload)))) + offset; - - Label stopMessage = generator.DefineLabel(); - - newInstructions.InsertRange( - index, - new[] - { - // this.Firearm - new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Callvirt, PropertyGetter(typeof(AnimatorReloaderModuleBase), nameof(AnimatorReloaderModuleBase.Firearm))), - - // ReloadingWeaponEventArgs ev = new(firearm) - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(ReloadingWeaponEventArgs))[0]), - new(OpCodes.Dup), - - // Player.OnReloadingWeapon(ev) - new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnReloadingWeapon))), - - // if (!ev.IsAllowed) - // this.SendRpc(NetworkWriter x => - // { - // x.WriteSubheader(AnimatorReloaderModuleBase.ReloaderMessageHeader.Stop); - // }, true); - new(OpCodes.Callvirt, PropertyGetter(typeof(ReloadingWeaponEventArgs), nameof(ReloadingWeaponEventArgs.IsAllowed))), - new(OpCodes.Brfalse, stopMessage), - }); - - offset = -2; - index = newInstructions.FindIndex(x => x.Calls(Method(typeof(IReloadUnloadValidatorModule), nameof(IReloadUnloadValidatorModule.ValidateUnload)))) + offset; - - newInstructions.InsertRange( - index, - new[] - { - // this.Firearm - new CodeInstruction(OpCodes.Ldarg_0).MoveLabelsFrom(newInstructions[index]), - new(OpCodes.Callvirt, PropertyGetter(typeof(AnimatorReloaderModuleBase), nameof(AnimatorReloaderModuleBase.Firearm))), - - // UnloadingWeaponEventArgs ev = new(firearm) - new(OpCodes.Newobj, GetDeclaredConstructors(typeof(UnloadingWeaponEventArgs))[0]), - new(OpCodes.Dup), - - // Player.OnUnloadingWeapon(ev) - new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnUnloadingWeapon))), - - // if (!ev.IsAllowed) - // this.SendRpc(NetworkWriter x => - // { - // x.WriteSubheader(AnimatorReloaderModuleBase.ReloaderMessageHeader.Stop); - // }, true); - new (OpCodes.Callvirt, PropertyGetter(typeof(UnloadingWeaponEventArgs), nameof(UnloadingWeaponEventArgs.IsAllowed))), - new(OpCodes.Brfalse, stopMessage), - }); - - offset = 2; - index = newInstructions.FindIndex(x => x.operand == (object)PropertyGetter(typeof(AnimatorReloaderModuleBase), nameof(AnimatorReloaderModuleBase.IsUnloading))) + offset; - - newInstructions[index].labels.Add(stopMessage); - - for (int z = 0; z < newInstructions.Count; z++) - yield return newInstructions[z]; - - ListPool.Pool.Return(newInstructions); - } - } -}