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();
}
}