From 60647dc4c03764ee5e2ead239c764e342a3badc0 Mon Sep 17 00:00:00 2001 From: Farie82 Date: Mon, 13 Dec 2021 09:22:08 +0100 Subject: [PATCH] Makes playable mobs GC better by reworking how GLOB.respawnable_list works (#17217) --- code/modules/events/alien_infestation.dm | 2 +- code/modules/events/traders.dm | 2 +- code/modules/mob/dead/observer/login.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 4 ++-- code/modules/mob/living/carbon/brain/MMI.dm | 4 ++-- code/modules/mob/living/death.dm | 2 +- code/modules/mob/living/stat_states.dm | 2 +- code/modules/mob/mob.dm | 16 ++++++++++------ code/modules/mob/new_player/new_player.dm | 2 +- code/modules/tgui/modules/ghost_hud_panel.dm | 2 +- 10 files changed, 21 insertions(+), 17 deletions(-) diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index eac29d2a877..cc731783d03 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -27,7 +27,7 @@ var/obj/vent = pick_n_take(vents) var/mob/C = pick_n_take(candidates) if(C) - GLOB.respawnable_list -= C.client + C.remove_from_respawnable_list() var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) new_xeno.amount_grown += (0.75 * new_xeno.max_grown) //event spawned larva start off almost ready to evolve. new_xeno.key = C.key diff --git a/code/modules/events/traders.dm b/code/modules/events/traders.dm index 1dfc52d1f5b..cd522243b5e 100644 --- a/code/modules/events/traders.dm +++ b/code/modules/events/traders.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol")) var/mob/C = pick_n_take(candidates) spawn_count-- if(C) - GLOB.respawnable_list -= C.client + C.remove_from_respawnable_list() var/mob/living/carbon/human/M = new /mob/living/carbon/human(picked_loc) M.ckey = C.ckey // must be before equipOutfit, or that will runtime due to lack of mind M.equipOutfit(/datum/outfit/admin/sol_trader) diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index 76f2ff9dbd0..73e938e14fe 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -6,4 +6,4 @@ if(GLOB.non_respawnable_keys[ckey]) can_reenter_corpse = 0 - GLOB.respawnable_list -= src + remove_from_respawnable_list() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4c2a7a604aa..d45fb2a2f6f 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -164,9 +164,9 @@ Works together with spawning an observer, noted above. flags &= ~GHOST_CAN_REENTER var/mob/dead/observer/ghost = new(src, flags) //Transfer safety to observer spawning proc. ghost.timeofdeath = src.timeofdeath //BS12 EDIT - GLOB.respawnable_list -= src + remove_from_respawnable_list() if(ghost.can_reenter_corpse) - GLOB.respawnable_list += ghost + ghost.add_to_respawnable_list() else GLOB.non_respawnable_keys[ckey] = 1 ghost.key = key diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 429e9b7864d..2a0223762a2 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -51,7 +51,7 @@ brainmob.forceMove(src) brainmob.stat = CONSCIOUS brainmob.see_invisible = initial(brainmob.see_invisible) - GLOB.respawnable_list -= brainmob + brainmob.remove_from_respawnable_list() GLOB.dead_mob_list -= brainmob//Update dem lists GLOB.alive_mob_list += brainmob @@ -161,7 +161,7 @@ brainmob.container = null//Reset brainmob mmi var. brainmob.forceMove(held_brain) //Throw mob into brain. - GLOB.respawnable_list += brainmob + brainmob.add_to_respawnable_list() GLOB.alive_mob_list -= brainmob//Get outta here held_brain.brainmob = brainmob//Set the brain to use the brainmob held_brain.brainmob.cancel_camera() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 65589260d66..d580fdcaa5f 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -85,7 +85,7 @@ GLOB.dead_mob_list += src if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0) - GLOB.respawnable_list += src + add_to_respawnable_list() if(mind.name && !isbrain(src)) // !isbrain() is to stop it from being called twice var/turf/T = get_turf(src) diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm index ad583d0ec76..a654e3c8c6d 100644 --- a/code/modules/mob/living/stat_states.dm +++ b/code/modules/mob/living/stat_states.dm @@ -54,7 +54,7 @@ GLOB.dead_mob_list -= src GLOB.alive_mob_list += src if(mind) - GLOB.respawnable_list -= src + remove_from_respawnable_list() timeofdeath = null if(updating) update_canmove() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3448ea52462..c1c983b191d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1095,6 +1095,14 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ /mob/proc/activate_hand(selhand) return +/mob/proc/add_to_respawnable_list() + GLOB.respawnable_list += src + RegisterSignal(src, COMSIG_PARENT_QDELETING, .proc/remove_from_respawnable_list) + +/mob/proc/remove_from_respawnable_list() + GLOB.respawnable_list -= src + UnregisterSignal(src, COMSIG_PARENT_QDELETING) + /mob/dead/observer/verb/respawn() set name = "Respawn as NPC" set category = "Ghost" @@ -1115,17 +1123,13 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ var/picked = input("Please select an NPC to respawn as", "Respawn as NPC") as null|anything in creatures switch(picked) if("Mouse") - GLOB.respawnable_list -= usr + remove_from_respawnable_list() become_mouse() - spawn(5) - GLOB.respawnable_list += usr else var/mob/living/NPC = picked if(istype(NPC) && !NPC.key) - GLOB.respawnable_list -= usr + remove_from_respawnable_list() NPC.key = key - spawn(5) - GLOB.respawnable_list += usr else to_chat(usr, "You are not dead or you have given up your right to be respawned!") return diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index fe524ea5851..1858a9c9024 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -194,7 +194,7 @@ observer.name = observer.real_name observer.key = key QDEL_NULL(mind) - GLOB.respawnable_list += observer + observer.add_to_respawnable_list() qdel(src) return TRUE return FALSE diff --git a/code/modules/tgui/modules/ghost_hud_panel.dm b/code/modules/tgui/modules/ghost_hud_panel.dm index 456df088827..8ce39eb12dd 100644 --- a/code/modules/tgui/modules/ghost_hud_panel.dm +++ b/code/modules/tgui/modules/ghost_hud_panel.dm @@ -69,7 +69,7 @@ GLOBAL_DATUM_INIT(ghost_hud_panel, /datum/ui_module/ghost_hud_panel, new) ghost.has_enabled_antagHUD = TRUE ghost.can_reenter_corpse = FALSE - GLOB.respawnable_list -= ghost + ghost.remove_from_respawnable_list() ghost.antagHUD = TRUE for(var/datum/atom_hud/antag/H in GLOB.huds)