From 8a28865697cf6011d46b8f0e9fa4437d83c61c81 Mon Sep 17 00:00:00 2001 From: Wildkins Date: Thu, 14 Apr 2022 19:27:39 -0400 Subject: [PATCH] Fix security camera consoles, hopefully (#13507) --- code/game/machinery/computer/Operating.dm | 5 +- code/game/machinery/computer/camera.dm | 32 +-- code/game/machinery/computer/computer.dm | 5 + code/game/machinery/computer/message.dm | 249 +++++++++--------- code/game/machinery/computer/pod.dm | 54 ++-- code/game/machinery/computer/sentencing.dm | 4 - code/modules/holodeck/HolodeckControl.dm | 52 ++-- .../silicon/robot/drone/drone_console.dm | 2 - code/modules/mob/mob_movement.dm | 10 + .../computers/modular_computer/core.dm | 5 + .../file_system/programs/security/camera.dm | 9 +- code/modules/nano/interaction/default.dm | 4 +- code/modules/nano/nanoui.dm | 3 + code/modules/power/turbine.dm | 40 ++- code/modules/vueui/ui.dm | 2 + .../changelogs/johnwildkins-cameraconsole.yml | 7 + 16 files changed, 236 insertions(+), 247 deletions(-) create mode 100644 html/changelogs/johnwildkins-cameraconsole.yml diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 1b9c2a0eb84..88fddc20bcc 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -135,7 +135,8 @@ to_chat(user, SPAN_NOTICE("No Patient Detected")) /obj/machinery/computer/operating/Topic(href, href_list) - ..() + if(..()) + return TRUE if(href_list["action"]) switch(href_list["action"]) if("update") @@ -154,8 +155,6 @@ if("print_new") print_new() usr.visible_message("\The [src] beeps, printing a new [input_scan] after a moment.") - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) return /obj/machinery/computer/operating/machinery_process() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 0fc35a03638..7effcbb722d 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -25,7 +25,7 @@ return attack_hand(user) /obj/machinery/computer/security/check_eye(var/mob/user as mob) - if (use_check_and_message(user) || user.blinded || inoperable()) + if (user.stat || user.blinded || inoperable()) return -1 if(!current_camera) return 0 @@ -35,11 +35,8 @@ return viewflag /obj/machinery/computer/security/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) - if(src.z > 6) return - if(stat & (NOPOWER|BROKEN)) return - if(user.stat) return - - user.set_machine(src) + if(..()) + return var/data[0] var/list/all_networks[0] @@ -73,10 +70,8 @@ /obj/machinery/computer/security/Topic(href, href_list) if(..()) - return 1 + return TRUE if(href_list["switch_camera"]) - if(src.z>6 || stat&(NOPOWER|BROKEN)) return - if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return var/obj/machinery/camera/C = locate(href_list["switch_camera"]) in cameranet.cameras if(!C) return @@ -86,19 +81,13 @@ switch_to_camera(usr, C) return 1 else if(href_list["switch_network"]) - if(src.z>6 || stat&(NOPOWER|BROKEN)) return - if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return if(href_list["switch_network"] in network) current_network = href_list["switch_network"] return 1 else if(href_list["reset"]) - if(src.z>6 || stat&(NOPOWER|BROKEN)) return - if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return reset_current() usr.reset_view(current_camera) return 1 - else - . = ..() /obj/machinery/computer/security/attack_hand(var/mob/user as mob) if (src.z > 6) @@ -123,7 +112,7 @@ A.client.eye = A.eyeobj return 1 - if (!C.can_use() || user.stat || (get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) && !istype(user, /mob/living/silicon))) + if (user.stat || user.blinded || inoperable()) return 0 set_current(C) if(ishuman(user)) @@ -214,17 +203,6 @@ var/obj/machinery/computer/security/console = usr.machine console.jump_on_click(usr,src) -//Camera control: arrow keys. -/mob/living/Move(n,direct) - if(istype(machine,/obj/machinery/computer/security)) - var/obj/machinery/computer/security/console = machine - var/turf/T = get_turf(console.current_camera) - for(var/i;i<10;i++) - T = get_step(T,direct) - console.jump_on_click(src,T) - return - return ..(n,direct) - /obj/machinery/computer/security/telescreen name = "Telescreen" desc = "Used for watching an empty arena." diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index b48bfae3e51..e3a2e31ffef 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -26,6 +26,11 @@ power_change() update_icon() +/obj/machinery/computer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = TRUE) + if(inoperable() || isNotStationLevel(z) || user.stat) + user.unset_machine() + return + /obj/machinery/computer/emp_act(severity) if(prob(20/severity)) set_broken() ..() diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index c7a02a05901..c4ed8576267 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -258,150 +258,145 @@ /obj/machinery/computer/message_monitor/Topic(href, href_list) if(..()) return 1 - if(stat & (NOPOWER|BROKEN)) - return - if(!istype(usr, /mob/living)) - return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - //Authenticate - if (href_list["auth"]) + //Authenticate + if (href_list["auth"]) + if(auth) + auth = 0 + screen = 0 + else + var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + if(dkey && dkey != "") + if(src.linkedServer.decryptkey == dkey) + auth = 1 + else + message = incorrectkey + + //Turn the server on/off. + if (href_list["active"]) + if(auth) linkedServer.active = !linkedServer.active + //Find a server + if (href_list["find"]) + if(message_servers && message_servers.len > 1) + src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers + message = "NOTICE: Server selected." + else if(message_servers && message_servers.len > 0) + linkedServer = message_servers[1] + message = "NOTICE: Only Single Server Detected - Server selected." + else + message = noserver + + //View the logs - KEY REQUIRED + if (href_list["view"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.screen = 1 + + //Clears the logs - KEY REQUIRED + if (href_list["clear"]) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.linkedServer.pda_msgs = list() + message = "NOTICE: Logs cleared." + //Clears the requests console logs - KEY REQUIRED + if (href_list["clearr"]) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.linkedServer.rc_msgs = list() + message = "NOTICE: Logs cleared." + //Change the password - KEY REQUIRED + if (href_list["pass"]) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else if(auth) - auth = 0 - screen = 0 - else var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) - auth = 1 + var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) + if(length(newkey) <= 3) + message = "NOTICE: Decryption key too short!" + else if(length(newkey) > 16) + message = "NOTICE: Decryption key too long!" + else if(newkey && newkey != "") + src.linkedServer.decryptkey = newkey + message = "NOTICE: Decryption key set." else message = incorrectkey - //Turn the server on/off. - if (href_list["active"]) - if(auth) linkedServer.active = !linkedServer.active - //Find a server - if (href_list["find"]) - if(message_servers && message_servers.len > 1) - src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers - message = "NOTICE: Server selected." - else if(message_servers && message_servers.len > 0) - linkedServer = message_servers[1] - message = "NOTICE: Only Single Server Detected - Server selected." - else - message = noserver - - //View the logs - KEY REQUIRED - if (href_list["view"]) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.screen = 1 - - //Clears the logs - KEY REQUIRED - if (href_list["clear"]) + //Hack the Console to get the password + if (href_list["hack"]) + if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr)) + src.hacking = 1 + src.screen = 2 + update_icon() + //Time it takes to bruteforce is dependant on the password length. + spawn(100*length(src.linkedServer.decryptkey)) + if(src && src.linkedServer && usr) + BruteForce(usr) + //Delete the log. + if (href_list["delete"]) + //Are they on the view logs screen? + if(screen == 1) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver - else - if(auth) - src.linkedServer.pda_msgs = list() - message = "NOTICE: Logs cleared." - //Clears the requests console logs - KEY REQUIRED - if (href_list["clearr"]) + else //if(istype(href_list["delete"], /datum/data_pda_msg)) + src.linkedServer.pda_msgs -= locate(href_list["delete"]) + message = "NOTICE: Log Deleted!" + //Delete the requests console log. + if (href_list["deleter"]) + //Are they on the view logs screen? + if(screen == 4) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver - else - if(auth) - src.linkedServer.rc_msgs = list() - message = "NOTICE: Logs cleared." - //Change the password - KEY REQUIRED - if (href_list["pass"]) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) - if(dkey && dkey != "") - if(src.linkedServer.decryptkey == dkey) - var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) - if(length(newkey) <= 3) - message = "NOTICE: Decryption key too short!" - else if(length(newkey) > 16) - message = "NOTICE: Decryption key too long!" - else if(newkey && newkey != "") - src.linkedServer.decryptkey = newkey - message = "NOTICE: Decryption key set." - else - message = incorrectkey + else //if(istype(href_list["delete"], /datum/data_pda_msg)) + src.linkedServer.rc_msgs -= locate(href_list["deleter"]) + message = "NOTICE: Log Deleted!" + //Create a custom message + if (href_list["msg"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.screen = 3 - //Hack the Console to get the password - if (href_list["hack"]) - if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr)) - src.hacking = 1 - src.screen = 2 - update_icon() - //Time it takes to bruteforce is dependant on the password length. - spawn(100*length(src.linkedServer.decryptkey)) - if(src && src.linkedServer && usr) - BruteForce(usr) - //Delete the log. - if (href_list["delete"]) - //Are they on the view logs screen? - if(screen == 1) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else //if(istype(href_list["delete"], /datum/data_pda_msg)) - src.linkedServer.pda_msgs -= locate(href_list["delete"]) - message = "NOTICE: Log Deleted!" - //Delete the requests console log. - if (href_list["deleter"]) - //Are they on the view logs screen? - if(screen == 4) - if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else //if(istype(href_list["delete"], /datum/data_pda_msg)) - src.linkedServer.rc_msgs -= locate(href_list["deleter"]) - message = "NOTICE: Log Deleted!" - //Create a custom message - if (href_list["msg"]) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.screen = 3 + //Requests Console Logs - KEY REQUIRED + if(href_list["viewr"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.screen = 4 - //Requests Console Logs - KEY REQUIRED - if(href_list["viewr"]) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.screen = 4 + //to_chat(usr, href_list["select"]) - //to_chat(usr, href_list["select"]) + if(href_list["spam"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.screen = 5 - if(href_list["spam"]) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - if(auth) - src.screen = 5 + if(href_list["addtoken"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + src.linkedServer.spamfilter += input(usr,"Enter text you want to be filtered out","Token creation") as text|null - if(href_list["addtoken"]) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - src.linkedServer.spamfilter += input(usr,"Enter text you want to be filtered out","Token creation") as text|null + if(href_list["deltoken"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + var/tokennum = text2num(href_list["deltoken"]) + src.linkedServer.spamfilter.Cut(tokennum,tokennum+1) - if(href_list["deltoken"]) - if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - message = noserver - else - var/tokennum = text2num(href_list["deltoken"]) - src.linkedServer.spamfilter.Cut(tokennum,tokennum+1) - - if (href_list["back"]) - src.screen = 0 + if (href_list["back"]) + src.screen = 0 return src.attack_hand(usr) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index fee1e273b90..b097a5b48ad 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -105,35 +105,33 @@ /obj/machinery/computer/pod/Topic(href, href_list) if(..()) return 1 - if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - if(href_list["power"]) - var/t = text2num(href_list["power"]) - t = min(max(0.25, t), 16) - if(connected) - connected.power = t - if(href_list["alarm"]) - alarm() - if(href_list["drive"]) - for(var/obj/machinery/mass_driver/M in SSmachinery.processing_machines) - if(M.id == id) - M.power = connected.power - M.drive() + if(href_list["power"]) + var/t = text2num(href_list["power"]) + t = min(max(0.25, t), 16) + if(connected) + connected.power = t + if(href_list["alarm"]) + alarm() + if(href_list["drive"]) + for(var/obj/machinery/mass_driver/M in SSmachinery.processing_machines) + if(M.id == id) + M.power = connected.power + M.drive() - if(href_list["time"]) - timing = text2num(href_list["time"]) - if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 120) - if(href_list["door"]) - for(var/obj/machinery/door/blast/M in SSmachinery.processing_machines) - if(M.id == id) - if(M.density) - M.open() - else - M.close() - updateUsrDialog() + if(href_list["time"]) + timing = text2num(href_list["time"]) + if(href_list["tp"]) + var/tp = text2num(href_list["tp"]) + time += tp + time = min(max(round(time), 0), 120) + if(href_list["door"]) + for(var/obj/machinery/door/blast/M in SSmachinery.processing_machines) + if(M.id == id) + if(M.density) + M.open() + else + M.close() + updateUsrDialog() return diff --git a/code/game/machinery/computer/sentencing.dm b/code/game/machinery/computer/sentencing.dm index 4a074fcde16..3bbe1d5890e 100644 --- a/code/game/machinery/computer/sentencing.dm +++ b/code/game/machinery/computer/sentencing.dm @@ -479,10 +479,6 @@ if(..()) return - if(stat & (NOPOWER|BROKEN)) - return 0 // don't update UIs attached to this object - - usr.set_machine(src) switch(href_list["button"]) if( "import_incident" ) diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 49f2660af87..517dadfffe6 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -106,41 +106,37 @@ if(..()) return 1 - if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + if(locked && !allowed(usr)) + return - if(locked && !allowed(usr)) + if(href_list["program"]) + var/prog = href_list["program"] + if(prog in current_map.holodeck_programs) + loadProgram(current_map.holodeck_programs[prog]) + + else if(href_list["AIoverride"]) + if(!issilicon(usr)) return - usr.set_machine(src) + if(safety_disabled && emagged) + return //if a traitor has gone through the trouble to emag the thing, let them keep it. - if(href_list["program"]) - var/prog = href_list["program"] - if(prog in current_map.holodeck_programs) - loadProgram(current_map.holodeck_programs[prog]) + safety_disabled = !safety_disabled + update_projections() + if(safety_disabled) + message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") + log_game("[key_name(usr)] overrided the holodeck's safeties",ckey=key_name(usr)) + else + message_admins("[key_name_admin(usr)] restored the holodeck's safeties") + log_game("[key_name(usr)] restored the holodeck's safeties",ckey=key_name(usr)) - else if(href_list["AIoverride"]) - if(!issilicon(usr)) - return + else if(href_list["gravity"]) + toggleGravity(linkedholodeck) - if(safety_disabled && emagged) - return //if a traitor has gone through the trouble to emag the thing, let them keep it. + else if(href_list["togglehololock"]) + togglelock(usr) - safety_disabled = !safety_disabled - update_projections() - if(safety_disabled) - message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") - log_game("[key_name(usr)] overrided the holodeck's safeties",ckey=key_name(usr)) - else - message_admins("[key_name_admin(usr)] restored the holodeck's safeties") - log_game("[key_name(usr)] restored the holodeck's safeties",ckey=key_name(usr)) - - else if(href_list["gravity"]) - toggleGravity(linkedholodeck) - - else if(href_list["togglehololock"]) - togglelock(usr) - - src.add_fingerprint(usr) + src.add_fingerprint(usr) src.updateUsrDialog() return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 2262c21b98e..bbaa875b280 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -58,8 +58,6 @@ to_chat(usr, SPAN_WARNING("Access denied.")) return - if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) if(href_list["setarea"]) if(!call_area_names) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 0e7f6baa567..c893c99e28b 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -227,6 +227,16 @@ if(item.zoom) item.zoom(mob) break + if(istype(mob.machine,/obj/machinery/computer/security)) + // Has to be here specfically to allow WASD/arrow movement of cameras while buckled. + // TODO: Remove when machinery/computer finally dies. + var/obj/machinery/computer/security/console = mob.machine + if(console.current_camera) + var/turf/T = get_turf(console.current_camera) + for(var/i;i<10;i++) + T = get_step(T,direct) + console.jump_on_click(mob,T) + return // Only meaningful for living mobs. if(Process_Grab()) diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 4bc3fcd1f53..f2ca41d8344 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -112,6 +112,11 @@ if(iscarbon(user)) playsound(src, 'sound/machines/pda_click.ogg', 20) +/obj/item/modular_computer/CouldNotUseTopic(var/mob/user) + ..() + if(user.machine == src) + user.unset_machine() + /obj/item/modular_computer/emag_act(var/remaining_charges, var/mob/user) if(computer_emagged) to_chat(user, SPAN_WARNING("\The [src] has already been emagged.")) diff --git a/code/modules/modular_computers/file_system/programs/security/camera.dm b/code/modules/modular_computers/file_system/programs/security/camera.dm index e918587f52f..599dce448cf 100644 --- a/code/modules/modular_computers/file_system/programs/security/camera.dm +++ b/code/modules/modular_computers/file_system/programs/security/camera.dm @@ -157,12 +157,11 @@ current_camera = null /datum/nano_module/camera_monitor/check_eye(var/mob/user as mob) - if(istype(ui_host(), /obj/machinery/computer)) - var/obj/machinery/computer/C = ui_host() - if (C.use_check_and_message(user) || C.inoperable()) + var/obj/item/modular_computer/MC = user.machine + if(istype(MC) && ui_host() == MC) + if(!MC.working || user.blinded || user.stat) + user.unset_machine() return -1 - if(user.blinded) - return -1 if(!current_camera) return 0 var/viewflag = current_camera.check_eye(user) diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index 04d15a19d8b..2003e5166c3 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -36,7 +36,7 @@ // robots can interact with things they can see within their view range if((src_object in view(src)) && get_dist(src_object, src) <= src.client.view) return STATUS_INTERACTIVE // interactive (green visibility) - return STATUS_DISABLED // no updates, completely disabled (red visibility) + return STATUS_CLOSE // close the UI if no longer in view /mob/living/silicon/ai/default_can_use_topic(var/src_object) . = shared_nano_interaction() @@ -111,4 +111,4 @@ else . = min(., loc.contents_nano_distance(src_object, src)) else - . = min(., shared_living_nano_distance(src_object)) \ No newline at end of file + . = min(., shared_living_nano_distance(src_object)) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 0cbd1a1c20a..218f06630b9 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -445,6 +445,9 @@ nanoui is used to open and update nano browser uis state = null master_ui = null + if(istype(user)) + user.unset_machine() + /** * Set the UI window to call the nanoclose verb when the window is closed * This allows Nano to handle closed windows diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index b113512a31a..0fbb44ab959 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -253,29 +253,27 @@ /obj/machinery/computer/turbine_computer/Topic(href, href_list) if(..()) return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.machine = src - if( href_list["view"] ) - usr.client.eye = src.compressor - else if( href_list["str"] ) - src.compressor.starter = !src.compressor.starter - else if (href_list["doors"]) - for(var/obj/machinery/door/blast/D in src.doors) - if (door_status == 0) - spawn( 0 ) - D.open() - door_status = 1 - else - spawn( 0 ) - D.close() - door_status = 0 - else if( href_list["close"] ) - usr << browse(null, "window=computer") - usr.machine = null - return + if( href_list["view"] ) + usr.client.eye = src.compressor + else if( href_list["str"] ) + src.compressor.starter = !src.compressor.starter + else if (href_list["doors"]) + for(var/obj/machinery/door/blast/D in src.doors) + if (door_status == 0) + spawn( 0 ) + D.open() + door_status = 1 + else + spawn( 0 ) + D.close() + door_status = 0 + else if( href_list["close"] ) + usr << browse(null, "window=computer") + usr.machine = null + return - src.add_fingerprint(usr) + src.add_fingerprint(usr) src.updateUsrDialog() return diff --git a/code/modules/vueui/ui.dm b/code/modules/vueui/ui.dm index 667080981b4..8733edd813d 100644 --- a/code/modules/vueui/ui.dm +++ b/code/modules/vueui/ui.dm @@ -109,6 +109,8 @@ main ui datum. SSvueui.ui_closed(src) // this stops processing and cleans up references to this UI user << browse(null, "window=[windowid]") status = null + if(istype(user)) + user.unset_machine() /** * Resizes UI diff --git a/html/changelogs/johnwildkins-cameraconsole.yml b/html/changelogs/johnwildkins-cameraconsole.yml new file mode 100644 index 00000000000..473df94ebac --- /dev/null +++ b/html/changelogs/johnwildkins-cameraconsole.yml @@ -0,0 +1,7 @@ +author: JohnWildkins + +delete-after: True + +changes: + - bugfix: "Camera consoles can now be used while buckled in non-office chairs, and should reset view properly when no longer in use." + - tweak: "Computer UIs will now close for cyborgs if they move beyond visual range. (They already disabled interaction in the past.)"