mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 08:37:43 +01:00
[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:
co-authored by
RikuTheKiller
Zonespace
parent
2177412038
commit
bd02e180c1
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user