ai/states/ai_seek_weapon_state.cs
// AiSeekWeaponState.cs
using Sandbox;

public sealed class AiSeekWeaponState : AiState
{
    public override string StateName => "SeekWeapon";
    private const float PickupDistance = 65f;
    private SkinnedModelRenderer Renderer => Brain.Movement?.AnimRenderer ?? Brain.Components.GetInChildren<SkinnedModelRenderer>();

    public override void OnEnter()
    {
        var rend = Renderer;
        if ( rend != null )
        {
            rend.Set( "in_combat", false );
            rend.Set( "in_combat_weight", 0.0f );
            rend.Set( "look_weight", 0.3f );
        }
    }

    public override void OnUpdate()
    {
        var itemObj = Blackboard.DesiredEquipmentDrop;

        if ( itemObj == null || !itemObj.IsValid )
        {
            Brain.TransitionTo<AiEngageState>();
            return;
        }

        Brain.Agent.MoveTo( itemObj.WorldPosition );

        // Fait pivoter le corps face à la direction de course
        var moveVel = Brain.Agent.Velocity.WithZ( 0 );
        if ( moveVel.LengthSquared > 25f )
        {
            var lookRot = Rotation.LookAt( moveVel.Normal, Vector3.Up );
            Brain.WorldRotation = Rotation.Slerp( Brain.WorldRotation, lookRot, Time.Delta * 12f );
        }
        else
        {
            var toItem = (itemObj.WorldPosition - Brain.WorldPosition).WithZ( 0 );
            if ( toItem.LengthSquared > 1f )
            {
                var lookRot = Rotation.LookAt( toItem.Normal, Vector3.Up );
                Brain.WorldRotation = Rotation.Slerp( Brain.WorldRotation, lookRot, Time.Delta * 10f );
            }
        }

        Renderer?.Set( "aim_target", itemObj.WorldPosition + Vector3.Up * 10f );

        var distToItem = (itemObj.WorldPosition - Brain.WorldPosition).Length;
        if ( distToItem <= PickupDistance )
        {
            var weapon = itemObj.Components.Get<Weapon>();
            if ( weapon != null && !weapon.IsEquipped )
            {
                Combat.EquipWeapon( weapon );
            }

            if ( Blackboard.DesiredEquipmentDrop == null )
            {
                Brain.TransitionTo<AiEngageState>();
            }
        }
    }

    public override void OnExit()
    {
        Brain.Agent?.Stop();
    }
}