Files
tbd-station-14/Content.Client/Audio/ClientGlobalSoundSystem.cs

118 lines
3.4 KiB
C#

using Content.Shared.Audio;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Configuration;
using Robust.Shared.Player;
namespace Content.Client.Audio;
public sealed class ClientGlobalSoundSystem : SharedGlobalSoundSystem
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
// Admin music
private bool _adminAudioEnabled = true;
private List<EntityUid?> _adminAudio = new(1);
// Event sounds (e.g. nuke timer)
private bool _eventAudioEnabled = true;
private Dictionary<StationEventMusicType, EntityUid?> _eventAudio = new(1);
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestart);
SubscribeNetworkEvent<AdminSoundEvent>(PlayAdminSound);
Subs.CVar(_cfg, CCVars.AdminSoundsEnabled, ToggleAdminSound, true);
SubscribeNetworkEvent<StationEventMusicEvent>(PlayStationEventMusic);
SubscribeNetworkEvent<StopStationEventMusic>(StopStationEventMusic);
Subs.CVar(_cfg, CCVars.EventMusicEnabled, ToggleStationEventMusic, true);
SubscribeNetworkEvent<GameGlobalSoundEvent>(PlayGameSound);
}
private void OnRoundRestart(RoundRestartCleanupEvent ev)
{
ClearAudio();
}
public override void Shutdown()
{
base.Shutdown();
ClearAudio();
}
private void ClearAudio()
{
foreach (var stream in _adminAudio)
{
_audio.Stop(stream);
}
_adminAudio.Clear();
foreach (var stream in _eventAudio.Values)
{
_audio.Stop(stream);
}
_eventAudio.Clear();
}
private void PlayAdminSound(AdminSoundEvent soundEvent)
{
if(!_adminAudioEnabled) return;
var stream = _audio.PlayGlobal(soundEvent.Specifier, Filter.Local(), false, soundEvent.AudioParams);
_adminAudio.Add(stream?.Entity);
}
private void PlayStationEventMusic(StationEventMusicEvent soundEvent)
{
// Either the cvar is disabled or it's already playing
if(!_eventAudioEnabled || _eventAudio.ContainsKey(soundEvent.Type)) return;
var stream = _audio.PlayGlobal(soundEvent.Specifier, Filter.Local(), false, soundEvent.AudioParams);
_eventAudio.Add(soundEvent.Type, stream?.Entity);
}
private void PlayGameSound(GameGlobalSoundEvent soundEvent)
{
_audio.PlayGlobal(soundEvent.Specifier, Filter.Local(), false, soundEvent.AudioParams);
}
private void StopStationEventMusic(StopStationEventMusic soundEvent)
{
if (!_eventAudio.TryGetValue(soundEvent.Type, out var stream))
return;
_audio.Stop(stream);
_eventAudio.Remove(soundEvent.Type);
}
private void ToggleAdminSound(bool enabled)
{
_adminAudioEnabled = enabled;
if (_adminAudioEnabled) return;
foreach (var stream in _adminAudio)
{
_audio.Stop(stream);
}
_adminAudio.Clear();
}
private void ToggleStationEventMusic(bool enabled)
{
_eventAudioEnabled = enabled;
if (_eventAudioEnabled) return;
foreach (var stream in _eventAudio)
{
_audio.Stop(stream.Value);
}
_eventAudio.Clear();
}
}