diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index f540d21ed8d..cf9f34865ab 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -103,6 +103,7 @@
Radio = new /obj/item/device/radio(src)
Radio.listening = 0 //Makes bot radios transmit only so no one hears things while adjacent to one.
Radio.config(list("[radio_name]" = 0))
+ Radio.follow_target = src
/obj/machinery/bot/proc/add_to_beacons(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots.
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index fa649d818bf..aced6424633 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -221,7 +221,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M,
var/vmask, var/vmessage, var/obj/item/device/radio/radio,
var/message, var/name, var/job, var/realname, var/vname,
- var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/datum/language/speaking = null)
+ var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/datum/language/speaking = null,
+ var/atom/follow_target = null)
/* ###### Prepare the radio connection ###### */
@@ -389,33 +390,33 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if (length(heard_masked))
for (var/mob/R in heard_masked)
- R.hear_radio(message,verbage, speaking, part_a, part_b, M, 0, name)
+ R.hear_radio(message,verbage, speaking, part_a, part_b, M, 0, name, follow_target=follow_target)
/* --- Process all the mobs that heard the voice normally (understood) --- */
if (length(heard_normal))
for (var/mob/R in heard_normal)
- R.hear_radio(message, verbage, speaking, part_a, part_b, M, 0, realname)
+ R.hear_radio(message, verbage, speaking, part_a, part_b, M, 0, realname, follow_target=follow_target)
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
if (length(heard_voice))
for (var/mob/R in heard_voice)
- R.hear_radio(message,verbage, speaking, part_a, part_b, M,0, vname)
+ R.hear_radio(message,verbage, speaking, part_a, part_b, M,0, vname, follow_target=follow_target)
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
// Displays garbled message (ie "f*c* **u, **i*er!")
if (length(heard_garbled))
for (var/mob/R in heard_garbled)
- R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1, vname)
+ R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1, vname, follow_target=follow_target)
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if (length(heard_gibberish))
for (var/mob/R in heard_gibberish)
- R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1)
+ R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1, follow_target=follow_target)
return 1
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index f3b59b2e66b..ec45cb5e814 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -30,6 +30,7 @@
g_amt = 25
var/const/FREQ_LISTENING = 1
var/prison_radio = 0
+ var/atom/follow_target // Custom follow target for autosay-using bots
/obj/item/device/radio
@@ -189,7 +190,7 @@
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
- 4, 0, zlevel, connection.frequency)
+ 4, 0, zlevel, connection.frequency, follow_target=follow_target)
del(A)
return
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 22af8b0bedc..914e3307801 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -503,12 +503,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
..()
if (href_list["track"])
- var/mob/target = locate(href_list["track"]) in mob_list
+ var/atom/target = locate(href_list["track"])
if(target)
ManualFollow(target)
if (href_list["follow"])
- var/mob/target = locate(href_list["follow"]) in mob_list
+ var/atom/target = locate(href_list["follow"])
var/mob/A = usr;
A << "You are now following [target]"
//var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index f63566a0483..1a5272b63fd 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -75,7 +75,7 @@
src.playsound_local(source, speech_sound, sound_vol, 1)
-/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
+/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/atom/follow_target)
if(!client)
return
@@ -85,6 +85,8 @@
return
var/track = null
+ if(!follow_target)
+ follow_target = speaker
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
@@ -160,12 +162,15 @@
else
track = "[speaker_name] ([jobname])"
else
- track = "[speaker_name] ([jobname])"
+ if(istype(follow_target, /obj/machinery/bot) && isAI(src))
+ track = "[speaker_name] ([jobname])"
+ else
+ track = "[speaker_name] ([jobname])"
if(istype(src, /mob/dead/observer))
if(speaker_name != speaker.real_name && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs.
speaker_name = "[speaker.real_name] ([speaker_name])"
- track = "[speaker_name] (follow)"
+ track = "[speaker_name] (follow)"
var/formatted
if(language)