KitchenCombatAudio.cs
using Sandbox;
namespace PaintballBaddies;
public static class KitchenCombatAudio
{
private static readonly Dictionary<string,SoundEvent[]> banks=new();
private static readonly Dictionary<string,int> previous=new();
private static readonly List<SoundHandle> voices=new();
public static int Plays {get;private set;}
public static SoundHandle Play(string kind,Vector3 point)
{
if(kind is not ("bow" or "bolt" or "egg" or "bonk" or "concrete" or "swap"))return null;
if(!banks.TryGetValue(kind,out var bank))banks[kind]=bank=Enumerable.Range(0,4).Select(i=>new SoundEvent
{Sounds=[SoundFile.Load($"sounds/kitchen/{kind}_{i}.vsnd")],Volume=1,Pitch=1,Distance=1000,DistanceAttenuation=true,OcclusionEnabled=false,AirAbsorption=false,ReverbEnabled=false}).ToArray();
int take=previous.TryGetValue(kind,out var old) ? (old+Game.Random.Int(1,3))%4 : Game.Random.Int(0,3);previous[kind]=take;
voices.RemoveAll(v=>!v.IsPlaying);while(voices.Count>=12){voices[0].Stop();voices.RemoveAt(0);}
var handle=Sound.Play(bank[take],point);
if(handle is not null){handle.Volume=kind=="swap" ? .5f : .8f;handle.Pitch=Game.Random.Float(.98f,1.03f);voices.Add(handle);Plays++;}
return handle;
}
}