diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 88b306c6ad..4875aba0aa 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -330,11 +330,41 @@ public sealed partial class ChatSystem : SharedChatSystem _chatManager.ChatMessageToAll(ChatChannel.Radio, message, wrappedMessage, default, false, true, colorOverride); if (playSound) { - _audio.PlayGlobal(announcementSound?.GetSound() ?? DefaultAnnouncementSound, Filter.Broadcast(), true, AudioParams.Default.WithVolume(-2f)); + _audio.PlayGlobal(announcementSound == null ? DefaultAnnouncementSound : _audio.GetSound(announcementSound), Filter.Broadcast(), true, AudioParams.Default.WithVolume(-2f)); } _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Global station announcement from {sender}: {message}"); } + /// + /// Dispatches an announcement to players selected by filter. + /// + /// Filter to select players who will recieve the announcement + /// The contents of the message + /// The entity making the announcement (used to determine the station) + /// The sender (Communications Console in Communications Console Announcement) + /// Play the announcement sound + /// Sound to play + /// Optional color for the announcement message + public void DispatchFilteredAnnouncement( + Filter filter, + string message, + EntityUid? source = null, + string? sender = null, + bool playSound = true, + SoundSpecifier? announcementSound = null, + Color? colorOverride = null) + { + sender ??= Loc.GetString("chat-manager-sender-announcement"); + + var wrappedMessage = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender), ("message", FormattedMessage.EscapeText(message))); + _chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, wrappedMessage, source ?? default, false, true, colorOverride); + if (playSound) + { + _audio.PlayGlobal(announcementSound?.ToString() ?? DefaultAnnouncementSound, filter, true, AudioParams.Default.WithVolume(-2f)); + } + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Station Announcement from {sender}: {message}"); + } + /// /// Dispatches an announcement on a specific station /// @@ -370,7 +400,7 @@ public sealed partial class ChatSystem : SharedChatSystem if (playDefaultSound) { - _audio.PlayGlobal(announcementSound?.GetSound() ?? DefaultAnnouncementSound, filter, true, AudioParams.Default.WithVolume(-2f)); + _audio.PlayGlobal(announcementSound?.ToString() ?? DefaultAnnouncementSound, filter, true, AudioParams.Default.WithVolume(-2f)); } _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Station Announcement on {station} from {sender}: {message}"); diff --git a/Content.Server/GameTicking/GameTicker.Lobby.cs b/Content.Server/GameTicking/GameTicker.Lobby.cs index 82ef8c6012..61d9fd99ca 100644 --- a/Content.Server/GameTicking/GameTicker.Lobby.cs +++ b/Content.Server/GameTicking/GameTicker.Lobby.cs @@ -179,5 +179,11 @@ namespace Content.Server.GameTicking // update server info to reflect new ready count UpdateInfoText(); } + + public bool UserHasJoinedGame(ICommonSession session) + => UserHasJoinedGame(session.UserId); + + public bool UserHasJoinedGame(NetUserId userId) + => PlayerGameStatuses[userId] == PlayerGameStatus.JoinedGame; } } diff --git a/Content.Server/StationEvents/Events/StationEventSystem.cs b/Content.Server/StationEvents/Events/StationEventSystem.cs index c4c51afd2a..67643a8df5 100644 --- a/Content.Server/StationEvents/Events/StationEventSystem.cs +++ b/Content.Server/StationEvents/Events/StationEventSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Administration.Logs; using Content.Server.Chat.Systems; +using Content.Server.GameTicking; using Content.Server.GameTicking.Rules; using Content.Server.Station.Systems; using Content.Server.StationEvents.Components; @@ -21,6 +22,7 @@ public abstract class StationEventSystem : GameRuleSystem where T : ICompo [Dependency] protected readonly ChatSystem ChatSystem = default!; [Dependency] protected readonly SharedAudioSystem Audio = default!; [Dependency] protected readonly StationSystem StationSystem = default!; + [Dependency] protected readonly GameTicker GameTicker = default!; protected ISawmill Sawmill = default!; @@ -41,10 +43,13 @@ public abstract class StationEventSystem : GameRuleSystem where T : ICompo AdminLogManager.Add(LogType.EventAnnounced, $"Event added / announced: {ToPrettyString(uid)}"); - if (stationEvent.StartAnnouncement != null) - ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor); + // we don't want to send to players who aren't in game (i.e. in the lobby) + Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); - Audio.PlayGlobal(stationEvent.StartAudio, Filter.Broadcast(), true); + if (stationEvent.StartAnnouncement != null) + ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor); + + Audio.PlayGlobal(stationEvent.StartAudio, allPlayersInGame, true); } /// @@ -77,10 +82,13 @@ public abstract class StationEventSystem : GameRuleSystem where T : ICompo AdminLogManager.Add(LogType.EventStopped, $"Event ended: {ToPrettyString(uid)}"); - if (stationEvent.EndAnnouncement != null) - ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor); + // we don't want to send to players who aren't in game (i.e. in the lobby) + Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); - Audio.PlayGlobal(stationEvent.EndAudio, Filter.Broadcast(), true); + if (stationEvent.EndAnnouncement != null) + ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor); + + Audio.PlayGlobal(stationEvent.EndAudio, allPlayersInGame, true); } ///