From 148959f68cf5242a1eba08d789000e4fb0b9735b Mon Sep 17 00:00:00 2001 From: Jiraya <177346249+intjiraya@users.noreply.github.com> Date: Fri, 8 May 2026 23:40:05 +0200 Subject: [PATCH 1/2] fix: respect CustomWeapon ClipSize and preserve ammo on drop (#817) --- .../API/Features/CustomWeapon.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs b/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs index cc2e7f25bc..f0d3cd0783 100644 --- a/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs +++ b/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs @@ -71,7 +71,7 @@ public override ItemType Type /// public override Pickup? Spawn(Vector3 position, Player? previousOwner = null) { - if (Type.IsWeapon(false)) + if (!Type.IsWeapon(false)) { Log.Warn($"{nameof(Spawn)}: Item is not Firearm."); return null; @@ -79,6 +79,9 @@ public override ItemType Type Firearm firearm = Item.Create(Type); + if (ClipSize > 0) + firearm.MaxMagazineAmmo = ClipSize; + if (!Attachments.IsEmpty()) firearm.AddAttachment(Attachments); @@ -112,12 +115,12 @@ public override ItemType Type { if (item is Firearm firearm) { + if (ClipSize > 0) + firearm.MaxMagazineAmmo = ClipSize; + if (!Attachments.IsEmpty()) firearm.AddAttachment(Attachments); - if (ClipSize > 0) - firearm.MagazineAmmo = ClipSize; - int ammo = firearm.MagazineAmmo; Log.Debug($"{nameof(Name)}.{nameof(Spawn)}: Spawning weapon with {ammo} ammo."); Pickup? pickup = firearm.CreatePickup(position); @@ -141,6 +144,9 @@ public override void Give(Player player, bool displayMessage = true) if (item is Firearm firearm) { + if (ClipSize > 0) + firearm.MaxMagazineAmmo = ClipSize; + if (!Attachments.IsEmpty()) firearm.AddAttachment(Attachments); @@ -251,6 +257,8 @@ private void OnInternalReloaded(ReloadedWeaponEventArgs ev) if (ClipSize > 0) { + ev.Firearm.MaxMagazineAmmo = ClipSize; + int ammoChambered = ((AutomaticActionModule?)ev.Firearm.Base.Modules.FirstOrDefault(x => x is AutomaticActionModule))?.SyncAmmoChambered ?? 0; int ammoToGive = ClipSize - ammoChambered; From 040ee3a83d1e9e8fc4bc1e0b1efffb8648db0cef Mon Sep 17 00:00:00 2001 From: Jiraya <177346249+intjiraya@users.noreply.github.com> Date: Thu, 14 May 2026 14:30:10 +0200 Subject: [PATCH 2/2] fix(CustomItems): re-assert CustomWeapon ClipSize capacity in OnAcquired instead of on every reload --- .../API/Features/CustomWeapon.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs b/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs index 21c6138423..ab131c564d 100644 --- a/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs +++ b/EXILED/Exiled.CustomItems/API/Features/CustomWeapon.cs @@ -160,6 +160,19 @@ public override void Give(Player player, bool displayMessage = true) OnAcquired(player, item, displayMessage); } + /// + protected override void OnAcquired(Player player, Item item, bool displayMessage) + { + // MaxMagazineAmmo writes to MagazineModule._defaultCapacity, which is per-instance state and is not + // carried over when the item is re-created (e.g. dropped and picked back up). Re-assert it here so the + // custom ClipSize survives every base-game capacity clamp (reload, attachment changes) no matter how + // the weapon entered the inventory. + if (ClipSize > 0 && item is Firearm firearm) + firearm.MaxMagazineAmmo = ClipSize; + + base.OnAcquired(player, item, displayMessage); + } + /// protected override void SubscribeEvents() { @@ -257,8 +270,6 @@ private void OnInternalReloaded(ReloadedWeaponEventArgs ev) if (ClipSize > 0) { - ev.Firearm.MaxMagazineAmmo = ClipSize; - int ammoChambered = ((AutomaticActionModule?)ev.Firearm.Base.Modules.FirstOrDefault(x => x is AutomaticActionModule))?.SyncAmmoChambered ?? 0; int ammoToGive = ClipSize - ammoChambered;