From 98dd3707c160be88b6c50801236d58cbf6220b90 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Fri, 10 Apr 2020 19:50:55 -0400 Subject: [PATCH] Refactor consoles to operate on logically adjacent zlevels --- code/datums/repositories/cameras.dm | 19 ++++++++++-- code/game/machinery/camera/camera.dm | 2 ++ code/game/machinery/camera/presets.dm | 1 + code/game/machinery/computer/camera.dm | 10 +++---- code/modules/alarm/alarm_handler.dm | 29 ++++++++++++------- code/modules/alarm/atmosphere_alarm.dm | 10 +++++-- .../programs/engineering/alarm_monitor.dm | 15 ++++++---- .../programs/engineering/atmos_control.dm | 8 +++-- .../programs/engineering/power_monitor.dm | 8 +++-- .../programs/engineering/rcon_console.dm | 8 +++++ .../engineering/supermatter_monitor.dm | 6 ++-- .../file_system/programs/generic/camera.dm | 10 ++++++- .../programs/medical/suit_sensors.dm | 15 ++++++---- nano/templates/sec_camera.tmpl | 3 +- 14 files changed, 104 insertions(+), 40 deletions(-) diff --git a/code/datums/repositories/cameras.dm b/code/datums/repositories/cameras.dm index 7bac2a4634..d516113394 100644 --- a/code/datums/repositories/cameras.dm +++ b/code/datums/repositories/cameras.dm @@ -14,10 +14,25 @@ var/global/datum/repository/cameras/camera_repository = new() networks = list() ..() -/datum/repository/cameras/proc/cameras_in_network(var/network) +/datum/repository/cameras/proc/cameras_in_network(var/network, var/list/zlevels) setup_cache() var/list/network_list = networks[network] - return network_list + if(LAZYLEN(zlevels)) + var/list/filtered_cameras = list() + for(var/list/C in network_list) + //Camera is marked as always-visible + if(C["omni"]) + filtered_cameras[++filtered_cameras.len] = C + continue + //Camera might be in an adjacent zlevel + var/camz = C["z"] + if(!camz) //It's inside something (helmet, communicator, etc) or nullspace or who knows + camz = get_z(locate(C["camera"]) in cameranet.cameras) + if(camz in zlevels) + filtered_cameras[++filtered_cameras.len] = C //Can't add lists to lists with += + return filtered_cameras + else + return network_list /datum/repository/cameras/proc/setup_cache() if(!invalidated) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index f20c05d627..15f9d65bc3 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -33,6 +33,7 @@ var/busy = 0 var/on_open_network = 0 + var/always_visible = FALSE //Visable from any map, good for entertainment network cameras var/affected_by_emp_until = 0 @@ -472,6 +473,7 @@ cam["name"] = sanitize(c_tag) cam["deact"] = !can_use() cam["camera"] = "\ref[src]" + cam["omni"] = always_visible cam["x"] = x cam["y"] = y cam["z"] = z diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 911e128984..d7070146d1 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -102,6 +102,7 @@ var/global/list/engineering_networks = list( /obj/machinery/camera/network/thunder network = list(NETWORK_THUNDER) invuln = 1 + always_visible = TRUE // EMP diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 57d6d01c6e..9adf2a0a43 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -43,11 +43,14 @@ data["current_camera"] = current_camera ? current_camera.nano_structure() : null data["current_network"] = current_network data["networks"] = network ? network : list() + + var/map_levels = using_map.get_map_levels(src.z, TRUE) + data["map_levels"] = map_levels + if(current_network) - data["cameras"] = camera_repository.cameras_in_network(current_network) + data["cameras"] = camera_repository.cameras_in_network(current_network, map_levels) if(current_camera) switch_to_camera(user, current_camera) - data["map_levels"] = using_map.get_map_levels(src.z) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -91,9 +94,6 @@ . = ..() /obj/machinery/computer/security/attack_hand(var/mob/user as mob) - if (using_map && !(src.z in using_map.contact_levels)) - to_chat(user, "Unable to establish a connection: You're too far away from the station!") - return if(stat & (NOPOWER|BROKEN)) return if(!isAI(user)) diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm index 22b069093a..cbec4c25b6 100644 --- a/code/modules/alarm/alarm_handler.dm +++ b/code/modules/alarm/alarm_handler.dm @@ -47,16 +47,17 @@ existing.clear(source) return check_alarm_cleared(existing) -/datum/alarm_handler/proc/major_alarms() - return visible_alarms() +/datum/alarm_handler/proc/major_alarms(var/z) + return visible_alarms(z) -/datum/alarm_handler/proc/has_major_alarms() - if(alarms && alarms.len) - return 1 - return 0 +/datum/alarm_handler/proc/has_major_alarms(var/z) + if(!LAZYLEN(alarms)) + return 0 -/datum/alarm_handler/proc/minor_alarms() - return visible_alarms() + return LAZYLEN(major_alarms(z)) + +/datum/alarm_handler/proc/minor_alarms(var/z) + return visible_alarms(z) /datum/alarm_handler/proc/check_alarm_cleared(var/datum/alarm/alarm) if ((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len) @@ -101,9 +102,15 @@ for(var/listener in listeners) call(listener, listeners[listener])(src, alarm, was_raised) -/datum/alarm_handler/proc/visible_alarms() +/datum/alarm_handler/proc/visible_alarms(var/z) + if(!LAZYLEN(alarms)) + return list() + + var/list/map_levels = using_map.get_map_levels(z) + var/list/visible_alarms = new() for(var/datum/alarm/A in alarms) - if(!A.hidden) - visible_alarms.Add(A) + if(A.hidden || (z && !(A.origin?.z in map_levels))) + continue + visible_alarms.Add(A) return visible_alarms \ No newline at end of file diff --git a/code/modules/alarm/atmosphere_alarm.dm b/code/modules/alarm/atmosphere_alarm.dm index fc0fe92ee4..f19044a6b7 100644 --- a/code/modules/alarm/atmosphere_alarm.dm +++ b/code/modules/alarm/atmosphere_alarm.dm @@ -1,16 +1,22 @@ /datum/alarm_handler/atmosphere category = "Atmosphere Alarms" -/datum/alarm_handler/atmosphere/major_alarms() +/datum/alarm_handler/atmosphere/major_alarms(var/z) var/list/major_alarms = new() + var/list/map_levels = using_map.get_map_levels(z) for(var/datum/alarm/A in visible_alarms()) + if(z && (z && !(A.origin?.z in map_levels))) + continue if(A.max_severity() > 1) major_alarms.Add(A) return major_alarms -/datum/alarm_handler/atmosphere/minor_alarms() +/datum/alarm_handler/atmosphere/minor_alarms(var/z) var/list/minor_alarms = new() + var/list/map_levels = using_map.get_map_levels(z) for(var/datum/alarm/A in visible_alarms()) + if(z && (z && !(A.origin?.z in map_levels))) + continue if(A.max_severity() == 1) minor_alarms.Add(A) return minor_alarms diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm index c887034754..bb45191f2f 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm @@ -61,31 +61,35 @@ AH.unregister_alarm(object) /datum/nano_module/alarm_monitor/proc/all_alarms() + var/z = get_z(nano_host()) var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) - all_alarms += AH.visible_alarms() + all_alarms += AH.visible_alarms(z) return all_alarms /datum/nano_module/alarm_monitor/proc/major_alarms() + var/z = get_z(nano_host()) var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) - all_alarms += AH.major_alarms() + all_alarms += AH.major_alarms(z) return all_alarms // Modified version of above proc that uses slightly less resources, returns 1 if there is a major alarm, 0 otherwise. /datum/nano_module/alarm_monitor/proc/has_major_alarms() + var/z = get_z(nano_host()) for(var/datum/alarm_handler/AH in alarm_handlers) - if(AH.has_major_alarms()) + if(AH.has_major_alarms(z)) return 1 return 0 /datum/nano_module/alarm_monitor/proc/minor_alarms() + var/z = get_z(nano_host()) var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) - all_alarms += AH.minor_alarms() + all_alarms += AH.minor_alarms(z) return all_alarms @@ -104,9 +108,10 @@ var/list/data = host.initial_data() var/categories[0] + var/z = get_z(nano_host()) for(var/datum/alarm_handler/AH in alarm_handlers) categories[++categories.len] = list("category" = AH.category, "alarms" = list()) - for(var/datum/alarm/A in AH.major_alarms()) + for(var/datum/alarm/A in AH.major_alarms(z)) var/cameras[0] var/lost_sources[0] diff --git a/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm b/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm index 776e73ec7a..bfcaadee3e 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/atmos_control.dm @@ -47,12 +47,17 @@ /datum/nano_module/atmos_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state) var/list/data = host.initial_data() var/alarms[0] - var/turf/T = get_turf(nano_host()) + + var/z = get_z(nano_host()) + var/list/map_levels = using_map.get_map_levels(z) + data["map_levels"] = map_levels // TODO: Move these to a cache, similar to cameras for(var/obj/machinery/alarm/alarm in (monitored_alarms.len ? monitored_alarms : machines)) if(!monitored_alarms.len && alarm.alarms_hidden) continue + if(!(alarm.z in map_levels)) + continue alarms[++alarms.len] = list( "name" = sanitize(alarm.name), "ref"= "\ref[alarm]", @@ -61,7 +66,6 @@ "y" = alarm.y, "z" = alarm.z) data["alarms"] = alarms - data["map_levels"] = using_map.get_map_levels(T.z) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 32117e845c..b5c086dc26 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -53,10 +53,15 @@ var/list/sensors = list() // Focus: If it remains null if no sensor is selected and UI will display sensor list, otherwise it will display sensor reading. var/obj/machinery/power/sensor/focus = null - var/turf/T = get_turf(nano_host()) + + var/z = get_z(nano_host()) + var/list/map_levels = using_map.get_map_levels(z) + data["map_levels"] = map_levels // Build list of data from sensor readings. for(var/obj/machinery/power/sensor/S in grid_sensors) + if(!(S.z in map_levels)) + continue sensors.Add(list(list( "name" = S.name_tag, "alarm" = S.check_grid_warning() @@ -67,7 +72,6 @@ data["all_sensors"] = sensors if(focus) data["focus"] = focus.return_reading_data() - data["map_levels"] = using_map.get_map_levels(T.z) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) diff --git a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm index d5ee88b670..7603b1115e 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm @@ -122,11 +122,19 @@ // Description: Refreshes local list of known devices. /datum/nano_module/rcon/proc/FindDevices() known_SMESs = new /list() + + var/z = get_z(nano_host()) + var/list/map_levels = using_map.get_map_levels(z) + for(var/obj/machinery/power/smes/buildable/SMES in machines) + if(!(SMES.z in map_levels)) + continue if(SMES.RCon_tag && (SMES.RCon_tag != "NO_TAG") && SMES.RCon) known_SMESs.Add(SMES) known_breakers = new /list() for(var/obj/machinery/power/breakerbox/breaker in machines) + if(!(breaker.z in map_levels)) + continue if(breaker.RCon_tag != "NO_TAG") known_breakers.Add(breaker) diff --git a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm index af0489a953..6939a44dff 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm @@ -41,10 +41,10 @@ // Refreshes list of active supermatter crystals /datum/nano_module/supermatter_monitor/proc/refresh() supermatters = list() - var/turf/T = get_turf(nano_host()) - if(!T) + var/z = get_z(nano_host()) + if(!z) return - var/valid_z_levels = (GetConnectedZlevels(T.z) & using_map.station_levels) + var/valid_z_levels = using_map.get_map_levels(z) for(var/obj/machinery/power/supermatter/S in machines) // Delaminating, not within coverage, not on a tile. if(S.grav_pulling || S.exploded || !(S.z in valid_z_levels) || !istype(S.loc, /turf/)) diff --git a/code/modules/modular_computers/file_system/programs/generic/camera.dm b/code/modules/modular_computers/file_system/programs/generic/camera.dm index a722dea6b6..e07d9ec293 100644 --- a/code/modules/modular_computers/file_system/programs/generic/camera.dm +++ b/code/modules/modular_computers/file_system/programs/generic/camera.dm @@ -15,6 +15,12 @@ return access_research if(NETWORK_ERT) return access_cent_specops + //VOREStation Add Start + if(NETWORK_TALON_SHIP) + return access_talon + if(NETWORK_TALON_HELMETS) + return access_talon + //VOREStation Add End if(network in using_map.station_networks) return access_security // Default for all other station networks @@ -62,8 +68,10 @@ data["networks"] = all_networks + var/list/map_levels = using_map.get_map_levels(get_z(nano_host()), TRUE) + if(current_network) - data["cameras"] = camera_repository.cameras_in_network(current_network) + data["cameras"] = camera_repository.cameras_in_network(current_network, map_levels) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index 1105051997..bf8fe50909 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -34,18 +34,21 @@ /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/list/data = host.initial_data() - var/turf/T = get_turf(nano_host()) data["isAI"] = isAI(user) - data["map_levels"] = using_map.get_map_levels(T.z, FALSE) + + var/z = get_z(nano_host()) + var/list/map_levels = using_map.get_map_levels(z, TRUE) + data["map_levels"] = map_levels + data["crewmembers"] = list() - for(var/z in data["map_levels"]) // VOREStation Edit - data["crewmembers"] += crew_repository.health_data(z) + for(var/zlevel in map_levels) + data["crewmembers"] += crew_repository.health_data(zlevel) if(!data["map_levels"].len) to_chat(user, "The crew monitor doesn't seem like it'll work here.") - if(ui) // VOREStation Addition - ui.close() // VOREStation Addition + if(ui) + ui.close() return ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/nano/templates/sec_camera.tmpl b/nano/templates/sec_camera.tmpl index 1d46f1868f..21ecea71e7 100644 --- a/nano/templates/sec_camera.tmpl +++ b/nano/templates/sec_camera.tmpl @@ -8,7 +8,8 @@ Used In File(s): \code\game\machinery\computer\camera.dm {{:helper.link('Reset', 'refresh', {'reset' : 1})}}
-
Current Camera: 
+
Current Camera: 
+
{{if data.current_camera}}
{{:data.current_camera.name}}
{{else}}