Utilty/TemporaryNavBlocker.cs
namespace Opium.AI;

public partial class TemporaryNavBlocker : Component
{
	float lifetime;
	[Property] public float Lifetime
	{
		get => lifetime;
		set
		{
			lifetime = value;

			if ( value > 0f )
			{
				GameObject.DestroyAsync( Lifetime );
			}
		}
	}

	[Property] public Vector3 Scale { get; set; }
	[Property] public Vector3 Center { get; set; }

	protected override void OnEnabled()
	{
		var collider = GameObject.Components.Create<BoxCollider>();
		collider.Scale = Scale;
		collider.Center = Center;

		Scene.NavMesh.SetDirty();
	}

	protected override void OnDestroy()
	{
		Scene.NavMesh.SetDirty();
	}

	static TimeSince TimeSinceUpdate = 0; 
	protected override void OnUpdate()
	{
		if ( TimeSinceUpdate > 1 )
		{
			TimeSinceUpdate = 0;
			Scene.NavMesh.SetDirty();
		}
	}

	/// <summary>
	/// Creates a temporary nav blocker.
	/// </summary>
	/// <param name="pos"></param>
	/// <param name="size"></param>
	/// <param name="lifetime"></param>
	/// <returns></returns>
	public static TemporaryNavBlocker Create( Vector3 pos, Vector3 size, float lifetime = 10 )
	{
		var obj = Game.ActiveScene.CreateObject();
		obj.Name = "Nav Blocker";
		var blocker = obj.Components.Create<TemporaryNavBlocker>();
		blocker.Scale = size;
		blocker.Lifetime = lifetime;

		obj.Transform.Position = pos;

		return blocker;
	}
}