diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index e2789e446ab..95d2ab907f6 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -296,3 +296,34 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
dat += data_core.get_manifest()
src << browse(dat, "window=manifest;size=370x420;can_close=1")
+
+//BEGIN TELEPORT HREF CODE
+/mob/dead/observer/Topic(href, href_list)
+ if(usr != src)
+ return
+ ..()
+
+ if (href_list["follow"])
+ var/mob/target = locate(href_list["follow"]) in mob_list
+ var/mob/A = usr;
+ A << "You are now following [target]"
+ //var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list
+ if(target && target != usr)
+ following = target
+ spawn(0)
+ var/turf/pos = get_turf(A)
+ while(A.loc == pos)
+
+ var/turf/T = get_turf(target)
+ if(!T)
+ break
+ if(following != target)
+ break
+ if(!client)
+ break
+ A.loc = T
+ pos = A.loc
+ sleep(15)
+ following = null
+ ..()
+//END TELEPORT HREF CODE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index 28947ac55ee..9604a50559d 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -60,9 +60,10 @@
message = say_quote(message)
rendered = "Hivemind, [name] [message_a]"
-
+ var/rendered2 = null
for (var/mob/M in player_list)
if (istype(M, /mob/new_player))
continue
- if (M.stat > 1)
- M.show_message(rendered, 2)
\ No newline at end of file
+ if (M.stat > 1 && istype(M, /mob/dead/observer))
+ rendered2 = "Hivemind, [name] (Follow) [message_a]"
+ M.show_message(rendered2, 2)
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d7021a22b49..0317983e27e 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -359,7 +359,16 @@ var/list/department_radio_keys = list(
message_a = "[message_a]"
rendered = "[GetVoice()][alt_name] [message_a]"
- for (var/M in heard_a)
+ var/rendered2 = null
+
+ for (var/mob/M in heard_a)
+ //BEGIN TELEPORT CHANGES
+ if(!istype(M, /mob/new_player))
+ if(M && M.stat == DEAD)
+ rendered2 = "[GetVoice()] [alt_name] (Follow) [message_a]"
+ M:show_message(rendered2, 2)
+ continue
+ //END CHANGES
if(hascall(M,"show_message"))
var/deaf_message = ""
var/deaf_type = 1
@@ -381,9 +390,17 @@ var/list/department_radio_keys = list(
message_b = "[message_b]"
rendered = "[name][alt_name] [message_b]" //Voice_name isn't too useful. You'd be able to tell who was talking presumably.
-
+ var/rendered2 = null
for (var/M in heard_b)
+ var/mob/MM
+ if(istype(M, /mob))
+ MM = M
+ if(!istype(MM, /mob/new_player) && MM)
+ if(MM && MM.stat == DEAD)
+ rendered2 = "[voice_name] (Follow) [message_b]"
+ MM:show_message(rendered2, 2)
+ continue
if(hascall(M,"show_message"))
M:show_message(rendered, 2)
M << speech_bubble
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 7c63628ced4..766ddcbcb55 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -108,6 +108,9 @@
if(istype(S , /mob/living/silicon/ai))
var/renderedAI = "Robotic Talk, [name] [message_a]"
S.show_message(renderedAI, 2)
+ else if(istype(S , /mob/dead/observer) && S.stat == DEAD)
+ var/rendered2 = "Robotic Talk, [name] (Follow) [message_a]"
+ S.show_message(rendered2, 2)
else
S.show_message(rendered, 2)
@@ -116,6 +119,9 @@
if(istype(S , /mob/living/silicon/ai))
var/renderedAI = "Robotic Talk, [name] [message_a]"
S.show_message(renderedAI, 2)
+ else if(istype(S , /mob/dead/observer) && S.stat == DEAD)
+ var/rendered2 = "Robotic Talk, [name] (Follow) [message_a]"
+ S.show_message(rendered2, 2)
else
S.show_message(rendered, 2)
@@ -142,8 +148,10 @@
message = say_quote(message)
- rendered = "Robotic Talk, [name] [message_a]"
+// rendered = "Robotic Talk, [name] [message_a]"
+ rendered = null
for (var/mob/M in dead_mob_list)
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
+ rendered = "Robotic Talk, [name] (Follow) [message_a]"
M.show_message(rendered, 2)
\ No newline at end of file
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 75cbd582f1e..246deeab16f 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -49,16 +49,17 @@
alt_name = " (died as [real_name])"
message = src.say_quote(message)
- var/rendered = "DEAD: [name][alt_name] [message]"
-
+ //var/rendered = "DEAD: [name][alt_name] [message]"
+ var/rendered2 = null//edited
for(var/mob/M in player_list)
+ rendered2 = "DEAD: [name][alt_name] (Follow) [message]"//edited
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 message to admins/mods with deadchat toggled on
- M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
+ M << rendered2 //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
else if(M.client && M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the message to regular ghosts with deadchat toggled on.
- M.show_message(rendered, 2) //Takes into account blindness and such.
+ M.show_message(rendered2, 2) //Takes into account blindness and such.
return
/mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)