diff --git a/baystation12.dme b/baystation12.dme index fcc7b36f2f2..ada5e29095d 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1229,6 +1229,7 @@ #include "code\modules\nano\nanoprocs.dm" #include "code\modules\nano\nanoui.dm" #include "code\modules\nano\modules\crew_monitor.dm" +#include "code\modules\nano\modules\power_monitor.dm" #include "code\modules\nano\modules\rcon.dm" #include "code\modules\organs\blood.dm" #include "code\modules\organs\organ.dm" diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 7cfb7c76944..d5eaec70a1b 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -25,7 +25,8 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/toggle_acceleration, /mob/living/silicon/ai/proc/toggle_camera_light, /mob/living/silicon/ai/proc/nano_rcon, - /mob/living/silicon/ai/proc/nano_crew_monitor + /mob/living/silicon/ai/proc/nano_crew_monitor, + /mob/living/silicon/ai/proc/nano_power_monitor ) //Not sure why this is necessary... diff --git a/code/modules/mob/living/silicon/ai/nano.dm b/code/modules/mob/living/silicon/ai/nano.dm index 6925f2560bd..8572c8ec59d 100644 --- a/code/modules/mob/living/silicon/ai/nano.dm +++ b/code/modules/mob/living/silicon/ai/nano.dm @@ -1,18 +1,27 @@ var/obj/nano_module/crew_monitor/crew_monitor var/obj/nano_module/rcon/rcon +var/obj/nano_module/power_monitor/power_monitor /mob/living/silicon/ai/proc/init_subsystems() crew_monitor = new(src) rcon = new(src) - -/mob/living/silicon/ai/proc/nano_rcon() - set category = "AI Subystems" - set name = "RCON" - - rcon.ui_interact(usr) + power_monitor = new(src) /mob/living/silicon/ai/proc/nano_crew_monitor() set category = "AI Subystems" set name = "Crew Monitor" crew_monitor.ui_interact(usr) + +/mob/living/silicon/ai/proc/nano_power_monitor() + set category = "AI Subystems" + set name = "Power Monitor" + + power_monitor.ui_interact(usr) + + +/mob/living/silicon/ai/proc/nano_rcon() + set category = "AI Subystems" + set name = "RCON" + + rcon.ui_interact(usr) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index 73ba6d482df..97b6edd7ac5 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -1,9 +1,11 @@ /obj/nano_module/crew_monitor + name = "Crew monitor" var/list/tracked = new /obj/nano_module/crew_monitor/Topic(href, href_list) if(..()) return - if (!(src.loc.z in config.player_levels)) + var/turf/T = get_turf(src) + if (!T || !(T.z in config.player_levels)) usr << "Unable to establish a connection: You're too far away from the station!" return 0 if(href_list["close"] ) @@ -21,13 +23,13 @@ src.scan() var/data[0] + var/turf/T = get_turf(src) var/list/crewmembers = list() - for(var/obj/item/clothing/under/C in src.tracked) var/turf/pos = get_turf(C) - if((C) && (C.has_sensor) && (pos) && (pos.z == src.loc.z) && (C.sensor_mode != SUIT_SENSOR_OFF)) + if((C) && (C.has_sensor) && (pos) && (T && pos.z == T.z) && (C.sensor_mode != SUIT_SENSOR_OFF)) if(istype(C.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C.loc diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm new file mode 100644 index 00000000000..03d9263a802 --- /dev/null +++ b/code/modules/nano/modules/power_monitor.dm @@ -0,0 +1,58 @@ +/obj/nano_module/power_monitor + name = "Power monitor" + var/list/grid_sensors + var/active_sensor = null //name_tag of the currently selected sensor + +/obj/nano_module/power_monitor/New() + ..() + refresh_sensors() + +/obj/nano_module/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/list/data = list() + var/list/sensors = list() + // Focus: If it remains null if no sensor is selected and UI will display sensor list, otherwise it will display sensor reading. + var/obj/machinery/power/sensor/focus = null + + // Build list of data from sensor readings. + for(var/obj/machinery/power/sensor/S in grid_sensors) + sensors.Add(list(list( + "name" = S.name_tag, + "alarm" = S.check_grid_warning() + ))) + if(S.name_tag == active_sensor) + focus = S + + data["all_sensors"] = sensors + if(focus) + data["focus"] = focus.return_reading_data() + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 500) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +// Proc: refresh_sensors() +// Parameters: None +// Description: Refreshes list of active sensors kept on this computer. +/obj/nano_module/power_monitor/proc/refresh_sensors() + grid_sensors = list() + var/turf/T = get_turf(src) + for(var/obj/machinery/power/sensor/S in machines) + if((T && S.loc.z == T.z) || (S.long_range)) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels. + if(S.name_tag == "#UNKN#") // Default name. Shouldn't happen! + warning("Powernet sensor with unset ID Tag! [S.x]X [S.y]Y [S.z]Z") + else + grid_sensors += S + +// Proc: Topic() +// Parameters: 2 (href, href_list - allows us to process UI clicks) +// Description: Allows us to process UI clicks, which are relayed in form of hrefs. +/obj/nano_module/power_monitor/Topic(href, href_list) + if(..()) + return + if( href_list["clear"] ) + active_sensor = null + else if( href_list["setsensor"] ) + active_sensor = href_list["setsensor"] diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm index a3b978946b4..54b203a7d43 100644 --- a/code/modules/power/sensors/sensor_monitoring.dm +++ b/code/modules/power/sensors/sensor_monitoring.dm @@ -16,12 +16,11 @@ density = 1 anchored = 1.0 circuit = /obj/item/weapon/circuitboard/powermonitor - var/list/grid_sensors var/alerting = 0 - var/active_sensor = null //name_tag of the currently selected sensor use_power = 1 idle_power_usage = 300 active_power_usage = 300 + var/obj/nano_module/power_monitor/power_monitor // Proc: process() // Parameters: None @@ -53,19 +52,7 @@ /obj/machinery/computer/power_monitor/New() ..() spawn(50) - refresh_sensors() - -// Proc: refresh_sensors() -// Parameters: None -// Description: Refreshes list of active sensors kept on this computer. -/obj/machinery/computer/power_monitor/proc/refresh_sensors() - grid_sensors = list() - for(var/obj/machinery/power/sensor/S in machines) - if((S.loc.z == src.loc.z) || (S.long_range)) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels. - if(S.name_tag == "#UNKN#") // Default name. Shouldn't happen! - warning("Powernet sensor with unset ID Tag! [S.x]X [S.y]Y [S.z]Z") - else - grid_sensors += S + power_monitor = new(src) // Proc: attack_hand() // Parameters: None @@ -77,50 +64,18 @@ return ui_interact(user) -// Proc: Topic() -// Parameters: 2 (href, href_list - allows us to process UI clicks) -// Description: Allows us to process UI clicks, which are relayed in form of hrefs. -/obj/machinery/computer/power_monitor/Topic(href, href_list) - ..() - if( href_list["clear"] ) - active_sensor = null - else if( href_list["setsensor"] ) - active_sensor = href_list["setsensor"] +// Proc: ui_interact() +// Parameters: 4 (standard NanoUI parameters) +// Description: Uses dark magic to operate the NanoUI of this computer. +/obj/machinery/computer/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + power_monitor.ui_interact(user, ui_key, ui, force_open) + // Proc: check_warnings() // Parameters: None // Description: Verifies if any warnings were registered by connected sensors. /obj/machinery/computer/power_monitor/proc/check_warnings() - for(var/obj/machinery/power/sensor/S in grid_sensors) + for(var/obj/machinery/power/sensor/S in power_monitor.grid_sensors) if(S.check_grid_warning()) return 1 return 0 - -// Proc: ui_interact() -// Parameters: 4 (standard NanoUI parameters) -// Description: Uses dark magic to operate the NanoUI of this computer. -/obj/machinery/computer/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/list/data = list() - var/list/sensors = list() - // Focus: If it remains null if no sensor is selected and UI will display sensor list, otherwise it will display sensor reading. - var/obj/machinery/power/sensor/focus = null - - // Build list of data from sensor readings. - for(var/obj/machinery/power/sensor/S in grid_sensors) - sensors.Add(list(list( - "name" = S.name_tag, - "alarm" = S.check_grid_warning() - ))) - if(S.name_tag == active_sensor) - focus = S - - data["all_sensors"] = sensors - if(focus) - data["focus"] = focus.return_reading_data() - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 500) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) \ No newline at end of file diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 99180db13d8..102c1b6f505 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -318,14 +318,14 @@ // Parameters: None // Description: Switches the input on/off depending on previous setting /obj/machinery/power/smes/buildable/proc/toggle_input() - input_attempt = !input_attempt + inputting(!input_attempt) update_icon() // Proc: toggle_output() // Parameters: None // Description: Switches the output on/off depending on previous setting /obj/machinery/power/smes/buildable/proc/toggle_output() - output_attempt = !output_attempt + outputting(!output_attempt) update_icon() // Proc: set_input()