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
This commit is contained in:
giacomand@gmail.com
2012-08-01 22:55:14 +00:00
parent fd4cd23084
commit 4b239afe76
4 changed files with 56 additions and 48 deletions
+1 -1
View File
@@ -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
+29 -28
View File
@@ -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))
+4 -6
View File
@@ -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
+22 -13
View File
@@ -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)