diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 07ba61edc0..24986dac0c 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -10,6 +10,7 @@ using Content.Server.Popups; using Content.Server.Radio.EntitySystems; using Content.Server.Station.Components; using Content.Server.Station.Systems; +using Content.Server.MobState; using Content.Shared.ActionBlocker; using Content.Shared.CCVar; using Content.Shared.Chat; @@ -49,18 +50,21 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly StationSystem _stationSystem = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; private const int VoiceRange = 7; // how far voice goes in world units private const int WhisperRange = 2; // how far whisper goes in world units private const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg"; private bool _loocEnabled = true; + private bool _deadLoocEnabled = false; private readonly bool _adminLoocEnabled = true; public override void Initialize() { InitializeRadio(); _configurationManager.OnValueChanged(CCVars.LoocEnabled, OnLoocEnabledChanged, true); + _configurationManager.OnValueChanged(CCVars.DeadLoocEnabled, OnDeadLoocEnabledChanged, true); SubscribeLocalEvent(OnGameChange); } @@ -80,6 +84,15 @@ public sealed partial class ChatSystem : SharedChatSystem Loc.GetString(val ? "chat-manager-looc-chat-enabled-message" : "chat-manager-looc-chat-disabled-message")); } + private void OnDeadLoocEnabledChanged(bool val) + { + if (_deadLoocEnabled == val) return; + + _deadLoocEnabled = val; + _chatManager.DispatchServerAnnouncement( + Loc.GetString(val ? "chat-manager-dead-looc-chat-enabled-message" : "chat-manager-dead-looc-chat-disabled-message")); + } + private void OnGameChange(GameRunLevelChangedEvent ev) { if (_configurationManager.GetCVar(CCVars.OocEnableDuringRound)) @@ -153,7 +166,13 @@ public sealed partial class ChatSystem : SharedChatSystem message = SanitizeInGameOOCMessage(message); - switch (type) + var sendType = type; + // If dead player LOOC is disabled, unless you are an aghost, send dead messages to dead chat + if (!_adminManager.IsAdmin(player) && !_deadLoocEnabled && + (HasComp(source) || _mobStateSystem.IsDead(source))) + sendType = InGameOOCChatType.Dead; + + switch (sendType) { case InGameOOCChatType.Dead: SendDeadChat(source, player, message, hideChat); diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index db801e00a2..30bfffe634 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -772,6 +772,12 @@ namespace Content.Shared.CCVar public static readonly CVarDef AdminLoocEnabled = CVarDef.Create("looc.enabled_admin", true, CVar.NOTIFY); + /// + /// True: Dead players can use LOOC + /// False: Dead player LOOC gets redirected to dead chat + /// + public static readonly CVarDef DeadLoocEnabled = CVarDef.Create("looc.enabled_dead", false, CVar.NOTIFY | CVar.REPLICATED); + /* * Entity Menu Grouping Types */ diff --git a/Resources/Locale/en-US/chat/managers/chat-manager.ftl b/Resources/Locale/en-US/chat/managers/chat-manager.ftl index c555150fce..770cd96a64 100644 --- a/Resources/Locale/en-US/chat/managers/chat-manager.ftl +++ b/Resources/Locale/en-US/chat/managers/chat-manager.ftl @@ -5,6 +5,8 @@ chat-manager-ooc-chat-enabled-message = OOC chat has been enabled. chat-manager-ooc-chat-disabled-message = OOC chat has been disabled. chat-manager-looc-chat-enabled-message = LOOC chat has been enabled. chat-manager-looc-chat-disabled-message = LOOC chat has been disabled. +chat-manager-dead-looc-chat-enabled-message = Dead players can now use LOOC. +chat-manager-dead-looc-chat-disabled-message = Dead players can no longer use LOOC. chat-manager-admin-ooc-chat-enabled-message = Admin OOC chat has been enabled. chat-manager-admin-ooc-chat-disabled-message = Admin OOC chat has been disabled. chat-manager-max-message-length-exceeded-message = Your message exceeded {$limit} character limit