BotSpawner.cs
using Sandbox;
using System;
using System.Collections.Generic;

public sealed class BotSpawner : Component
{
	[Property] public GameObject BotPrefab { get; set; }
	[Property] public float SpawnInterval { get; set; } = 4f;
	[Property] public int MaxBots { get; set; } = 5;

	public static bool EnableBots { get; set; } = true;

	private List<GameObject> _activeBots = new();
	private TimeSince _timeSinceLastSpawn = 0;

	protected override void OnUpdate()
	{
		if ( !EnableBots ) return;

		if ( _timeSinceLastSpawn > SpawnInterval )
		{
			_timeSinceLastSpawn = 0;
			SpawnBot();
		}
	}

	private void SpawnBot()
	{
		if ( BotPrefab == null )
		{
			Log.Warning( "[BotSpawner] BotPrefab не назначен в Инспекторе!" );
			return;
		}

		
		_activeBots.RemoveAll( bot => !bot.IsValid() );

		if ( _activeBots.Count >= MaxBots ) return;

		
		var randomX = Random.Shared.Float( -100f, 100f );
		var randomY = Random.Shared.Float( -100f, 100f );
		var spawnPos = new Vector3( randomX, randomY, 400f );

		var botInstance = BotPrefab.Clone( spawnPos );
		if ( botInstance == null ) return;

		_activeBots.Add( botInstance );

		if ( Network.Active )
		{
			botInstance.NetworkSpawn();
		}

		Log.Info( $"[BotSpawner] Бот успешно заспавнен в {spawnPos}" );
	}
}