diff --git a/Content.Client/Announcements/Systems/AnnouncerSystem.cs b/Content.Client/Announcements/Systems/AnnouncerSystem.cs new file mode 100644 index 0000000000..de76396f70 --- /dev/null +++ b/Content.Client/Announcements/Systems/AnnouncerSystem.cs @@ -0,0 +1,69 @@ +using Content.Client.Audio; +using Content.Shared.Announcements.Events; +using Content.Shared.Announcements.Systems; +using Content.Shared.CCVar; +using Robust.Client.Audio; +using Robust.Client.Player; +using Robust.Client.ResourceManagement; +using Robust.Shared.Audio.Sources; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; + +namespace Content.Client.Announcements.Systems; + +public sealed class AnnouncerSystem : SharedAnnouncerSystem +{ + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly IResourceCache _cache = default!; + [Dependency] private readonly IAudioManager _audioManager = default!; + + private IAudioSource? AnnouncerSource { get; set; } + private float AnnouncerVolume { get; set; } + + + public override void Initialize() + { + base.Initialize(); + + AnnouncerVolume = _config.GetCVar(CCVars.AnnouncerVolume) * 100f / ContentAudioSystem.AnnouncerMultiplier; + + SubscribeNetworkEvent(OnAnnouncementReceived); + _config.OnValueChanged(CCVars.AnnouncerVolume, OnAnnouncerVolumeChanged); + } + + public override void Shutdown() + { + base.Shutdown(); + + _config.UnsubValueChanged(CCVars.AnnouncerVolume, OnAnnouncerVolumeChanged); + } + + + private void OnAnnouncerVolumeChanged(float value) + { + AnnouncerVolume = value; + + if (AnnouncerSource != null) + AnnouncerSource.Gain = AnnouncerVolume; + } + + private void OnAnnouncementReceived(AnnouncementSendEvent ev) + { + if (!ev.Recipients.Contains(_player.LocalSession!.UserId) + || !_cache.TryGetResource(GetAnnouncementPath(ev.AnnouncementId, ev.AnnouncerId), + out var resource)) + return; + + var source = _audioManager.CreateAudioSource(resource); + if (source != null) + { + source.Gain = AnnouncerVolume * SharedAudioSystem.VolumeToGain(ev.AudioParams.Volume); + source.Global = true; + } + + AnnouncerSource?.Dispose(); + AnnouncerSource = source; + AnnouncerSource?.StartPlaying(); + } +} diff --git a/Content.Client/Audio/ContentAudioSystem.cs b/Content.Client/Audio/ContentAudioSystem.cs index f62b34b492..a79ff74e79 100644 --- a/Content.Client/Audio/ContentAudioSystem.cs +++ b/Content.Client/Audio/ContentAudioSystem.cs @@ -29,7 +29,8 @@ public sealed partial class ContentAudioSystem : SharedContentAudioSystem public const float AmbientMusicMultiplier = 3f; public const float LobbyMultiplier = 3f; public const float InterfaceMultiplier = 2f; - + public const float AnnouncerMultiplier = 3f; + public override void Initialize() { base.Initialize(); diff --git a/Content.Client/Options/UI/Tabs/AudioTab.xaml b/Content.Client/Options/UI/Tabs/AudioTab.xaml index e54b0dc34e..8dd723d446 100644 --- a/Content.Client/Options/UI/Tabs/AudioTab.xaml +++ b/Content.Client/Options/UI/Tabs/AudioTab.xaml @@ -100,6 +100,19 @@