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 @@
{{:helper.link('MAX', null, {'set_press' : 'max'}, null)}} {{:helper.link('SET', null, {'set_press' : 'set'}, null)}} -
 {{:(data.pressure_set/100)}} kPa 
+
 {{:(data.set_pressure/100)}} kPa 
diff --git a/tgstation.dme b/tgstation.dme index 9613793b812..136681471c6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1351,9 +1351,8 @@ #include "code\modules\mob\new_player\new_player.dm" #include "code\modules\mob\new_player\poll.dm" #include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\sprite_accessories.dm" -#include "code\modules\nano\nanoexternal.dm" -#include "code\modules\nano\nanomanager.dm" +#include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\nano\external.dm" #include "code\modules\nano\nanoui.dm" #include "code\modules\nano\subsystem.dm" #include "code\modules\nano\interaction\admin.dm"