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);
}
///