Helper/GrindAudioHelper.cs
namespace Skateboard.Player;

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

	[Property] private SoundEvent GrindSound { get; set; }

	private SoundHandle grindSound;
	private bool PreviouslyGrinding;

	protected override void OnUpdate()
	{
		var pawn = Pawn ?? Components.Get<SkatePawn>();
		if ( pawn is null )
			return;

		if ( !IsLocallyControlled( pawn ) )
			return;

		var pawnVelocity = pawn.Velocity.Length;
		if ( !pawn.Grinding )
		{
			if ( grindSound.IsValid() )
				grindSound.Stop();
			PreviouslyGrinding = false;
			return;
		}

		if ( !PreviouslyGrinding || !grindSound.IsValid() )
		{
			if ( grindSound.IsValid() )
				grindSound.Stop();
			grindSound = pawn.GameObject.PlaySound( GrindSound );
		}

		if ( grindSound.IsValid() )
		{
			grindSound.Volume = pawnVelocity * 0.01f;
			grindSound.Pitch = pawnVelocity * 0.005f;
		}

		PreviouslyGrinding = true;
	}

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

		if ( pawn.GameObject.Network.IsOwner )
			return true;

		return pawn.OwningConnectionId == Connection.Local.Id;
	}
}