AI/Default/IdleActionState.cs
using Sandbox.Sboku;
using Sandbox.Sboku.Shared;
using System;

namespace Sandbox.AI.Default;
internal class IdleActionState : StateBase, IActionState
{
    public IdleActionState(SbokuBase bot) : base(bot)
    {
    }

    public override void Think()
    {
        if (Target == null)
        {
            (ISbokuTarget Target, float SquaredDistance)? saved = null;
            foreach (var tar in Bot.Scene.GetAllComponents<ISbokuTarget>())
            {
                var dist = Bot.WorldPosition.DistanceSquared(tar.WorldPosition);
                if (tar.IsEnemy && dist <= MathF.Pow(Bot.SearchRange, 2))
                {
                    if (saved == null || dist < saved.Value.SquaredDistance)
                    {
                        saved = new(tar, dist);
                    }
                }
            }

            if (saved != null)
                Bot.Target = saved.Value.Target;
        }

        if (Bot.Target != null)
        {
            if (Bot.WorldPosition.DistanceSquared(Bot.Target.GameObject.WorldPosition) > MathF.Pow(Bot.MaxFightRange, 2))
                Bot.SetActionState<ChaseState>();
            else
                Bot.SetActionState<TacticalState>();
        }
    }

    public override void OnSet()
    {
        Bot.StopNavigating();
    }
}