diff --git a/Content.Server/Audio/ContentAudioSystem.cs b/Content.Server/Audio/ContentAudioSystem.cs index f36d14cbaf..88ef49c1b6 100644 --- a/Content.Server/Audio/ContentAudioSystem.cs +++ b/Content.Server/Audio/ContentAudioSystem.cs @@ -3,32 +3,52 @@ using Content.Server.GameTicking; using Content.Server.GameTicking.Events; using Content.Shared.Audio; using Content.Shared.Audio.Events; +using Content.Shared.CCVar; using Content.Shared.GameTicking; using Robust.Server.Audio; using Robust.Shared.Audio; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Random; + namespace Content.Server.Audio; public sealed class ContentAudioSystem : SharedContentAudioSystem { - [ValidatePrototypeId] - private const string LobbyMusicCollection = "LobbyMusic"; - [Dependency] private readonly AudioSystem _serverAudio = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; - private SoundCollectionPrototype _lobbyMusicCollection = default!; + private SoundCollectionPrototype? _lobbyMusicCollection = default!; private string[]? _lobbyPlaylist; public override void Initialize() { base.Initialize(); - _lobbyMusicCollection = _prototypeManager.Index(LobbyMusicCollection); - _lobbyPlaylist = ShuffleLobbyPlaylist(); + //changes the music collection and reshuffles the playlist to update the lobby music + Subs.CVar( + _cfg, + CCVars.LobbyMusicCollection, + x => + { + //Checks to see if the sound collection exists. If it does change it if not defaults to null + // as the new _lobbyMusicCollection meaning it wont play anything in the lobby. + if(_prototypeManager.TryIndex(x, out var outputSoundCollection)) + { + _lobbyMusicCollection = outputSoundCollection; + } + else + { + Log.Error($"Invalid Lobby Music sound collection specified: {x}"); + _lobbyMusicCollection = null; + } + + _lobbyPlaylist = ShuffleLobbyPlaylist(); + }, + true); SubscribeLocalEvent(OnRoundEnd); SubscribeLocalEvent(OnPlayerJoinedLobby); @@ -76,11 +96,16 @@ public sealed class ContentAudioSystem : SharedContentAudioSystem private string[] ShuffleLobbyPlaylist() { + if (_lobbyMusicCollection == null) + { + return []; + } + var playlist = _lobbyMusicCollection.PickFiles .Select(x => x.ToString()) .ToArray(); - _robustRandom.Shuffle(playlist); + _robustRandom.Shuffle(playlist); - return playlist; + return playlist; } } diff --git a/Content.Shared/CCVar/CCVars.Audio.cs b/Content.Shared/CCVar/CCVars.Audio.cs index 4d9e7c4431..63e49ef532 100644 --- a/Content.Shared/CCVar/CCVars.Audio.cs +++ b/Content.Shared/CCVar/CCVars.Audio.cs @@ -1,4 +1,6 @@ -using Robust.Shared.Configuration; +using Content.Shared.Administration; +using Content.Shared.CCVar.CVarAccess; +using Robust.Shared.Configuration; namespace Content.Shared.CCVar; @@ -58,4 +60,10 @@ public sealed partial class CCVars public static readonly CVarDef InterfaceVolume = CVarDef.Create("audio.interface_volume", 0.50f, CVar.ARCHIVE | CVar.CLIENTONLY); + /// + /// Lobby music collection string + /// + [CVarControl(AdminFlags.VarEdit)] + public static readonly CVarDef LobbyMusicCollection = + CVarDef.Create("audio.lobby_music_collection", "LobbyMusic", CVar.REPLICATED | CVar.SERVER); }