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();
}
}