diff --git a/baystation12.dme b/baystation12.dme
index 76b962bff30..6640c379888 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1136,6 +1136,7 @@
#include "code\modules\mob\living\silicon\ai\life.dm"
#include "code\modules\mob\living\silicon\ai\login.dm"
#include "code\modules\mob\living\silicon\ai\logout.dm"
+#include "code\modules\mob\living\silicon\ai\nano.dm"
#include "code\modules\mob\living\silicon\ai\say.dm"
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
@@ -1225,7 +1226,11 @@
#include "code\modules\nano\nanoexternal.dm"
#include "code\modules\nano\nanomanager.dm"
#include "code\modules\nano\nanomapgen.dm"
+#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"
#include "code\modules\organs\organ_alien.dm"
diff --git a/code/game/machinery/computer/RCON_Console.dm b/code/game/machinery/computer/RCON_Console.dm
index 93b18cf9896..f80f0b93c4d 100644
--- a/code/game/machinery/computer/RCON_Console.dm
+++ b/code/game/machinery/computer/RCON_Console.dm
@@ -12,12 +12,11 @@
circuit = /obj/item/weapon/circuitboard/rcon_console
req_one_access = list(access_engine)
var/current_tag = null
- var/list/known_SMESs = null
- var/list/known_breakers = null
- // Allows you to hide specific parts of the UI
- var/hide_SMES = 0
- var/hide_SMES_details = 0
- var/hide_breakers = 0
+ var/obj/nano_module/rcon/rcon
+
+/obj/machinery/computer/rcon/New()
+ ..()
+ rcon = new(src)
// Proc: attack_hand()
// Parameters: 1 (user - Person which clicked this computer)
@@ -29,106 +28,5 @@
// Proc: ui_interact()
// Parameters: 4 (standard NanoUI parameters)
// Description: Uses dark magic (NanoUI) to render this machine's UI
-/obj/machinery/computer/rcon/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- FindDevices() // Update our devices list
- var/data[0]
-
- // SMES DATA (simplified view)
- var/list/smeslist[0]
- for(var/obj/machinery/power/smes/buildable/SMES in known_SMESs)
- smeslist.Add(list(list(
- "charge" = round(SMES.Percentage()),
- "input_set" = SMES.input_attempt,
- "input_val" = round(SMES.input_level),
- "output_set" = SMES.output_attempt,
- "output_val" = round(SMES.output_level),
- "output_load" = round(SMES.output_used),
- "RCON_tag" = SMES.RCon_tag
- )))
-
- data["smes_info"] = sortByKey(smeslist, "RCON_tag")
-
- // BREAKER DATA (simplified view)
- var/list/breakerlist[0]
- for(var/obj/machinery/power/breakerbox/BR in known_breakers)
- breakerlist.Add(list(list(
- "RCON_tag" = BR.RCon_tag,
- "enabled" = BR.on
- )))
- data["breaker_info"] = breakerlist
- data["hide_smes"] = hide_SMES
- data["hide_smes_details"] = hide_SMES_details
- data["hide_breakers"] = hide_breakers
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
- ui = new(user, src, ui_key, "rcon.tmpl", "RCON Console", 600, 400)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
-
-// 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/rcon/Topic(href, href_list)
- if(href_list["smes_in_toggle"])
- var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_in_toggle"])
- if(SMES)
- SMES.toggle_input()
- if(href_list["smes_out_toggle"])
- var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_out_toggle"])
- if(SMES)
- SMES.toggle_output()
- if(href_list["smes_in_set"])
- var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_in_set"])
- if(SMES)
- var/inputset = input(usr, "Enter new input level (0-[SMES.input_level_max])", "SMES Input Power Control") as num
- SMES.set_input(inputset)
- if(href_list["smes_out_set"])
- var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_out_set"])
- if(SMES)
- var/outputset = input(usr, "Enter new output level (0-[SMES.output_level_max])", "SMES Input Power Control") as num
- SMES.set_output(outputset)
-
- if(href_list["toggle_breaker"])
- var/obj/machinery/power/breakerbox/toggle = null
- for(var/obj/machinery/power/breakerbox/breaker in known_breakers)
- if(breaker.RCon_tag == href_list["toggle_breaker"])
- toggle = breaker
- if(toggle)
- if(toggle.update_locked)
- usr << "The breaker box was recently toggled. Please wait before toggling it again."
- else
- toggle.auto_toggle()
- if(href_list["hide_smes"])
- hide_SMES = !hide_SMES
- if(href_list["hide_smes_details"])
- hide_SMES_details = !hide_SMES_details
- if(href_list["hide_breakers"])
- hide_breakers = !hide_breakers
-
-
-// Proc: GetSMESByTag()
-// Parameters: 1 (tag - RCON tag of SMES we want to look up)
-// Description: Looks up and returns SMES which has matching RCON tag
-/obj/machinery/computer/rcon/proc/GetSMESByTag(var/tag)
- if(!tag)
- return
-
- for(var/obj/machinery/power/smes/buildable/S in known_SMESs)
- if(S.RCon_tag == tag)
- return S
-
-// Proc: FindDevices()
-// Parameters: None
-// Description: Refreshes local list of known devices.
-/obj/machinery/computer/rcon/proc/FindDevices()
- known_SMESs = new /list()
- for(var/obj/machinery/power/smes/buildable/SMES in machines)
- if(SMES.RCon_tag && (SMES.RCon_tag != "NO_TAG") && SMES.RCon)
- known_SMESs.Add(SMES)
-
- known_breakers = new /list()
- for(var/obj/machinery/power/breakerbox/breaker in machines)
- if(breaker.RCon_tag != "NO_TAG")
- known_breakers.Add(breaker)
\ No newline at end of file
+/obj/machinery/computer/rcon/ui_interact(mob/user, ui_key = "rcon", var/datum/nanoui/ui = null, var/force_open = 1)
+ rcon.ui_interact(user, ui_key, ui, force_open)
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 06fd906ea88..b5394328b83 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -6,11 +6,10 @@
idle_power_usage = 250
active_power_usage = 500
circuit = "/obj/item/weapon/circuitboard/crew"
- var/list/tracked = list( )
-
+ var/obj/nano_module/crew_monitor/crew_monitor
/obj/machinery/computer/crew/New()
- tracked = list()
+ crew_monitor = new(src)
..()
@@ -25,6 +24,8 @@
return
ui_interact(user)
+/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ crew_monitor.ui_interact(user, ui_key, ui, force_open)
/obj/machinery/computer/crew/update_icon()
@@ -38,93 +39,5 @@
icon_state = initial(icon_state)
stat &= ~NOPOWER
-
-/obj/machinery/computer/crew/Topic(href, href_list)
- if(..()) return
- if (src.z > 6)
- usr << "\red Unable to establish a connection: \black You're too far away from the station!"
- return 0
- if( href_list["close"] )
- var/mob/user = usr
- var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
- usr.unset_machine()
- ui.close()
- return 0
- if(href_list["update"])
- src.updateDialog()
- return 1
-
/obj/machinery/computer/crew/interact(mob/user)
- ui_interact(user)
-
-/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(stat & (BROKEN|NOPOWER))
- return
- user.set_machine(src)
- src.scan()
-
- var/data[0]
- 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.z) && (C.sensor_mode != SUIT_SENSOR_OFF))
- if(istype(C.loc, /mob/living/carbon/human))
-
- var/mob/living/carbon/human/H = C.loc
- if(H.w_uniform != C)
- continue
-
- var/list/crewmemberData = list("dead"=0, "oxy"=-1, "tox"=-1, "fire"=-1, "brute"=-1, "area"="", "x"=-1, "y"=-1)
-
- crewmemberData["sensor_type"] = C.sensor_mode
- crewmemberData["name"] = H.get_authentification_name(if_no_id="Unknown")
- crewmemberData["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job")
- crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
-
- if(C.sensor_mode >= SUIT_SENSOR_BINARY)
- crewmemberData["dead"] = H.stat > 1
-
- if(C.sensor_mode >= SUIT_SENSOR_VITAL)
- crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
- crewmemberData["tox"] = round(H.getToxLoss(), 1)
- crewmemberData["fire"] = round(H.getFireLoss(), 1)
- crewmemberData["brute"] = round(H.getBruteLoss(), 1)
-
- if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
- var/area/A = get_area(H)
- crewmemberData["area"] = sanitize(A.name)
- crewmemberData["x"] = pos.x
- crewmemberData["y"] = pos.y
-
- crewmembers[++crewmembers.len] = crewmemberData
-
- crewmembers = sortByKey(crewmembers, "name")
-
- data["crewmembers"] = crewmembers
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 800)
-
- // adding a template with the key "mapContent" enables the map ui functionality
- ui.add_template("mapContent", "crew_monitor_map_content.tmpl")
- // adding a template with the key "mapHeader" replaces the map header content
- ui.add_template("mapHeader", "crew_monitor_map_header.tmpl")
-
- ui.set_initial_data(data)
- ui.open()
-
- // should make the UI auto-update; doesn't seem to?
- ui.set_auto_update(1)
-
-
-/obj/machinery/computer/crew/proc/scan()
- for(var/mob/living/carbon/human/H in mob_list)
- if(istype(H.w_uniform, /obj/item/clothing/under))
- var/obj/item/clothing/under/C = H.w_uniform
- if (C.has_sensor)
- tracked |= C
- return 1
+ crew_monitor.ui_interact(user)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index bbcad347b59..8f54b76717b 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -20,7 +20,8 @@
// Calling Topic without a corresponding window open causes runtime errors
if(!nowindow && ..())
return 1
- if(usr.can_interact_with_interface(src, checkrange) != STATUS_INTERACTIVE)
+
+ if(usr.can_interact_with_interface(nano_host(), checkrange) != STATUS_INTERACTIVE)
return 1
add_fingerprint(usr)
return 0
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 2bc59be1961..d5eaec70a1b 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -23,7 +23,10 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/sensor_mode,
/mob/living/silicon/ai/proc/show_laws_verb,
/mob/living/silicon/ai/proc/toggle_acceleration,
- /mob/living/silicon/ai/proc/toggle_camera_light
+ /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_power_monitor
)
//Not sure why this is necessary...
@@ -163,6 +166,8 @@ var/list/ai_verbs_default = list(
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
+ init_subsystems()
+
ai_list += src
..()
return
diff --git a/code/modules/mob/living/silicon/ai/nano.dm b/code/modules/mob/living/silicon/ai/nano.dm
new file mode 100644
index 00000000000..8572c8ec59d
--- /dev/null
+++ b/code/modules/mob/living/silicon/ai/nano.dm
@@ -0,0 +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)
+ 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
new file mode 100644
index 00000000000..97b6edd7ac5
--- /dev/null
+++ b/code/modules/nano/modules/crew_monitor.dm
@@ -0,0 +1,88 @@
+/obj/nano_module/crew_monitor
+ name = "Crew monitor"
+ var/list/tracked = new
+
+/obj/nano_module/crew_monitor/Topic(href, href_list)
+ if(..()) return
+ 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"] )
+ var/mob/user = usr
+ var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
+ usr.unset_machine()
+ ui.close()
+ return 0
+ if(href_list["update"])
+ src.updateDialog()
+ return 1
+
+/obj/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+ 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) && (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
+ if(H.w_uniform != C)
+ continue
+
+ var/list/crewmemberData = list("dead"=0, "oxy"=-1, "tox"=-1, "fire"=-1, "brute"=-1, "area"="", "x"=-1, "y"=-1)
+
+ crewmemberData["sensor_type"] = C.sensor_mode
+ crewmemberData["name"] = H.get_authentification_name(if_no_id="Unknown")
+ crewmemberData["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job")
+ crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
+
+ if(C.sensor_mode >= SUIT_SENSOR_BINARY)
+ crewmemberData["dead"] = H.stat > 1
+
+ if(C.sensor_mode >= SUIT_SENSOR_VITAL)
+ crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
+ crewmemberData["tox"] = round(H.getToxLoss(), 1)
+ crewmemberData["fire"] = round(H.getFireLoss(), 1)
+ crewmemberData["brute"] = round(H.getBruteLoss(), 1)
+
+ if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
+ var/area/A = get_area(H)
+ crewmemberData["area"] = sanitize(A.name)
+ crewmemberData["x"] = pos.x
+ crewmemberData["y"] = pos.y
+
+ crewmembers[++crewmembers.len] = crewmemberData
+
+ crewmembers = sortByKey(crewmembers, "name")
+
+ data["crewmembers"] = crewmembers
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 800)
+
+ // adding a template with the key "mapContent" enables the map ui functionality
+ ui.add_template("mapContent", "crew_monitor_map_content.tmpl")
+ // adding a template with the key "mapHeader" replaces the map header content
+ ui.add_template("mapHeader", "crew_monitor_map_header.tmpl")
+
+ ui.set_initial_data(data)
+ ui.open()
+
+ // should make the UI auto-update; doesn't seem to?
+ ui.set_auto_update(1)
+
+/obj/nano_module/crew_monitor/proc/scan()
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(istype(H.w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/C = H.w_uniform
+ if (C.has_sensor)
+ tracked |= C
+ return 1
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/nano/modules/rcon.dm b/code/modules/nano/modules/rcon.dm
new file mode 100644
index 00000000000..6224c56de8f
--- /dev/null
+++ b/code/modules/nano/modules/rcon.dm
@@ -0,0 +1,116 @@
+/obj/nano_module/rcon
+ name = "RCON interface"
+
+ var/list/known_SMESs = null
+ var/list/known_breakers = null
+ // Allows you to hide specific parts of the UI
+ var/hide_SMES = 0
+ var/hide_SMES_details = 0
+ var/hide_breakers = 0
+
+/obj/nano_module/rcon/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1)
+ FindDevices() // Update our devices list
+ var/data[0]
+
+ // SMES DATA (simplified view)
+ var/list/smeslist[0]
+ for(var/obj/machinery/power/smes/buildable/SMES in known_SMESs)
+ smeslist.Add(list(list(
+ "charge" = round(SMES.Percentage()),
+ "input_set" = SMES.input_attempt,
+ "input_val" = round(SMES.input_level),
+ "output_set" = SMES.output_attempt,
+ "output_val" = round(SMES.output_level),
+ "output_load" = round(SMES.output_used),
+ "RCON_tag" = SMES.RCon_tag
+ )))
+
+ data["smes_info"] = sortByKey(smeslist, "RCON_tag")
+
+ // BREAKER DATA (simplified view)
+ var/list/breakerlist[0]
+ for(var/obj/machinery/power/breakerbox/BR in known_breakers)
+ breakerlist.Add(list(list(
+ "RCON_tag" = BR.RCon_tag,
+ "enabled" = BR.on
+ )))
+ data["breaker_info"] = breakerlist
+ data["hide_smes"] = hide_SMES
+ data["hide_smes_details"] = hide_SMES_details
+ data["hide_breakers"] = hide_breakers
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "rcon.tmpl", "RCON Console", 600, 400)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+// 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/rcon/Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["smes_in_toggle"])
+ var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_in_toggle"])
+ if(SMES)
+ SMES.toggle_input()
+ if(href_list["smes_out_toggle"])
+ var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_out_toggle"])
+ if(SMES)
+ SMES.toggle_output()
+ if(href_list["smes_in_set"])
+ var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_in_set"])
+ if(SMES)
+ var/inputset = input(usr, "Enter new input level (0-[SMES.input_level_max])", "SMES Input Power Control") as num
+ SMES.set_input(inputset)
+ if(href_list["smes_out_set"])
+ var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_out_set"])
+ if(SMES)
+ var/outputset = input(usr, "Enter new output level (0-[SMES.output_level_max])", "SMES Input Power Control") as num
+ SMES.set_output(outputset)
+
+ if(href_list["toggle_breaker"])
+ var/obj/machinery/power/breakerbox/toggle = null
+ for(var/obj/machinery/power/breakerbox/breaker in known_breakers)
+ if(breaker.RCon_tag == href_list["toggle_breaker"])
+ toggle = breaker
+ if(toggle)
+ if(toggle.update_locked)
+ usr << "The breaker box was recently toggled. Please wait before toggling it again."
+ else
+ toggle.auto_toggle()
+ if(href_list["hide_smes"])
+ hide_SMES = !hide_SMES
+ if(href_list["hide_smes_details"])
+ hide_SMES_details = !hide_SMES_details
+ if(href_list["hide_breakers"])
+ hide_breakers = !hide_breakers
+
+
+// Proc: GetSMESByTag()
+// Parameters: 1 (tag - RCON tag of SMES we want to look up)
+// Description: Looks up and returns SMES which has matching RCON tag
+/obj/nano_module/rcon/proc/GetSMESByTag(var/tag)
+ if(!tag)
+ return
+
+ for(var/obj/machinery/power/smes/buildable/S in known_SMESs)
+ if(S.RCon_tag == tag)
+ return S
+
+// Proc: FindDevices()
+// Parameters: None
+// Description: Refreshes local list of known devices.
+/obj/nano_module/rcon/proc/FindDevices()
+ known_SMESs = new /list()
+ for(var/obj/machinery/power/smes/buildable/SMES in machines)
+ if(SMES.RCon_tag && (SMES.RCon_tag != "NO_TAG") && SMES.RCon)
+ known_SMESs.Add(SMES)
+
+ known_breakers = new /list()
+ for(var/obj/machinery/power/breakerbox/breaker in machines)
+ if(breaker.RCon_tag != "NO_TAG")
+ known_breakers.Add(breaker)
diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm
index da546ac66da..ddc3fcac9f4 100644
--- a/code/modules/nano/nanomanager.dm
+++ b/code/modules/nano/nanomanager.dm
@@ -1,249 +1,249 @@
-// This is the window/UI manager for Nano UI
-// There should only ever be one (global) instance of nanomanger
-/datum/nanomanager
- // a list of current open /nanoui UIs, grouped by src_object and ui_key
- var/open_uis[0]
- // a list of current open /nanoui UIs, not grouped, for use in processing
- var/list/processing_uis = list()
- // a list of asset filenames which are to be sent to the client on user logon
- var/list/asset_files = list()
-
- /**
- * Create a new nanomanager instance.
- * This proc generates a list of assets which are to be sent to each client on connect
- *
- * @return /nanomanager new nanomanager object
- */
-/datum/nanomanager/New()
- var/list/nano_asset_dirs = list(\
- "nano/css/",\
- "nano/images/",\
- "nano/js/",\
- "nano/templates/"\
- )
-
- var/list/filenames = null
- for (var/path in nano_asset_dirs)
- filenames = flist(path)
- for(var/filename in filenames)
- if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
- if(fexists(path + filename))
- asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect
-
- return
-
- /**
- * Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data
- *
- * @param user /mob The mob who opened/owns the ui
- * @param src_object /obj|/mob The obj or mob which the ui belongs to
- * @param ui_key string A string key used for the ui
- * @param ui /datum/nanoui An existing instance of the ui (can be null)
- * @param data list The data to be passed to the ui, if it exists
- * @param force_open boolean The ui is being forced to (re)open, so close ui if it exists (instead of updating)
- *
- * @return /nanoui Returns the found ui, for null if none exists
- */
-/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data, var/force_open = 0)
- if (isnull(ui)) // no ui has been passed, so we'll search for one
- {
- ui = get_open_ui(user, src_object, ui_key)
- }
- if (!isnull(ui))
- // The UI is already open
- if (!force_open)
- ui.push_data(data)
- return ui
- else
- //testing("nanomanager/try_update_ui mob [user.name] [src_object:name] [ui_key] [force_open] - forcing opening of ui")
- ui.close()
- return null
-
- /**
- * Get an open /nanoui ui for the current user, src_object and ui_key
- *
- * @param user /mob The mob who opened/owns the ui
- * @param src_object /obj|/mob The obj or mob which the ui belongs to
- * @param ui_key string A string key used for the ui
- *
- * @return /nanoui Returns the found ui, or null if none exists
- */
-/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key)
- var/src_object_key = "\ref[src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
- //testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open")
- return null
- else if (isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list))
- //testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open for this object")
- return null
-
- for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
- if (ui.user == user)
- return ui
-
- //testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - ui not found")
- return null
-
- /**
- * Update all /nanoui uis attached to src_object
- *
- * @param src_object /obj|/mob The obj or mob which the uis are attached to
- *
- * @return int The number of uis updated
- */
-/datum/nanomanager/proc/update_uis(src_object)
- var/src_object_key = "\ref[src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
- return 0
-
- var/update_count = 0
- for (var/ui_key in open_uis[src_object_key])
- for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
- if(ui && ui.src_object && ui.user)
- ui.process(1)
- update_count++
- return update_count
-
- /**
- * Update /nanoui uis belonging to user
- *
- * @param user /mob The mob who owns the uis
- * @param src_object /obj|/mob If src_object is provided, only update uis which are attached to src_object (optional)
- * @param ui_key string If ui_key is provided, only update uis with a matching ui_key (optional)
- *
- * @return int The number of uis updated
- */
-/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null)
- if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
- return 0 // has no open uis
-
- var/update_count = 0
- for (var/datum/nanoui/ui in user.open_uis)
- if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
- ui.process(1)
- update_count++
-
- return update_count
-
- /**
- * Close /nanoui uis belonging to user
- *
- * @param user /mob The mob who owns the uis
- * @param src_object /obj|/mob If src_object is provided, only close uis which are attached to src_object (optional)
- * @param ui_key string If ui_key is provided, only close uis with a matching ui_key (optional)
- *
- * @return int The number of uis closed
- */
-/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null)
- if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
- //testing("nanomanager/close_user_uis mob [user.name] has no open uis")
- return 0 // has no open uis
-
- var/close_count = 0
- for (var/datum/nanoui/ui in user.open_uis)
- if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
- ui.close()
- close_count++
-
- //testing("nanomanager/close_user_uis mob [user.name] closed [open_uis.len] of [close_count] uis")
-
- return close_count
-
- /**
- * Add a /nanoui ui to the list of open uis
- * This is called by the /nanoui open() proc
- *
- * @param ui /nanoui The ui to add
- *
- * @return nothing
- */
-/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui)
- var/src_object_key = "\ref[ui.src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
- open_uis[src_object_key] = list(ui.ui_key = list())
- else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
- open_uis[src_object_key][ui.ui_key] = list();
-
- ui.user.open_uis.Add(ui)
- var/list/uis = open_uis[src_object_key][ui.ui_key]
- uis.Add(ui)
- processing_uis.Add(ui)
- //testing("nanomanager/ui_opened mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [ui.user.open_uis.len] | uis [uis.len] | processing_uis [processing_uis.len]")
-
- /**
- * Remove a /nanoui ui from the list of open uis
- * This is called by the /nanoui close() proc
- *
- * @param ui /nanoui The ui to remove
- *
- * @return int 0 if no ui was removed, 1 if removed successfully
- */
-/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui)
- var/src_object_key = "\ref[ui.src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
- return 0 // wasn't open
- else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
- return 0 // wasn't open
-
- processing_uis.Remove(ui)
- ui.user.open_uis.Remove(ui)
- var/list/uis = open_uis[src_object_key][ui.ui_key]
- uis.Remove(ui)
-
- //testing("nanomanager/ui_closed mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [ui.user.open_uis.len] | uis [uis.len] | processing_uis [processing_uis.len]")
-
- return 1
-
- /**
- * This is called on user logout
- * Closes/clears all uis attached to the user's /mob
- *
- * @param user /mob The user's mob
- *
- * @return nothing
- */
-
-//
-/datum/nanomanager/proc/user_logout(var/mob/user)
- //testing("nanomanager/user_logout user [user.name]")
- return close_user_uis(user)
-
- /**
- * This is called when a player transfers from one mob to another
- * Transfers all open UIs to the new mob
- *
- * @param oldMob /mob The user's old mob
- * @param newMob /mob The user's new mob
- *
- * @return nothing
- */
-/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
- //testing("nanomanager/user_transferred from mob [oldMob.name] to mob [newMob.name]")
- if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
- //testing("nanomanager/user_transferred mob [oldMob.name] has no open uis")
- return 0 // has no open uis
-
- if (isnull(newMob.open_uis) || !istype(newMob.open_uis, /list))
- newMob.open_uis = list()
-
- for (var/datum/nanoui/ui in oldMob.open_uis)
- ui.user = newMob
- newMob.open_uis.Add(ui)
-
- oldMob.open_uis.Cut()
-
- return 1 // success
-
- /**
- * Sends all nano assets to the client
- * This is called on user login
- *
- * @param client /client The user's client
- *
- * @return nothing
- */
-
-/datum/nanomanager/proc/send_resources(client)
- for(var/file in asset_files)
- client << browse_rsc(file) // send the file to the client
-
+// This is the window/UI manager for Nano UI
+// There should only ever be one (global) instance of nanomanger
+/datum/nanomanager
+ // a list of current open /nanoui UIs, grouped by src_object and ui_key
+ var/open_uis[0]
+ // a list of current open /nanoui UIs, not grouped, for use in processing
+ var/list/processing_uis = list()
+ // a list of asset filenames which are to be sent to the client on user logon
+ var/list/asset_files = list()
+
+ /**
+ * Create a new nanomanager instance.
+ * This proc generates a list of assets which are to be sent to each client on connect
+ *
+ * @return /nanomanager new nanomanager object
+ */
+/datum/nanomanager/New()
+ var/list/nano_asset_dirs = list(\
+ "nano/css/",\
+ "nano/images/",\
+ "nano/js/",\
+ "nano/templates/"\
+ )
+
+ var/list/filenames = null
+ for (var/path in nano_asset_dirs)
+ filenames = flist(path)
+ for(var/filename in filenames)
+ if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
+ if(fexists(path + filename))
+ asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect
+
+ return
+
+ /**
+ * Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data
+ *
+ * @param user /mob The mob who opened/owns the ui
+ * @param src_object /obj|/mob The obj or mob which the ui belongs to
+ * @param ui_key string A string key used for the ui
+ * @param ui /datum/nanoui An existing instance of the ui (can be null)
+ * @param data list The data to be passed to the ui, if it exists
+ * @param force_open boolean The ui is being forced to (re)open, so close ui if it exists (instead of updating)
+ *
+ * @return /nanoui Returns the found ui, for null if none exists
+ */
+/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data, var/force_open = 0)
+ if (isnull(ui)) // no ui has been passed, so we'll search for one
+ {
+ ui = get_open_ui(user, src_object, ui_key)
+ }
+ if (!isnull(ui))
+ // The UI is already open
+ if (!force_open)
+ ui.push_data(data)
+ return ui
+ else
+ //testing("nanomanager/try_update_ui mob [user.name] [src_object:name] [ui_key] [force_open] - forcing opening of ui")
+ ui.close()
+ return null
+
+ /**
+ * Get an open /nanoui ui for the current user, src_object and ui_key
+ *
+ * @param user /mob The mob who opened/owns the ui
+ * @param src_object /obj|/mob The obj or mob which the ui belongs to
+ * @param ui_key string A string key used for the ui
+ *
+ * @return /nanoui Returns the found ui, or null if none exists
+ */
+/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key)
+ var/src_object_key = "\ref[src_object]"
+ if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ //testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open")
+ return null
+ else if (isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list))
+ //testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open for this object")
+ return null
+
+ for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
+ if (ui.user == user)
+ return ui
+
+ //testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - ui not found")
+ return null
+
+ /**
+ * Update all /nanoui uis attached to src_object
+ *
+ * @param src_object /obj|/mob The obj or mob which the uis are attached to
+ *
+ * @return int The number of uis updated
+ */
+/datum/nanomanager/proc/update_uis(src_object)
+ var/src_object_key = "\ref[src_object]"
+ if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ return 0
+
+ var/update_count = 0
+ for (var/ui_key in open_uis[src_object_key])
+ for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
+ if(ui && ui.src_object && ui.user && ui.src_object.nano_host())
+ ui.process(1)
+ update_count++
+ return update_count
+
+ /**
+ * Update /nanoui uis belonging to user
+ *
+ * @param user /mob The mob who owns the uis
+ * @param src_object /obj|/mob If src_object is provided, only update uis which are attached to src_object (optional)
+ * @param ui_key string If ui_key is provided, only update uis with a matching ui_key (optional)
+ *
+ * @return int The number of uis updated
+ */
+/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null)
+ if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
+ return 0 // has no open uis
+
+ var/update_count = 0
+ for (var/datum/nanoui/ui in user.open_uis)
+ if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
+ ui.process(1)
+ update_count++
+
+ return update_count
+
+ /**
+ * Close /nanoui uis belonging to user
+ *
+ * @param user /mob The mob who owns the uis
+ * @param src_object /obj|/mob If src_object is provided, only close uis which are attached to src_object (optional)
+ * @param ui_key string If ui_key is provided, only close uis with a matching ui_key (optional)
+ *
+ * @return int The number of uis closed
+ */
+/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null)
+ if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
+ //testing("nanomanager/close_user_uis mob [user.name] has no open uis")
+ return 0 // has no open uis
+
+ var/close_count = 0
+ for (var/datum/nanoui/ui in user.open_uis)
+ if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
+ ui.close()
+ close_count++
+
+ //testing("nanomanager/close_user_uis mob [user.name] closed [open_uis.len] of [close_count] uis")
+
+ return close_count
+
+ /**
+ * Add a /nanoui ui to the list of open uis
+ * This is called by the /nanoui open() proc
+ *
+ * @param ui /nanoui The ui to add
+ *
+ * @return nothing
+ */
+/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui)
+ var/src_object_key = "\ref[ui.src_object]"
+ if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ open_uis[src_object_key] = list(ui.ui_key = list())
+ else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
+ open_uis[src_object_key][ui.ui_key] = list();
+
+ ui.user.open_uis.Add(ui)
+ var/list/uis = open_uis[src_object_key][ui.ui_key]
+ uis.Add(ui)
+ processing_uis.Add(ui)
+ //testing("nanomanager/ui_opened mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [ui.user.open_uis.len] | uis [uis.len] | processing_uis [processing_uis.len]")
+
+ /**
+ * Remove a /nanoui ui from the list of open uis
+ * This is called by the /nanoui close() proc
+ *
+ * @param ui /nanoui The ui to remove
+ *
+ * @return int 0 if no ui was removed, 1 if removed successfully
+ */
+/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui)
+ var/src_object_key = "\ref[ui.src_object]"
+ if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ return 0 // wasn't open
+ else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
+ return 0 // wasn't open
+
+ processing_uis.Remove(ui)
+ ui.user.open_uis.Remove(ui)
+ var/list/uis = open_uis[src_object_key][ui.ui_key]
+ uis.Remove(ui)
+
+ //testing("nanomanager/ui_closed mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [ui.user.open_uis.len] | uis [uis.len] | processing_uis [processing_uis.len]")
+
+ return 1
+
+ /**
+ * This is called on user logout
+ * Closes/clears all uis attached to the user's /mob
+ *
+ * @param user /mob The user's mob
+ *
+ * @return nothing
+ */
+
+//
+/datum/nanomanager/proc/user_logout(var/mob/user)
+ //testing("nanomanager/user_logout user [user.name]")
+ return close_user_uis(user)
+
+ /**
+ * This is called when a player transfers from one mob to another
+ * Transfers all open UIs to the new mob
+ *
+ * @param oldMob /mob The user's old mob
+ * @param newMob /mob The user's new mob
+ *
+ * @return nothing
+ */
+/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
+ //testing("nanomanager/user_transferred from mob [oldMob.name] to mob [newMob.name]")
+ if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
+ //testing("nanomanager/user_transferred mob [oldMob.name] has no open uis")
+ return 0 // has no open uis
+
+ if (isnull(newMob.open_uis) || !istype(newMob.open_uis, /list))
+ newMob.open_uis = list()
+
+ for (var/datum/nanoui/ui in oldMob.open_uis)
+ ui.user = newMob
+ newMob.open_uis.Add(ui)
+
+ oldMob.open_uis.Cut()
+
+ return 1 // success
+
+ /**
+ * Sends all nano assets to the client
+ * This is called on user login
+ *
+ * @param client /client The user's client
+ *
+ * @return nothing
+ */
+
+/datum/nanomanager/proc/send_resources(client)
+ for(var/file in asset_files)
+ client << browse_rsc(file) // send the file to the client
+
diff --git a/code/modules/nano/nanoprocs.dm b/code/modules/nano/nanoprocs.dm
new file mode 100644
index 00000000000..65432a8f24b
--- /dev/null
+++ b/code/modules/nano/nanoprocs.dm
@@ -0,0 +1,11 @@
+/atom/movable/proc/nano_host()
+ return src
+
+/obj/nano_module/nano_host()
+ return loc
+
+/atom/movable/proc/nano_can_update()
+ return 1
+
+/obj/machinery/nano_can_update()
+ return !(stat & (NOPOWER|BROKEN))
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index fbd809cd03c..04ef3cc95b9 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -132,7 +132,12 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/update_status(var/push_update = 0)
- var/status = user.can_interact_with_interface(src_object)
+ var/atom/movable/host = src_object.nano_host()
+ if(!host.nano_can_update())
+ close()
+ return
+
+ var/status = user.can_interact_with_interface(host.nano_host())
if(status == STATUS_CLOSE)
close()
else
@@ -181,7 +186,7 @@ nanoui is used to open and update nano browser uis
return STATUS_UPDATE
/mob/living/silicon/ai/can_interact_with_interface(var/src_object)
- if(stat || !client)
+ if(!client || check_unable(1))
return STATUS_CLOSE
// Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras)
// unless it's on the same level as the object it's interacting with.
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()