PlayerFootsteps.cs
using Sandbox;

namespace Facepunch.BombRoyale;

[Group( "Bomb Royale" )]
[Title( "Player Footsteps" )]
public sealed class PlayerFootsteps : Component
{
	[Property] private SkinnedModelRenderer ModelRenderer { get; set; }

	private TimeSince TimeSinceLastStep { get; set; }
	
	protected override void OnEnabled()
	{
		if ( !ModelRenderer.IsValid() )
			return;

		ModelRenderer.OnFootstepEvent += OnEvent;
	}

	protected override void OnDisabled()
	{
		if ( !ModelRenderer.IsValid() )
			return;

		ModelRenderer.OnFootstepEvent -= OnEvent;
	}
	
	private void OnEvent( SceneModel.FootstepEvent e )
	{
		if ( TimeSinceLastStep < 0.2f )
			return;

		var trace = Scene.Trace
			.Ray( e.Transform.Position + Vector3.Up * 20f, e.Transform.Position + Vector3.Up * -20f )
			.Run();

		if ( !trace.Hit )
			return;

		if ( trace.Surface is null )
			return;

		TimeSinceLastStep = 0f;

		var sound = e.FootId == 0 ? trace.Surface.SoundCollection.FootLeft : trace.Surface.SoundCollection.FootRight;
		if ( sound is null ) return;

		var handle = Sound.Play( sound, trace.HitPosition + trace.Normal * 5f );
		handle.Volume *= e.Volume;
	}
}