Example/Complex/PlayerWalkControllerComplex.Crouching.cs
using Sandbox;
namespace XMovement;

public partial class PlayerWalkControllerComplex : Component
{
	public float EyeHeightOffset;
	float LastEyeHeightOffset = 0;

	public void UpdateCrouching()
	{
		DoCrouching();
		Controller.Height = Height + EyeHeightOffset;
		// This moves our feet up when crouching in air
		var delta = LastEyeHeightOffset - EyeHeightOffset;
		if ( !Controller.IsOnGround )
		{
			var delmove = delta;
			delmove *= WorldScale.z;

			var offset = Vector3.Up * delmove;
			if ( !IsNoclipping )
			{
				Controller.MoveTo( Controller.WorldPosition + offset, true );
			}
			else
			{
				Controller.WorldPosition += offset;
			}
		}

		Head.LocalPosition = new Vector3( 0, 0, HeadHeight + EyeHeightOffset );
		LastEyeHeightOffset = EyeHeightOffset;
	}
	public virtual void DoCrouching()
	{
		var eyeHeightOffset = GetEyeHeightOffset();
		EyeHeightOffset = EyeHeightOffset.LerpTo( eyeHeightOffset, Time.Delta * 10f );
	}
	protected float GetEyeHeightOffset()
	{
		if ( IsCrouching ) return -36f;
		return 0f;
	}
}