Pawn/SkateInput.cs
namespace Skateboard.Player;

public sealed class SkateInput : Component
{
	[Property] public SkatePawn Pawn { get; set; }

	[Sync] public Vector3 Move { get; private set; }
	[Sync] public Angles Look { get; private set; }
	[Sync] public bool JumpPressed { get; private set; }
	[Sync] public bool JumpHeld { get; private set; }
	[Sync] public bool FlipPressed { get; private set; }
	[Sync] public bool GrabPressed { get; private set; }
	[Sync] public bool GrindPressed { get; private set; }
	[Sync] public bool GrindHeld { get; private set; }
	[Sync] public bool RevertPressed { get; private set; }
	[Sync] public bool CrouchHeld { get; private set; }
	[Sync] public bool CrouchPressed { get; private set; }

	protected override void OnUpdate()
	{
		Pawn ??= Components.Get<SkatePawn>();

		if ( !IsLocallyControlled() )
			return;

		Move = Input.AnalogMove;
		Look = Input.AnalogLook;
		JumpPressed = Input.Pressed( "Jump" );
		JumpHeld = Input.Down( "Jump" );
		FlipPressed = Input.Pressed( "attack1" );
		GrabPressed = Input.Pressed( "attack2" );
		GrindPressed = Input.Pressed( "use" );
		GrindHeld = Input.Down( "use" );
		RevertPressed = Input.Pressed( "Run" );
		CrouchHeld = Input.Down( "Duck" );
		CrouchPressed = Input.Pressed( "Duck" );

	}

	private bool IsLocallyControlled()
	{
		if ( !Networking.IsActive )
			return true;

		if ( !Pawn.IsValid() )
			return false;

		return GameObject.Network.IsOwner || Pawn.OwningConnectionId == Connection.Local.Id;
	}

}