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()