diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm new file mode 100644 index 00000000000..366c68afc0a --- /dev/null +++ b/code/datums/cache/air_alarm.dm @@ -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 + diff --git a/code/datums/cache/apc.dm b/code/datums/cache/apc.dm new file mode 100644 index 00000000000..e6dc996827b --- /dev/null +++ b/code/datums/cache/apc.dm @@ -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 \ No newline at end of file diff --git a/code/datums/cache/cache.dm b/code/datums/cache/cache.dm new file mode 100644 index 00000000000..2502bb871b2 --- /dev/null +++ b/code/datums/cache/cache.dm @@ -0,0 +1,6 @@ +/datum/cache_entry + var/timestamp + var/data + +/datum/repository + var/cache_data \ No newline at end of file diff --git a/code/datums/crew.dm b/code/datums/cache/crew.dm similarity index 96% rename from code/datums/crew.dm rename to code/datums/cache/crew.dm index d398ef5d4e4..0afb70a4404 100644 --- a/code/datums/crew.dm +++ b/code/datums/cache/crew.dm @@ -1,12 +1,5 @@ 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() ..() diff --git a/code/datums/cache/powermonitor.dm b/code/datums/cache/powermonitor.dm new file mode 100644 index 00000000000..6ba79d2f78e --- /dev/null +++ b/code/datums/cache/powermonitor.dm @@ -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) + \ No newline at end of file diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index b37437e7c22..138f6b324b9 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -14,9 +14,13 @@ /obj/machinery/computer/monitor/New() power_monitor = new(src) powernet = find_powernet() - + powermonitor_repository.update_cache() ..() +/obj/machinery/computer/monitor/Destroy() + powermonitor_repository.update_cache() + return ..() + /obj/machinery/computer/monitor/process() if(!powernet) powernet = find_powernet() diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm index 1c5f3c9a932..5a12c4db8a3 100644 --- a/code/modules/nano/modules/atmos_control.dm +++ b/code/modules/nano/modules/atmos_control.dm @@ -31,14 +31,7 @@ /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/data[0] - var/alarms[0] - - // TODO: Move these to a cache, similar to cameras - 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() - data["alarms"] = alarms + data["alarms"] = air_alarm_repository.air_alarm_data(monitored_alarms) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index af5f12fbba8..9171ea747ce 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -13,34 +13,17 @@ /datum/nano_module/power_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/data[0] - var/pMonData[0] - var/apcData[0] data["powermonitor"] = powermonitor if(select_monitor) data["select_monitor"] = 1 - for(var/obj/machinery/computer/monitor/pMon in world) - if( !(pMon.stat & (NOPOWER|BROKEN)) ) - pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]") + data["powermonitors"] = powermonitor_repository.powermonitor_data() - data["powermonitors"] = pMonData - - if (powermonitor && !isnull(powermonitor.powernet)) + if (powermonitor && !isnull(powermonitor.powernet)) data["poweravail"] = powermonitor.powernet.avail - data["powerload"] = num2text(powermonitor.powernet.viewload,10) - 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: nope, 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) - - data["apcs"] = apcData - + data["powerload"] = num2text(powermonitor.powernet.viewload,10) + data["apcs"] = apc_repository.apc_data(powermonitor) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 700, state = state) diff --git a/paradise.dme b/paradise.dme index 24288a7e640..83d16e64888 100644 --- a/paradise.dme +++ b/paradise.dme @@ -174,7 +174,6 @@ #include "code\datums\browser.dm" #include "code\datums\cargoprofile.dm" #include "code\datums\computerfiles.dm" -#include "code\datums\crew.dm" #include "code\datums\datacore.dm" #include "code\datums\datumvars.dm" #include "code\datums\gas_mixture.dm" @@ -188,6 +187,11 @@ #include "code\datums\spell.dm" #include "code\datums\supplypacks.dm" #include "code\datums\uplink_item.dm" +#include "code\datums\cache\air_alarm.dm" +#include "code\datums\cache\apc.dm" +#include "code\datums\cache\cache.dm" +#include "code\datums\cache\crew.dm" +#include "code\datums\cache\powermonitor.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\global_iterator.dm"