1
0

ClientGlobalSoundSystem.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using Content.Shared.Audio;
  2. using Content.Shared.CCVar;
  3. using Content.Shared.GameTicking;
  4. using Robust.Shared.Audio;
  5. using Robust.Shared.Audio.Systems;
  6. using Robust.Shared.Configuration;
  7. using Robust.Shared.Player;
  8. namespace Content.Client.Audio;
  9. public sealed class ClientGlobalSoundSystem : SharedGlobalSoundSystem
  10. {
  11. [Dependency] private readonly IConfigurationManager _cfg = default!;
  12. [Dependency] private readonly SharedAudioSystem _audio = default!;
  13. // Admin music
  14. private bool _adminAudioEnabled = true;
  15. private List<EntityUid?> _adminAudio = new(1);
  16. // Event sounds (e.g. nuke timer)
  17. private bool _eventAudioEnabled = true;
  18. private Dictionary<StationEventMusicType, EntityUid?> _eventAudio = new(1);
  19. public override void Initialize()
  20. {
  21. base.Initialize();
  22. SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestart);
  23. SubscribeNetworkEvent<AdminSoundEvent>(PlayAdminSound);
  24. Subs.CVar(_cfg, CCVars.AdminSoundsEnabled, ToggleAdminSound, true);
  25. SubscribeNetworkEvent<StationEventMusicEvent>(PlayStationEventMusic);
  26. SubscribeNetworkEvent<StopStationEventMusic>(StopStationEventMusic);
  27. Subs.CVar(_cfg, CCVars.EventMusicEnabled, ToggleStationEventMusic, true);
  28. SubscribeNetworkEvent<GameGlobalSoundEvent>(PlayGameSound);
  29. }
  30. private void OnRoundRestart(RoundRestartCleanupEvent ev)
  31. {
  32. ClearAudio();
  33. }
  34. public override void Shutdown()
  35. {
  36. base.Shutdown();
  37. ClearAudio();
  38. }
  39. private void ClearAudio()
  40. {
  41. foreach (var stream in _adminAudio)
  42. {
  43. _audio.Stop(stream);
  44. }
  45. _adminAudio.Clear();
  46. foreach (var stream in _eventAudio.Values)
  47. {
  48. _audio.Stop(stream);
  49. }
  50. _eventAudio.Clear();
  51. }
  52. private void PlayAdminSound(AdminSoundEvent soundEvent)
  53. {
  54. if(!_adminAudioEnabled) return;
  55. var stream = _audio.PlayGlobal(soundEvent.Specifier, Filter.Local(), false, soundEvent.AudioParams);
  56. _adminAudio.Add(stream?.Entity);
  57. }
  58. private void PlayStationEventMusic(StationEventMusicEvent soundEvent)
  59. {
  60. // Either the cvar is disabled or it's already playing
  61. if(!_eventAudioEnabled || _eventAudio.ContainsKey(soundEvent.Type)) return;
  62. var stream = _audio.PlayGlobal(soundEvent.Specifier, Filter.Local(), false, soundEvent.AudioParams);
  63. _eventAudio.Add(soundEvent.Type, stream?.Entity);
  64. }
  65. private void PlayGameSound(GameGlobalSoundEvent soundEvent)
  66. {
  67. _audio.PlayGlobal(soundEvent.Specifier, Filter.Local(), false, soundEvent.AudioParams);
  68. }
  69. private void StopStationEventMusic(StopStationEventMusic soundEvent)
  70. {
  71. if (!_eventAudio.TryGetValue(soundEvent.Type, out var stream))
  72. return;
  73. _audio.Stop(stream);
  74. _eventAudio.Remove(soundEvent.Type);
  75. }
  76. private void ToggleAdminSound(bool enabled)
  77. {
  78. _adminAudioEnabled = enabled;
  79. if (_adminAudioEnabled) return;
  80. foreach (var stream in _adminAudio)
  81. {
  82. _audio.Stop(stream);
  83. }
  84. _adminAudio.Clear();
  85. }
  86. private void ToggleStationEventMusic(bool enabled)
  87. {
  88. _eventAudioEnabled = enabled;
  89. if (_eventAudioEnabled) return;
  90. foreach (var stream in _eventAudio)
  91. {
  92. _audio.Stop(stream.Value);
  93. }
  94. _eventAudio.Clear();
  95. }
  96. }