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)