final
This commit is contained in:
@@ -114,8 +114,8 @@
|
||||
src.allowed_z_levels = allowed_z_levels
|
||||
src.allowed_areas = allowed_areas
|
||||
for(var/alarm_type in alarms_to_listen_for)
|
||||
RegisterSignal(SSdcs, COMSIG_ALARM_FIRE(alarm_type), .proc/add_alarm)
|
||||
RegisterSignal(SSdcs, COMSIG_ALARM_CLEAR(alarm_type), .proc/clear_alarm)
|
||||
RegisterSignal(SSdcs, COMSIG_ALARM_FIRE(alarm_type), PROC_REF(add_alarm))
|
||||
RegisterSignal(SSdcs, COMSIG_ALARM_CLEAR(alarm_type), PROC_REF(clear_alarm))
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
var/list/cameras = source_area.cameras
|
||||
if(optional_camera)
|
||||
cameras = list(optional_camera) // This will cause harddels, so we need to clear manually
|
||||
RegisterSignal(optional_camera, COMSIG_PARENT_QDELETING, .proc/clear_camera_ref, override = TRUE) //It's just fine to override, cause we clear all refs in the proc
|
||||
RegisterSignal(optional_camera, COMSIG_PARENT_QDELETING, PROC_REF(clear_camera_ref), override = TRUE) //It's just fine to override, cause we clear all refs in the proc
|
||||
|
||||
//This does mean that only the first alarm of that camera type in the area will send a ping, but jesus what else can ya do
|
||||
alarms_of_our_type[source_area.name] = list(source_area, cameras, list(handler))
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
/datum/station_alert
|
||||
/// Holder of the datum
|
||||
var/holder
|
||||
/// List of all alarm types we are listening to
|
||||
var/list/alarm_types
|
||||
/// Listens for alarms, provides the alarms list for our UI
|
||||
var/datum/alarm_listener/listener
|
||||
/// Title of our UI
|
||||
var/title
|
||||
/// If UI will also show and allow jumping to cameras connected to each alert area
|
||||
var/camera_view
|
||||
|
||||
/datum/station_alert/ui_host(mob/user)
|
||||
return holder
|
||||
|
||||
/datum/station_alert/New(holder, list/alarm_types, list/listener_z_level, list/listener_areas, title = "Station Alerts", camera_view = FALSE)
|
||||
src.holder = holder
|
||||
src.alarm_types = alarm_types
|
||||
src.title = title
|
||||
src.camera_view = camera_view
|
||||
listener = new(alarm_types, listener_z_level, listener_areas)
|
||||
|
||||
/datum/station_alert/Destroy()
|
||||
QDEL_NULL(listener)
|
||||
return ..()
|
||||
|
||||
/datum/station_alert/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "StationAlertConsole", title)
|
||||
ui.open()
|
||||
|
||||
/datum/station_alert/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["cameraView"] = camera_view
|
||||
data["alarms"] = list()
|
||||
var/list/nominal_types = alarm_types.Copy()
|
||||
var/list/alarms = listener.alarms
|
||||
for(var/alarm_type in alarms)
|
||||
var/list/alarm_category = list(
|
||||
"name" = alarm_type,
|
||||
"alerts" = list(),
|
||||
)
|
||||
var/list/alerts = alarms[alarm_type]
|
||||
for(var/alert in alerts)
|
||||
var/list/alert_details = alerts[alert]
|
||||
alarm_category["alerts"] += list(list(
|
||||
"name" = get_area_name(alert_details[1], TRUE),
|
||||
"cameras" = camera_view ? length(alert_details[2]) : null,
|
||||
"sources" = camera_view ? length(alert_details[3]) : null,
|
||||
"ref" = camera_view ? REF(alert) : null,
|
||||
))
|
||||
data["alarms"] += list(alarm_category)
|
||||
nominal_types -= alarm_type
|
||||
if(length(nominal_types))
|
||||
for(var/nominal_type in nominal_types)
|
||||
var/list/nominal_category = list(
|
||||
"name" = nominal_type,
|
||||
"alerts" = list(),
|
||||
)
|
||||
data["alarms"] += list(nominal_category)
|
||||
return data
|
||||
|
||||
/datum/station_alert/ui_act(action, params)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("select_camera")
|
||||
var/mob/living/silicon/ai/ai = usr
|
||||
if(!istype(ai))
|
||||
return
|
||||
|
||||
var/list/alarms = listener.alarms
|
||||
var/list/alerts = list()
|
||||
for(var/alarm_type in alarms)
|
||||
alerts += alarms[alarm_type]
|
||||
|
||||
var/list/our_alert = locate(params["alert"]) in alerts
|
||||
if(!length(our_alert))
|
||||
return
|
||||
var/chosen_alert = alerts[our_alert]
|
||||
var/list/cameras = chosen_alert[2]
|
||||
if(!length(cameras))
|
||||
return
|
||||
var/list/named_cameras = list()
|
||||
for(var/obj/machinery/camera/camera in cameras)
|
||||
named_cameras[camera.c_tag] = camera
|
||||
|
||||
var/chosen_camera
|
||||
if(length(named_cameras) == 1)
|
||||
chosen_camera = named_cameras[1]
|
||||
else
|
||||
chosen_camera = tgui_input_list(ai, "Choose a camera to jump to", "Camera Selection", named_cameras)
|
||||
if(!chosen_camera)
|
||||
return
|
||||
var/obj/machinery/camera/selected_camera = named_cameras[chosen_camera]
|
||||
if(!selected_camera.can_use())
|
||||
to_chat(ai, span_warning("Camera is unavailable!"))
|
||||
return
|
||||
ai.switchCamera(selected_camera)
|
||||
return TRUE
|
||||
Reference in New Issue
Block a user