This is the code.
function HandleAmmo(box) local Amount = box.Amount local GUI = box.GUI local AmountLabel = GUI.Frame.Amount local Debounce = false local function UpdateGUI() AmountLabel.Text = Amount.Value .. " ROUNDS" end UpdateGUI() box.Touched:connect(function(hit) if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then local GunScript for i, v in pairs(hit.Parent:GetChildren()) do if v:IsA("Tool") and v:FindFirstChild("Gun_Script") then GunScript = v.Gun_Script break end end if GunScript then Debounce = true local Give = GunScript.MaxAmmo.Value - GunScript.StoredAmmo.Value local Remaining = Amount.Value - Give if Remaining < 0 then Give = Give - math.abs(Remaining) end Amount.Value = Amount.Value - Give GunScript.StoredAmmo.Value = GunScript.StoredAmmo.Value + Give UpdateGUI() wait(2) Debounce = false end end end) end function CreateMaxValues(instance) for i, v in pairs(instance:GetChildren()) do if v:IsA("Tool") and v:FindFirstChild("Gun_Script") and not v:FindFirstChild("MaxAmmo") then local Max = Instance.new("IntValue", v.Gun_Script) Max.Name = "MaxAmmo" Max.Value = v.Gun_Script.StoredAmmo.Value else CreateMaxValues(v) end end end function GetAllAmmoCrates(instance) for i, v in pairs(instance:GetChildren()) do if v.Name == "AmmoCrate" and v:FindFirstChild("Amount") then HandleAmmo(v) elseif v:IsA("Model") then GetAllAmmoCrates(v) end end end CreateMaxValues(game.Lighting) CreateMaxValues(game.StarterPack) CreateMaxValues(workspace) CreateMaxValues(game:GetService("Teams")) GetAllAmmoCrates(workspace) Workspace.ChildAdded:connect(function(crate) if crate.Name == "AmmoCrate" and crate:FindFirstChild("Amount") then HandleAmmo(crate) end end)