NPCs/EnemyAnimator.cs
using Sandbox;

namespace Opium.AI;

public partial class EnemyAnimator : AgentAnimator
{
	private void UpdateUpperState()
	{
		var stateMachine = Agent?.StateMachine;
		var chosenState = UpperBodyState.Default;

		if ( stateMachine is not null )
		{
			chosenState = stateMachine.CurrentState.GetUpperAnimationState();
		}

		UpperBodyState = chosenState;
	}

	private void UpdateLowerState()
	{
		var stateMachine = Agent?.StateMachine;
		var chosenState = LowerBodyState.Default;

		if ( stateMachine is not null )
		{
			chosenState = stateMachine.CurrentState.GetLowerAnimationState();
		}

		LowerBodyState = chosenState;
	}

	private void UpdateFullState()
	{
		var stateMachine = Agent?.StateMachine;
		FullBodyState? chosenState = null;

		if ( stateMachine is not null )
		{
			chosenState = stateMachine.CurrentState.GetFullBodyState();
		}

		if ( chosenState is not null )
		{
			IsFullBody = true;
			FullBodyState = chosenState.Value;
		}
		else
		{
			IsFullBody = false;
		}
	}

	protected override void OnUpdate()
	{
		UpdateUpperState();
		UpdateLowerState();
		UpdateFullState();

		base.OnUpdate();
	}
}