diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index 366c68afc0a..07caea0f3ad 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -1,6 +1,6 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() -/datum/repository/air_alarm/proc/air_alarm_data(var/list/monitored_alarms) +/datum/repository/air_alarm/proc/air_alarm_data(var/list/monitored_alarms, var/refresh = 0, var/obj/machinery/alarm/passed_alarm) var/alarms[0] var/datum/cache_entry/cache_entry = cache_data @@ -8,15 +8,20 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() cache_entry = new/datum/cache_entry cache_data = cache_entry - if(world.time < cache_entry.timestamp) + if(!refresh) 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() + if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time + alarms[++alarms.len] = passed_alarm.get_nano_data_console() + else + for(var/obj/machinery/alarm/alarm in sortAtom((monitored_alarms ? monitored_alarms : machines))) + if(!monitored_alarms && 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.timestamp = world.time //+ 10 SECONDS cache_entry.data = alarms return alarms +/datum/repository/air_alarm/proc/update_cache(var/obj/machinery/alarm/alarm) + return air_alarm_data(refresh = 1, passed_alarm = alarm) \ No newline at end of file diff --git a/code/datums/cache/powermonitor.dm b/code/datums/cache/powermonitor.dm index 6ba79d2f78e..a99b380a13d 100644 --- a/code/datums/cache/powermonitor.dm +++ b/code/datums/cache/powermonitor.dm @@ -10,8 +10,8 @@ var/global/datum/repository/powermonitor/powermonitor_repository = new() if(!refresh) return cache_entry.data - - for(var/obj/machinery/computer/monitor/pMon in world) + + for(var/obj/machinery/computer/monitor/pMon in machines) if( !(pMon.stat & (NOPOWER|BROKEN)) ) pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]") @@ -20,5 +20,5 @@ var/global/datum/repository/powermonitor/powermonitor_repository = new() return pMonData /datum/repository/powermonitor/proc/update_cache() - return powermonitor_data(1) + return powermonitor_data(refresh = 1) \ No newline at end of file diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 1a9dcca511e..7dafb778e7a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -66,8 +66,10 @@ atmosalm = danger_level for (var/obj/machinery/alarm/AA in src) AA.update_icon() - + + air_alarm_repository.update_cache(src) return 1 + air_alarm_repository.update_cache(src) return 0 /area/proc/air_doors_close() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index b9abe4e1c1d..45429353bfc 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -204,6 +204,10 @@ /obj/machinery/alarm/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) + + if (src in machines) // So the cache can properly update + removeAtProcessing() + air_alarm_repository.update_cache(src) return ..() /obj/machinery/alarm/proc/first_run() @@ -212,6 +216,7 @@ if (name == "alarm") name = "[alarm_area.name] Air Alarm" apply_preset(1) // Don't cycle. + air_alarm_repository.update_cache(src) /obj/machinery/alarm/initialize() set_frequency(frequency) diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 138f6b324b9..50a37483526 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -12,15 +12,21 @@ var/datum/nano_module/power_monitor/power_monitor /obj/machinery/computer/monitor/New() + ..() power_monitor = new(src) powernet = find_powernet() powermonitor_repository.update_cache() - ..() /obj/machinery/computer/monitor/Destroy() + if (src in machines) // So the cache can properly update + removeAtProcessing() powermonitor_repository.update_cache() return ..() +/obj/machinery/computer/monitor/power_change() + ..() + powermonitor_repository.update_cache() + /obj/machinery/computer/monitor/process() if(!powernet) powernet = find_powernet() diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index d71852ddc68..4b69fd2dd6d 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -285,7 +285,7 @@ if(mode==43 || mode==433) values["powermonitors"] = powermonitor_repository.powermonitor_data() - if (!isnull(powmonitor.powernet)) + if (powmonitor && !isnull(powmonitor.powernet)) values["powerconnected"] = 1 values["poweravail"] = powmonitor.powernet.avail values["powerload"] = num2text(powmonitor.powernet.viewload,10) diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index 9171ea747ce..1bcf9bc2176 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -20,6 +20,9 @@ data["powermonitors"] = powermonitor_repository.powermonitor_data() if (powermonitor && !isnull(powermonitor.powernet)) + if(select_monitor && (powermonitor.stat & (NOPOWER|BROKEN))) + powermonitor = null + return data["poweravail"] = powermonitor.powernet.avail data["powerload"] = num2text(powermonitor.powernet.viewload,10) data["apcs"] = apc_repository.apc_data(powermonitor)