Player/Mechanics/CrouchMechanic.cs
namespace Opium;

public partial class CrouchMechanic : PlayerMechanic
{
	public override bool ShouldBecomeActive()
	{
		return Player.Input.WantsToCrouch && !HasTag( "sprint" ) && !HasTag( "takeover" );
	}

	bool CanUncrouch()
	{
		var tr = Player.CharacterController.TraceDirection( Vector3.Up * ( GetEyeHeight().Value ) );
		return !tr.Hit; // hit nothing - we can!
	}

	public override bool ShouldBecomeInactive()
	{
		if ( IsActive )
		{
			if ( !CanUncrouch() ) return false; 
		}

		return base.ShouldBecomeInactive();
	}

	public override IEnumerable<string> GetTags()
	{
		yield return "crouch";
	}

	public override float? GetEyeHeight()
	{
		return 32f;
	}

	public override float? GetGroundFriction()
	{
		return base.GetGroundFriction() * 2f;
	}

	public override float? GetSpeed()
	{
		return 77.0f;
	}
}