Spawners/BaseSpawner.cs
using System.Collections.Generic;

namespace Sandbox.Spawners;

public abstract class BaseSpawner: Component
{
	#region FIELDS
	[Property] public string SpawnerName { get; set; }
	[Property, Range( 1, 10000 )] public float Range { get; set; } = 256f;
	[Property, Range( 64, 1024 )] public int MaskResolution { get; set; } = 256;
	
	#endregion

	public override string ToString()
	{
		return $"{GetType().Name} - {SpawnerName}";
	}

	#region VIRTUAL FUNCTIONS

	/// <summary>
	/// handle cleaning or init
	/// </summary>
	public virtual void OnBeforeGenerate() { }

	public virtual void Generate() {}
	
	/// <summary>
	/// will see
	/// </summary>
	public virtual void OnGenerationFinished() { }

	public bool IsFinished() => _isFinished;

	protected bool _isFinished = false;
	#endregion

	#region UTILS

	public BBox GenerateSpawnerBounds()
	{
		return BBox.FromPositionAndSize(
			WorldPosition,
			new Vector3( Range, Range, 100f )
		);
	}
	
	protected ApexWorldManager Manager
	{
		get
		{
			if (Scene == null) return null;
			
			foreach (var gameObject in Scene.GetAllObjects(false))
			{
				var manager = gameObject.Components.Get<ApexWorldManager>();
				if (manager != null) return manager;
			}
			return null;
		}
	}
	
	
	protected List<Terrain> GetTerrainsInBounds( BBox bounds )
	{
		var manager = Manager;
		if ( manager == null ) return new List<Terrain>();

		return manager.GetWorldCache().GetTerrainsInBounds( bounds );
	}
	#endregion
	
	
}