mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Creates a central repository for crew data. This repository only updates data as necessary and only every 5th second, no matter how many times it is requested. Reduces any lag caused by having multiple crew monitor windows open and as a bonus gives antags a larger window of opportunity for disabling sensors before detection of harm.
75 lines
2.4 KiB
Plaintext
75 lines
2.4 KiB
Plaintext
var/global/datum/repository/crew/crew_repository = new()
|
|
|
|
/datum/cache_entry
|
|
var/timestamp
|
|
var/data
|
|
|
|
/datum/repository/crew
|
|
var/list/cache_data
|
|
|
|
/datum/repository/crew/New()
|
|
cache_data = list()
|
|
..()
|
|
|
|
/datum/repository/crew/proc/health_data(var/turf/T)
|
|
var/list/crewmembers = list()
|
|
if(!T)
|
|
return crewmembers
|
|
|
|
var/z_level = "[T.z]"
|
|
var/datum/cache_entry/cache_entry = cache_data[z_level]
|
|
if(!cache_entry)
|
|
cache_entry = new/datum/cache_entry
|
|
cache_data[z_level] = cache_entry
|
|
|
|
if(world.time < cache_entry.timestamp)
|
|
return cache_entry.data
|
|
|
|
var/tracked = scan()
|
|
for(var/obj/item/clothing/under/C in tracked)
|
|
var/turf/pos = get_turf(C)
|
|
if((C) && (C.has_sensor) && (pos) && (T && pos.z == T.z) && (C.sensor_mode != SUIT_SENSOR_OFF))
|
|
if(istype(C.loc, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = C.loc
|
|
if(H.w_uniform != C)
|
|
continue
|
|
|
|
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")
|
|
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")
|
|
|
|
if(C.sensor_mode >= SUIT_SENSOR_BINARY)
|
|
crewmemberData["dead"] = H.stat > UNCONSCIOUS
|
|
|
|
if(C.sensor_mode >= SUIT_SENSOR_VITAL)
|
|
crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
|
|
crewmemberData["tox"] = round(H.getToxLoss(), 1)
|
|
crewmemberData["fire"] = round(H.getFireLoss(), 1)
|
|
crewmemberData["brute"] = round(H.getBruteLoss(), 1)
|
|
|
|
if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
|
|
var/area/A = get_area(H)
|
|
crewmemberData["area"] = sanitize(A.name)
|
|
crewmemberData["x"] = pos.x
|
|
crewmemberData["y"] = pos.y
|
|
|
|
crewmembers[++crewmembers.len] = crewmemberData
|
|
|
|
crewmembers = sortByKey(crewmembers, "name")
|
|
cache_entry.timestamp = world.time + 5 SECONDS
|
|
cache_entry.data = crewmembers
|
|
|
|
return crewmembers
|
|
|
|
/datum/repository/crew/proc/scan()
|
|
var/list/tracked = list()
|
|
for(var/mob/living/carbon/human/H in mob_list)
|
|
if(istype(H.w_uniform, /obj/item/clothing/under))
|
|
var/obj/item/clothing/under/C = H.w_uniform
|
|
if (C.has_sensor)
|
|
tracked |= C
|
|
return tracked
|