Add API to change the sound of AmbientSoundComponent (#18115)

This commit is contained in:
Abbey Armbruster
2023-08-03 06:36:10 -04:00
committed by GitHub
parent 0a9164d857
commit f708a8dbf5
3 changed files with 27 additions and 11 deletions

View File

@@ -50,7 +50,7 @@ public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
/// </summary> /// </summary>
private int MaxSingleSound => (int) (_maxAmbientCount / (16.0f / 6.0f)); private int MaxSingleSound => (int) (_maxAmbientCount / (16.0f / 6.0f));
private readonly Dictionary<AmbientSoundComponent, (IPlayingAudioStream? Stream, string Sound)> _playingSounds = new(); private readonly Dictionary<AmbientSoundComponent, (IPlayingAudioStream? Stream, SoundSpecifier Sound, string Path)> _playingSounds = new();
private readonly Dictionary<string, int> _playingCount = new(); private readonly Dictionary<string, int> _playingCount = new();
public bool OverlayEnabled public bool OverlayEnabled
@@ -104,9 +104,9 @@ public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
return; return;
sound.Stream?.Stop(); sound.Stream?.Stop();
_playingCount[sound.Sound] -= 1; _playingCount[sound.Path] -= 1;
if (_playingCount[sound.Sound] == 0) if (_playingCount[sound.Path] == 0)
_playingCount.Remove(sound.Sound); _playingCount.Remove(sound.Path);
} }
private void SetAmbienceVolume(float value) private void SetAmbienceVolume(float value)
@@ -141,9 +141,9 @@ public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
{ {
var count = 0; var count = 0;
foreach (var (_, (_, sound)) in _playingSounds) foreach (var (_, (_, sound, path)) in _playingSounds)
{ {
if (sound.Equals(countSound)) if (path.Equals(countSound))
count++; count++;
} }
@@ -177,7 +177,7 @@ public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
private void ClearSounds() private void ClearSounds()
{ {
foreach (var (stream, _) in _playingSounds.Values) foreach (var (stream, _, _) in _playingSounds.Values)
{ {
stream?.Stop(); stream?.Stop();
} }
@@ -245,6 +245,8 @@ public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
var entity = comp.Owner; var entity = comp.Owner;
if (comp.Enabled && if (comp.Enabled &&
// Don't keep playing sounds that have changed since.
sound.Sound == comp.Sound &&
query.TryGetComponent(entity, out var xform) && query.TryGetComponent(entity, out var xform) &&
xform.MapID == playerXform.MapID && xform.MapID == playerXform.MapID &&
!metaQuery.GetComponent(entity).EntityPaused) !metaQuery.GetComponent(entity).EntityPaused)
@@ -259,9 +261,9 @@ public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
sound.Stream?.Stop(); sound.Stream?.Stop();
_playingSounds.Remove(comp); _playingSounds.Remove(comp);
_playingCount[sound.Sound] -= 1; _playingCount[sound.Path] -= 1;
if (_playingCount[sound.Sound] == 0) if (_playingCount[sound.Path] == 0)
_playingCount.Remove(sound.Sound); _playingCount.Remove(sound.Path);
} }
if (_playingSounds.Count >= _maxAmbientCount) if (_playingSounds.Count >= _maxAmbientCount)
@@ -301,7 +303,7 @@ public sealed class AmbientSoundSystem : SharedAmbientSoundSystem
if (stream == null) if (stream == null)
continue; continue;
_playingSounds[comp] = (stream, key); _playingSounds[comp] = (stream, comp.Sound, key);
playingCount++; playingCount++;
if (_playingSounds.Count >= _maxAmbientCount) if (_playingSounds.Count >= _maxAmbientCount)

View File

@@ -50,4 +50,5 @@ public sealed class AmbientSoundComponentState : ComponentState
public bool Enabled { get; init; } public bool Enabled { get; init; }
public float Range { get; init; } public float Range { get; init; }
public float Volume { get; init; } public float Volume { get; init; }
public SoundSpecifier Sound { get; init; } = default!;
} }

View File

@@ -1,3 +1,4 @@
using Robust.Shared.Audio;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
namespace Content.Shared.Audio; namespace Content.Shared.Audio;
@@ -45,12 +46,23 @@ public abstract class SharedAmbientSoundSystem : EntitySystem
Dirty(ambience); Dirty(ambience);
} }
public virtual void SetSound(EntityUid uid, SoundSpecifier sound, AmbientSoundComponent? ambience = null)
{
if (!Resolve(uid, ref ambience, false) || ambience.Sound == sound)
return;
ambience.Sound = sound;
QueueUpdate(uid, ambience);
Dirty(ambience);
}
private void HandleCompState(EntityUid uid, AmbientSoundComponent component, ref ComponentHandleState args) private void HandleCompState(EntityUid uid, AmbientSoundComponent component, ref ComponentHandleState args)
{ {
if (args.Current is not AmbientSoundComponentState state) return; if (args.Current is not AmbientSoundComponentState state) return;
SetAmbience(uid, state.Enabled, component); SetAmbience(uid, state.Enabled, component);
SetRange(uid, state.Range, component); SetRange(uid, state.Range, component);
SetVolume(uid, state.Volume, component); SetVolume(uid, state.Volume, component);
SetSound(uid, state.Sound, component);
} }
private void GetCompState(EntityUid uid, AmbientSoundComponent component, ref ComponentGetState args) private void GetCompState(EntityUid uid, AmbientSoundComponent component, ref ComponentGetState args)
@@ -60,6 +72,7 @@ public abstract class SharedAmbientSoundSystem : EntitySystem
Enabled = component.Enabled, Enabled = component.Enabled,
Range = component.Range, Range = component.Range,
Volume = component.Volume, Volume = component.Volume,
Sound = component.Sound,
}; };
} }
} }