Components/Footsteps.cs
using Sandbox.Audio;
namespace Clover.Components;
[Title( "Footsteps" )]
[Category( "Clover/Components" )]
public class Footsteps : Component
{
[Property] SkinnedModelRenderer Source { get; set; }
protected override void OnEnabled()
{
if ( !Source.IsValid() )
return;
Source.OnFootstepEvent += OnEvent;
}
protected override void OnDisabled()
{
if ( !Source.IsValid() )
return;
Source.OnFootstepEvent -= OnEvent;
}
TimeSince timeSinceStep;
private void OnEvent( SceneModel.FootstepEvent e )
{
if ( timeSinceStep < 0.1f )
return;
// Log.Info( "Footstep event" );
var tr = Scene.Trace
.Ray( e.Transform.Position + Vector3.Up * 20, e.Transform.Position + Vector3.Up * -20 )
.WithTag( "terrain" )
.Run();
if ( !tr.Hit )
return;
if ( tr.Surface is null )
return;
timeSinceStep = 0;
var sound = e.FootId == 0 ? tr.Surface.SoundCollection.FootLeft : tr.Surface.SoundCollection.FootRight;
if ( sound is null ) return;
var handle = Sound.Play( sound, tr.HitPosition + tr.Normal * 5 );
handle.TargetMixer = Mixer.FindMixerByName( "Footsteps" );
handle.Volume *= e.Volume * 5f;
Scene.RunEvent<IFootstepEvent>( x => x.OnFootstepEvent( e ) );
}
}
public interface IFootstepEvent
{
void OnFootstepEvent( SceneModel.FootstepEvent e );
}