AmmoManager.cs
using Sandbox;
using System.Linq;

public sealed class AmmoManager : Component
{
	[Property, Category( "Setup" )] 
	public GameObject AmmoPrefab { get; set; }

	[Property, Category( "Settings" )] 
	public float SpawnInterval { get; set; } = 10f; // Як часто спавнити амуніцію (в секундах)
	
	[Property, Category( "Settings" )] 
	public int MaxActiveAmmo { get; set; } = 5; // Максимальна кількість амуніції одночасно на карті

	private TimeSince timeSinceLastSpawn;

	protected override void OnUpdate()
	{
		// Спавн контролюється лише хостом
		if ( !Networking.IsHost ) return;

		if ( timeSinceLastSpawn >= SpawnInterval )
		{
			TrySpawnAmmo();
			timeSinceLastSpawn = 0;
		}
	}

	private void TrySpawnAmmo()
	{
		if ( !AmmoPrefab.IsValid() ) return;

		// Рахуємо скільки амуніції зараз є на карті
		var currentAmmoList = Scene.GetAllComponents<AmmoPickup>().ToList();
		if ( currentAmmoList.Count >= MaxActiveAmmo ) return;

		// Знаходимо всі спавнери
		var spawners = Scene.GetAllComponents<AmmoSpawner>().ToList();
		if ( spawners.Count == 0 ) return;

		// Відфільтровуємо спавнери, біля яких ВЖЕ лежить амуніція (в радіусі 50 юнітів)
		var freeSpawners = spawners.Where( s => 
			!currentAmmoList.Any( a => a.WorldPosition.Distance( s.WorldPosition ) < 50f ) 
		).ToList();

		if ( freeSpawners.Count == 0 ) return;

		// Вибираємо рандомний вільний спавнер
		var randomSpawner = freeSpawners[System.Random.Shared.Next( 0, freeSpawners.Count )];

		// Спавнимо амуніцію
		var ammoObj = AmmoPrefab.Clone( randomSpawner.WorldPosition );
		ammoObj.NetworkSpawn();
	}
}