diff --git a/Content.Server/Audio/ServerGlobalSoundSystem.cs b/Content.Server/Audio/ServerGlobalSoundSystem.cs index df8771df8d8..3d30be8eeae 100644 --- a/Content.Server/Audio/ServerGlobalSoundSystem.cs +++ b/Content.Server/Audio/ServerGlobalSoundSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Station.Systems; using Content.Shared.Audio; using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; using Robust.Shared.Console; using Robust.Shared.Player; @@ -10,6 +11,7 @@ public sealed class ServerGlobalSoundSystem : SharedGlobalSoundSystem { [Dependency] private readonly IConsoleHost _conHost = default!; [Dependency] private readonly StationSystem _stationSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; public override void Shutdown() { @@ -49,10 +51,14 @@ public void StopStationEventMusic(EntityUid source, StationEventMusicType type) } public void DispatchStationEventMusic(EntityUid source, SoundSpecifier sound, StationEventMusicType type) + { + DispatchStationEventMusic(source, _audio.GetSound(sound), type); + } + + public void DispatchStationEventMusic(EntityUid source, string sound, StationEventMusicType type) { var audio = AudioParams.Default.WithVolume(-8); - var soundFile = sound.GetSound(); - var msg = new StationEventMusicEvent(soundFile, type, audio); + var msg = new StationEventMusicEvent(sound, type, audio); var filter = GetStationAndPvs(source); RaiseNetworkEvent(msg, filter); diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs index 652852ece28..d6767cd2de8 100644 --- a/Content.Server/Nuke/NukeSystem.cs +++ b/Content.Server/Nuke/NukeSystem.cs @@ -46,7 +46,8 @@ public sealed class NukeSystem : EntitySystem /// /// Used to calculate when the nuke song should start playing for maximum kino with the nuke sfx /// - private const float NukeSongLength = 60f + 51.6f; + private float _nukeSongLength; + private string _selectedNukeSong = String.Empty; /// /// Time to leave between the nuke song and the nuke alarm playing. @@ -292,9 +293,9 @@ private void TickTimer(EntityUid uid, float frameTime, NukeComponent? nuke = nul // Start playing the nuke event song so that it ends a couple seconds before the alert sound // should play - if (nuke.RemainingTime <= NukeSongLength + nuke.AlertSoundTime + NukeSongBuffer && !nuke.PlayedNukeSong) + if (nuke.RemainingTime <= _nukeSongLength + nuke.AlertSoundTime + NukeSongBuffer && !nuke.PlayedNukeSong && !string.IsNullOrEmpty(_selectedNukeSong)) { - _sound.DispatchStationEventMusic(uid, nuke.ArmMusic, StationEventMusicType.Nuke); + _sound.DispatchStationEventMusic(uid, _selectedNukeSong, StationEventMusicType.Nuke); nuke.PlayedNukeSong = true; } @@ -457,6 +458,9 @@ public void ArmBomb(EntityUid uid, NukeComponent? component = null) var y = (int) pos.Y; var posText = $"({x}, {y})"; + // We are collapsing the randomness here, otherwise we would get separate random song picks for checking duration and when actually playing the song afterwards + _selectedNukeSong = _audio.GetSound(component.ArmMusic); + // warn a crew var announcement = Loc.GetString("nuke-component-announcement-armed", ("time", (int) component.RemainingTime), ("position", posText)); @@ -464,6 +468,7 @@ public void ArmBomb(EntityUid uid, NukeComponent? component = null) _chatSystem.DispatchStationAnnouncement(stationUid ?? uid, announcement, sender, false, null, Color.Red); _sound.PlayGlobalOnStation(uid, _audio.GetSound(component.ArmSound)); + _nukeSongLength = (float) _audio.GetAudioLength(_selectedNukeSong).TotalSeconds; // turn on the spinny light _pointLight.SetEnabled(uid, true);