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;