From 4e0ee95fecffa660c18ccb95570a181a553f7197 Mon Sep 17 00:00:00 2001 From: ARGUS <268038739+ARGUS-Memory@users.noreply.github.com> Date: Fri, 20 Mar 2026 00:28:32 +0100 Subject: [PATCH] fix: MUTE trait no longer blocks say emotes (\! prefix) or radio say emotes (;\!) (#19302) Noise language is used for audible emotes when '\!' is prefixed in say. handle_speech_problems() was unconditionally clearing the message for any mob with sdisabilities & MUTE, including Noise language pieces. '*emote' in say() bypasses mute entirely by redirecting to emote() before handle_speech_problems is reached. '\!emote' and ';\!emote' should be consistent with that: MUTE suppresses speech but not emote actions. Now, when MUTE is the sole reason the suppression block fires (not silent or paralysis), Noise language pieces fall through to the parent proc instead of being cleared. --- code/modules/mob/living/carbon/human/say.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 4cedda2262..cd1708a319 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -142,6 +142,13 @@ /mob/living/carbon/human/handle_speech_problems(var/list/message_data) if(silent || (sdisabilities & MUTE) || is_paralyzed()) + // MUTE shouldn't suppress noise language (audible say emotes), consistent with * emotes bypassing mute in say(). + if((sdisabilities & MUTE) && !silent && !is_paralyzed()) + var/list/pieces = message_data[1] + if(islist(pieces) && LAZYLEN(pieces)) + var/datum/multilingual_say_piece/first = pieces[1] + if(istype(first) && first.speaking == GLOB.all_languages["Noise"]) + return ..() message_data[1] = "" . = 1