From 9db4ba1da0eaa34e833078c6ff7d81f5ca1bb7b4 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 3 Dec 2015 09:27:28 +0100 Subject: [PATCH 1/4] Adds a remote interaction state for NanoUI. This state has two checks: A preliminary check of the remote target, ensuring it's powered, etc. If the remote target is fully disabled, it closes the window and conducts no further checks. It then makes a full check, ensuring that the mob is capable, within range of the source remoting to the remote target, etc. Unlike most other static interaction states, whoever initializes the remote state is responsible for deleting it properly. Conflicts: polaris.dme --- code/game/machinery/computer/crew.dm | 7 +++- code/modules/nano/interaction/base.dm | 3 ++ code/modules/nano/interaction/interactive.dm | 7 ++++ code/modules/nano/interaction/remote.dm | 39 ++++++++++++++++++++ code/modules/nano/nanoui.dm | 3 ++ polaris.dme | 2 + 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 code/modules/nano/interaction/interactive.dm create mode 100644 code/modules/nano/interaction/remote.dm diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 0c6c33928a6..d780d47406e 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -28,8 +28,11 @@ return ui_interact(user) -/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - crew_monitor.ui_interact(user, ui_key, ui, force_open) +/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + crew_monitor.ui_interact(user, ui_key, ui, force_open, state) + +/obj/machinery/computer/crew/nano_container() + return crew_monitor /obj/machinery/computer/crew/interact(mob/user) crew_monitor.ui_interact(user) diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm index ccd9f3740b3..82fd32ea3c5 100644 --- a/code/modules/nano/interaction/base.dm +++ b/code/modules/nano/interaction/base.dm @@ -1,6 +1,9 @@ /datum/proc/nano_host() return src +/datum/proc/nano_container() + return src + /datum/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state) var/src_object = nano_host() return state.can_use_topic(src_object, user) diff --git a/code/modules/nano/interaction/interactive.dm b/code/modules/nano/interaction/interactive.dm new file mode 100644 index 00000000000..ddd8f8f9e11 --- /dev/null +++ b/code/modules/nano/interaction/interactive.dm @@ -0,0 +1,7 @@ +/* + This state always returns STATUS_INTERACTIVE +*/ +/var/global/datum/topic_state/interactive/interactive_state = new() + +/datum/topic_state/interactive/can_use_topic(var/src_object, var/mob/user) + return STATUS_INTERACTIVE diff --git a/code/modules/nano/interaction/remote.dm b/code/modules/nano/interaction/remote.dm new file mode 100644 index 00000000000..ef2cb6926df --- /dev/null +++ b/code/modules/nano/interaction/remote.dm @@ -0,0 +1,39 @@ +/* + This state checks that user is capable, within range of the remoter, etc. and that src_object meets the basic requirements for interaction (being powered, non-broken, etc. + Whoever initializes this state is also responsible for deleting it properly. +*/ +/datum/topic_state/remote + var/datum/remoter + var/datum/remote_target + var/datum/topic_state/remoter_state + +/datum/topic_state/remote/New(var/remoter, var/remote_target, var/datum/topic_state/remoter_state = default_state) + src.remoter = remoter + src.remote_target = remote_target + src.remoter_state = remoter_state + ..() + +/datum/topic_state/remote/Destroy() + src.remoter = null + src.remoter_state = null + + // Force an UI update before we go, ensuring that any windows we may have opened for the remote target closes. + nanomanager.update_uis(remote_target.nano_container()) + remote_target = null + return ..() + +/datum/topic_state/remote/can_use_topic(var/datum/src_object, var/mob/user) + if(!(remoter && remoter_state)) // The remoter is gone, let us leave + return STATUS_CLOSE + + if(src_object != remote_target) + error("remote - Unexpected src_object: Expected '[remote_target]'/[remote_target.type], was '[src_object]'/[src_object.type]") + + // This checks if src_object is powered, etc. + // The interactive state is otherwise simplistic and only returns STATUS_INTERACTIVE and never checks distances, etc. + . = src_object.CanUseTopic(user, interactive_state) + if(. == STATUS_CLOSE) + return + + // This is the (generally) heavy checking, making sure the user is capable, within range of the remoter source, etc. + return min(., remoter.CanUseTopic(user, remoter_state)) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index e90a562fefd..5fd221b2a8b 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -428,6 +428,9 @@ nanoui is used to open and update nano browser uis user << browse(null, "window=[window_id]") for(var/datum/nanoui/child in children) child.close() + children.Cut() + state = null + master_ui = null /** * Set the UI window to call the nanoclose verb when the window is closed diff --git a/polaris.dme b/polaris.dme index 7a7d42d13d2..16f869bee95 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1499,10 +1499,12 @@ #include "code\modules\nano\interaction\conscious.dm" #include "code\modules\nano\interaction\contained.dm" #include "code\modules\nano\interaction\default.dm" +#include "code\modules\nano\interaction\interactive.dm" #include "code\modules\nano\interaction\inventory.dm" #include "code\modules\nano\interaction\inventory_deep.dm" #include "code\modules\nano\interaction\outside.dm" #include "code\modules\nano\interaction\physical.dm" +#include "code\modules\nano\interaction\remote.dm" #include "code\modules\nano\interaction\self.dm" #include "code\modules\nano\interaction\zlevel.dm" #include "code\modules\nano\modules\alarm_monitor.dm" From 15cc546556ab865dec181ff27b2c2c695d51538b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 3 Dec 2015 21:50:24 +0100 Subject: [PATCH 2/4] Backports NanoUI fixes from dev. Fixes #11579. Conflicts: code/modules/nano/modules/crew_monitor.dm --- code/modules/nano/modules/crew_monitor.dm | 32 ++++++++++++---------- code/modules/nano/modules/power_monitor.dm | 2 +- code/modules/nano/nanoui.dm | 1 + 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index bb5e28ca046..3d0cdac6575 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -1,25 +1,34 @@ -/datum/nano_module/crew_monitor +/obj/nano_module/crew_monitor name = "Crew monitor" -/datum/nano_module/crew_monitor/Topic(href, href_list) +/obj/nano_module/crew_monitor/Topic(href, href_list) if(..()) return 1 - var/turf/T = get_turf(nano_host()) // TODO: Allow setting any config.contact_levels from the interface. + var/turf/T = get_turf(src) if (!T || !(T.z in config.player_levels)) - usr << "Unable to establish a connection: You're too far away from the station!" + usr << "Unable to establish a connection: You're too far away from the station!" return 0 + if(href_list["close"] ) + var/mob/user = usr + var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") + usr.unset_machine() + ui.close() + return 0 + if(href_list["update"]) + src.updateDialog() + return 1 if(href_list["track"]) - if(isAI(usr)) + if(usr.isMobAI()) var/mob/living/silicon/ai/AI = usr var/mob/living/carbon/human/H = locate(href_list["track"]) in mob_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) return 1 -/datum/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) +/obj/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/data[0] - var/turf/T = get_turf(nano_host()) + var/turf/T = get_turf(src) - data["isAI"] = isAI(user) + data["isAI"] = user.isMobAI() data["crewmembers"] = crew_repository.health_data(T) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -37,11 +46,4 @@ // should make the UI auto-update; doesn't seem to? ui.set_auto_update(1) -/*/datum/nano_module/crew_monitor/proc/scan() - for(var/mob/living/carbon/human/H in mob_list) - if(istype(H.w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/C = H.w_uniform - if (C.has_sensor) - tracked |= C return 1 -*/ \ No newline at end of file diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index 9d386e8c932..94223fc4eff 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -47,7 +47,7 @@ // Allows us to process UI clicks, which are relayed in form of hrefs. /datum/nano_module/power_monitor/Topic(href, href_list) if(..()) - return + return 1 if( href_list["clear"] ) active_sensor = null if( href_list["refresh"] ) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 5fd221b2a8b..3d043929432 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -140,6 +140,7 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) + src_object = src_object.nano_host() var/new_status = src_object.CanUseTopic(user, state) if(master_ui) new_status = min(new_status, master_ui.status) From a1203ed942d424e1318cf6ff575f1feb5d1a2ef8 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 6 Dec 2015 16:24:13 +0100 Subject: [PATCH 3/4] Fixes the broken Antag Uplink. NanoUI re-assigns src_object, rather than merely acquiring the host, causing ui_interact() updates to be called on the wrong object. Fixes #11607. --- code/modules/nano/nanoui.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 3d043929432..c1e367fc98e 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -140,8 +140,8 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) - src_object = src_object.nano_host() - var/new_status = src_object.CanUseTopic(user, state) + var/obj/host = src_object.nano_host() + var/new_status = host.CanUseTopic(user, state) if(master_ui) new_status = min(new_status, master_ui.status) From f219980a3df97be1ac232de8e4ed2e93024484b3 Mon Sep 17 00:00:00 2001 From: Neerti Date: Mon, 7 Dec 2015 03:38:38 -0500 Subject: [PATCH 4/4] Fixed merge conflicts causing lack of compilation hopefully. --- code/game/machinery/computer/crew.dm | 7 ++--- code/modules/nano/modules/crew_monitor.dm | 32 +++++++++++------------ 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index d780d47406e..0c6c33928a6 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -28,11 +28,8 @@ return ui_interact(user) -/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - crew_monitor.ui_interact(user, ui_key, ui, force_open, state) - -/obj/machinery/computer/crew/nano_container() - return crew_monitor +/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + crew_monitor.ui_interact(user, ui_key, ui, force_open) /obj/machinery/computer/crew/interact(mob/user) crew_monitor.ui_interact(user) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index 3d0cdac6575..bb5e28ca046 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -1,34 +1,25 @@ -/obj/nano_module/crew_monitor +/datum/nano_module/crew_monitor name = "Crew monitor" -/obj/nano_module/crew_monitor/Topic(href, href_list) +/datum/nano_module/crew_monitor/Topic(href, href_list) if(..()) return 1 - var/turf/T = get_turf(src) + var/turf/T = get_turf(nano_host()) // TODO: Allow setting any config.contact_levels from the interface. if (!T || !(T.z in config.player_levels)) - usr << "Unable to establish a connection: You're too far away from the station!" + usr << "Unable to establish a connection: You're too far away from the station!" return 0 - if(href_list["close"] ) - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - usr.unset_machine() - ui.close() - return 0 - if(href_list["update"]) - src.updateDialog() - return 1 if(href_list["track"]) - if(usr.isMobAI()) + if(isAI(usr)) var/mob/living/silicon/ai/AI = usr var/mob/living/carbon/human/H = locate(href_list["track"]) in mob_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) return 1 -/obj/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) +/datum/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/data[0] - var/turf/T = get_turf(src) + var/turf/T = get_turf(nano_host()) - data["isAI"] = user.isMobAI() + data["isAI"] = isAI(user) data["crewmembers"] = crew_repository.health_data(T) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -46,4 +37,11 @@ // should make the UI auto-update; doesn't seem to? ui.set_auto_update(1) +/*/datum/nano_module/crew_monitor/proc/scan() + for(var/mob/living/carbon/human/H in mob_list) + if(istype(H.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/C = H.w_uniform + if (C.has_sensor) + tracked |= C return 1 +*/ \ No newline at end of file