diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index a2ece69dfcd..ceecee64a01 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -93,16 +93,20 @@ Passive gate is similar to the regular pump except:
return 1
-/obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
- if(stat & (BROKEN|NOPOWER))
- return
+/obj/machinery/atmospherics/components/binary/passive_gate/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER)) return
+ ui_interact(user)
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_gas_pump.tmpl", name, 400, 120, 0)
+/obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
+ ui.open()
/obj/machinery/atmospherics/components/binary/passive_gate/get_ui_data()
var/data = list()
data["on"] = on
- data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["set_pressure"] = round(target_pressure*100)
data["max_pressure"] = MAX_OUTPUT_PRESSURE
return data
@@ -142,18 +146,16 @@ Passive gate is similar to the regular pump except:
/obj/machinery/atmospherics/components/binary/passive_gate/attack_hand(mob/user)
- if(..())
- return
- src.add_fingerprint(usr)
- if(!src.allowed(user))
- user << "Access denied."
- return
- usr.set_machine(src)
- ui_interact(user)
- return
+ if(..() || !user) return
+ add_fingerprint(usr)
+ interact(user)
-/obj/machinery/atmospherics/components/binary/passive_gate/Topic(href,href_list)
+/obj/machinery/atmospherics/components/binary/passive_gate/Topic(href, href_list)
if(..()) return
+ if(!src.allowed(usr))
+ usr << "Access denied."
+ return
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
@@ -164,17 +166,13 @@ Passive gate is similar to the regular pump except:
if ("set")
target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure)))
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
- usr.set_machine(src)
- src.update_icon()
- src.updateUsrDialog()
- return
+
+ update_icon()
/obj/machinery/atmospherics/components/binary/passive_gate/power_change()
..()
update_icon()
-
-
/obj/machinery/atmospherics/components/binary/passive_gate/attackby(obj/item/weapon/W, mob/user, params)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index bddcbc76f1b..0d1de20304e 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -98,16 +98,23 @@ Thus, the two variables affect pump operation are set in New():
return 1
-/obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(stat & (BROKEN|NOPOWER))
+/obj/machinery/atmospherics/components/binary/pump/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER)) return
+ if(!src.allowed(usr))
+ usr << "Access denied."
return
+ ui_interact(user)
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_gas_pump.tmpl", name, 400, 120, 0)
+/obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
+ ui.open()
/obj/machinery/atmospherics/components/binary/pump/get_ui_data()
var/data = list()
data["on"] = on
- data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["set_pressure"] = round(target_pressure*100)
data["max_pressure"] = MAX_OUTPUT_PRESSURE
return data
@@ -146,18 +153,12 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/pump/attack_hand(mob/user)
- if(..())
- return
- src.add_fingerprint(usr)
- if(!src.allowed(user))
- user << "Access denied."
- return
- usr.set_machine(src)
- ui_interact(user)
- return
+ if(..() | !user) return
+ interact(user)
/obj/machinery/atmospherics/components/binary/pump/Topic(href,href_list)
if(..()) return
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
@@ -168,10 +169,9 @@ Thus, the two variables affect pump operation are set in New():
if ("set")
target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure)))
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
- usr.set_machine(src)
- src.update_icon()
- src.updateUsrDialog()
- return
+
+ add_fingerprint(usr)
+ update_icon()
/obj/machinery/atmospherics/components/binary/pump/power_change()
..()
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index cbd0236669b..26960d40c03 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -94,16 +94,23 @@ Thus, the two variables affect pump operation are set in New():
return 1
-/obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(stat & (BROKEN|NOPOWER))
+/obj/machinery/atmospherics/components/binary/volume_pump/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER)) return
+ if(!src.allowed(usr))
+ usr << "Access denied."
return
+ ui_interact(user)
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_gas_pump.tmpl", name, 400, 120, 0)
+/obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
+ ui.open()
/obj/machinery/atmospherics/components/binary/volume_pump/get_ui_data()
var/data = list()
data["on"] = on
- data["transfer_rate"] = round(transfer_rate*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["transfer_rate"] = round(transfer_rate*100)
data["max_rate"] = MAX_TRANSFER_RATE
return data
@@ -142,18 +149,15 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/volume_pump/attack_hand(mob/user)
- if(..())
- return
- src.add_fingerprint(usr)
- if(!src.allowed(user))
- user << "Access denied."
- return
- usr.set_machine(src)
- ui_interact(user)
- return
+ if(..() | !user) return
+ interact(user)
/obj/machinery/atmospherics/components/binary/volume_pump/Topic(href,href_list)
if(..()) return
+ if(!src.allowed(usr))
+ usr << "Access denied."
+ return
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
@@ -164,17 +168,14 @@ Thus, the two variables affect pump operation are set in New():
if ("set")
transfer_rate = max(0, min(MAX_TRANSFER_RATE, safe_input("Pressure control", "Enter new transfer rate (0-[MAX_TRANSFER_RATE] L/s)", transfer_rate)))
investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos")
- usr.set_machine(src)
- src.update_icon()
- src.updateUsrDialog()
- return
+
+ add_fingerprint(usr)
+ update_icon()
/obj/machinery/atmospherics/components/binary/volume_pump/power_change()
..()
update_icon()
-
-
/obj/machinery/atmospherics/components/binary/volume_pump/attackby(obj/item/weapon/W, mob/user, params)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index b2464c2a129..a5437886bd8 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -157,34 +157,36 @@ Filter types:
return ..()
/obj/machinery/atmospherics/components/trinary/filter/attack_hand(mob/user)
- if(..())
- return
+ if(..() | !user) return
+ interact(user)
- if(!src.allowed(user))
- user << "Access denied."
+/obj/machinery/atmospherics/components/trinary/filter/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER)) return
+ if(!src.allowed(usr))
+ usr << "Access denied."
return
-
ui_interact(user)
-/obj/machinery/atmospherics/components/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(stat & (BROKEN|NOPOWER))
- return
-
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_filter.tmpl", name, 400, 320, 0)
+/obj/machinery/atmospherics/components/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 320)
+ ui.open()
/obj/machinery/atmospherics/components/trinary/filter/get_ui_data()
var/data = list()
data["on"] = on
- data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["set_pressure"] = round(target_pressure*100)
data["max_pressure"] = MAX_OUTPUT_PRESSURE
data["filter_type"] = filter_type
return data
/obj/machinery/atmospherics/components/trinary/filter/Topic(href, href_list)
- if(..())
+ if(..()) return
+ if(!src.allowed(usr))
+ usr << "Access denied."
return
- usr.set_machine(src)
- src.add_fingerprint(usr)
+
if(href_list["filterset"])
src.filter_type = text2num(href_list["filterset"])
var/filtering_name = "nothing"
@@ -212,11 +214,6 @@ Filter types:
if(href_list["power"])
on=!on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
- src.update_icon()
- src.updateUsrDialog()
-/*
- for(var/mob/M in viewers(1, src))
- if ((M.client && M.machine == src))
- src.attack_hand(M)
-*/
- return
+
+ add_fingerprint(usr)
+ update_icon()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 14c3c47adf7..fa774a21cb2 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -120,25 +120,26 @@
return 1
/obj/machinery/atmospherics/components/trinary/mixer/attack_hand(mob/user)
- if(..())
- return
+ if(..() | !user) return
+ interact(user)
- if(!src.allowed(user))
- user << "Access denied."
+/obj/machinery/atmospherics/components/trinary/mixer/interact(mob/user)
+ if(stat & (BROKEN|NOPOWER)) return
+ if(!src.allowed(usr))
+ usr << "Access denied."
return
-
ui_interact(user)
-/obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(stat & (BROKEN|NOPOWER))
- return
-
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_mixer.tmpl", name, 400, 320, 0)
+/obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 320)
+ ui.open()
/obj/machinery/atmospherics/components/trinary/mixer/get_ui_data()
var/data = list()
data["on"] = on
- data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["set_pressure"] = round(target_pressure*100)
data["max_pressure"] = MAX_OUTPUT_PRESSURE
data["node1_concentration"] = round(node1_concentration*100)
data["node2_concentration"] = round(node2_concentration*100)
@@ -166,6 +167,6 @@
src.node2_concentration = max(0, min(1, src.node2_concentration + value))
src.node1_concentration = max(0, min(1, src.node1_concentration - value))
investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", "atmos")
- src.update_icon()
- src.updateUsrDialog()
- return
+
+ add_fingerprint(usr)
+ update_icon()
diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm
index ac816f3109b..a265b6af912 100644
--- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm
@@ -120,28 +120,18 @@
user << "Seems empty."
/obj/machinery/atmospherics/components/unary/cryo_cell/attack_hand(mob/user)
- if(..())
- return
+ if(..() | !user) return
+ interact(user)
+/obj/machinery/atmospherics/components/unary/cryo_cell/interact(mob/user)
+ if(user == occupant || user.stat || panel_open) return
ui_interact(user)
-
- /**
- * The ui_interact proc is used to open and update Nano UIs
- * If ui_interact is not used then the UI will not update correctly
- * ui_interact is currently defined for /atom/movable
- *
- * @param user /mob The mob who is interacting with this ui
- * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
- *
- * @return nothing
- */
-/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(user == occupant || user.stat || panel_open)
- return
-
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "cryo.tmpl", "Cryo Cell Control System", 520, 410, 1)
- //user.set_machine(src)
+/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "cryo.tmpl", name, 520, 410)
+ ui.open()
/obj/machinery/atmospherics/components/unary/cryo_cell/get_ui_data()
// this is the data which will be sent to the ui
@@ -193,11 +183,8 @@
return data
/obj/machinery/atmospherics/components/unary/cryo_cell/Topic(href, href_list)
- if(usr == occupant || panel_open)
- return 0 // don't update UIs attached to this object
-
- if(..())
- return 0 // don't update UIs attached to this object
+ if(..()) return 0
+ if(usr == occupant || panel_open) return 0
if(href_list["switchOn"])
if(!state_open)
@@ -215,9 +202,8 @@
B.loc = get_step(loc, SOUTH)
beaker = null
- update_icon()
add_fingerprint(usr)
- return 1 // update UIs attached to this object
+ update_icon()
/obj/machinery/atmospherics/components/unary/cryo_cell/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/reagent_containers/glass))
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index bbf22fb3cf1..5d03248ae3f 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -169,40 +169,25 @@
return 0
/obj/machinery/alarm/attack_hand(mob/user)
- if (..())
+ if (..() || !user) return
+ if (buildstage != 2) return
+
+ interact(user)
+
+/obj/machinery/alarm/interact(mob/user)
+ if (user.has_unlimited_silicon_privilege && src.aidisabled)
+ user << "AI control for this Air Alarm interface has been disabled."
+ user << browse(null, "window=air_alarm")
return
- if (buildstage != 2)
- return
+ if(panel_open && !istype(user, /mob/living/silicon/ai)) wires.Interact(user)
+ else if (!shorted) ui_interact(user)
- user.set_machine(src)
-
- if ( (get_dist(src, user) > 1 ))
- if (!istype(user, /mob/living/silicon))
- user.unset_machine()
- user << browse(null, "window=air_alarm")
- user << browse(null, "window=AAlarmwires")
- return
-
-
- else if (user.has_unlimited_silicon_privilege && src.aidisabled)
- user << "AI control for this Air Alarm interface has been disabled."
- user << browse(null, "window=air_alarm")
- return
-
- if(!shorted)
- ui_interact(user)
-
- if(panel_open && (!istype(user, /mob/living/silicon/ai)))
- wires.Interact(user)
-
- return
-
-/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(stat & (BROKEN|NOPOWER))
- return
-
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "air_alarm.tmpl", "Air Alarm", 440, 600, 1)
+/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "air_alarm.tmpl", name, 440, 600)
+ ui.open()
/obj/machinery/alarm/get_ui_data(mob/user)
var/data = list()
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 4454d3e8aaa..331019831c3 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -259,29 +259,20 @@ update_flag
..()
-/obj/machinery/portable_atmospherics/canister/attack_ai(mob/user)
- return src.attack_hand(user)
-
-/obj/machinery/portable_atmospherics/canister/attack_paw(mob/user)
- return src.attack_hand(user)
-
-/obj/machinery/portable_atmospherics/canister/attack_tk(mob/user)
- return src.attack_hand(user)
-
/obj/machinery/portable_atmospherics/canister/attack_hand(mob/user)
- return src.ui_interact(user)
+ if (!user) return
+ interact(user)
-/obj/machinery/portable_atmospherics/canister/interact(mob/user, ui_key = "main")
- if (src.destroyed || !user)
- return
+/obj/machinery/portable_atmospherics/canister/interact(mob/user)
+ if (src.destroyed) return
+ add_fingerprint(user)
+ ui_interact(user)
- SSnano.try_update_ui(user, src, ui_key, null, src.get_ui_data())
-
-/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if (src.destroyed)
- return
-
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "canister.tmpl", "Canister", 480, 400, 0)
+/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "canister.tmpl", name, 480, 400)
+ ui.open()
/obj/machinery/portable_atmospherics/canister/get_ui_data()
var/data = list()
@@ -300,79 +291,63 @@ update_flag
return data
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
+ if(href_list["toggle"])
+ var/logmsg
+ if (valve_open)
+ if (holding)
+ logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into the [holding]
"
+ else
+ logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into the air
"
+ else
+ if (holding)
+ logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the [holding]
"
+ else
+ logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the air
"
+ if(air_contents.toxins > 0)
+ message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains plasma! (JMP)")
+ log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
+ var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
+ if(sleeping_agent && (sleeping_agent.moles > 1))
+ message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains N2O! (JMP)")
+ log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
+ investigate_log(logmsg, "atmos")
+ release_log += logmsg
+ valve_open = !valve_open
- //Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict.
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- usr << browse(null, "window=canister")
- onclose(usr, "canister")
- return
-
- if (((get_dist(src, usr) <= 1) && istype(src.loc, /turf)))
- usr.set_machine(src)
-
- if(href_list["toggle"])
- var/logmsg
+ if (href_list["remove_tank"])
+ if(holding)
if (valve_open)
- if (holding)
- logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into the [holding]
"
- else
- logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into the air
"
- else
- if (holding)
- logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the [holding]
"
- else
- logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the air
"
- if(air_contents.toxins > 0)
- message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains plasma! (JMP)")
- log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
- var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
- if(sleeping_agent && (sleeping_agent.moles > 1))
- message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains N2O! (JMP)")
- log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
- investigate_log(logmsg, "atmos")
- release_log += logmsg
- valve_open = !valve_open
+ investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transfering into the air
", "atmos")
+ holding.loc = loc
+ holding = null
- if (href_list["remove_tank"])
- if(holding)
- if (valve_open)
- investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transfering into the air
", "atmos")
- holding.loc = loc
- holding = null
+ if (href_list["pressure_adj"])
+ var/diff = text2num(href_list["pressure_adj"])
+ if(diff > 0)
+ release_pressure = min(10*ONE_ATMOSPHERE, release_pressure+diff)
+ else
+ release_pressure = max(ONE_ATMOSPHERE/10, release_pressure+diff)
- if (href_list["pressure_adj"])
- var/diff = text2num(href_list["pressure_adj"])
- if(diff > 0)
- release_pressure = min(10*ONE_ATMOSPHERE, release_pressure+diff)
- else
- release_pressure = max(ONE_ATMOSPHERE/10, release_pressure+diff)
+ if (href_list["relabel"])
+ if (can_label)
+ var/list/colors = list(\
+ "\[N2O\]" = "redws", \
+ "\[N2\]" = "red", \
+ "\[O2\]" = "blue", \
+ "\[Plasma\]" = "orange", \
+ "\[CO2\]" = "black", \
+ "\[Air\]" = "grey", \
+ "\[CAUTION\]" = "yellow", \
+ )
+ var/label = input("Choose canister label", "Gas canister") as null|anything in colors
+ if (label)
+ src.canister_color = colors[label]
+ src.icon_state = colors[label]
+ src.name = "canister: [label]"
- if (href_list["relabel"])
- if (can_label)
- var/list/colors = list(\
- "\[N2O\]" = "redws", \
- "\[N2\]" = "red", \
- "\[O2\]" = "blue", \
- "\[Plasma\]" = "orange", \
- "\[CO2\]" = "black", \
- "\[Air\]" = "grey", \
- "\[CAUTION\]" = "yellow", \
- )
- var/label = input("Choose canister label", "Gas canister") as null|anything in colors
- if (label)
- src.canister_color = colors[label]
- src.icon_state = colors[label]
- src.name = "canister: [label]"
- src.updateUsrDialog()
- src.add_fingerprint(usr)
- update_icon()
- else
- usr << browse(null, "window=canister")
- return
- return
+ update_icon()
/obj/machinery/portable_atmospherics/canister/toxins/New()
-
..()
src.air_contents.toxins = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
@@ -381,7 +356,6 @@ update_flag
return 1
/obj/machinery/portable_atmospherics/canister/oxygen/New()
-
..()
src.air_contents.oxygen = (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
@@ -390,7 +364,6 @@ update_flag
return 1
/obj/machinery/portable_atmospherics/canister/sleeping_agent/New()
-
..()
var/datum/gas/sleeping_agent/trace_gas = new
@@ -403,6 +376,7 @@ update_flag
//Dirty way to fill room with gas. However it is a bit easier to do than creating some floor/engine/n2o -rastaf0
/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller/New()
..()
+
var/datum/gas/sleeping_agent/trace_gas = air_contents.trace_gases[1]
trace_gas.moles = 9*4000
spawn(10)
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 3434d2da31c..52f7d830f89 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -99,7 +99,7 @@
/obj/item/weapon/tank/attackby(obj/item/weapon/W, mob/user, params)
..()
- src.add_fingerprint(user)
+ add_fingerprint(user)
if (istype(src.loc, /obj/item/assembly))
icon = src.loc
@@ -110,16 +110,18 @@
bomb_assemble(W,user)
/obj/item/weapon/tank/attack_self(mob/user)
- if (!(src.air_contents))
- return
+ if (!user) return
+ interact(user)
+/obj/item/weapon/tank/interact(mob/user)
+ if (!(src.air_contents)) return
ui_interact(user)
-/obj/item/weapon/tank/interact(mob/user, ui_key = "main")
- SSnano.try_update_ui(user, src, ui_key, null, src.get_ui_data())
-
-/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "tanks.tmpl", "Tank", 500, 300, 0)
+/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "tanks.tmpl", name, 500, 300)
+ ui.open()
/obj/item/weapon/tank/get_ui_data()
var/mob/living/carbon/location = null
@@ -153,11 +155,10 @@
return data
/obj/item/weapon/tank/Topic(href, href_list)
- ..()
- if (usr.stat|| usr.restrained())
- return
+ if (..()) return
+ if (usr.stat|| usr.restrained()) return
+
if (src.loc == usr)
- usr.set_machine(src)
if (href_list["dist_p"])
if (href_list["dist_p"] == "reset")
src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 75d4188d78b..9b42932b12c 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -779,8 +779,8 @@ var/global/list/g_fancy_list_of_types = null
/client/proc/reload_nanoui_templates()
set category = "Debug"
- set name = "Reload NanoUI Templates"
- set desc = "Forces the client to redownload NanoUI Templates"
+ set name = "Reload NanoUI Resources"
+ set desc = "Force the client to redownload NanoUI Resources"
var/list/resources = SSnano.populate_resources()
diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/external.dm
similarity index 90%
rename from code/modules/nano/nanoexternal.dm
rename to code/modules/nano/external.dm
index 3c518ad1a60..76a1e712f8c 100644
--- a/code/modules/nano/nanoexternal.dm
+++ b/code/modules/nano/external.dm
@@ -1,54 +1,59 @@
- // This file contains all Nano procs/definitions for external classes/objects
-
- /**
- * Called when a Nano UI window is closed
- * This is how Nano handles closed windows
- * It must be a verb so that it can be called using winset
- *
- * @return nothing
- */
-/client/verb/nanoclose(var/uiref as text)
- set hidden = 1 // hide this verb from the user's panel
- set name = "nanoclose"
-
- var/datum/nanoui/ui = locate(uiref)
-
- if (istype(ui))
- ui.close()
-
- if(ui.ref)
- var/href = "close=1"
- src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's Topic() proc via client.Topic()
- else if (ui.on_close_logic)
- // no atomref specified (or not found)
- // so just reset the user mob's machine var
- if(src && src.mob)
- src.mob.unset_machine()
-
- /**
- * The ui_interact proc is used to open and update Nano UIs
- * If ui_interact is not used then the UI will not update correctly
- * ui_interact is currently defined for /atom/movable
- *
- * @param user /mob The mob who is interacting with this ui
- * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
- * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui
- * @param force_open boolean Force the UI to (re)open, even if it's already open
- *
- * @return nothing
- */
-/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/state = default_state)
- return
-
- /**
- * Used to get data to send to the Nano UI.
- *
- * @param user /mob The mob who is interacting with this ui
- *
- * @return list
- */
-/atom/movable/proc/get_ui_data(mob/user)
- return list()
-
-// Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob
-/mob/var/list/open_uis = list()
+ // This file contains all Nano procs/definitions for external classes/objects
+
+ /**
+ * Called when a Nano UI window is closed
+ * This is how Nano handles closed windows
+ * It must be a verb so that it can be called using winset
+ *
+ * @return nothing
+ */
+/client/verb/nanoclose(var/uiref as text)
+ set hidden = 1 // hide this verb from the user's panel
+ set name = "nanoclose"
+
+ var/datum/nanoui/ui = locate(uiref)
+
+ if (istype(ui))
+ ui.close()
+
+ if(ui.ref)
+ var/href = "close=1"
+ src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's Topic() proc via client.Topic()
+ else if (ui.on_close_logic)
+ // no atomref specified (or not found)
+ // so just reset the user mob's machine var
+ if(src && src.mob)
+ src.mob.unset_machine()
+
+ /**
+ * The ui_interact proc is used to open and update Nano UIs
+ * If ui_interact is not used then the UI will not update correctly
+ * ui_interact is currently defined for /atom/movable
+ *
+ * @param user /mob The mob who is interacting with this ui
+ * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
+ * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui
+ * @param force_open boolean Force the UI to (re)open, even if it's already open
+ *
+ * @return nothing
+ */
+/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, \
+ var/force_open = 1, var/datum/nano_ui/master_ui = null, \
+ var/datum/topic_state/state = default_state)
+ return
+
+// Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob
+/mob/var/list/open_uis = list()
+
+ /**
+ * Used to get data to send to the Nano UI.
+ *
+ * @param user /mob The mob who is interacting with this ui
+ *
+ * @return list
+ */
+/atom/movable/proc/get_ui_data(mob/user)
+ return list()
+
+/atom/proc/nano_host()
+ return src
\ No newline at end of file
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index bb7316868a1..43bad6c0e14 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -1,32 +1,43 @@
-/atom/proc/nano_host()
- return src
-
/atom/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state)
var/src_object = nano_host()
- return state.can_use_topic(src_object, user)
+ return state.can_use_topic(src_object, user) // Check if the state allows interaction.
-/datum/topic_state/proc/href_list(var/mob/user)
- return list()
/datum/topic_state/proc/can_use_topic(var/src_object, var/mob/user)
- return NANO_CLOSE
+ return NANO_CLOSE // Don't allow interaction by default.
+
/mob/proc/shared_nano_interaction()
- if (src.stat || !client)
- return NANO_CLOSE // no updates, close the interface
- else if (restrained() || lying || stat || stunned || weakened) // TODO: Change to incapaciated() on merge
- return NANO_UPDATE // update only (orange visibility)
+ if (!client || src.stat) // Close NanoUIs if mindless or dead/unconcious.
+ return NANO_CLOSE
+ else if (restrained() || lying || stat || stunned || weakened) // Update NanoUIs if incapicitated but concious.
+ return NANO_UPDATE
return NANO_INTERACTIVE
/mob/living/silicon/ai/shared_nano_interaction()
- if (lacks_power())
+ if (lacks_power()) // Close NanoUIs if the AI is unpowered.
return NANO_CLOSE
return ..()
/mob/living/silicon/robot/shared_nano_interaction()
- . = NANO_INTERACTIVE
- if (cell.charge <= 0)
+ if (cell.charge <= 0) // Close NanoUIs if the Borg is unpowered.
return NANO_CLOSE
- if (lockcharge)
- . = NANO_DISABLED
- return min(., ..())
+ if (lockcharge) // Disable NanoUIs if the Borg is locked.
+ return NANO_DISABLED
+ return ..()
+
+/atom/proc/contents_nano_distance(var/src_object, var/mob/living/user)
+ return user.shared_living_nano_distance(src_object)
+
+/mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object)
+ if (!(src_object in view(4, src))) // If the src object is not in visable, disable updates
+ return NANO_CLOSE
+
+ var/dist = get_dist(src_object, src)
+ if (dist <= 1)
+ return NANO_INTERACTIVE // interactive (green visibility)
+ else if (dist <= 2)
+ return NANO_UPDATE // update only (orange visibility)
+ else if (dist <= 4)
+ return NANO_DISABLED // no updates, completely disabled (red visibility)
+ return NANO_CLOSE
\ No newline at end of file
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index c7c0a1429d6..42f2f7fa53d 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -1,11 +1,10 @@
/var/global/datum/topic_state/default/default_state = new()
-/datum/topic_state/default/href_list(var/mob/user)
- return list()
/datum/topic_state/default/can_use_topic(var/src_object, var/mob/user)
return user.default_can_use_topic(src_object)
+
/mob/proc/default_can_use_topic(var/src_object)
return NANO_CLOSE // By default no mob can do anything with NanoUI
@@ -14,12 +13,6 @@
return NANO_INTERACTIVE // Admins are more equal
return NANO_UPDATE // Ghosts can view updates
-/mob/living/silicon/pai/default_can_use_topic(var/src_object)
- if((src_object == src || src_object == radio) && !stat)
- return NANO_INTERACTIVE
- else
- return ..()
-
/mob/living/silicon/robot/default_can_use_topic(var/src_object)
. = shared_nano_interaction()
if(. <= NANO_DISABLED)
@@ -45,37 +38,20 @@
/mob/living/silicon/ai/default_can_use_topic(var/src_object)
. = shared_nano_interaction()
- if(. != NANO_INTERACTIVE)
+ if (. != NANO_INTERACTIVE)
return
- // 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.
- var/turf/T = get_turf(src_object)
- if(!T || !(z == T.z))
- return NANO_CLOSE
-
- // If an object is in view then we can interact with it
- if(src_object in view(client.view, src))
+ // If an object is in view of the client and a camera then we can interact with it
+ if ((src_object in view(eyeobj)) && cameranet.checkTurfVis(get_turf(src_object)))
return NANO_INTERACTIVE
return NANO_CLOSE
-//Some atoms such as vehicles might have special rules for how mobs inside them interact with NanoUI.
-/atom/proc/contents_nano_distance(var/src_object, var/mob/living/user)
- return user.shared_living_nano_distance(src_object)
-
-/mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object)
- if (!(src_object in view(4, src))) // If the src object is not in visable, disable updates
- return NANO_CLOSE
-
- var/dist = get_dist(src_object, src)
- if (dist <= 1)
- return NANO_INTERACTIVE // interactive (green visibility)
- else if (dist <= 2)
- return NANO_UPDATE // update only (orange visibility)
- else if (dist <= 4)
- return NANO_DISABLED // no updates, completely disabled (red visibility)
- return NANO_CLOSE
+/mob/living/silicon/pai/default_can_use_topic(var/src_object)
+ if((src_object == src || src_object == radio) && !stat)
+ return NANO_INTERACTIVE
+ else
+ return ..()
/mob/living/default_can_use_topic(var/src_object)
. = shared_nano_interaction(src_object)
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 1d7d769b8a2..8128d4bb2df 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -1,10 +1,12 @@
-/**********************************************************
-NANO UI FRAMEWORK
+ /**
+ * NanoUI
+ *
+ * /tg/station user interface library
+ * thanks to baystation12
+ *
+ * modified by neersighted
+ **/
-nanoui class (or whatever Byond calls classes)
-
-nanoui is used to open and update nano browser uis
-**********************************************************/
/datum/nanoui
// the user who opened this ui
@@ -46,9 +48,9 @@ nanoui is used to open and update nano browser uis
// the map z level to display
var/map_z_level = 1
// initial data, containing the full data structure, must be sent to the ui (the data structure cannot be extended later on)
- var/list/initial_data[0]
+ var/list/initial_data
// set to 1 to update the ui automatically every master_controller tick
- var/is_auto_updating = 0
+ var/auto_update = 0
// the current status/visibility of the ui
var/status = NANO_INTERACTIVE
@@ -156,7 +158,7 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/set_auto_update(nstate = 1)
- is_auto_updating = nstate
+ auto_update = nstate
/**
* Set the initial data for the ui. This is vital as the data structure set here cannot be changed when pushing new updates.
@@ -194,11 +196,10 @@ nanoui is used to open and update nano browser uis
*
* @return /list data to send to the ui
*/
-/datum/nanoui/proc/get_send_data(var/list/data)
- var/list/config_data = get_config_data()
-
- var/list/send_data = list("config" = config_data)
+/datum/nanoui/proc/get_send_data(list/data)
+ var/list/send_data = list()
+ send_data["config"] = get_config_data()
if (!isnull(data))
send_data["data"] = data
@@ -329,7 +330,6 @@ nanoui is used to open and update nano browser uis
* @return string HTML for the UI
*/
/datum/nanoui/proc/get_html()
-
// before the UI opens, add the layout files based on the layout key
add_stylesheet("layout_[layout_key].css")
add_template("layout", "layout_[layout_key].tmpl")
@@ -337,10 +337,10 @@ nanoui is used to open and update nano browser uis
var/head_content = ""
for (var/filename in scripts)
- head_content += " "
+ head_content += ""
for (var/filename in stylesheets)
- head_content += " "
+ head_content += " "
var/template_data_json = "{}" // An empty JSON object
if (templates.len > 0)
@@ -388,10 +388,15 @@ nanoui is used to open and update nano browser uis
*
* @return nothing
*/
-/datum/nanoui/proc/open()
+/datum/nanoui/proc/open(list/data = null)
if(!user.client)
return
+ if (!initial_data)
+ if (!data)
+ data = src_object.get_ui_data()
+ set_initial_data(data)
+
var/window_size = ""
if (width && height)
window_size = "size=[width]x[height];"
@@ -423,7 +428,7 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/close()
- is_auto_updating = 0
+ auto_update = 0
SSnano.ui_closed(src)
user << browse(null, "window=[window_id]")
for(var/datum/nanoui/child in children)
@@ -495,7 +500,7 @@ nanoui is used to open and update nano browser uis
close()
return
- if (status && (update || is_auto_updating))
+ if (status && (update || auto_update))
update() // Update the UI (update_status() is called whenever a UI is updated)
else
update_status(1) // Not updating UI, so lets check here if status has changed
diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/subsystem.dm
similarity index 84%
rename from code/modules/nano/nanomanager.dm
rename to code/modules/nano/subsystem.dm
index 8785fb765f7..fbdf1ca5c75 100644
--- a/code/modules/nano/nanomanager.dm
+++ b/code/modules/nano/subsystem.dm
@@ -1,27 +1,3 @@
- /**
- * Get an open /nanoui ui for the current user, or create a new one.
- *
- * @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
- *
- * @return /nanoui Returns the new or found ui
- */
-/datum/subsystem/nano/proc/push_open_or_new_ui(mob/user, atom/movable/src_object, ui_key, datum/nanoui/ui, template, title, width, height, auto_update, var/atom/ref = null, var/datum/nanoui/master_ui = null, var/datum/topic_state/state = default_state)
- var/list/data = src_object.get_ui_data(user)
- if (!data)
- data = list()
-
- ui = try_update_ui(user, src_object, ui_key, ui, data)
-
- if (isnull(ui))
- ui = new/datum/nanoui(user, src_object, ui_key, template, title, width, height, ref, master_ui, state)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(auto_update)
-
/**
* Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data
*
@@ -34,21 +10,22 @@
*
* @return /nanoui Returns the found ui, for null if none exists
*/
-/datum/subsystem/nano/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
- ui.reinitialise(new_initial_data=data)
- return ui
+/datum/subsystem/nano/proc/try_update_ui(mob/user, atom/movable/src_object, ui_key, datum/nanoui/ui, \
+ list/data = null, force_open = 0)
+ if (!data)
+ data = src_object.get_ui_data(user)
- return null
+ if (isnull(ui)) // No NanoUI was passed, so look for one.
+ ui = get_open_ui(user, src_object, ui_key)
+
+ if (!isnull(ui))
+ if (!force_open) // UI is already open; update it.
+ ui.push_data(data)
+ else // Re-open it anyways.
+ ui.reinitialise(new_initial_data=data)
+ return ui // We found the UI, return it.
+
+ return null // We couldn't find a UI.
/**
* Get an open /nanoui ui for the current user, src_object and ui_key
@@ -278,6 +255,7 @@
* @param resources /list The resources to be sent.
*
* @return nothing
- */
+ */
+
/datum/subsystem/nano/proc/send_resources(client, var/list/resources = resource_files)
- getFilesSlow(client, resources)
+ getFilesSlow(client, resources)
\ No newline at end of file
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index b24f4cb0179..3e31edfbff9 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -586,11 +586,8 @@
// attack with hand - remove cell (if cover open) or interact with the APC
/obj/machinery/power/apc/attack_hand(mob/user)
-// if (!can_use(user)) This already gets called in interact() and in topic()
-// return
- if(!user)
- return
- src.add_fingerprint(user)
+ if (!user) return
+ add_fingerprint(user)
if(usr == user && opened && (!issilicon(user)))
if(cell)
user.put_in_hands(cell)
@@ -604,14 +601,10 @@
charging = 0
src.update_icon()
return
- if(stat & (BROKEN|MAINT))
- return
- // do APC interaction
- src.interact(user)
+ interact(user)
/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user)
- if(!user)
- return
+ if(!user) return
user.do_attack_animation(src)
user.visible_message("[user.name] slashes at the [src.name]!", "You slash at the [src.name]!")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
@@ -633,35 +626,15 @@
/obj/machinery/power/apc/interact(mob/user)
- if(!user)
- return
+ if(stat & (BROKEN|MAINT)) return
+ if(wiresexposed && !istype(user, /mob/living/silicon/ai)) wires.Interact(user)
+ else ui_interact(user)
- if(wiresexposed /*&& (!istype(user, /mob/living/silicon))*/) //Commented out the typecheck to allow engiborgs to repair damaged apcs.
- wires.Interact(user)
-
- return ui_interact(user)
-
-
-/obj/machinery/power/apc/proc/get_malf_status(mob/user)
- if (ticker && ticker.mode && (user.mind in ticker.mode.malf_ai) && istype(user, /mob/living/silicon/ai))
- if (src.malfai == (user:parent ? user:parent : user))
- if (src.occupier == user)
- return 3 // 3 = User is shunted in this APC
- else if (istype(user.loc, /obj/machinery/power/apc))
- return 4 // 4 = User is shunted in another APC
- else
- return 2 // 2 = APC hacked by user, and user is in its core.
- else
- return 1 // 1 = APC not hacked.
- else
- return 0 // 0 = User is not a Malf AI
-
-
-/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(!user)
- return
-
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "apc.tmpl", "[area.name] - APC", 540, user.has_unlimited_silicon_privilege ? 550 : 470, 1)
+/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "apc.tmpl", name, 515, 550)
+ ui.open()
/obj/machinery/power/apc/get_ui_data(mob/user)
var/list/data = list(
@@ -711,6 +684,21 @@
)
return data
+
+/obj/machinery/power/apc/proc/get_malf_status(mob/user)
+ if (ticker && ticker.mode && (user.mind in ticker.mode.malf_ai) && istype(user, /mob/living/silicon/ai))
+ if (src.malfai == (user:parent ? user:parent : user))
+ if (src.occupier == user)
+ return 3 // 3 = User is shunted in this APC
+ else if (istype(user.loc, /obj/machinery/power/apc))
+ return 4 // 4 = User is shunted in another APC
+ else
+ return 2 // 2 = APC hacked by user, and user is in its core.
+ else
+ return 1 // 1 = APC not hacked.
+ else
+ return 0 // 0 = User is not a Malf AI
+
/obj/machinery/power/apc/proc/report()
return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])"
@@ -778,11 +766,8 @@
return 1
/obj/machinery/power/apc/Topic(href, href_list)
- if(..())
- return 0
-
- if(!can_use(usr, 1))
- return 0
+ if(..()) return
+ if(!can_use(usr, 1)) return
if (href_list["lock"])
coverlocked = !coverlocked
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 646bd7eb81d..d30d0405f04 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -313,24 +313,20 @@
if(terminal && terminal.powernet)
terminal.powernet.load += amount
-
-/obj/machinery/power/smes/attack_ai(mob/user)
- if(stat & BROKEN) return
- ui_interact(user)
-
-
/obj/machinery/power/smes/attack_hand(mob/user)
+ if (!user) return
add_fingerprint(user)
- if(stat & BROKEN) return
+ interact(user)
+
+/obj/machinery/power/smes/interact(mob/user)
+ if (stat & BROKEN) return
ui_interact(user)
-
-/obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(!user)
- return
-
- // update the ui if it exists, create a new one if it doesn't
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "smes.tmpl", "SMES - [name]", 350, 560, 1)
+/obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "smes.tmpl", name, 350, 560)
+ ui.open()
/obj/machinery/power/smes/get_ui_data()
var/list/data = list(
@@ -353,11 +349,7 @@
return data
/obj/machinery/power/smes/Topic(href, href_list)
-// world << "[href] ; [href_list[href]]"
-
- if(..())
- return
-
+ if(..()) return
else if( href_list["input_attempt"] )
input_attempt = text2num(href_list["input_attempt"])
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 65eb59daa3b..3edb8d760f9 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -357,11 +357,19 @@
overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))
/obj/machinery/power/solar_control/attack_hand(mob/user)
- if(!..())
- ui_interact(user)
+ if (..() || !user) return
+ add_fingerprint(user)
+ interact(user)
-/obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "solar_control.tmpl", name, 490, 420, 1)
+/obj/machinery/power/solar_control/interact(mob/user)
+ if (stat & BROKEN) return
+ ui_interact(user)
+
+/obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "solar_control.tmpl", name, 490, 420)
+ ui.open()
/obj/machinery/power/solar_control/get_ui_data()
var/data = list()
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 364caabeebf..98f164ca9ed 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -61,21 +61,15 @@
if(prob(50))
qdel(src)
- /**
- * The ui_interact proc is used to open and update Nano UIs
- * If ui_interact is not used then the UI will not update correctly
- * ui_interact is currently defined for /atom/movable
- *
- * @param user /mob The mob who is interacting with this ui
- * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
- *
- * @return nothing
- */
-/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(stat & (BROKEN)) return
- if(user.incapacitated()) return
+/obj/machinery/chem_dispenser/interact(mob/user)
+ if(stat & BROKEN) return
+ ui_interact(user)
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "chem_dispenser.tmpl", "[uiname]", 490, 710, 0)
+/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "chem_dispenser.tmpl", uiname, 490, 710)
+ ui.open()
/obj/machinery/chem_dispenser/get_ui_data()
var/data = list()
@@ -108,8 +102,7 @@
return data
/obj/machinery/chem_dispenser/Topic(href, href_list)
- if(stat & (BROKEN))
- return 0 // don't update UIs attached to this object
+ if(stat & (BROKEN)) return
if(href_list["amount"])
amount = round(text2num(href_list["amount"]), 5) // round to nearest 5
@@ -135,7 +128,6 @@
overlays.Cut()
add_fingerprint(usr)
- return 1 // update UIs attached to this object
/obj/machinery/chem_dispenser/attackby(obj/item/weapon/reagent_containers/glass/B, mob/user, params)
if(isrobot(user))
@@ -160,17 +152,9 @@
icon_beaker.pixel_x = rand(-10,5)
overlays += icon_beaker
-/obj/machinery/chem_dispenser/attack_ai(mob/user)
- return src.attack_hand(user)
-
-/obj/machinery/chem_dispenser/attack_paw(mob/user)
- return src.attack_hand(user)
-
/obj/machinery/chem_dispenser/attack_hand(mob/user)
- if(stat & BROKEN)
- return
-
- ui_interact(user)
+ if (!user) return
+ interact(user)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1476,15 +1460,14 @@
return 1
/obj/machinery/chem_heater/attack_hand(mob/user)
- ui_interact(user)
+ if (!user) return
+ interact(user)
/obj/machinery/chem_heater/Topic(href, href_list)
- if(..())
- return 0
+ if(..()) return
if(href_list["toggle_on"])
on = !on
- . = 1
if(href_list["adjust_temperature"])
var/val = href_list["adjust_temperature"]
@@ -1493,17 +1476,22 @@
else if(val == "input")
desired_temp = Clamp(input("Please input the target temperature", name) as num, 0, 1000)
else
- return 0
- . = 1
+ return
if(href_list["eject_beaker"])
eject_beaker()
- . = 0 //updated in eject_beaker() already
-/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
- if(user.stat || user.restrained()) return
+ add_fingerprint(usr)
- ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "chem_heater.tmpl", "ChemHeater", 350, 270, 0)
+/obj/machinery/chem_heater/interact(mob/user)
+ if(stat & BROKEN) return
+ ui_interact(user)
+
+/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "chem_heater.tmpl", name, 350, 270)
+ ui.open()
/obj/machinery/chem_heater/get_ui_data()
var/data = list()
diff --git a/nano/templates/atmos_gas_pump.tmpl b/nano/templates/atmos_gas_pump.tmpl
index 17428843995..64e8b6ef306 100644
--- a/nano/templates/atmos_gas_pump.tmpl
+++ b/nano/templates/atmos_gas_pump.tmpl
@@ -29,7 +29,7 @@