diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 4b64cbadce..1f0b5f454f 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -14,138 +14,140 @@
var/cache_id = 0
circuit = /obj/item/weapon/circuitboard/security
- New()
- if(!network)
- network = station_networks.Copy()
- ..()
- if(network.len)
- current_network = network[1]
+/obj/machinery/computer/security/New()
+ if(!network)
+ network = station_networks.Copy()
+ ..()
+ if(network.len)
+ current_network = network[1]
- attack_ai(var/mob/user as mob)
- return attack_hand(user)
+/obj/machinery/computer/security/attack_ai(var/mob/user as mob)
+ return attack_hand(user)
- check_eye(var/mob/user as mob)
- if (user.stat || ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded) && !istype(user, /mob/living/silicon))) //user can't see - not sure why canmove is here.
- return -1
- if(!current_camera)
- return 0
- var/viewflag = current_camera.check_eye(user)
- if ( viewflag < 0 ) //camera doesn't work
- reset_current()
- return viewflag
+/obj/machinery/computer/security/check_eye(var/mob/user as mob)
+ if (user.stat || ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded) && !istype(user, /mob/living/silicon))) //user can't see - not sure why canmove is here.
+ return -1
+ if(!current_camera)
+ return 0
+ var/viewflag = current_camera.check_eye(user)
+ if ( viewflag < 0 ) //camera doesn't work
+ reset_current()
+ return viewflag
- 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
+/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
- var/data[0]
+ var/data[0]
- data["current_camera"] = current_camera ? current_camera.nano_structure() : null
- data["current_network"] = current_network
- data["networks"] = network ? network : list()
- if(current_network)
- data["cameras"] = camera_repository.cameras_in_network(current_network)
+ data["current_camera"] = current_camera ? current_camera.nano_structure() : null
+ data["current_network"] = current_network
+ data["networks"] = network ? network : list()
+ if(current_network)
+ data["cameras"] = camera_repository.cameras_in_network(current_network)
+ if(current_camera)
+ switch_to_camera(user, current_camera)
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
- ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800)
- // adding a template with the key "mapContent" enables the map ui functionality
- ui.add_template("mapContent", "sec_camera_map_content.tmpl")
- // adding a template with the key "mapHeader" replaces the map header content
- ui.add_template("mapHeader", "sec_camera_map_header.tmpl")
+ // adding a template with the key "mapContent" enables the map ui functionality
+ ui.add_template("mapContent", "sec_camera_map_content.tmpl")
+ // adding a template with the key "mapHeader" replaces the map header content
+ ui.add_template("mapHeader", "sec_camera_map_header.tmpl")
- ui.set_initial_data(data)
- ui.open()
+ ui.set_initial_data(data)
+ ui.open()
- Topic(href, href_list)
- if(..())
- return 1
- 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
- if(!(current_network in C.network))
- return
-
- 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
- . = ..()
-
- attack_hand(var/mob/user as mob)
- if (src.z > 6)
- user << "Unable to establish a connection: You're too far away from the station!"
+/obj/machinery/computer/security/Topic(href, href_list)
+ if(..())
+ return 1
+ 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
+ if(!(current_network in C.network))
return
- if(stat & (NOPOWER|BROKEN)) return
- if(!isAI(user))
- user.set_machine(src)
- ui_interact(user)
+ 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
+ . = ..()
- proc/switch_to_camera(var/mob/user, var/obj/machinery/camera/C)
- //don't need to check if the camera works for AI because the AI jumps to the camera location and doesn't actually look through cameras.
- if(isAI(user))
- var/mob/living/silicon/ai/A = user
- // Only allow non-carded AIs to view because the interaction with the eye gets all wonky otherwise.
- if(!A.is_in_chassis())
- return 0
+/obj/machinery/computer/security/attack_hand(var/mob/user as mob)
+ if (src.z > 6)
+ user << "Unable to establish a connection: You're too far away from the station!"
+ return
+ if(stat & (NOPOWER|BROKEN)) return
- A.eyeobj.setLoc(get_turf(C))
- A.client.eye = A.eyeobj
- return 1
+ if(!isAI(user))
+ user.set_machine(src)
+ ui_interact(user)
- if (!C.can_use() || user.stat || (get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) && !istype(user, /mob/living/silicon)))
+/obj/machinery/computer/security/proc/switch_to_camera(var/mob/user, var/obj/machinery/camera/C)
+ //don't need to check if the camera works for AI because the AI jumps to the camera location and doesn't actually look through cameras.
+ if(isAI(user))
+ var/mob/living/silicon/ai/A = user
+ // Only allow non-carded AIs to view because the interaction with the eye gets all wonky otherwise.
+ if(!A.is_in_chassis())
return 0
- set_current(C)
- user.reset_view(current_camera)
- check_eye(user)
+
+ A.eyeobj.setLoc(get_turf(C))
+ 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)))
+ return 0
+ set_current(C)
+ user.reset_view(current_camera)
+ check_eye(user)
+ return 1
+
//Camera control: moving.
- proc/jump_on_click(var/mob/user,var/A)
- if(user.machine != src)
- return
- var/obj/machinery/camera/jump_to
- if(istype(A,/obj/machinery/camera))
- jump_to = A
- else if(ismob(A))
- if(ishuman(A))
- jump_to = locate() in A:head
- else if(isrobot(A))
- jump_to = A:camera
- else if(isobj(A))
- jump_to = locate() in A
- else if(isturf(A))
- var/best_dist = INFINITY
- for(var/obj/machinery/camera/camera in get_area(A))
- if(!camera.can_use())
- continue
- if(!can_access_camera(camera))
- continue
- var/dist = get_dist(camera,A)
- if(dist < best_dist)
- best_dist = dist
- jump_to = camera
- if(isnull(jump_to))
- return
- if(can_access_camera(jump_to))
- switch_to_camera(user,jump_to)
+/obj/machinery/computer/security/proc/jump_on_click(var/mob/user,var/A)
+ if(user.machine != src)
+ return
+ var/obj/machinery/camera/jump_to
+ if(istype(A,/obj/machinery/camera))
+ jump_to = A
+ else if(ismob(A))
+ if(ishuman(A))
+ jump_to = locate() in A:head
+ else if(isrobot(A))
+ jump_to = A:camera
+ else if(isobj(A))
+ jump_to = locate() in A
+ else if(isturf(A))
+ var/best_dist = INFINITY
+ for(var/obj/machinery/camera/camera in get_area(A))
+ if(!camera.can_use())
+ continue
+ if(!can_access_camera(camera))
+ continue
+ var/dist = get_dist(camera,A)
+ if(dist < best_dist)
+ best_dist = dist
+ jump_to = camera
+ if(isnull(jump_to))
+ return
+ if(can_access_camera(jump_to))
+ switch_to_camera(user,jump_to)
/obj/machinery/computer/security/process()
if(cache_id != camera_repository.camera_cache_id)