using Content.Shared.Chat; using Content.Shared.Database; using Content.Shared.Station.Components; using Robust.Shared.Audio; using Robust.Shared.Player; using Robust.Shared.Utility; namespace Content.Server.Chat.Systems; public sealed partial class ChatSystem { public new readonly SoundSpecifier DefaultAnnouncementSound = new SoundPathSpecifier("/Audio/Corvax/Announcements/announce.ogg"); // Corvax-Announcements public const string CentComAnnouncementSound = "/Audio/Corvax/Announcements/centcomm.ogg"; // Corvax-Announcements /// public override void DispatchGlobalAnnouncement( string message, string? sender = null, bool playSound = true, SoundSpecifier? announcementSound = null, Color? colorOverride = null, string? signature = null ) { sender ??= Loc.GetString("chat-manager-sender-announcement"); var wrappedMessage = WrapAnnouncement(sender, message, signature); _chatManager.ChatMessageToAll(ChatChannel.Radio, message, wrappedMessage, default, false, true, colorOverride); if (playSound) { if (sender == Loc.GetString("admin-announce-announcer-default")) announcementSound = new SoundPathSpecifier(CentComAnnouncementSound); // Corvax-Announcements: Support custom alert sound from admin panel _audio.PlayGlobal(announcementSound ?? DefaultAnnouncementSound, Filter.Broadcast(), true, AudioParams.Default.WithVolume(-2f)); } _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Global station announcement from {sender}: {message}"); } /// public override void DispatchFilteredAnnouncement( Filter filter, string message, EntityUid? source = null, string? sender = null, bool playSound = true, SoundSpecifier? announcementSound = null, Color? colorOverride = null, string? signature = null) { sender ??= Loc.GetString("chat-manager-sender-announcement"); var wrappedMessage = WrapAnnouncement(sender, message, signature); _chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, wrappedMessage, source ?? default, false, true, colorOverride); if (playSound) { _audio.PlayGlobal(announcementSound ?? DefaultAnnouncementSound, filter, true, AudioParams.Default.WithVolume(-2f)); } _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Station Announcement from {sender}: {message}"); } /// public override void DispatchStationAnnouncement( EntityUid source, string message, string? sender = null, bool playDefaultSound = true, SoundSpecifier? announcementSound = null, Color? colorOverride = null, string? signature = null) { sender ??= Loc.GetString("chat-manager-sender-announcement"); var wrappedMessage = WrapAnnouncement(sender, message, signature); var station = _stationSystem.GetOwningStation(source); if (station == null) { // you can't make a station announcement without a station return; } if (!TryComp(station, out var stationDataComp)) return; var filter = _stationSystem.GetInStation(stationDataComp); _chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, wrappedMessage, source, false, true, colorOverride); if (playDefaultSound) { _audio.PlayGlobal(announcementSound ?? DefaultAnnouncementSound, filter, true, AudioParams.Default.WithVolume(-2f)); } _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Station Announcement on {station} from {sender}: {message}"); } private string WrapAnnouncement(string sender, string message, string? signature) { var escapedMessage = FormattedMessage.EscapeText(message); return string.IsNullOrWhiteSpace(signature) ? Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender), ("message", escapedMessage)) : Loc.GetString("chat-manager-sender-announcement-wrap-message-signed", ("sender", sender), ("message", escapedMessage), ("signature", FormattedMessage.EscapeText(signature))); } }