diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 34e4ffdad4f..f7d26392a47 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -19,6 +19,7 @@ reagents.handle_stasis_chems(src, delta_time, times_fired) else //Reagent processing needs to come before breathing, to prevent edge cases. + handle_dead_metabolization(delta_time, times_fired) //Dead metabolization first since it can modify life metabolization. handle_organs(delta_time, times_fired) . = ..() @@ -560,6 +561,19 @@ if(HM?.timeout) dna.remove_mutation(HM.type) +/** + * Handles calling metabolization for dead people. + * Due to how reagent metabolization code works this couldn't be done anywhere else. + * + * Arguments: + * - delta_time: The amount of time that has elapsed since the last tick. + * - times_fired: The number of times SSmobs has ticked. + */ +/mob/living/carbon/proc/handle_dead_metabolization(delta_time, times_fired) + if (stat != DEAD) + return + reagents.metabolize(src, delta_time, times_fired, can_overdose = TRUE, liverless = TRUE, dead = TRUE) // Your liver doesn't work while you're dead. + /// Base carbon environment handler, adds natural stabilization /mob/living/carbon/handle_environment(datum/gas_mixture/environment, delta_time, times_fired) var/areatemp = get_temperature(environment) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 3287534b66a..9fa7a07b2ea 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -708,7 +708,7 @@ * * can_overdose - Allows overdosing * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing */ -/datum/reagents/proc/metabolize(mob/living/carbon/owner, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE) +/datum/reagents/proc/metabolize(mob/living/carbon/owner, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE, dead = FALSE) var/list/cached_reagents = reagent_list if(owner) expose_temperature(owner.bodytemperature, 0.25) @@ -723,7 +723,7 @@ for(var/datum/reagent/reagent as anything in cached_reagents) // skip metabolizing effects for small units of toxins - if(istype(reagent, /datum/reagent/toxin) && liver) + if(istype(reagent, /datum/reagent/toxin) && liver && !dead) var/datum/reagent/toxin/toxin = reagent var/amount = round(toxin.volume, CHEMICAL_QUANTISATION_LEVEL) if(belly) @@ -733,7 +733,7 @@ owner.reagents.remove_reagent(toxin.type, toxin.metabolization_rate * owner.metabolism_efficiency * delta_time) continue - need_mob_update += metabolize_reagent(owner, reagent, delta_time, times_fired, can_overdose, liverless) + need_mob_update += metabolize_reagent(owner, reagent, delta_time, times_fired, can_overdose, liverless, dead) if(owner && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. owner.updatehealth() @@ -749,7 +749,7 @@ * * can_overdose - Allows overdosing * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing */ -/datum/reagents/proc/metabolize_reagent(mob/living/carbon/owner, datum/reagent/reagent, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE) +/datum/reagents/proc/metabolize_reagent(mob/living/carbon/owner, datum/reagent/reagent, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE, dead = FALSE) var/need_mob_update = FALSE if(QDELETED(reagent.holder)) return FALSE @@ -781,7 +781,7 @@ return //SKYRAT EDIT ADDITION END - if(owner && reagent) + if(owner && reagent && (!dead || (reagent.chemical_flags & REAGENT_DEAD_PROCESS))) if(owner.reagent_check(reagent, delta_time, times_fired)) return if(liverless && !reagent.self_consuming) //need to be metabolized @@ -800,8 +800,10 @@ if(reagent.overdosed) need_mob_update += reagent.overdose_process(owner, delta_time, times_fired) - - need_mob_update += reagent.on_mob_life(owner, delta_time, times_fired) + if(!dead) + need_mob_update += reagent.on_mob_life(owner, delta_time, times_fired) + if(dead) + need_mob_update += reagent.on_mob_dead(owner, delta_time) return need_mob_update /// Signals that metabolization has stopped, triggering the end of trait-based effects diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 50562c28b35..ad71451dafb 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -198,20 +198,6 @@ if(4 * LIVER_FAILURE_STAGE_SECONDS to INFINITY) examine_list += span_danger("[owner]'s eyes are completely yellow and swelling with pus. [owner.p_they(TRUE)] [owner.p_do()]n't look like [owner.p_they()] will be alive for much longer.") -/obj/item/organ/internal/liver/on_death(delta_time, times_fired) - . = ..() - var/mob/living/carbon/carbon_owner = owner - if(!owner)//If we're outside of a mob - return - if(!iscarbon(carbon_owner)) - CRASH("on_death() called for [src] ([type]) with invalid owner ([isnull(owner) ? "null" : owner.type])") - if(carbon_owner.stat != DEAD) - CRASH("on_death() called for [src] ([type]) with not-dead owner ([owner])") - if((organ_flags & ORGAN_FAILING) && HAS_TRAIT(carbon_owner, TRAIT_NOMETABOLISM))//can't process reagents with a failing liver - return - for(var/datum/reagent/chem as anything in carbon_owner.reagents.reagent_list) - chem.on_mob_dead(carbon_owner, delta_time) - /obj/item/organ/internal/liver/get_availability(datum/species/owner_species, mob/living/owner_mob) return owner_species.mutantliver