Fix security camera consoles, hopefully (#13507)

This commit is contained in:
Wildkins
2022-04-14 20:27:39 -03:00
committed by GitHub
parent c0332fa943
commit 8a28865697
16 changed files with 236 additions and 247 deletions
+2 -3
View File
@@ -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()
+5 -27
View File
@@ -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."
+5
View File
@@ -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()
..()
+122 -127
View File
@@ -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 = "<span class='alert'>NOTICE: Server selected.</span>"
else if(message_servers && message_servers.len > 0)
linkedServer = message_servers[1]
message = "<span class='notice'>NOTICE: Only Single Server Detected - Server selected.</span>"
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 = "<span class='notice'>NOTICE: Logs cleared.</span>"
//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 = "<span class='notice'>NOTICE: Logs cleared.</span>"
//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 = "<span class='notice'>NOTICE: Decryption key too short!</span>"
else if(length(newkey) > 16)
message = "<span class='notice'>NOTICE: Decryption key too long!</span>"
else if(newkey && newkey != "")
src.linkedServer.decryptkey = newkey
message = "<span class='notice'>NOTICE: Decryption key set.</span>"
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 = "<span class='alert'>NOTICE: Server selected.</span>"
else if(message_servers && message_servers.len > 0)
linkedServer = message_servers[1]
message = "<span class='notice'>NOTICE: Only Single Server Detected - Server selected.</span>"
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 = "<span class='notice'>NOTICE: Logs cleared.</span>"
//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 = "<span class='notice'>NOTICE: Log Deleted!</span>"
//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 = "<span class='notice'>NOTICE: Logs cleared.</span>"
//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 = "<span class='notice'>NOTICE: Decryption key too short!</span>"
else if(length(newkey) > 16)
message = "<span class='notice'>NOTICE: Decryption key too long!</span>"
else if(newkey && newkey != "")
src.linkedServer.decryptkey = newkey
message = "<span class='notice'>NOTICE: Decryption key set.</span>"
else
message = incorrectkey
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.rc_msgs -= locate(href_list["deleter"])
message = "<span class='notice'>NOTICE: Log Deleted!</span>"
//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 = "<span class='notice'>NOTICE: Log Deleted!</span>"
//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 = "<span class='notice'>NOTICE: Log Deleted!</span>"
//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)
+26 -28
View File
@@ -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
@@ -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" )
+24 -28
View File
@@ -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
@@ -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)
+10
View File
@@ -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())
@@ -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."))
@@ -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)
+2 -2
View File
@@ -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))
. = min(., shared_living_nano_distance(src_object))
+3
View File
@@ -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
+19 -21
View File
@@ -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
+2
View File
@@ -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
@@ -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.)"