diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index d05bb3d9e7..1e03dc1775 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -35,16 +35,6 @@
if (!msg)
return
- var/rendered = "DEAD: [stafftype]([src.holder.fakekey ? pick("BADMIN", "hornigranny", "TLF", "scaredforshadows", "KSI", "Silnazi", "HerpEs", "BJ69", "SpoofedEdd", "Uhangay", "Wario90900", "Regarity", "MissPhareon", "LastFish", "unMportant", "Deurpyn", "Fatbeaver") : src.key]) says, \"[msg]\""
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
-
- if(M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to admins who have deadchat toggled on
- M.show_message(rendered, 2)
-
- else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to regular ghosts who have deadchat toggled on
- M.show_message(rendered, 2)
+ say_dead_direct("[stafftype]([src.holder.fakekey ? src.holder.fakekey : src.key]) says, \"[msg]\"")
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 09418b8bb0..c6171b225b 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -90,20 +90,5 @@
input = message
if(input)
- message = "DEAD: [src] [message]"
- else
- return
-
-
- if(message)
- log_emote("Ghost/[src.key] : [message]")
-
- for(var/mob/M in player_list)
- if(istype(M, /mob/new_player))
- continue
-
- if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods
- M << message
-
- else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on
- M.show_message(message, 2)
+ log_emote("Ghost/[src.key] : [input]")
+ say_dead_direct(input, src)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 90edb8863a..444c845921 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -465,3 +465,34 @@ proc/is_blind(A)
if(get_area(M) == A)
mobs += M
return mobs
+
+//Direct dead say used both by emote and say
+//It is somewhat messy. I don't know what to do.
+//I know you can't see the change, but I rewrote the name code. It is significantly less messy now
+/proc/say_dead_direct(var/message, var/mob/subject = null)
+ var/name
+ if(subject && subject.client)
+ var/client/C = subject.client
+ var/keyname = (C.holder && C.holder.fakekey) ? C.holder.fakekey : C.key
+ if(C.mob) //Most of the time this is the dead/observer mob; we can totally use him if there is no better name
+ var/mindname
+ var/realname = C.mob.real_name
+ if(C.mob.mind)
+ mindname = C.mob.mind.name
+ if(C.mob.mind.original && C.mob.mind.original.real_name)
+ realname = C.mob.mind.original.real_name
+ if(mindname && mindname != realname)
+ name = "[realname] died as [mindname]"
+ else
+ name = realname
+ name = "[keyname] ([name]) "
+
+ for(var/mob/M in player_list)
+ if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && (M.client.prefs.toggles & CHAT_DEAD))
+ var/follow = ""
+ if(subject)
+ if(subject != M)
+ follow = "(follow) "
+ if(M.stat != DEAD && M.client.holder)
+ follow = "(JMP) "
+ M << "" + create_text_tag("dead", "DEAD:", M.client) + " [name][follow][message]"
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 67ee6152a0..10e6c4266c 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -43,8 +43,6 @@
usr.emote(message)
/mob/proc/say_dead(var/message)
- var/name = src.real_name
-
if(say_disabled) //This is here to try to identify lag problems
usr << "\red Speech is currently admin-disabled."
return
@@ -58,23 +56,7 @@
usr << "\red You have deadchat muted."
return
- if(mind && mind.name)
- name = "[mind.name]"
- else
- name = real_name
- if(name != real_name)
- name += " (died as [real_name])"
-
- for(var/mob/M in player_list)
- if(istype(M, /mob/new_player))
- continue
- if(M.client && (M.stat == DEAD || (M.client.holder && !is_mentor(M.client)) && (M.client.prefs.toggles & CHAT_DEAD)))
- var/follow = ""
- if(src != M)
- follow = " (follow)"
- if(M.stat != DEAD && M.client.holder)
- follow = " (JMP)"
- M << "DEAD: [name][follow] [pick("complains","moans","whines","laments","blubbers")], \"[message]\""
+ say_dead_direct("[pick("complains","moans","whines","laments","blubbers")], \"[message]\"", src)
/mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)