sasalka/Code/AI/Enemy.Footsteps.cs
2025-06-08 23:43:22 +03:00

57 lines
1.7 KiB
C#

public sealed partial class Enemy
{
public bool DebugFootsteps = false;
public bool EnableFootstepSounds = true;
private TimeSince _timeSinceStep;
private void OnFootstepEvent( SceneModel.FootstepEvent e )
{
if ( EnableFootstepSounds && !(_timeSinceStep < 0.2f) )
{
_timeSinceStep = 0f;
PlayFootstepSound( e.Transform.Position, e.Volume, e.FootId );
}
}
[Rpc.Broadcast]
public void PlayFootstepSound( Vector3 worldPosition, float volume, int foot )
{
SceneTrace trace = Scene.Trace;
Vector3 from = worldPosition + WorldRotation.Up * 10f;
Vector3 to = worldPosition + WorldRotation.Down * 20f;
SceneTraceResult sceneTraceResult = trace.Ray( in from, in to ).IgnoreGameObjectHierarchy( GameObject ).Run();
if ( !sceneTraceResult.Hit || sceneTraceResult.Surface == null )
{
if ( DebugFootsteps )
{
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), Color.Red, 10f, default, overlay: true );
}
return;
}
SoundEvent soundEvent = ResourceLibrary.Get<SoundEvent>( (foot == 0)
? sceneTraceResult.Surface.Sounds.FootLeft
: sceneTraceResult.Surface.Sounds.FootRight );
if ( soundEvent == null )
{
if ( DebugFootsteps )
{
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), Color.Orange, 10f, default, overlay: true );
}
return;
}
SoundHandle soundHandle = GameObject.PlaySound( soundEvent, 0f );
// soundHandle.TargetMixer = FootstepMixer.GetOrDefault();
// soundHandle.Volume *= volume * FootstepVolume;
if ( DebugFootsteps )
{
DebugOverlay.Sphere( new Sphere( worldPosition, volume ), default, 10f, default, overlay: true );
DebugOverlay.Text( worldPosition, soundEvent.ResourceName ?? "", 14f, TextFlag.LeftTop, default, 10f,
default );
}
}
}