diff --git a/Content.Server/Administration/UI/AdminAnnounceEui.cs b/Content.Server/Administration/UI/AdminAnnounceEui.cs index e6d17b5af4..aa3c7f8dc9 100644 --- a/Content.Server/Administration/UI/AdminAnnounceEui.cs +++ b/Content.Server/Administration/UI/AdminAnnounceEui.cs @@ -55,8 +55,7 @@ namespace Content.Server.Administration.UI break; // TODO: Per-station announcement support case AdminAnnounceType.Station: - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("Announce"), Filter.Broadcast(), - doAnnounce.Announcement, doAnnounce.Announcer, Color.Gold); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("Announce"), doAnnounce.Announcement, doAnnounce.Announcer, colorOverride:Color.Gold); break; } diff --git a/Content.Server/AlertLevel/AlertLevelSystem.cs b/Content.Server/AlertLevel/AlertLevelSystem.cs index 46b02c0e97..de57841bc0 100644 --- a/Content.Server/AlertLevel/AlertLevelSystem.cs +++ b/Content.Server/AlertLevel/AlertLevelSystem.cs @@ -161,10 +161,11 @@ public sealed class AlertLevelSystem : EntitySystem announcement = locAnnouncement; var alert = $"alert{char.ToUpperInvariant(level[0]) + level[1..]}"; + var filter = _stationSystem.GetInOwningStation(station); if (playSound) - _announcer.SendAnnouncementAudio(alert, _stationSystem.GetInOwningStation(station)); + _announcer.SendAnnouncementAudio(alert, filter); if (announce) - _announcer.SendAnnouncementMessage(alert, "alert-level-announcement", null, detail.Color, null, null, + _announcer.SendAnnouncementMessage(alert, "alert-level-announcement", null, filter, detail.Color, null, null, ("name", name), ("announcement", announcement)); RaiseLocalEvent(new AlertLevelChangedEvent(station, level)); diff --git a/Content.Server/Announcements/AnnounceCommand.cs b/Content.Server/Announcements/AnnounceCommand.cs index 088764ad27..c829fdd440 100644 --- a/Content.Server/Announcements/AnnounceCommand.cs +++ b/Content.Server/Announcements/AnnounceCommand.cs @@ -26,16 +26,16 @@ namespace Content.Server.Announcements shell.WriteError("Not enough arguments! Need at least 1."); return; case 1: - announcer.SendAnnouncement(announcer.GetAnnouncementId("CommandReport"), Filter.Broadcast(), - args[0], "Central Command", Color.Gold); + announcer.SendAnnouncement(announcer.GetAnnouncementId("CommandReport"), + args[0], Loc.GetString("chat-manager-sender-announcement"), colorOverride: Color.Gold); break; case 2: - announcer.SendAnnouncement(announcer.GetAnnouncementId("CommandReport"), Filter.Broadcast(), - args[1], args[0], Color.Gold); + announcer.SendAnnouncement(announcer.GetAnnouncementId("CommandReport"), + args[1], args[0], colorOverride: Color.Gold); break; case 3: - announcer.SendAnnouncement(announcer.GetAnnouncementId(args[2]), Filter.Broadcast(), args[1], - args[0], Color.Gold); + announcer.SendAnnouncement(announcer.GetAnnouncementId(args[2]), args[1], + args[0], colorOverride: Color.Gold); break; case 4: if (!proto.TryIndex(args[3], out AnnouncerPrototype? prototype)) @@ -43,8 +43,8 @@ namespace Content.Server.Announcements shell.WriteError($"No announcer prototype with ID {args[3]} found!"); return; } - announcer.SendAnnouncement(args[2], Filter.Broadcast(), args[1], args[0], Color.Gold, null, - prototype); + announcer.SendAnnouncement(args[2], args[1], args[0], colorOverride: Color.Gold, + announcerOverride: prototype); break; } diff --git a/Content.Server/Announcements/Systems/AnnouncerSystem.Announce.cs b/Content.Server/Announcements/Systems/AnnouncerSystem.Announce.cs index 3342bc9aef..33edf951a7 100644 --- a/Content.Server/Announcements/Systems/AnnouncerSystem.Announce.cs +++ b/Content.Server/Announcements/Systems/AnnouncerSystem.Announce.cs @@ -30,8 +30,9 @@ public sealed partial class AnnouncerSystem /// ID of the announcement to get information from /// Who hears the announcement audio /// Uses this announcer instead of the current global one - public void SendAnnouncementAudio(string announcementId, Filter filter, AnnouncerPrototype? announcerOverride = null) + public void SendAnnouncementAudio(string announcementId, Filter? filter = null, AnnouncerPrototype? announcerOverride = null) { + filter ??= Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); var ev = new AnnouncementSendEvent( announcerOverride?.ID ?? Announcer.ID, announcementId, @@ -48,15 +49,24 @@ public sealed partial class AnnouncerSystem /// ID of the announcement to get information from /// Text to send in the announcement /// Who to show as the announcement announcer, defaults to the current announcer's name + /// Who hears the announcement /// What color the announcement should be /// Station ID to send the announcement to /// Uses this announcer instead of the current global one /// Locale arguments to pass to the announcement message - public void SendAnnouncementMessage(string announcementId, string locale, string? sender = null, - Color? colorOverride = null, EntityUid? station = null, AnnouncerPrototype? announcerOverride = null, - params (string, object)[] localeArgs) + public void SendAnnouncementMessage( + string announcementId, + string locale, + string? sender = null, + Filter? filter = null, + Color? colorOverride = null, + EntityUid? station = null, + AnnouncerPrototype? announcerOverride = null, + params (string, object)[] localeArgs + ) { sender ??= Loc.GetString($"announcer-{announcerOverride?.ID ?? Announcer.ID}-name"); + filter ??= Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); // If the announcement has a message override, use that instead of the message parameter if (GetAnnouncementMessage(announcementId, announcerOverride?.ID ?? Announcer.ID) is { } announcementMessage) @@ -68,29 +78,33 @@ public sealed partial class AnnouncerSystem if (string.IsNullOrEmpty(locale)) return; - // If there is a station, send the announcement to the station, otherwise send it to everyone - if (station == null) - _chat.DispatchGlobalAnnouncement(locale, sender, false, colorOverride: colorOverride); - else - _chat.DispatchStationAnnouncement(station.Value, locale, sender, false, colorOverride: colorOverride); + _chat.DispatchFilteredAnnouncement(filter, locale, station, sender, false, colorOverride: colorOverride); } /// /// Sends an announcement with a message and audio /// /// ID of the announcement to get information from - /// Who hears the announcement audio /// Text to send in the announcement /// Who to show as the announcement announcer, defaults to the current announcer's name + /// Who hears the announcement /// What color the announcement should be /// Station ID to send the announcement to /// Uses this announcer instead of the current global one /// Locale arguments to pass to the announcement message - public void SendAnnouncement(string announcementId, Filter filter, string locale, string? sender = null, - Color? colorOverride = null, EntityUid? station = null, AnnouncerPrototype? announcerOverride = null, - params (string, object)[] localeArgs) + public void SendAnnouncement( + string announcementId, + string locale, + string? sender = null, + Filter? filter = null, + Color? colorOverride = null, + EntityUid? station = null, + AnnouncerPrototype? announcerOverride = null, + params (string, object)[] localeArgs + ) { + filter ??= Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); SendAnnouncementAudio(announcementId, filter, announcerOverride); - SendAnnouncementMessage(announcementId, locale, sender, colorOverride, station, announcerOverride, localeArgs); + SendAnnouncementMessage(announcementId, locale, sender, filter, colorOverride, station, announcerOverride, localeArgs); } } diff --git a/Content.Server/Announcements/Systems/AnnouncerSystem.cs b/Content.Server/Announcements/Systems/AnnouncerSystem.cs index 1770a2ce93..946ed3cd54 100644 --- a/Content.Server/Announcements/Systems/AnnouncerSystem.cs +++ b/Content.Server/Announcements/Systems/AnnouncerSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Chat.Systems; +using Content.Server.GameTicking; using Content.Shared.GameTicking; using Content.Shared.Announcements.Prototypes; using Content.Shared.Announcements.Systems; @@ -13,6 +14,7 @@ public sealed partial class AnnouncerSystem : SharedAnnouncerSystem [Dependency] private readonly IConfigurationManager _config = default!; [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly GameTicker GameTicker = default!; /// /// The currently selected announcer diff --git a/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs b/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs index 08910c9564..1edd2e5958 100644 --- a/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs +++ b/Content.Server/Chat/Systems/AnnounceOnSpawnSystem.cs @@ -17,7 +17,7 @@ public sealed class AnnounceOnSpawnSystem : EntitySystem private void OnInit(EntityUid uid, AnnounceOnSpawnComponent comp, MapInitEvent args) { var sender = comp.Sender != null ? Loc.GetString(comp.Sender) : Loc.GetString("chat-manager-sender-announcement"); - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("SpawnAnnounceCaptain"), Filter.Broadcast(), - comp.Message, sender, comp.Color); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("SpawnAnnounceCaptain"), + comp.Message, sender, colorOverride: comp.Color); } } diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 2a26d9f11f..cdad834f13 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -364,11 +364,41 @@ public sealed partial class ChatSystem : SharedChatSystem _chatManager.ChatMessageToAll(ChatChannel.Radio, message, wrappedMessage, default, false, true, colorOverride); if (playSound) { - _audio.PlayGlobal(announcementSound != null ? announcementSound.ToString() : 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 /// @@ -404,7 +434,7 @@ public sealed partial class ChatSystem : SharedChatSystem if (playDefaultSound) { - _audio.PlayGlobal(announcementSound != null ? announcementSound.ToString() : 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/Communications/CommsHackerSystem.cs b/Content.Server/Communications/CommsHackerSystem.cs index 4d149ca1ad..da8ef6c94f 100644 --- a/Content.Server/Communications/CommsHackerSystem.cs +++ b/Content.Server/Communications/CommsHackerSystem.cs @@ -82,7 +82,7 @@ public sealed class CommsHackerSystem : SharedCommsHackerSystem public void CallInThreat(NinjaHackingThreatPrototype ninjaHackingThreat) { _gameTicker.StartGameRule(ninjaHackingThreat.Rule, out _); - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("NinjaHacking"), Filter.Broadcast(), + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("NinjaHacking"), ninjaHackingThreat.Announcement, colorOverride: Color.Red); } } diff --git a/Content.Server/Communications/CommunicationsConsoleSystem.cs b/Content.Server/Communications/CommunicationsConsoleSystem.cs index 5d8e15e209..4049e000e0 100644 --- a/Content.Server/Communications/CommunicationsConsoleSystem.cs +++ b/Content.Server/Communications/CommunicationsConsoleSystem.cs @@ -267,15 +267,14 @@ namespace Content.Server.Communications msg += $"\n{Loc.GetString("comms-console-announcement-sent-by")} {author}"; if (comp.Global) { - _announcer.SendAnnouncement("announce", Filter.Broadcast(), msg, title, comp.Color); + _announcer.SendAnnouncement("announce", msg, title, colorOverride: comp.Color); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following global announcement: {msg}"); return; } if (TryComp(_stationSystem.GetOwningStation(uid), out var stationData)) - _announcer.SendAnnouncement("announce", _stationSystem.GetInStation(stationData), msg, title, - comp.Color); + _announcer.SendAnnouncement("announce", msg, title, _stationSystem.GetInStation(stationData), comp.Color); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following station announcement: {msg}"); diff --git a/Content.Server/Dragon/DragonRiftSystem.cs b/Content.Server/Dragon/DragonRiftSystem.cs index b0dd87d3fd..e916a8ceab 100644 --- a/Content.Server/Dragon/DragonRiftSystem.cs +++ b/Content.Server/Dragon/DragonRiftSystem.cs @@ -72,7 +72,7 @@ public sealed class DragonRiftSystem : EntitySystem comp.State = DragonRiftState.AlmostFinished; Dirty(uid, comp); - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("CarpRift"), Filter.Broadcast(), + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("CarpRift"), "carp-rift-warning", colorOverride: Color.Red, localeArgs: ("location", FormattedMessage.RemoveMarkupPermissive(_navMap.GetNearestBeaconString((uid, xform))))); _navMap.SetBeaconEnabled(uid, true); } diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index b84fc4ebfa..dd99eeec3a 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -590,7 +590,7 @@ namespace Content.Server.GameTicking DisallowLateJoin = false; _playerGameStatuses.Clear(); - + foreach (var session in _playerManager.Sessions) _playerGameStatuses[session.UserId] = LobbyEnabled ? PlayerGameStatus.NotReadyToPlay : PlayerGameStatus.ReadyToPlay; } @@ -651,8 +651,7 @@ namespace Content.Server.GameTicking var proto = _robustRandom.Pick(options); - _announcer.SendAnnouncement(_announcer.GetAnnouncementId(proto.ID), Filter.Broadcast(), - proto.Message ?? "game-ticker-welcome-to-the-station"); + _announcer.SendAnnouncement(_announcer.GetAnnouncementId(proto.ID), proto.Message ?? "game-ticker-welcome-to-the-station"); } private async void SendRoundStartedDiscordMessage() diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index c967edac22..e2491f44d3 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -123,7 +123,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem foreach (var station in _station.GetStations()) { _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleCalled"), - _station.GetInOwningStation(station), "zombie-shuttle-call", + "zombie-shuttle-call", filter: _station.GetInOwningStation(station), colorOverride: Color.Crimson); } _roundEnd.RequestRoundEnd(null, false); diff --git a/Content.Server/Nuke/NukeCodePaperSystem.cs b/Content.Server/Nuke/NukeCodePaperSystem.cs index f1d3f2ff97..c802336567 100644 --- a/Content.Server/Nuke/NukeCodePaperSystem.cs +++ b/Content.Server/Nuke/NukeCodePaperSystem.cs @@ -80,7 +80,7 @@ namespace Content.Server.Nuke } if (wasSent) - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("NukeCodes"), Filter.Broadcast(), + _announcer.SendAnnouncement(_announcer.GetAnnouncementId("NukeCodes"), "nuke-component-announcement-send-codes", colorOverride: Color.Red); return wasSent; diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs index 653be7ccb5..8b3a6574b1 100644 --- a/Content.Server/Nuke/NukeSystem.cs +++ b/Content.Server/Nuke/NukeSystem.cs @@ -459,10 +459,12 @@ public sealed class NukeSystem : EntitySystem _announcer.GetAnnouncementId("NukeArm"), "nuke-component-announcement-armed", Loc.GetString("nuke-component-announcement-sender"), + null, Color.Red, stationUid ?? uid, null, - ("time", (int) component.RemainingTime), ("location", FormattedMessage.RemoveMarkupPermissive(_navMap.GetNearestBeaconString((uid, nukeXform)))) + ("time", (int) component.RemainingTime), + ("location", FormattedMessage.RemoveMarkupPermissive(_navMap.GetNearestBeaconString((uid, nukeXform)))) ); _sound.PlayGlobalOnStation(uid, _audio.GetSound(component.ArmSound)); diff --git a/Content.Server/NukeOps/WarDeclaratorSystem.cs b/Content.Server/NukeOps/WarDeclaratorSystem.cs index 04f0b069f1..2536697557 100644 --- a/Content.Server/NukeOps/WarDeclaratorSystem.cs +++ b/Content.Server/NukeOps/WarDeclaratorSystem.cs @@ -74,7 +74,7 @@ public sealed class WarDeclaratorSystem : EntitySystem if (ev.Status == WarConditionStatus.WarReady) { var title = Loc.GetString(ent.Comp.SenderTitle); - _announcer.SendAnnouncement("war", Filter.Broadcast(), ent.Comp.Message, title, ent.Comp.Color); + _announcer.SendAnnouncement("war", ent.Comp.Message, title, colorOverride: ent.Comp.Color); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(args.Actor):player} has declared war with this text: {ent.Comp.Message}"); } diff --git a/Content.Server/PowerSink/PowerSinkSystem.cs b/Content.Server/PowerSink/PowerSinkSystem.cs index 903cb7ce12..06f87b8665 100644 --- a/Content.Server/PowerSink/PowerSinkSystem.cs +++ b/Content.Server/PowerSink/PowerSinkSystem.cs @@ -128,9 +128,12 @@ namespace Content.Server.PowerSink if (station == null) return; - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("PowerSinkExplosion"), - _station.GetInOwningStation(station.Value), "powersink-immiment-explosion-announcement", - colorOverride: Color.Yellow, station: station.Value); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("PowerSinkExplosion"), + "powersink-immiment-explosion-announcement", + filter: _station.GetInOwningStation(station.Value), + colorOverride: Color.Yellow, + station: station.Value); } } } diff --git a/Content.Server/RoundEnd/RoundEndSystem.cs b/Content.Server/RoundEnd/RoundEndSystem.cs index fe05f69d4a..00daa7a41e 100644 --- a/Content.Server/RoundEnd/RoundEndSystem.cs +++ b/Content.Server/RoundEnd/RoundEndSystem.cs @@ -182,15 +182,12 @@ namespace Content.Server.RoundEnd units = "eta-units-minutes"; } - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleCalled"), - Filter.Broadcast(), + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleCalled"), text, name, - Color.Gold, - null, - null, - ("time", time), - ("units", Loc.GetString(units)) + colorOverride: Color.Gold, + localeArgs: [("time", time), ("units", Loc.GetString(units)), ] ); LastCountdownStart = _gameTiming.CurTime; @@ -238,10 +235,9 @@ namespace Content.Server.RoundEnd _announcer.SendAnnouncement( _announcer.GetAnnouncementId("ShuttleRecalled"), - Filter.Broadcast(), "round-end-system-shuttle-recalled-announcement", Loc.GetString("Station"), - Color.Gold + colorOverride: Color.Gold ); LastCountdownStart = null; @@ -323,10 +319,9 @@ namespace Content.Server.RoundEnd { _announcer.SendAnnouncement( _announcer.GetAnnouncementId("ShuttleCalled"), - Filter.Broadcast(), textAnnounce, Loc.GetString(sender), - Color.Gold + colorOverride: Color.Gold ); } else diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index 6252d58edd..faa0d10ee1 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -221,10 +221,8 @@ public sealed partial class EmergencyShuttleSystem ShuttlesLeft = true; _announcer.SendAnnouncement( _announcer.GetAnnouncementId("ShuttleLeft"), - Filter.Broadcast(), "emergency-shuttle-left", - null, null, null, null, - ("transitTime", $"{TransitTime:0}") + localeArgs: [("transitTime", $"{TransitTime:0}"), ] ); Timer.Spawn((int) (TransitTime * 1000) + _bufferTime.Milliseconds, () => _roundEnd.EndRound(), _roundEndCancelToken?.Token ?? default); @@ -273,10 +271,8 @@ public sealed partial class EmergencyShuttleSystem _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Actor:user}"); _announcer.SendAnnouncement( _announcer.GetAnnouncementId("ShuttleAuthRevoked"), - Filter.Broadcast(), "emergency-shuttle-console-auth-revoked", - null, null, null, null, - ("remaining", component.AuthorizationsRequired) + localeArgs: [("remaining", component.AuthorizationsRequired), ] ); component.AuthorizedEntities.Clear(); UpdateAllEmergencyConsoles(); @@ -308,10 +304,8 @@ public sealed partial class EmergencyShuttleSystem var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; _announcer.SendAnnouncement( _announcer.GetAnnouncementId("ShuttleAuthRevoked"), - Filter.Broadcast(), "emergency-shuttle-console-auth-revoked", - null, null, null, null, - ("remaining", remaining) + localeArgs: [("remaining", remaining), ] ); CheckForLaunch(component); UpdateAllEmergencyConsoles(); @@ -335,13 +329,11 @@ public sealed partial class EmergencyShuttleSystem var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; if (remaining > 0) - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleAuthAdded"), - Filter.Broadcast(), + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleAuthAdded"), "emergency-shuttle-console-auth-left", - null, - DangerColor, - null, null, - ("remaining", remaining) + colorOverride: DangerColor, + localeArgs: [("remaining", remaining), ] ); if (!CheckForLaunch(component)) @@ -446,10 +438,8 @@ public sealed partial class EmergencyShuttleSystem _announced = true; _announcer.SendAnnouncement( _announcer.GetAnnouncementId("ShuttleAlmostLaunching"), - Filter.Broadcast(), "emergency-shuttle-launch-time", - null, null, null, null, - ("consoleAccumulator", $"{_consoleAccumulator:0}") + localeArgs: [("consoleAccumulator", $"{_consoleAccumulator:0}"), ] ); } diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index ee0875b7a4..98174b17ec 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -277,8 +277,10 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem if (targetGrid == null) { _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to dock with station {ToPrettyString(stationUid)}"); - _announcer.SendAnnouncement(_announcer.GetAnnouncementId("ShuttleGoodLuck"), Filter.Broadcast(), - "emergency-shuttle-good-luck", colorOverride: DangerColor); + _announcer.SendAnnouncement( + _announcer.GetAnnouncementId("ShuttleGoodLuck"), + "emergency-shuttle-good-luck", + colorOverride: DangerColor); return; } @@ -293,7 +295,11 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem _announcer.SendAnnouncementMessage( _announcer.GetAnnouncementId("ShuttleDock"), "emergency-shuttle-docked", - null, null, null, null, + null, + null, + null, + null, + null, ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir()), ("location", location) @@ -318,7 +324,7 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem } _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} docked with stations"); - _announcer.SendAnnouncementAudio(_announcer.GetAnnouncementId("ShuttleDock"), Filter.Broadcast()); + _announcer.SendAnnouncementAudio(_announcer.GetAnnouncementId("ShuttleDock")); } else { @@ -333,6 +339,7 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem null, null, null, + null, ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir()), ("location", location) @@ -341,7 +348,7 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem } _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to find a valid docking port for {ToPrettyString(stationUid)}"); - _announcer.SendAnnouncementAudio(_announcer.GetAnnouncementId("ShuttleNearby"), Filter.Broadcast()); + _announcer.SendAnnouncementAudio(_announcer.GetAnnouncementId("ShuttleNearby")); } } diff --git a/Content.Server/StationEvents/Events/AirlockVirusRule.cs b/Content.Server/StationEvents/Events/AirlockVirusRule.cs index cf2ed9ef56..481bb65c87 100644 --- a/Content.Server/StationEvents/Events/AirlockVirusRule.cs +++ b/Content.Server/StationEvents/Events/AirlockVirusRule.cs @@ -49,10 +49,7 @@ public sealed class AirlockVirusRule : StationEventSystem _announcer.SendAnnouncement( _announcer.GetAnnouncementId(args.RuleId), - Filter.Broadcast(), component.Announce, - null, - stationEvent.StartAnnouncementColor, - null, null, - ("sender", Loc.GetString(component.Sender)), + colorOverride: stationEvent.StartAnnouncementColor, + localeArgs: + [ + ("sender", Loc.GetString(component.Sender)), ("description", Loc.GetString(component.Description)), - ("dest", Loc.GetString(component.Dest)) + ("dest", Loc.GetString(component.Dest)), + ] ); } diff --git a/Content.Server/StationEvents/Events/FalseAlarmRule.cs b/Content.Server/StationEvents/Events/FalseAlarmRule.cs index 1ecbdd7a61..a2c9fd5212 100644 --- a/Content.Server/StationEvents/Events/FalseAlarmRule.cs +++ b/Content.Server/StationEvents/Events/FalseAlarmRule.cs @@ -23,13 +23,10 @@ public sealed class FalseAlarmRule : StationEventSystem _announcer.SendAnnouncement( _announcer.GetAnnouncementId(picked.Key.ID), - Filter.Broadcast(), _announcer.GetEventLocaleString(_announcer.GetAnnouncementId(picked.Key.ID)), - null, - picked.Value.StartAnnouncementColor, - null, null, + colorOverride: picked.Value.StartAnnouncementColor, //TODO This isn't a good solution, but I can't think of something better - ("data", Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}")) + localeArgs: [("data", Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}")), ] ); } } diff --git a/Content.Server/StationEvents/Events/StationEventSystem.cs b/Content.Server/StationEvents/Events/StationEventSystem.cs index 06ba9c7ec6..e789c0120a 100644 --- a/Content.Server/StationEvents/Events/StationEventSystem.cs +++ b/Content.Server/StationEvents/Events/StationEventSystem.cs @@ -58,7 +58,6 @@ public abstract class StationEventSystem : GameRuleSystem where T : ICompo { _announcer.SendAnnouncement( _announcer.GetAnnouncementId(args.RuleId), - Filter.Broadcast(), _announcer.GetEventLocaleString(_announcer.GetAnnouncementId(args.RuleId)), colorOverride: Color.Gold ); @@ -88,7 +87,6 @@ public abstract class StationEventSystem : GameRuleSystem where T : ICompo { _announcer.SendAnnouncement( _announcer.GetAnnouncementId(args.RuleId, true), - Filter.Broadcast(), _announcer.GetEventLocaleString(_announcer.GetAnnouncementId(args.RuleId, true)), colorOverride: Color.Gold); } diff --git a/Content.Server/_Goobstation/GameTicking/Rules/BlobRuleSystem.cs b/Content.Server/_Goobstation/GameTicking/Rules/BlobRuleSystem.cs index 547591ef31..87c3b57c3b 100644 --- a/Content.Server/_Goobstation/GameTicking/Rules/BlobRuleSystem.cs +++ b/Content.Server/_Goobstation/GameTicking/Rules/BlobRuleSystem.cs @@ -118,10 +118,9 @@ public sealed class BlobRuleSystem : GameRuleSystem _announcer.SendAnnouncement( "blob-recall-shuttle", - Filter.Broadcast(), Loc.GetString("blob-alert-recall-shuttle"), - station: stationUid, - colorOverride: Color.Red + colorOverride: Color.Red, + station: stationUid ); } @@ -132,10 +131,9 @@ public sealed class BlobRuleSystem : GameRuleSystem _announcer.SendAnnouncement( "blob-detect", - Filter.Broadcast(), Loc.GetString("blob-alert-detect"), - station: stationUid, - colorOverride: Color.Red + colorOverride: Color.Red, + station: stationUid ); // blobRuleComp.DetectedAudio, @@ -158,10 +156,9 @@ public sealed class BlobRuleSystem : GameRuleSystem _announcer.SendAnnouncement( "blob-critical", - Filter.Broadcast(), Loc.GetString("blob-alert-critical"), - station: stationUid, - colorOverride: Color.Red + colorOverride: Color.Red, + station: stationUid ); // blobRuleComp.CriticalAudio } @@ -171,7 +168,6 @@ public sealed class BlobRuleSystem : GameRuleSystem _announcer.SendAnnouncement( "blob-critical-no-nuke", - Filter.Broadcast(), Loc.GetString("blob-alert-critical-NoNukeCode"), colorOverride: Color.Red );