Add caching to air alarms, apcs and power monitoring computers

This commit is contained in:
Markolie
2015-08-11 15:56:37 +02:00
parent 09fc2bc54f
commit ebdfeae887
9 changed files with 96 additions and 39 deletions
+22
View File
@@ -0,0 +1,22 @@
var/global/datum/repository/air_alarm/air_alarm_repository = new()
/datum/repository/air_alarm/proc/air_alarm_data(var/list/monitored_alarms)
var/alarms[0]
var/datum/cache_entry/cache_entry = cache_data
if(!cache_entry)
cache_entry = new/datum/cache_entry
cache_data = cache_entry
if(world.time < cache_entry.timestamp)
return cache_entry.data
for(var/obj/machinery/alarm/alarm in sortAtom((monitored_alarms.len ? monitored_alarms : machines)))
if(!monitored_alarms.len && alarm.z != ZLEVEL_STATION && alarm.z != ZLEVEL_ASTEROID)
continue
alarms[++alarms.len] = alarm.get_nano_data_console()
cache_entry.timestamp = world.time + 10 SECONDS
cache_entry.data = alarms
return alarms
+28
View File
@@ -0,0 +1,28 @@
var/global/datum/repository/apc/apc_repository = new()
/datum/repository/apc/proc/apc_data(var/obj/machinery/computer/monitor/powermonitor)
var/apcData[0]
var/datum/cache_entry/cache_entry = cache_data
if(!cache_entry)
cache_entry = new/datum/cache_entry
cache_data = cache_entry
if(world.time < cache_entry.timestamp)
return cache_entry.data
if (powermonitor && !isnull(powermonitor.powernet))
var/list/L = list()
for(var/obj/machinery/power/terminal/term in powermonitor.powernet.nodes)
if(istype(term.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = term.master
L += A
var/list/Status = list(0,0,1,1) // Status: off, auto-off, on, auto-on
var/list/chg = list(0,1,1) // Charging: no, charging, full
for(var/obj/machinery/power/apc/A in L)
apcData[++apcData.len] = list("Name" = html_encode(A.area.name), "Equipment" = Status[A.equipment+1], "Lights" = Status[A.lighting+1], "Environment" = Status[A.environ+1], "CellPct" = A.cell ? round(A.cell.percent(),1) : -1, "CellStatus" = A.cell ? chg[A.charging+1] : 0)
cache_entry.timestamp = world.time + 5 SECONDS
cache_entry.data = apcData
return apcData
+6
View File
@@ -0,0 +1,6 @@
/datum/cache_entry
var/timestamp
var/data
/datum/repository
var/cache_data
+67
View File
@@ -0,0 +1,67 @@
var/global/datum/repository/crew/crew_repository = new()
/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
+24
View File
@@ -0,0 +1,24 @@
var/global/datum/repository/powermonitor/powermonitor_repository = new()
/datum/repository/powermonitor/proc/powermonitor_data(var/refresh = 0)
var/pMonData[0]
var/datum/cache_entry/cache_entry = cache_data
if(!cache_entry)
cache_entry = new/datum/cache_entry
cache_data = cache_entry
if(!refresh)
return cache_entry.data
for(var/obj/machinery/computer/monitor/pMon in world)
if( !(pMon.stat & (NOPOWER|BROKEN)) )
pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]")
cache_entry.timestamp = world.time //+ 30 SECONDS
cache_entry.data = pMonData
return pMonData
/datum/repository/powermonitor/proc/update_cache()
return powermonitor_data(1)