From 4b239afe76e5323a7438cdea083cf2a6f8eb0451 Mon Sep 17 00:00:00 2001 From: "giacomand@gmail.com" Date: Wed, 1 Aug 2012 22:55:14 +0000 Subject: [PATCH] Fixed issue 724 - I've also tried to fix the unreported bug where a person cannot hear their radio messages while in the dark. Instead I'll make an issue report and try to work on it more later. I'm assuming it has something to do with BYOND thinking that the user cannot see dark tiles in the viewer proc. Cleaned up a bit of the broadcasting code. Made everything use turf's z levels as I find them more reliable, sometimes an item's loc can be null or the z level can be entirely wrong. I hope the high usage of get_turf() will not create problems. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4275 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/procs/gamehelpers.dm | 2 +- code/game/machinery/telecomms/broadcaster.dm | 57 ++++++++++---------- code/game/objects/radio/intercom.dm | 10 ++-- code/game/objects/radio/radio.dm | 35 +++++++----- 4 files changed, 56 insertions(+), 48 deletions(-) diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm index b4429f9d60b..b76597ebde8 100644 --- a/code/defines/procs/gamehelpers.dm +++ b/code/defines/procs/gamehelpers.dm @@ -229,7 +229,7 @@ for(var/mob/M in player_list) if(!M) continue - var/atom/ear = M.get_ear() + var/turf/ear = get_turf(M) if(!ear) continue // Now see if they're near any broadcasting radio diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 1fd388bc258..409f53f4ce0 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -26,21 +26,22 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : /obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) // Don't broadcast rejected signals + var/turf/position = get_turf(src) if(signal.data["reject"]) return //Is it a test signal? if(signal.data["type"] == 4) signal.data["done"] = 1 - signal.data["level"] += src.loc.z + signal.data["level"] += position.z return if(signal.data["message"]) // Prevents massive radio spam - if("[signal.data["message"]]:[signal.data["realname"]]:[src.loc.z]" in recentmessages) + if("[signal.data["message"]]:[signal.data["realname"]]:[position.z]" in recentmessages) return - recentmessages.Add("[signal.data["message"]]:[signal.data["realname"]]:[src.loc.z]") + recentmessages.Add("[signal.data["message"]]:[signal.data["realname"]]:[position.z]") signal.data["done"] = 1 // mark the signal as being broadcasted @@ -61,7 +62,7 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"], src.loc.z) + signal.data["realname"], signal.data["vname"],, signal.data["compression"], position.z) /** #### - Simple Broadcast - #### **/ @@ -71,7 +72,7 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : /* ###### Broadcast a message using signal.data ###### */ Broadcast_SimpleMessage(signal.data["name"], signal.frequency, signal.data["message"],null, null, - signal.data["compression"]) + signal.data["compression"], position.z) /** #### - Artificial Broadcast - #### **/ @@ -86,7 +87,7 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], src.loc.z) + signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], position.z) spawn(5) recentmessages = list() @@ -135,20 +136,21 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : /* ###### Broadcast a message using signal.data ###### */ var/datum/radio_frequency/connection = signal.data["connection"] + var/turf/position = get_turf(src) if(connection.frequency == SYND_FREQ) // if syndicate broadcast, just Broadcast_Message(signal.data["connection"], signal.data["mob"], signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"], src.loc.z) + signal.data["realname"], signal.data["vname"],, signal.data["compression"], position.z) else if(intercept) Broadcast_Message(signal.data["connection"], signal.data["mob"], signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], src.loc.z) + signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], position.z) @@ -211,12 +213,10 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : var/message, var/name, var/job, var/realname, var/vname, var/data, var/compression, var/level) - /* ###### Prepare the radio connection ###### */ var/display_freq = connection.frequency - var/list/obj/item/device/radio/radios = list() // --- Broadcast only to intercom devices --- @@ -224,8 +224,7 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : if(data == 1) for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) if(R.receive_range(display_freq, level) > 0) - radios |= R - + radios += R // --- Broadcast only to intercoms and station-bounced radios --- @@ -236,8 +235,7 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : continue if(R.receive_range(display_freq, level) > 0) - radios |= R - + radios += R // --- Broadcast to syndicate radio! --- @@ -247,19 +245,18 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) if(R.receive_range(SYND_FREQ, level) > 0) - radios |= R + radios += R // --- Broadcast to ALL radio devices --- else for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) if(R.receive_range(display_freq, level) > 0) - radios |= R + radios += R // Get a list of mobs who can hear from the radios we collected. var/list/receive = get_mobs_in_radio_ranges(radios) - /* ###### Organize the receivers into categories for displaying the message ###### */ // Understood the message: @@ -510,8 +507,9 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : if(data == 1) for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) - if(R.loc && R.loc.z == level) - receive |= R.send_hear(display_freq) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq, level) // --- Broadcast only to intercoms and station-bounced radios --- @@ -521,8 +519,8 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : if(istype(R, /obj/item/device/radio/headset)) continue - - if(R.loc && R.loc.z == level) + var/turf/position = get_turf(R) + if(position && position.z == level) receive |= R.send_hear(display_freq) @@ -532,8 +530,8 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) - - if(R.loc && R.loc.z == level) + var/turf/position = get_turf(R) + if(position && position.z == level) receive |= R.send_hear(SYND_FREQ) @@ -541,8 +539,8 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : else for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - - if(R.loc && R.loc.z == level) + var/turf/position = get_turf(R) + if(position && position.z == level) receive |= R.send_hear(display_freq) @@ -704,7 +702,8 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : /atom/proc/test_telecomms() var/datum/signal/signal = telecomms_process() - return (src.loc.z in signal.data["level"] && signal.data["done"]) + var/turf/position = get_turf(src) + return (position.z in signal.data["level"] && signal.data["done"]) /atom/proc/telecomms_process() @@ -726,8 +725,10 @@ var/list/recentmessages = list() // global list of recent messages broadcasted : signal.frequency = 1459// Common channel //#### Sending the signal to all subspace receivers ####// - for(var/obj/machinery/telecomms/receiver/R in world) - if(src.loc.z == R.loc.z) + var/turf/position = get_turf(src) + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + var/turf/receiver_turf = get_turf(R) + if(position.z == receiver_turf.z) R.receive_signal(signal) sleep(rand(10,25)) diff --git a/code/game/objects/radio/intercom.dm b/code/game/objects/radio/intercom.dm index 879d36504eb..e174d87ed10 100644 --- a/code/game/objects/radio/intercom.dm +++ b/code/game/objects/radio/intercom.dm @@ -26,9 +26,8 @@ attack_self(user) - send_hear(freq) - var/range = receive_range(freq) - + send_hear(freq, level) + var/range = receive_range(freq, level) if(range > 0) return get_mobs_in_view(canhear_range, src) @@ -37,9 +36,8 @@ return 0 if (!(src.wires & WIRE_RECEIVE)) return 0 - if(!src.loc) - return 0 - if(src.loc.z != level) + var/turf/position = get_turf(src) + if(isnull(position) || position.z != level) return 0 if (!src.listening) return 0 diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm index 05eec40b5d9..b08fc71ed7a 100644 --- a/code/game/objects/radio/radio.dm +++ b/code/game/objects/radio/radio.dm @@ -69,7 +69,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use frequency = sanitize_frequency(frequency, maxf) // The max freq is higher than a regular headset to decrease the chance of people listening in, if you use the higher channels. else if (frequency < 1441 || frequency > maxf) - world.log << "[src] ([type]) has a frequency of [frequency], sanitizing." + //world.log << "[src] ([type]) has a frequency of [frequency], sanitizing." frequency = sanitize_frequency(frequency, maxf) set_frequency(frequency) @@ -358,16 +358,21 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use signal.frequency = connection.frequency // Quick frequency set //#### Sending the signal to all subspace receivers ####// - for(var/obj/machinery/telecomms/receiver/R in world) - if(src.loc.z == R.loc.z) + + var/turf/position = get_turf(src) + + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + var/turf/receiver_turf = get_turf(R) + if(position.z == receiver_turf.z) R.receive_signal(signal) // Allinone can act as receivers. - for(var/obj/machinery/telecomms/allinone/R in world) - if(src.loc.z == R.loc.z) + for(var/obj/machinery/telecomms/allinone/R in telecomms_list) + var/turf/receiver_turf = get_turf(R) + if(position.z == receiver_turf.z) R.receive_signal(signal) - // Receiving code can be located in Telecommunications.dm + // Receiving code can be located in Telecommunications.dm return @@ -410,8 +415,11 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use ) signal.frequency = connection.frequency // Quick frequency set - for(var/obj/machinery/telecomms/receiver/R in world) - if(src.loc.z == R.loc.z) + var/turf/position = get_turf(src) + + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + var/turf/receiver_turf = get_turf(R) + if(position.z == receiver_turf.z) R.receive_signal(signal) @@ -429,7 +437,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use Broadcast_Message(connection, M, voicemask, M.voice_message, src, message, displayname, jobname, real_name, M.voice_name, - filter_type, signal.data["compression"], src.loc.z) + filter_type, signal.data["compression"], position.z) @@ -473,7 +481,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use //for (var/obj/item/device/radio/R in radio_connection.devices) for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) // Modified for security headset code -- TLE //if(R.accept_rad(src, message)) - receive |= R.send_hear(display_freq) + receive |= R.send_hear(display_freq, 0) //world << "DEBUG: receive.len=[receive.len]" var/list/heard_masked = list() // masked name or no real name @@ -633,7 +641,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use if (!(wires & WIRE_RECEIVE)) return 0 - if(isnull(src.loc) || src.loc.z != level) + var/turf/position = get_turf(src) + if(isnull(position) || position.z != level) return 0 if(freq == SYND_FREQ) if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys @@ -656,9 +665,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use return canhear_range -/obj/item/device/radio/proc/send_hear(freq) - var/range = receive_range(freq) +/obj/item/device/radio/proc/send_hear(freq, level) + var/range = receive_range(freq, level) if(range > 0) return get_mobs_in_view(canhear_range, src)