diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index a533efe0a58..2b256298835 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -68,6 +68,11 @@
for(var/obj/O in contents)
O.hear_talk(M, msg)
+/obj/item/device/transfer_valve/hear_message(mob/living/M as mob, msg)
+ ..()
+ for(var/obj/O in contents)
+ O.hear_message(M, msg)
+
/obj/item/device/transfer_valve/attack_self(mob/user as mob)
ui_interact(user)
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 26dd1849a8a..6007154db66 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -235,6 +235,10 @@
if(nadeassembly)
nadeassembly.hear_talk(M, msg)
+/obj/item/weapon/grenade/chem_grenade/hear_message(mob/living/M, msg)
+ if(nadeassembly)
+ nadeassembly.hear_message(M, msg)
+
/obj/item/weapon/grenade/chem_grenade/Bump()
..()
if(nadeassembly)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index a6e8ef3ca57..56aecc16a94 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -149,7 +149,6 @@
/obj/proc/hear_talk(mob/M as mob, text)
-
if(talking_atom)
talking_atom.catchMessage(text, M)
@@ -159,8 +158,8 @@
var/rendered = "[M.name]: [text]"
mo.show_message(rendered, 2)
*/
- return
+/obj/proc/hear_message(mob/M as mob, text)
/obj/proc/multitool_menu(var/mob/user,var/obj/item/device/multitool/P)
return "NO MULTITOOL_MENU!"
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index cdad32ee349..dbda18e7b71 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -85,6 +85,9 @@
if(bombassembly)
bombassembly.hear_talk(M, msg)
+/obj/item/device/onetankbomb/hear_message(mob/living/M as mob, msg)
+ if(bombassembly)
+ bombassembly.hear_message(M, msg)
// ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ----------
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index a37eeabcd9b..1d48afde8a5 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -100,6 +100,12 @@
a_left.hear_talk(M, msg)
if(a_right)
a_right.hear_talk(M, msg)
+
+ hear_message(mob/living/M as mob, msg)
+ if(a_left)
+ a_left.hear_message(M, msg)
+ if(a_right)
+ a_right.hear_message(M, msg)
proc/process_movement() // infrared beams and prox sensors
if(a_left && a_right)
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 1510c8791de..4c15b5f860e 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -6,6 +6,7 @@
origin_tech = "magnets=1"
var/listening = 0
var/recorded = null //the activation message
+ var/recorded_type = 0 // 0 for say, 1 for emote
bomb_name = "voice-activated bomb"
@@ -16,15 +17,22 @@
return "[src] is deactivated."
hear_talk(mob/living/M as mob, msg)
+ hear_input(M, msg, 0)
+
+ hear_message(mob/living/M as mob, msg)
+ hear_input(M, msg, 1)
+
+ proc/hear_input(mob/living/M as mob, msg, type)
if(!istype(M,/mob/living))
return
if(listening)
recorded = msg
+ recorded_type = type
listening = 0
var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"")
+ T.visible_message("\icon[src] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"")
else
- if(findtext(msg, recorded))
+ if(findtext(msg, recorded) && type == recorded_type)
pulse(0)
var/turf/T = get_turf(src) //otherwise it won't work in hand
T.visible_message("\icon[src] \red beeps!")
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 8ff83a239a8..2c2597c0011 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -33,6 +33,10 @@
pockets.hear_talk(M, msg)
..()
+/obj/item/clothing/suit/storage/hear_message(mob/M, var/msg)
+ pockets.hear_message(M, msg)
+ ..()
+
/obj/item/clothing/suit/storage/proc/return_inv()
var/list/L = list( )
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 36e59a86eb3..0bf75d5911b 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -40,6 +40,10 @@
hold.hear_talk(M, msg, verb, speaking)
..()
+/obj/item/clothing/accessory/storage/hear_message(mob/M, var/msg, verb, datum/language/speaking)
+ hold.hear_message(M, msg)
+ ..()
+
/obj/item/clothing/accessory/storage/proc/return_inv()
var/list/L = list( )
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 46a7c80667b..32f92ff0da8 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -106,7 +106,21 @@
for(var/mob/M in get_mobs_in_view(range, src))
if(self_message && M==src)
msg = self_message
- M.show_message( msg, 2, deaf_message, 1)
+ M.show_message(msg, 2, deaf_message, 1)
+
+ // based on say code
+ var/omsg = replacetext(message, "[src] ", "")
+ var/list/listening_obj = new
+ for(var/atom/movable/A in view(range, src))
+ if(istype(A, /mob))
+ var/mob/M = A
+ for(var/obj/O in M.contents)
+ listening_obj |= O
+ else if(istype(A, /obj))
+ var/obj/O = A
+ listening_obj |= O
+ for(var/obj/O in listening_obj)
+ O.hear_message(src, omsg)
// Show a message to all mobs in earshot of this atom
// Use for objects performing audible actions
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 1c3ea26b911..bf8255f4ce1 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -497,7 +497,6 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
var/icon_on = "videocam_on"
var/icon_off = "videocam"
var/canhear_range = 7
- var/watcherslist = list()
/obj/item/device/videocam/attack_self(mob/user)
on = !on
@@ -523,14 +522,19 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
if(..(user, 1))
user << "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active."
-
/obj/item/device/videocam/hear_talk(mob/M as mob, msg)
if (camera && on)
if(get_dist(src, M) <= canhear_range)
talk_into(M, msg)
- for(var/mob/living/carbon/human/H in watcherslist)
- H.show_message(text("\blue (Newscaster) [] says, '[]'",M,msg), 1)
+ for(var/obj/machinery/computer/security/telescreen/T)
+ if(T.current == camera)
+ T.audible_message("(Newscaster) [M] says, '[msg]'", hearing_distance = 2)
+/obj/item/device/videocam/hear_message(mob/M as mob, msg)
+ if (camera && on)
+ for(var/obj/machinery/computer/security/telescreen/T)
+ if(T.current == camera)
+ T.audible_message("(Newscaster) [M] [msg]", hearing_distance = 2)
///hauntings, like hallucinations but more spooky
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 3e64245d2c5..a10e265fecf 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -266,6 +266,10 @@
if(assembly)
assembly.hear_talk(M, msg)
+/obj/item/weapon/reagent_containers/glass/beaker/hear_message(mob/living/M, msg)
+ if(assembly)
+ assembly.hear_message(M, msg)
+
/obj/item/weapon/reagent_containers/glass/beaker/large
name = "large beaker"
desc = "A large beaker. Can hold up to 100 units."
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 6818390cf98..802c2a5f25d 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -176,6 +176,10 @@
if(rig)
rig.hear_talk(M, msg)
+/obj/structure/reagent_dispensers/fueltank/hear_message(mob/living/M, msg)
+ if(rig)
+ rig.hear_message(M, msg)
+
/obj/structure/reagent_dispensers/fueltank/Bump()
..()
if(rig)