From 1c0df5d40e98e8473990f0b4ab6739b0a25db917 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 22:40:04 -0600 Subject: [PATCH 01/14] Fix canister runtime The following runtime has occured 10198 time(s). runtime error: Cannot execute null.return pressure(). proc name: update icon (/obj/machinery/portable_atmospherics/canister/update_icon) source file: canister.dm,112 usr: Slurpy Slurpy (/mob/living/carbon/human) src: the o2 canister (/obj/machinery/portable_atmospherics/canister/oxygen) --- .../machinery/portable/canister.dm | 14 +++++++++----- .../portable/portable_atmospherics.dm | 19 ++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 6bc94a8ff35..773eb13d8a2 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -66,13 +66,18 @@ desc = "Pre-mixed air." icon_state = "grey" -/obj/machinery/portable_atmospherics/canister/New(loc) +/obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture) ..() - create_gas() + if(existing_mixture) + air_contents = existing_mixture + else + create_gas() + pump = new(src, FALSE) pump.on = TRUE pump.stat = 0 pump.build_network() + update_icon() /obj/machinery/portable_atmospherics/canister/Destroy() @@ -109,7 +114,7 @@ update |= HOLDING if(connected_port) update |= CONNECTED - var/pressure = air_contents.return_pressure() + var/pressure = air_contents ? air_contents.return_pressure() : 0 if(pressure < 10) update |= EMPTY else if(pressure < ONE_ATMOSPHERE) @@ -254,8 +259,7 @@ if(label && !..()) var/newtype = label2types[label] if(newtype) - var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc) - replacement.air_contents.copy_from(air_contents) + var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc, air_contents.copy()) replacement.interact(usr) qdel(src) if("pressure") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 56d3c867675..480a2c62b41 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/atmos.dmi' use_power = 0 - var/datum/gas_mixture/air_contents = new + var/datum/gas_mixture/air_contents var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port var/obj/item/weapon/tank/holding @@ -15,22 +15,27 @@ /obj/machinery/portable_atmospherics/New() ..() SSair.atmos_machinery += src + + air_contents = new air_contents.volume = volume air_contents.temperature = T20C + return 1 +/obj/machinery/portable_atmospherics/Destroy() + SSair.atmos_machinery -= src + + qdel(air_contents) + air_contents = null + + return ..() + /obj/machinery/portable_atmospherics/process_atmos() if(!connected_port) // Pipe network handles reactions if connected. air_contents.react() else update_icon() -/obj/machinery/portable_atmospherics/Destroy() - qdel(air_contents) - air_contents = null - SSair.atmos_machinery -= src - return ..() - /obj/machinery/portable_atmospherics/return_air() return air_contents From 76975aa27e16c000680f07f33245d81136070496 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 22:42:52 -0600 Subject: [PATCH 02/14] Fix IsAdminGhost runtime The following runtime has occured 263 time(s). runtime error: Cannot read null.client proc name: IsAdminGhost (/proc/IsAdminGhost) source file: mob_helpers.dm,398 usr: Nanotrasen Private Security Of... (/mob/living/simple_animal/hostile/nanotrasen/ranged/smg) src: null --- code/modules/mob/mob_helpers.dm | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7ebd205db06..eb21d2b982a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -395,7 +395,12 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return /proc/IsAdminGhost(var/mob/user) - if(check_rights_for(user.client, R_ADMIN) && istype(user, /mob/dead/observer) && user.client.AI_Interact) - return 1 - else - return 0 \ No newline at end of file + if(!user.client) // Do they have a client? + return + if(!isobserver(user)) // Are they a ghost? + return + if(!check_rights_for(user.client, R_ADMIN)) // Are they allowed? + return + if(!user.client.AI_Interact) // Do they have it enabled? + return + return TRUE \ No newline at end of file From 9fbdd7dc6bd56bc6368121a69552a8b864c0a7df Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 22:46:07 -0600 Subject: [PATCH 03/14] Fix sleeper runtime Doesn't matter because the parent calls dropContents() The following runtime has occured 128 time(s). runtime error: Cannot read null.contents proc name: Destroy (/obj/machinery/sleeper/Destroy) source file: Sleeper.dm,52 usr: Daniel Young (/mob/living/carbon/human) src: the sleeper (/obj/machinery/sleeper) --- code/game/machinery/Sleeper.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 32b34729cbe..f8669e5b8ea 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -47,11 +47,6 @@ for(var/i in 1 to I) available_chems |= possible_chems[i] -/obj/machinery/sleeper/Destroy() - var/turf/T = loc - T.contents += contents - return ..() - /obj/machinery/sleeper/update_icon() if(state_open) icon_state = "sleeper-open" From 33e73640fa3632e8821140195ea5388e4cd7543b Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 23:00:03 -0600 Subject: [PATCH 04/14] Fix synth runtime Synth damage overlays only apply if disguised The following runtime has occured 80 time(s). runtime error: Cannot read null.appearance proc name: handle disguise (/datum/species/synth/proc/handle_disguise) source file: species_types.dm,649 usr: null src: Military Synth (/datum/species/synth/military) --- code/modules/mob/living/carbon/human/species_types.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index ba054ec21bf..2c7407d8556 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -626,7 +626,7 @@ var/global/list/synth_flesh_disguises = list() /datum/species/synth/proc/handle_disguise(mob/living/carbon/human/H) - if(H) + if(H && fake_species) // Obviously we only are disguise when we're... disguised. H.updatehealth() var/add_overlay = FALSE if(H.health < disguise_fail_health) From 66dac6d1642cc98eb88939bc8ac95a791bc6cae0 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 23:00:39 -0600 Subject: [PATCH 05/14] Use more reliable method of relabeling canister --- code/modules/atmospherics/machinery/portable/canister.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 773eb13d8a2..9dd5d7f0356 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -69,7 +69,7 @@ /obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture) ..() if(existing_mixture) - air_contents = existing_mixture + air_contents.copy_from(existing_mixture) else create_gas() @@ -259,7 +259,7 @@ if(label && !..()) var/newtype = label2types[label] if(newtype) - var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc, air_contents.copy()) + var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc, air_contents) replacement.interact(usr) qdel(src) if("pressure") From 481bc67ae6f322b439577d755d75058793d38d29 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 23:00:57 -0600 Subject: [PATCH 06/14] Fix objective runtime When reading fromg gases you must assert_gas The following runtime has occured 59 time(s). runtime error: cannot read from list proc name: check special completion (/datum/objective_item/steal/plasma/check_special_completion) source file: objective_items.dm,97 usr: null src: 28 moles of plasma (full tank) (/datum/objective_item/steal/plasma) --- code/game/gamemodes/objective_items.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index c3121978a60..2e298106e98 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -94,7 +94,9 @@ /datum/objective_item/steal/plasma/check_special_completion(obj/item/weapon/tank/T) var/target_amount = text2num(name) var/found_amount = 0 + T.air_contents.assert_gas("plasma") found_amount += T.air_contents.gases["plasma"][MOLES] + T.air_contents.garbage_collect() return found_amount>=target_amount From cbd37b6e77243835607dbafad4685ba6ab65bebb Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 23:04:58 -0600 Subject: [PATCH 07/14] Fix gravity generator runtime Checking turf Z is silly when mob checks make more sense The following runtime has occured 53 time(s). runtime error: Cannot read null.z proc name: shake everyone (/obj/machinery/gravity_generator/main/proc/shake_everyone) source file: gravitygenerator.dm,360 usr: null src: the gravitational generator (/obj/machinery/gravity_generator/main/station) --- code/modules/power/gravitygenerator.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index c720875aeb9..721058952b9 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -354,14 +354,14 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. /obj/machinery/gravity_generator/main/proc/shake_everyone() - var/turf/our_turf = get_turf(src) + var/turf/T = get_turf(src) for(var/mob/M in mob_list) - var/turf/their_turf = get_turf(M) - if(their_turf.z == our_turf.z) - M.update_gravity(M.mob_has_gravity()) - if(M.client) - shake_camera(M, 15, 1) - M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5) + if(M.z != z) + continue + M.update_gravity(M.mob_has_gravity()) + if(M.client) + shake_camera(M, 15, 1) + M.playsound_local(T, 'sound/effects/alert.ogg', 100, 1, 0.5) /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src) From 72fbf9a1811d07fff9f3f7e2cd93e4a4a8207dbd Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 23:06:43 -0600 Subject: [PATCH 08/14] Fix click catcher runtime Check that a turf exists when attempting to click it This can happen if someone manages to click off the edge of the Z-level The following runtime has occured 48 time(s). runtime error: Cannot execute null.Click(). proc name: Click (/obj/screen/click_catcher/Click) source file: click.dm,345 usr: Drone (758) (/mob/living/simple_animal/drone) src: (/obj/screen/click_catcher) --- code/_onclick/click.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index e8297662c85..ce33b9097f4 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -342,5 +342,6 @@ C.swap_hand() else var/turf/T = screen_loc2turf(modifiers["screen-loc"], get_turf(usr)) - T.Click(location, control, params) + if(T) + T.Click(location, control, params) return 1 From f4c33332fefee6676a257e3855d5447f46e5b960 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 23:23:39 -0600 Subject: [PATCH 09/14] istypeless meme --- code/modules/mob/interactive.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 03213f35a67..57834921fd4 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -89,7 +89,8 @@ age = rand(AGE_MIN,AGE_MAX) //job handling var/list/jobs = SSjob.occupations.Copy() - for(var/datum/job/J in jobs) + for(var/job in jobs) + var/datum/job/J = job if(J.title == "Cyborg" || J.title == "AI" || J.title == "Chaplain" || J.title == "Mime") jobs -= J myjob = pick(jobs) From 5975449a310c02410dad09465ca966296c4df04d Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Tue, 9 Feb 2016 23:45:02 -0600 Subject: [PATCH 10/14] Fix gravity gen logging during init --- code/modules/power/gravitygenerator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 721058952b9..e93a0fb746c 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -288,7 +288,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Sound the alert if gravity was just enabled or disabled. var/alert = 0 var/area/area = get_area(src) - if(new_state) // If we turned on + if(on && ticker && ticker.current_state == GAME_STATE_PLAYING) // If we turned on and the game is live. if(gravity_in_level() == 0) alert = 1 investigate_log("was brought online and is now producing gravity for this level.", "gravity") From 265b8d2d20031ec8437001544f682621168e20dc Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Wed, 10 Feb 2016 07:01:24 -0600 Subject: [PATCH 11/14] Fix an air alarm runtime Don't store hard refs to an area which can cause race condtions Instead, get our area only when we need it The following runtime has occured 4426 time(s). runtime error: Cannot read null.atmosalm proc name: update icon (/obj/machinery/airalarm/update_icon) source file: airalarm.dm,535 usr: null src: the alarm (/obj/machinery/airalarm) --- code/datums/wires/airalarm.dm | 6 +- .../atmospherics/machinery/airalarm.dm | 165 +++++++++--------- .../components/unary_devices/vent_pump.dm | 50 ++---- .../components/unary_devices/vent_scrubber.dm | 69 +++----- 4 files changed, 127 insertions(+), 163 deletions(-) diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index 1e4d7cd04c1..e682045cd7a 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -45,7 +45,8 @@ A.mode = 1 // AALARM_MODE_SCRUB A.apply_mode() if(WIRE_ALARM) // Clear alarms. - if(A.alarm_area.atmosalert(0, holder)) + var/area/AA = get_area_master(A) + if(AA.atmosalert(0, holder)) A.post_alert(0) A.update_icon() @@ -66,6 +67,7 @@ A.mode = 3 // AALARM_MODE_PANIC A.apply_mode() if(WIRE_ALARM) // Post alarm. - if(A.alarm_area.atmosalert(2, holder)) + var/area/AA = get_area_master(A) + if(AA.atmosalert(2, holder)) A.post_alert(2) A.update_icon() \ No newline at end of file diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index d08ec5689ed..aa4ef256b4c 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -45,7 +45,7 @@ #define AALARM_REPORT_TIMEOUT 100 /obj/machinery/airalarm - name = "alarm" + name = "air alarm" desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous." icon = 'icons/obj/monitors.dmi' icon_state = "alarm0" @@ -55,22 +55,18 @@ active_power_usage = 8 power_channel = ENVIRON req_access = list(access_atmospherics) - var/frequency = 1439 - //var/skipprocess = 0 //Experimenting - var/alarm_frequency = 1437 - var/datum/radio_frequency/radio_connection + var/danger_level = 0 + var/mode = AALARM_MODE_SCRUBBING + var/locked = 1 var/aidisabled = 0 var/shorted = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - - var/mode = AALARM_MODE_SCRUBBING - - var/area_uid - var/area/alarm_area - var/danger_level = 0 + var/frequency = 1439 + var/alarm_frequency = 1437 + var/datum/radio_frequency/radio_connection var/list/TLV = list( // Breathable air. "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE* 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20), // kPa @@ -106,7 +102,6 @@ //all air alarms in area are connected via magic /area - var/obj/machinery/airalarm/master_air_alarm var/list/air_vent_names = list() var/list/air_scrub_names = list() var/list/air_vent_info = list() @@ -122,18 +117,15 @@ buildstage = 0 panel_open = 1 pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) - pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 + pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0 - alarm_area = get_area(loc) - if (alarm_area.master) - alarm_area = alarm_area.master - area_uid = alarm_area.uid - if (name == "alarm") - name = "[alarm_area.name] Air Alarm" + var/area/A = get_area_master(src) + if(name == initial(name)) + name = "[A.name] Air Alarm" update_icon() if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() + initialize() /obj/machinery/airalarm/Destroy() if(SSradio) @@ -144,19 +136,6 @@ /obj/machinery/airalarm/initialize() set_frequency(frequency) - if(!master_is_operating()) - elect_master() - -/obj/machinery/airalarm/proc/master_is_operating() - return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN)) - -/obj/machinery/airalarm/proc/elect_master() - for(var/area/A in alarm_area.related) - for(var/obj/machinery/airalarm/AA in A) - if(!(AA.stat & (NOPOWER|BROKEN))) - alarm_area.master_air_alarm = AA - return 1 - return 0 /obj/machinery/airalarm/ui_status(mob/user) if(user.has_unlimited_silicon_privilege && aidisabled) @@ -177,11 +156,13 @@ "locked" = locked, "siliconUser" = user.has_unlimited_silicon_privilege, "emagged" = emagged, - "atmos_alarm" = alarm_area.atmosalm, - "fire_alarm" = alarm_area.fire, "danger_level" = danger_level, ) + var/area/A = get_area(src) + data["atmos_alarm"] = A.atmosalm + data["fire_alarm"] = A.fire + var/turf/T = get_turf(src) var/datum/gas_mixture/environment = T.return_air() var/datum/tlv/cur_tlv @@ -218,9 +199,9 @@ if(!locked || user.has_unlimited_silicon_privilege) data["vents"] = list() - for(var/id_tag in alarm_area.air_vent_names) - var/long_name = alarm_area.air_vent_names[id_tag] - var/list/info = alarm_area.air_vent_info[id_tag] + for(var/id_tag in A.air_vent_names) + var/long_name = A.air_vent_names[id_tag] + var/list/info = A.air_vent_info[id_tag] if(!info || info["frequency"] != frequency) continue data["vents"] += list(list( @@ -235,9 +216,9 @@ "extdefault"= (info["external"] == ONE_ATMOSPHERE) )) data["scrubbers"] = list() - for(var/id_tag in alarm_area.air_scrub_names) - var/long_name = alarm_area.air_scrub_names[id_tag] - var/list/info = alarm_area.air_scrub_info[id_tag] + for(var/id_tag in A.air_scrub_names) + var/long_name = A.air_scrub_names[id_tag] + var/list/info = A.air_scrub_info[id_tag] if(!info || info["frequency"] != frequency) continue data["scrubbers"] += list(list( @@ -314,7 +295,8 @@ send_signal(device_id, list("checks" = text2num(params["val"])^2)) . = TRUE if("set_external_pressure") - var/target = input("New target pressure:", name, alarm_area.air_vent_info[device_id]["external"]) as num|null + var/area/A = get_area_master(src) + var/target = input("New target pressure:", name, A.air_vent_info[device_id]["external"]) as num|null if(!isnull(target) && !..()) send_signal(device_id, list("set_external_pressure" = target)) . = TRUE @@ -339,11 +321,13 @@ apply_mode() . = TRUE if("alarm") - if(alarm_area.atmosalert(2, src)) + var/area/A = get_area_master(src) + if(A.atmosalert(2, src)) post_alert(2) . = TRUE if("reset") - if(alarm_area.atmosalert(0, src)) + var/area/A = get_area_master(src) + if(A.atmosalert(0, src)) post_alert(0) . = TRUE update_icon() @@ -374,16 +358,17 @@ return 0 /obj/machinery/airalarm/proc/refresh_all() - for(var/id_tag in alarm_area.air_vent_names) - var/list/I = alarm_area.air_vent_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + var/area/A = get_area_master(src) + for(var/id_tag in A.air_vent_names) + var/list/I = A.air_vent_info[id_tag] + if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time) continue - send_signal(id_tag, list("status") ) - for(var/id_tag in alarm_area.air_scrub_names) - var/list/I = alarm_area.air_scrub_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + send_signal(id_tag, list("status")) + for(var/id_tag in A.air_scrub_names) + var/list/I = A.air_scrub_info[id_tag] + if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time) continue - send_signal(id_tag, list("status") ) + send_signal(id_tag, list("status")) /obj/machinery/airalarm/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) @@ -408,9 +393,10 @@ return 1 /obj/machinery/airalarm/proc/apply_mode() + var/area/A = get_area_master(src) switch(mode) if(AALARM_MODE_SCRUBBING) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "co2_scrub" = 1, @@ -419,14 +405,14 @@ "scrubbing" = 1, "widenet" = 0, )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, "set_external_pressure" = ONE_ATMOSPHERE )) if(AALARM_MODE_CONTAMINATED) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "co2_scrub" = 1, @@ -435,27 +421,27 @@ "scrubbing" = 1, "widenet" = 1, )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, "set_external_pressure" = ONE_ATMOSPHERE )) if(AALARM_MODE_VENTING) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "widenet" = 0, "scrubbing" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, "set_external_pressure" = ONE_ATMOSPHERE*2 )) if(AALARM_MODE_REFILL) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "co2_scrub" = 1, @@ -464,7 +450,7 @@ "scrubbing" = 1, "widenet" = 0, )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, @@ -472,43 +458,43 @@ )) if(AALARM_MODE_PANIC, AALARM_MODE_REPLACEMENT) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "widenet" = 1, "scrubbing" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 0 )) if(AALARM_MODE_SIPHON) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "widenet" = 0, "scrubbing" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 0 )) if(AALARM_MODE_OFF) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 0 )) if(AALARM_MODE_FLOOD) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 2, @@ -529,21 +515,23 @@ if((stat & (NOPOWER|BROKEN)) || shorted) icon_state = "alarmp" return - switch(max(danger_level, alarm_area.atmosalm)) - if (0) - src.icon_state = "alarm0" - if (1) - src.icon_state = "alarm2" //yes, alarm2 is yellow alarm - if (2) - src.icon_state = "alarm1" + + var/area/A = get_area_master(src) + switch(max(danger_level, A.atmosalm)) + if(0) + icon_state = "alarm0" + if(1) + icon_state = "alarm2" //yes, alarm2 is yellow alarm + if(2) + icon_state = "alarm1" /obj/machinery/airalarm/process() if((stat & (NOPOWER|BROKEN)) || shorted) return - var/turf/simulated/location = src.loc - if(!istype(location)) - return 0 + var/turf/simulated/location = get_turf(src) + if(!location) + return var/datum/tlv/cur_tlv @@ -570,23 +558,25 @@ var/old_danger_level = danger_level danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel) - if (old_danger_level != danger_level) + if(old_danger_level != danger_level) apply_danger_level() - if (mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05) + if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05) mode = AALARM_MODE_SCRUBBING apply_mode() - return /obj/machinery/airalarm/proc/post_alert(alert_level) var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency) - if(!frequency) return + if(!frequency) + return + + var/area/A = get_area_master(src) var/datum/signal/alert_signal = new alert_signal.source = src alert_signal.transmission_method = 1 - alert_signal.data["zone"] = alarm_area.name + alert_signal.data["zone"] = A.name alert_signal.data["type"] = "Atmospheric" if(alert_level==2) @@ -599,13 +589,16 @@ frequency.post_signal(src, alert_signal,null,-1) /obj/machinery/airalarm/proc/apply_danger_level() + var/area/A = get_area_master(src) + var/new_area_danger_level = 0 - for (var/area/A in alarm_area.related) - for (var/obj/machinery/airalarm/AA in A) + for(var/area/R in A.related) + for(var/obj/machinery/airalarm/AA in R) if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) new_area_danger_level = max(new_area_danger_level,AA.danger_level) - if (alarm_area.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state + if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state post_alert(new_area_danger_level) + update_icon() /obj/machinery/airalarm/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index a48785f31e3..a5b6fbe5865 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -6,35 +6,26 @@ #define RELEASING 1 /obj/machinery/atmospherics/components/unary/vent_pump - icon_state = "vent_map" - name = "air vent" desc = "Has a valve and pump attached to it" + icon_state = "vent_map" use_power = 1 - can_unwrench = 1 - welded = 0 - var/area/initial_loc - level = 1 - var/area_uid var/id_tag = null - var/on = 0 var/pump_direction = RELEASING + var/pressure_checks = EXT_BOUND var/external_pressure_bound = ONE_ATMOSPHERE var/internal_pressure_bound = 0 - - var/pressure_checks = EXT_BOUND //EXT_BOUND: Do not pass external_pressure_bound //INT_BOUND: Do not pass internal_pressure_bound //NO_BOUND: Do not pass either var/frequency = 1439 var/datum/radio_frequency/radio_connection - var/radio_filter_out var/radio_filter_in @@ -51,22 +42,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/New() ..() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) /obj/machinery/atmospherics/components/unary/vent_pump/Destroy() + var/area/A = get_area_master(src) + A.air_vent_names -= id_tag + A.air_vent_info -= id_tag + if(SSradio) SSradio.remove_object(src,frequency) radio_connection = null - if(initial_loc) - initial_loc.air_vent_info -= id_tag - initial_loc.air_vent_names -= id_tag - initial_loc = null + return ..() /obj/machinery/atmospherics/components/unary/vent_pump/high_volume @@ -164,24 +152,23 @@ signal.source = src signal.data = list( - "area" = src.area_uid, - "tag" = src.id_tag, + "tag" = id_tag, "frequency" = frequency, "device" = "VP", + "timestamp" = world.time, "power" = on, - "direction" = pump_direction?("release"):("siphon"), + "direction" = pump_direction ? "release" : "siphon", "checks" = pressure_checks, "internal" = internal_pressure_bound, "external" = external_pressure_bound, - "timestamp" = world.time, "sigtype" = "status" ) - if(!initial_loc.air_vent_names[id_tag]) - var/new_name = "\improper [initial_loc.name] vent pump #[initial_loc.air_vent_names.len+1]" - initial_loc.air_vent_names[id_tag] = new_name - src.name = new_name - initial_loc.air_vent_info[id_tag] = signal.data + var/area/A = get_area_master(src) + if(!A.air_vent_names[id_tag]) + name = "\improper [A.name] vent pump #[A.air_vent_names.len + 1]" + A.air_vent_names[id_tag] = name + A.air_vent_info[id_tag] = signal.data radio_connection.post_signal(src, signal, radio_filter_out) @@ -285,10 +272,7 @@ user << "It seems welded shut." /obj/machinery/atmospherics/components/unary/vent_pump/power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER + ..() update_icon_nopipes() /obj/machinery/atmospherics/components/unary/vent_pump/can_crawl_through() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index ff0acbbafcf..8d0e6e19614 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -2,67 +2,56 @@ #define SCRUBBING 1 /obj/machinery/atmospherics/components/unary/vent_scrubber - icon_state = "scrub_map" - name = "air scrubber" desc = "Has a valve and pump attached to it" - + icon_state = "scrub_map" use_power = 1 idle_power_usage = 10 active_power_usage = 60 - - level = 1 - can_unwrench = 1 - welded = 0 - var/area/initial_loc var/id_tag = null - var/frequency = 1439 - var/datum/radio_frequency/radio_connection - - var/list/turf/simulated/adjacent_turfs = list() - var/on = 0 var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing + var/scrub_CO2 = 1 var/scrub_Toxins = 0 var/scrub_N2O = 0 var/volume_rate = 200 var/widenet = 0 //is this scrubber acting on the 3x3 area around it. + var/list/turf/simulated/adjacent_turfs = list() - var/area_uid + var/frequency = 1439 + var/datum/radio_frequency/radio_connection var/radio_filter_out var/radio_filter_in - /obj/machinery/atmospherics/components/unary/vent_scrubber/New() ..() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) /obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy() + var/area/A = get_area_master(src) + A.air_scrub_names -= id_tag + A.air_scrub_info -= id_tag + if(SSradio) SSradio.remove_object(src,frequency) radio_connection = null - if(initial_loc) - initial_loc.air_scrub_info -= id_tag - initial_loc.air_scrub_names -= id_tag - initial_loc = null + for(var/I in adjacent_turfs) I = null + return ..() + /obj/machinery/atmospherics/components/unary/vent_scrubber/auto_use_power() if(!powered(power_channel)) return 0 - if (!on || welded) + if(!on || welded) return 0 if(stat & (NOPOWER|BROKEN)) return 0 @@ -80,7 +69,7 @@ amount = active_power_usage if (widenet) - amount += amount*(adjacent_turfs.len*(adjacent_turfs.len/2)) + amount += amount * (adjacent_turfs.len * (adjacent_turfs.len / 2)) use_power(amount, power_channel) return 1 @@ -115,7 +104,6 @@ signal.transmission_method = 1 //radio signal signal.source = src signal.data = list( - "area" = area_uid, "tag" = id_tag, "frequency" = frequency, "device" = "VS", @@ -128,11 +116,13 @@ "filter_n2o" = scrub_N2O, "sigtype" = "status" ) - if(!initial_loc.air_scrub_names[id_tag]) - var/new_name = "\improper [initial_loc.name] air scrubber #[initial_loc.air_scrub_names.len+1]" - initial_loc.air_scrub_names[id_tag] = new_name - src.name = new_name - initial_loc.air_scrub_info[id_tag] = signal.data + + var/area/A = get_area_master(src) + if(!A.air_scrub_names[id_tag]) + name = "\improper [A.name] air scrubber #[A.air_scrub_names.len + 1]" + A.air_scrub_names[id_tag] = name + A.air_scrub_info[id_tag] = signal.data + radio_connection.post_signal(src, signal, radio_filter_out) return 1 @@ -140,7 +130,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/atmosinit() radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null - if (frequency) + if(frequency) set_frequency(frequency) broadcast_status() check_turfs() @@ -159,8 +149,6 @@ for (var/turf/simulated/tile in adjacent_turfs) scrub(tile) - - /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/simulated/tile) if (!istype(tile)) return 0 @@ -245,9 +233,9 @@ // diagonal turfs that can share atmos with *both* of the cardinal turfs /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/check_turfs() adjacent_turfs.Cut() - var/turf/T = loc - if (istype(T)) - adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir=1) + var/turf/T = get_turf(src) + if(istype(T)) + adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir = 1) /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) @@ -299,10 +287,7 @@ return /obj/machinery/atmospherics/components/unary/vent_scrubber/power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER + ..() update_icon_nopipes() /obj/machinery/atmospherics/components/unary/vent_scrubber/attackby(obj/item/weapon/W, mob/user, params) From 85e80780ce2800efc70e83d92d80295b00cae0d0 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Wed, 10 Feb 2016 07:20:25 -0600 Subject: [PATCH 12/14] Fix storage runtime Mobs without clients can't see into storage! They have no screen! The following runtime has occured 92 time(s). runtime error: Cannot read null.screen proc name: show to (/obj/item/weapon/storage/proc/show_to) source file: storage.dm,104 usr: Leo Pfeifer (/mob/living/carbon/human) src: the backpack (/obj/item/weapon/storage/backpack) --- code/game/objects/items/weapons/storage/storage.dm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index ccd7d9d44b6..cac36746465 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -95,18 +95,17 @@ /obj/item/weapon/storage/proc/show_to(mob/user) + if(!user.client) + return if(user.s_active != src && (user.stat == CONSCIOUS)) for(var/obj/item/I in src) if(I.on_found(user)) return if(user.s_active) user.s_active.hide_from(user) - user.client.screen -= boxes - user.client.screen -= closer - user.client.screen -= contents - user.client.screen += boxes - user.client.screen += closer - user.client.screen += contents + user.client.screen |= boxes + user.client.screen |= closer + user.client.screen |= contents user.s_active = src is_seeing |= user @@ -115,7 +114,6 @@ close_all() return ..() - /obj/item/weapon/storage/proc/hide_from(mob/user) if(!user.client) return From 22119232ad4ce88bda08d75f8050b204bcd80660 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Wed, 10 Feb 2016 07:23:00 -0600 Subject: [PATCH 13/14] Fix DNA runtime When an admin clicks cancel on change species, a null species it set. Check for this in the set_species proc The following runtime has occured 34 time(s). runtime error: Cannot create objects of type null. proc name: set species (/mob/living/carbon/set_species) source file: dna.dm,180 usr: Phoebe Lotsu (/mob/dead/observer) src: Swae Lee (/mob/living/carbon/human) --- code/game/dna.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/dna.dm b/code/game/dna.dm index 97260fd785a..24b464d41ab 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -172,8 +172,8 @@ /mob/proc/set_species(datum/species/mrace, icon_update = 1) return -/mob/living/carbon/set_species(datum/species/mrace, icon_update = 1) - if(has_dna()) +/mob/living/carbon/set_species(datum/species/mrace = null, icon_update = 1) + if(mrace && has_dna()) if(dna.species.exotic_blood) var/datum/reagent/EB = dna.species.exotic_blood reagents.del_reagent(initial(EB.id)) From 4089d850cc622ae45d3d5eb1e883c529ce9f25ee Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Wed, 10 Feb 2016 23:42:15 -0600 Subject: [PATCH 14/14] Address feedback Canisters mixtures can no longer be null thanks to accepting one in New() Just forget assert_gas in objectives --- code/game/gamemodes/objective_items.dm | 4 +--- code/modules/atmospherics/machinery/portable/canister.dm | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 2e298106e98..e4c4ba20d7b 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -94,9 +94,7 @@ /datum/objective_item/steal/plasma/check_special_completion(obj/item/weapon/tank/T) var/target_amount = text2num(name) var/found_amount = 0 - T.air_contents.assert_gas("plasma") - found_amount += T.air_contents.gases["plasma"][MOLES] - T.air_contents.garbage_collect() + found_amount += T.air_contents.gases["plasma"] ? T.air_contents.gases["plasma"][MOLES] : 0 return found_amount>=target_amount diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 9dd5d7f0356..acda6be5141 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -114,7 +114,7 @@ update |= HOLDING if(connected_port) update |= CONNECTED - var/pressure = air_contents ? air_contents.return_pressure() : 0 + var/pressure = air_contents.return_pressure() if(pressure < 10) update |= EMPTY else if(pressure < ONE_ATMOSPHERE)