[MIRROR] Adds keyloop to the autoclearing ss, cleans up ssambience a bit (#8330)

* Adds keyloop to the autoclearing ss, cleans up ssambience a bit

* Update ambience.dm

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Gandalf <jzo123@hotmail.com>
This commit is contained in:
SkyratBot
2021-09-23 02:37:59 +01:00
committed by GitHub
co-authored by LemonInTheDark Gandalf
parent da3076fa46
commit e6a5103f0b
3 changed files with 58 additions and 42 deletions
+26 -25
View File
@@ -8,6 +8,10 @@ SUBSYSTEM_DEF(server_maint)
init_order = INIT_ORDER_SERVER_MAINT
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/list/currentrun
///Associated list of list names to lists to clear of nulls
var/list/lists_to_clear
///Delay between list clearings in ticks
var/delay = 5
var/cleanup_ticker = 0
/datum/controller/subsystem/server_maint/PreInit()
@@ -16,6 +20,16 @@ SUBSYSTEM_DEF(server_maint)
/datum/controller/subsystem/server_maint/Initialize(timeofday)
if (CONFIG_GET(flag/hub))
world.update_hub_visibility(TRUE)
//Keep in mind, because of how delay works adding a list here makes each list take wait * delay more time to clear
//Do it for stuff that's properly important, and shouldn't have null checks inside its other uses
lists_to_clear = list(
"player_list" = GLOB.player_list,
"mob_list" = GLOB.mob_list,
"alive_mob_list" = GLOB.alive_mob_list,
"suicided_mob_list" = GLOB.suicided_mob_list,
"dead_mob_list" = GLOB.dead_mob_list,
"keyloop_list" = GLOB.keyloop_list, //A null here will cause new clients to be unable to move. totally unacceptable
)
return ..()
/datum/controller/subsystem/server_maint/fire(resumed = FALSE)
@@ -24,31 +38,18 @@ SUBSYSTEM_DEF(server_maint)
log_world("Found a null in clients list!")
src.currentrun = GLOB.clients.Copy()
switch (cleanup_ticker) // do only one of these at a time, once per 5 fires
if (0)
if(listclearnulls(GLOB.player_list))
log_world("Found a null in player_list!")
cleanup_ticker++
if (5)
if(listclearnulls(GLOB.mob_list))
log_world("Found a null in mob_list!")
cleanup_ticker++
if (10)
if(listclearnulls(GLOB.alive_mob_list))
log_world("Found a null in alive_mob_list!")
cleanup_ticker++
if (15)
if(listclearnulls(GLOB.suicided_mob_list))
log_world("Found a null in suicided_mob_list!")
cleanup_ticker++
if (20)
if(listclearnulls(GLOB.dead_mob_list))
log_world("Found a null in dead_mob_list!")
cleanup_ticker++
if (25)
cleanup_ticker = 0
else
cleanup_ticker++
var/position_in_loop = (cleanup_ticker / delay) + 1 //Index at 1, thanks byond
if(!(position_in_loop % 1)) //If it's a whole number
var/listname = lists_to_clear[position_in_loop]
if(listclearnulls(lists_to_clear[listname]))
log_world("Found a null in [listname]!")
cleanup_ticker++
var/amount_to_work = length(lists_to_clear)
if(cleanup_ticker >= amount_to_work * delay) //If we've already done a loop, reset
cleanup_ticker = 0
var/list/currentrun = src.currentrun
var/round_started = SSticker.HasRoundStarted()