Files
Ben 2e3b21ec41 Autohiss/Stutter Repeat Fix (#19335)
Autohiss/stutter no longer procs twice when using `say :w` to whisper

**PLEASE TESTMERGE THIS BEFORE MERGE**. Say proc is spaghetti so had to
touch alot of things to get this to work.

Co-authored-by: Ben10083 <Ben10083@users.noreply.github.com>
2024-06-14 14:19:45 +00:00

93 lines
2.9 KiB
Plaintext

/mob/living/verb/whisper_verb(message as text)
set name = "Whisper"
set category = "IC"
if(say_disabled)
to_chat(usr, SPAN_WARNING("Speech is currently admin-disabled."))
return
message = sanitize(message)
message = formalize_text(message)
if(client.handle_spam_prevention(message, MUTE_IC))
return
whisper(message)
/mob/living/whisper(var/message, var/datum/language/speaking, var/is_singing = FALSE, var/say_verb = FALSE)
if(is_muzzled())
to_chat(src, SPAN_DANGER("You're muzzled and cannot speak!"))
return
if(silent)
to_chat(src, SPAN_WARNING("You try to speak, but nothing comes out!"))
return
var/had_speaking = !!speaking
speaking = speaking ? speaking : parse_language(message)
if(!had_speaking)
if(speaking)
message = copytext_char(message, 2 + length(speaking.key))
else
speaking = get_default_language()
if(length_char(message) >= 1 && copytext_char(message, 1, 2) == "%")
if(speaking?.sing_verb)
is_singing = TRUE
var/message_range = 1
var/eavesdropping_range = 2
var/watching_range = 5
var/whisper_text = "whispers"
var/not_heard = "[whisper_text] something"
if(speaking)
if(speaking.whisper_verb)
whisper_text = pick(speaking.whisper_verb)
not_heard = "[whisper_text] something"
else
var/adverb = pick("quietly", "softly")
var/speak_text = pick(speaking.speech_verb)
if(is_singing && speaking?.sing_verb)
speak_text = pick(speaking.sing_verb)
whisper_text = "[speak_text] [adverb]"
not_heard = "[speak_text] something [adverb]"
//Check to see who hears the full whisper message, and who just gets the not_heard message
var/list/eavesdropping = list()
var/list/watching = list()
var/list/observers = list()
var/list/all_in_range = hearers(watching_range, src)
for(var/mob/M as anything in all_in_range)
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) //Preventing duplicate messages to ghostear'd observers
continue
if(get_dist(src, M) <= message_range) //In range to hear
continue
else if(get_dist(src, M) <= eavesdropping_range)
if(M.stat == DEAD && M.client)
observers += M
else
eavesdropping += M
else if(get_dist(src, M) <= watching_range)
if(M.stat == DEAD && M.client)
observers += M
else
watching += M
if(length(observers)) //For ghosts who do NOT have ghost ears. They will see the whole message if nearby, no *s or not_heard messages.
for(var/mob/M in observers)
M.hear_say(message, "whispers", speaking, "", TRUE, src)
if(length(eavesdropping))
var/new_message = stars(message)
for(var/mob/M in eavesdropping)
M.hear_say(new_message, "whispers", speaking, "", TRUE, src)
if(length(watching))
var/rendered = "<span class='game say'><span class='name'>[src.name]</span> [not_heard].</span>"
for (var/mob/M in watching)
M.show_message(rendered, 2)
say(message, speaking, whisper_text, whisper = TRUE, skip_edit = say_verb)