diff --git a/code/datums/cache/crew.dm b/code/datums/cache/crew.dm index 3be1380f462..25833107926 100644 --- a/code/datums/cache/crew.dm +++ b/code/datums/cache/crew.dm @@ -7,7 +7,7 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new()) cache_data = list() ..() -/datum/repository/crew/proc/health_data(z) +/datum/repository/crew/proc/health_data(z, ignore_sensors = FALSE) var/list/crewmembers = list() if(!z) return crewmembers @@ -31,7 +31,7 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new()) for(var/thing in GLOB.human_list) var/mob/living/carbon/human/H = thing var/obj/item/clothing/under/C = H.w_uniform - if(!C || C.sensor_mode == SUIT_SENSOR_OFF || !C.has_sensor) + if(!ignore_sensors && (!C || C.sensor_mode == SUIT_SENSOR_OFF || !C.has_sensor)) continue var/turf/pos = get_turf(C) if(!istype(pos) || pos.z != z) @@ -39,15 +39,16 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new()) var/list/crewmemberData = list("dead"=0, "oxy"=-1, "tox"=-1, "fire"=-1, "brute"=-1, "area"="", "x"=-1, "y"=-1, "ref" = "\ref[H]") crewmemberData["sensor_type"] = C.sensor_mode - crewmemberData["name"] = H.get_authentification_name(if_no_id="Unknown") + // ignoring sensors means we also get their true name + crewmemberData["name"] = ignore_sensors ? H.name : H.get_authentification_name(if_no_id="Unknown") crewmemberData["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job") crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job") crewmemberData["is_command"] = (crewmemberData["assignment"] in bold_jobs) - if(C.sensor_mode >= SUIT_SENSOR_BINARY) + if(C.sensor_mode >= SUIT_SENSOR_BINARY || ignore_sensors) crewmemberData["dead"] = H.stat == DEAD - if(C.sensor_mode >= SUIT_SENSOR_VITAL) + if(C.sensor_mode >= SUIT_SENSOR_VITAL || ignore_sensors) crewmemberData["stat"] = H.stat crewmemberData["health"] = H.health crewmemberData["oxy"] = round(H.getOxyLoss(), 1) @@ -55,7 +56,7 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new()) crewmemberData["fire"] = round(H.getFireLoss(), 1) crewmemberData["brute"] = round(H.getBruteLoss(), 1) - if(C.sensor_mode >= SUIT_SENSOR_TRACKING) + if(C.sensor_mode >= SUIT_SENSOR_TRACKING || ignore_sensors) var/area/A = get_area(H) crewmemberData["area"] = sanitize_simple(A.name) crewmemberData["x"] = pos.x diff --git a/code/modules/mob/dead/observer/observer_base.dm b/code/modules/mob/dead/observer/observer_base.dm index e3de784f5c1..78185dc9e3e 100644 --- a/code/modules/mob/dead/observer/observer_base.dm +++ b/code/modules/mob/dead/observer/observer_base.dm @@ -5,6 +5,8 @@ GLOBAL_LIST_EMPTY(ghost_images) GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) +GLOBAL_DATUM_INIT(ghost_crew_monitor, /datum/ui_module/crew_monitor/ghost, new) + /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -477,6 +479,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp orbit_menu.ui_interact(src) +/mob/dead/observer/verb/crew_monitor() + set category = "Ghost" + set name = "Crew Monitor" + set desc = "Use a ghastly crew monitor that lets you follow people you select." + + GLOB.ghost_crew_monitor.ui_interact(src) + /mob/dead/observer/proc/add_observer_verbs() verbs.Add(/mob/dead/observer/proc/ManualFollow) diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index e0552ebd2f0..d57e9612da3 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -2,6 +2,8 @@ name = "Crew monitor" var/is_advanced = FALSE var/viewing_current_z_level + /// If true, we'll see everyone, regardless of their suit sensors. + var/ignore_sensors = FALSE /datum/ui_module/crew_monitor/ui_act(action, params) if(..()) @@ -17,11 +19,14 @@ switch(action) if("track") + var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.human_list if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.human_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) + if(isobserver(usr)) + var/mob/dead/observer/ghost = usr + ghost.ManualFollow(H) if("switch_level") if(!is_advanced) return @@ -53,7 +58,9 @@ data["viewing_current_z_level"] = viewing_current_z_level data["isAI"] = isAI(user) - data["crewmembers"] = GLOB.crew_repository.health_data(viewing_current_z_level) + data["isObserver"] = isobserver(user) + data["ignoreSensors"] = ignore_sensors + data["crewmembers"] = GLOB.crew_repository.health_data(viewing_current_z_level, ignore_sensors) data["critThreshold"] = HEALTH_THRESHOLD_CRIT return data @@ -62,9 +69,13 @@ var/list/data = list() data["is_advanced"] = is_advanced - data["possible_levels"] = list() for(var/z in 1 to world.maxz) data["possible_levels"] |= z return data + +/datum/ui_module/crew_monitor/ghost + name = "Crew monitor (Observer)" + is_advanced = TRUE + ignore_sensors = TRUE diff --git a/tgui/packages/tgui/interfaces/CrewMonitor.js b/tgui/packages/tgui/interfaces/CrewMonitor.js index 1fa86368924..f6b2283ba99 100644 --- a/tgui/packages/tgui/interfaces/CrewMonitor.js +++ b/tgui/packages/tgui/interfaces/CrewMonitor.js @@ -136,7 +136,7 @@ const CrewMonitorDataView = (_properties, context) => { {getStatText(cm, data.critThreshold)} - {cm.sensor_type >= 2 ? ( + {cm.sensor_type >= 2 || data.ignoreSensors ? ( {'('} @@ -159,8 +159,8 @@ const CrewMonitorDataView = (_properties, context) => { ) : null} - {cm.sensor_type === 3 ? ( - data.isAI ? ( + {cm.sensor_type === 3 || data.ignoreSensors ? ( + data.isAI || data.isObserver ? (