diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 8f87cf4ec58..a907170b5e3 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -200,20 +200,50 @@
/proc/get_mobs_in_radio_ranges(list/obj/item/radio/radios)
. = list()
- // Returns a list of mobs who can hear any of the radios
+ // Returns a list of mobs who can hear any of the radios given in @radios
var/list/speaker_coverage = list()
for(var/obj/item/radio/R in radios)
- var/obj/item/radio/borg/BR = R
- if(istype(BR) && BR.myborg)
- if(!BR.myborg.is_component_functioning("radio"))
- continue //No power.
+ if(R)
+ //Cyborg checks. Receiving message uses a bit of cyborg's charge.
+ var/obj/item/radio/borg/BR = R
+ if(istype(BR) && BR.myborg)
+ var/mob/living/silicon/robot/borg = BR.myborg
+ var/datum/robot_component/CO = borg.get_component("radio")
+ if(!CO)
+ continue //No radio component (Shouldn't happen)
+ if(!borg.is_component_functioning("radio"))
+ continue //No power.
- for(var/mob/listener in R.listeners)
- speaker_coverage |= listener
-
- if(ismob(R.loc))
- speaker_coverage |= R.loc
- return speaker_coverage
+ var/turf/speaker = get_turf(R)
+ if(speaker)
+ for(var/turf/T in hear(R.canhear_range,speaker))
+ var/obj/item/radio/oldR = speaker_coverage[T]
+ if(!istype(oldR))
+ speaker_coverage[T] = R
+ continue
+ if(oldR.canhear_range < R.canhear_range)
+ speaker_coverage[T] = R
+
+ // Try to find all the players who can hear the message
+ for(var/A in GLOB.player_list + GLOB.hear_radio_list)
+ var/mob/M = A
+ if(!M)
+ continue
+ var/turf/ear = get_turf(M)
+ if(!ear)
+ continue
+ // Ghostship is magic: Ghosts can hear radio chatter from anywhere
+ if(isobserver(M) && M.get_preference(PREFTOGGLE_CHAT_GHOSTRADIO))
+ . |= M
+ continue
+ if(!speaker_coverage[ear])
+ continue
+ var/obj/item/radio/R = speaker_coverage[ear]
+ if(!istype(R) || R.canhear_range > 0)
+ . |= M
+ continue
+ if(is_same_root_atom(M, speaker_coverage[ear]))
+ . |= M
/proc/inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
var/turf/T
diff --git a/code/game/machinery/tcomms/tcomms_base.dm b/code/game/machinery/tcomms/tcomms_base.dm
index c9507b67636..f89810dd4d8 100644
--- a/code/game/machinery/tcomms/tcomms_base.dm
+++ b/code/game/machinery/tcomms/tcomms_base.dm
@@ -280,7 +280,7 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
bad_connection = is_bad_connection(tcm.connection.frequency, display_freq)
new_connection = SSradio.return_frequency(display_freq)
- var/list/radios = list(GLOB.deadchat_radio)
+ var/list/radios = list()
// --- Broadcast only to intercom devices ---
diff --git a/code/game/objects/items/devices/radio/radio_objects.dm b/code/game/objects/items/devices/radio/radio_objects.dm
index 995889e743d..f64a7fbb450 100644
--- a/code/game/objects/items/devices/radio/radio_objects.dm
+++ b/code/game/objects/items/devices/radio/radio_objects.dm
@@ -60,8 +60,6 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
var/obj/item/encryptionkey/syndicate/syndiekey = null
/// How many times this is disabled by EMPs
var/disable_timer = 0
- /// List of all the mobs that can hear this radio
- var/list/listeners = list()
/// Areas in which this radio cannot send messages
var/static/list/blacklisted_areas = list(/area/adminconstruction, /area/tdome, /area/ruin/space/bubblegum_arena)
@@ -84,6 +82,7 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
var/requires_tcomms = FALSE // Does this device require tcomms to work.If TRUE it wont function at all without tcomms. If FALSE, it will work without tcomms, just slowly
var/instant = FALSE // Should this device instantly communicate if there isnt tcomms
+
/obj/item/radio/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
@@ -98,7 +97,6 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
/obj/item/radio/Destroy()
SStgui.close_uis(wires)
- listeners.Cut()
QDEL_NULL(wires)
if(SSradio)
SSradio.remove_object(src, frequency)
@@ -117,31 +115,6 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
for(var/ch_name in channels)
secure_radio_connections[ch_name] = SSradio.add_object(src, SSradio.radiochannels[ch_name], RADIO_CHAT)
- if(canhear_range)
- AddComponent(/datum/component/proximity_monitor, canhear_range)
-
-/obj/item/radio/HasProximity(mob/crosser)
- if(!istype(crosser) || (crosser in listeners))
- return
- listeners += crosser
- RegisterSignal(crosser, COMSIG_MOVABLE_MOVED, PROC_REF(is_crosser_still_listening))
- RegisterSignal(crosser, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_listener_list))
-
-/obj/item/radio/proc/is_crosser_still_listening(mob/crosser)
- SIGNAL_HANDLER // COMSIG_MOVABLE_MOVED
- var/still_listening = FALSE
- for(var/obj/effect/abstract/proximity_checker/checker in get_turf(crosser))
- if(checker.monitor.hasprox_receiver == src)
- still_listening = TRUE
- break
- if(still_listening)
- return
- remove_from_listener_list(crosser)
-
-/obj/item/radio/proc/remove_from_listener_list(mob/crosser)
- SIGNAL_HANDLER // COMSIG_PARENT_QDELETING
- listeners -= crosser
- UnregisterSignal(crosser, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED))
/obj/item/radio/attack_ghost(mob/user)
return interact(user)
@@ -236,26 +209,14 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
if(has_loudspeaker)
loudspeaker = !loudspeaker
if(loudspeaker)
- update_hear_range(3)
+ canhear_range = 3
else
- update_hear_range(0)
+ canhear_range = 0
else
. = FALSE
if(.)
add_fingerprint(usr)
-/obj/item/radio/proc/update_hear_range(new_hear_range)
- canhear_range = new_hear_range
- var/datum/component/proximity_monitor/our_prox_component = GetComponent(/datum/component/proximity_monitor)
- if(!canhear_range)
- QDEL_NULL(our_prox_component)
- return
-
- if(our_prox_component)
- our_prox_component.set_radius(canhear_range)
- else
- AddComponent(/datum/component/proximity_monitor, canhear_range)
-
/obj/item/radio/proc/list_secure_channels(mob/user)
var/list/dat = list()
for(var/channel in channels)
@@ -576,7 +537,9 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
/obj/item/radio/proc/send_announcement()
if(is_listening())
- return listeners
+ return get_mobs_in_view(canhear_range, src)
+
+ return null
/obj/item/radio/examine(mob/user)
. = ..()
@@ -844,16 +807,3 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
return
return M.say_dead(message)
-
-GLOBAL_DATUM_INIT(deadchat_radio, /obj/item/radio/dchat_radio_handler, new())
-
-/obj/item/radio/dchat_radio_handler
- name = "Deadchat radio handler. Do not fuck with"
- canhear_range = 0
-
-/obj/item/radio/dchat_radio_handler/Destroy(force)
- . = ..()
- stack_trace("Someone just tried to delete the deadchat handler!")
- if(!force)
- return QDEL_HINT_LETMELIVE
- return ..()
diff --git a/code/modules/client/preference/link_processing.dm b/code/modules/client/preference/link_processing.dm
index 79d6d5f7694..961b6394074 100644
--- a/code/modules/client/preference/link_processing.dm
+++ b/code/modules/client/preference/link_processing.dm
@@ -1048,9 +1048,6 @@
if("ghost_radio")
toggles ^= PREFTOGGLE_CHAT_GHOSTRADIO
- if(isobserver(user))
- var/mob/dead/observer/dead_dude = user
- dead_dude.update_dead_radio()
if("ghost_pda")
toggles ^= PREFTOGGLE_CHAT_GHOSTPDA
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index e627e2d4d3b..bb2816be556 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -410,7 +410,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
dat += "Donator Publicity: [(toggles & PREFTOGGLE_DONATOR_PUBLIC) ? "Public" : "Hidden"]
"
dat += "FPS: [clientfps]
"
dat += "Ghost Ears: [(toggles & PREFTOGGLE_CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
"
- dat += "Ghost Radio: [(toggles & PREFTOGGLE_CHAT_GHOSTRADIO) ? "All Chatter" : "No Chatter"]
"
+ dat += "Ghost Radio: [(toggles & PREFTOGGLE_CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
"
dat += "Ghost Sight: [(toggles & PREFTOGGLE_CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
"
dat += "Ghost PDA: [(toggles & PREFTOGGLE_CHAT_GHOSTPDA) ? "All PDA Messages" : "No PDA Messages"]
"
if(check_rights(R_ADMIN,0))
diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm
index c90cec523f0..541e55faba3 100644
--- a/code/modules/client/preference/preferences_toggles.dm
+++ b/code/modules/client/preference/preferences_toggles.dm
@@ -65,20 +65,14 @@
/datum/preference_toggle/toggle_ghost_radio
name = "Toggle Ghost Radio"
- description = "Toggle between hearing all radio chatter, or only from nobody"
+ description = "Toggle between hearing all radio chatter, or only from nearby speakers"
preftoggle_bitflag = PREFTOGGLE_CHAT_GHOSTRADIO
preftoggle_toggle = PREFTOGGLE_TOGGLE1
preftoggle_category = PREFTOGGLE_CATEGORY_GHOST
- enable_message = "As a ghost, you will now hear all radio chat in the world."
- disable_message = "As a ghost, you will now hear no radio chat."
+ enable_message = "As a ghost, you will now only hear from nearby speakers."
+ disable_message = "As a ghost, you will now hear all radio chat in the world."
blackbox_message = "Toggle GhostRadio"
-/datum/preference_toggle/toggle_ghost_radio/set_toggles(client/user)
- . = ..()
- if(isobserver(user.mob))
- var/mob/dead/observer/dead_dude = user.mob
- dead_dude.update_dead_radio()
-
/datum/preference_toggle/toggle_admin_radio
name = "Admin Radio"
description = "Toggle seeing radiochatter from radios and speakers"
diff --git a/code/modules/mob/dead/observer/observer_base.dm b/code/modules/mob/dead/observer/observer_base.dm
index 9d1d9e9bb7a..1a96a63de3e 100644
--- a/code/modules/mob/dead/observer/observer_base.dm
+++ b/code/modules/mob/dead/observer/observer_base.dm
@@ -952,11 +952,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
log_debug("[key_name(src)] ended up in regular cleanup_observe rather than the mentor cleanup observe despite having TRAIT_MENTOR_OBSERVING. This is likely a bug and may result in them being stuck outside of their bodies.")
cleanup_observe()
-/mob/dead/observer/proc/update_dead_radio()
- if(get_preference(PREFTOGGLE_CHAT_GHOSTRADIO))
- GLOB.deadchat_radio.listeners |= src
- else
- GLOB.deadchat_radio.listeners -= src
-
#undef GHOST_CAN_REENTER
#undef GHOST_IS_OBSERVER
diff --git a/code/modules/mob/dead/observer/observer_login.dm b/code/modules/mob/dead/observer/observer_login.dm
index f92958eb746..d9212897cc8 100644
--- a/code/modules/mob/dead/observer/observer_login.dm
+++ b/code/modules/mob/dead/observer/observer_login.dm
@@ -10,5 +10,3 @@
if(GLOB.non_respawnable_keys[ckey])
can_reenter_corpse = 0
REMOVE_TRAIT(src, TRAIT_RESPAWNABLE, GHOSTED)
-
- update_dead_radio()