[MIRROR] Makes dead metabolization work properly [MDB IGNORE] (#19598)

* Makes dead metabolization work properly

* Update holder.dm

---------

Co-authored-by: RikuTheKiller <88713943+RikuTheKiller@users.noreply.github.com>
Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com>
This commit is contained in:
SkyratBot
2023-03-03 08:24:14 -08:00
committed by GitHub
co-authored by RikuTheKiller Zonespace
parent 2177412038
commit bd02e180c1
3 changed files with 23 additions and 21 deletions
+14
View File
@@ -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)
+9 -7
View File
@@ -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
-14
View File
@@ -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