From 99850e9e50dba04b97518924fc88d5e8d22a037e Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 19:54:38 +0200 Subject: [PATCH] Fixes crash in Join as Freed Mob if some had been deleted (#4678) # About the pull request Improper usage of weakrefs in ghost freed code resulted in them not being cleared on deletion + the Join as Freed Mob verb to crash if such an entry was still present. Because /mob/Destroy already clears the hard reference, there is no actual reason to use weak references at all, so i just removed all of them. # Explain why it's good for the game Feature must work! # Testing Photographs and Procedure Customary testing that Freed Mobs joining still works after fix. # Changelog :cl: fix: Fixed 'Join as Freed Mob' verb crashing if freed mobs had previously been deleted. /:cl: --- code/game/machinery/cryopod.dm | 2 +- code/modules/admin/verbs/freeforghosts.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 16 ++++++---------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index eb9aed4f71e4..86bb5f79a035 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li //Lifted from Unity stasis.dm and refactored. ~Zuhayr /obj/structure/machinery/cryopod/process() - if(occupant && !(WEAKREF(occupant) in GLOB.freed_mob_list)) //ignore freed mobs + if(occupant && !(occupant in GLOB.freed_mob_list)) //ignore freed mobs //if occupant ghosted, time till despawn is severely shorter if(!occupant.key && time_till_despawn == 10 MINUTES) time_till_despawn -= 8 MINUTES diff --git a/code/modules/admin/verbs/freeforghosts.dm b/code/modules/admin/verbs/freeforghosts.dm index 24c261ee18f3..4bf5549f30f0 100644 --- a/code/modules/admin/verbs/freeforghosts.dm +++ b/code/modules/admin/verbs/freeforghosts.dm @@ -20,7 +20,7 @@ if(mind || client) ghostize(FALSE) - GLOB.freed_mob_list |= WEAKREF(src) + GLOB.freed_mob_list |= src if(!notify) return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 130a8a923edc..4d06d1e07142 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1012,13 +1012,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return var/list/mobs_by_role = list() // the list the mobs are assigned to first, for sorting purposes - for(var/datum/weakref/ref as anything in GLOB.freed_mob_list) - var/mob/living/resolved_mob = ref.resolve() - var/role_name = resolved_mob.get_role_name() + for(var/mob/freed_mob as anything in GLOB.freed_mob_list) + var/role_name = freed_mob.get_role_name() if(!role_name) role_name = "No Role" LAZYINITLIST(mobs_by_role[role_name]) - mobs_by_role[role_name] += resolved_mob + mobs_by_role[role_name] += freed_mob var/list/freed_mob_choices = list() // the list we'll be choosing from for(var/role in mobs_by_role) @@ -1034,18 +1033,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp handle_joining_as_freed_mob(L) /mob/dead/proc/handle_joining_as_freed_mob(mob/living/freed_mob) - if(!freed_mob || !(WEAKREF(freed_mob) in GLOB.freed_mob_list)) - return - - if(!istype(freed_mob)) + if(!istype(freed_mob) || !(freed_mob in GLOB.freed_mob_list)) return if(QDELETED(freed_mob) || freed_mob.client) - GLOB.freed_mob_list -= WEAKREF(freed_mob) + GLOB.freed_mob_list -= freed_mob to_chat(src, SPAN_WARNING("Something went wrong.")) return - GLOB.freed_mob_list -= WEAKREF(freed_mob) + GLOB.freed_mob_list -= freed_mob mind.transfer_to(freed_mob, TRUE) /mob/dead/verb/join_as_hellhound()