mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-29 16:18:01 +01:00
Merge pull request #8349 from MrPerson/qdel_reagents_hopefully
Fix reagent garbage collection hopefully
This commit is contained in:
@@ -306,11 +306,10 @@ datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/amanitin/reagent_deleted(var/mob/living/M as mob)
|
||||
datum/reagent/amanitin/on_mob_delete(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.adjustToxLoss(current_cycle*rand(2,4))
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/lipolicide
|
||||
name = "Lipolicide"
|
||||
|
||||
@@ -51,6 +51,15 @@ datum/reagents/New(maximum=100)
|
||||
chemical_reactions_list[id] += D
|
||||
break // Don't bother adding ourselves to other reagent ids, it is redundant.
|
||||
|
||||
datum/reagents/Destroy()
|
||||
..()
|
||||
for(var/datum/reagent/R in reagent_list)
|
||||
qdel(R)
|
||||
reagent_list.Cut()
|
||||
reagent_list = null
|
||||
if(my_atom && my_atom.reagents == src)
|
||||
my_atom.reagents = null
|
||||
|
||||
datum/reagents/proc/remove_any(var/amount=1)
|
||||
var/total_transfered = 0
|
||||
var/current_list_element = 1
|
||||
@@ -356,22 +365,18 @@ datum/reagents/proc/isolate_reagent(var/reagent)
|
||||
update_total()
|
||||
|
||||
datum/reagents/proc/del_reagent(var/reagent)
|
||||
for(var/A in reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
for(var/datum/reagent/R in reagent_list)
|
||||
if (R.id == reagent)
|
||||
if(istype(my_atom, /mob/living))
|
||||
var/mob/living/M = my_atom
|
||||
R.reagent_deleted(M)
|
||||
reagent_list -= A
|
||||
del(A)
|
||||
R.on_mob_delete(M)
|
||||
qdel(R)
|
||||
reagent_list -= R
|
||||
update_total()
|
||||
my_atom.on_reagent_change()
|
||||
check_ignoreslow(my_atom)
|
||||
check_gofast(my_atom)
|
||||
check_goreallyfast(my_atom)
|
||||
return 0
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
datum/reagents/proc/check_ignoreslow(var/mob/M)
|
||||
@@ -535,12 +540,6 @@ datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0
|
||||
|
||||
return has_removed_reagent
|
||||
|
||||
datum/reagents/proc/delete()
|
||||
for(var/datum/reagent/R in reagent_list)
|
||||
R.holder = null
|
||||
if(my_atom)
|
||||
my_atom.reagents = null
|
||||
|
||||
//two helper functions to preserve data across reactions (needed for xenoarch)
|
||||
datum/reagents/proc/get_data(var/reagent_id)
|
||||
for(var/datum/reagent/D in reagent_list)
|
||||
@@ -581,6 +580,6 @@ datum/reagents/proc/copy_data(var/datum/reagent/current_reagent)
|
||||
// Max vol is maximum volume of holder
|
||||
atom/proc/create_reagents(var/max_vol)
|
||||
if(reagents)
|
||||
reagents.delete()
|
||||
qdel(reagents)
|
||||
reagents = new/datum/reagents(max_vol)
|
||||
reagents.my_atom = src
|
||||
|
||||
@@ -21,8 +21,7 @@ datum/reagent
|
||||
var/list/data
|
||||
var/current_cycle = 0
|
||||
var/volume = 0
|
||||
//var/list/viruses = list()
|
||||
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
|
||||
var/color = "#000000" // rgb: 0, 0, 0
|
||||
var/can_synth = 1
|
||||
var/metabolization_rate = REAGENTS_METABOLISM
|
||||
var/overrides_metab = 0
|
||||
@@ -30,6 +29,11 @@ datum/reagent
|
||||
var/addiction_threshold = 0
|
||||
var/addiction_stage = 0
|
||||
var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
|
||||
|
||||
datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
|
||||
..()
|
||||
holder = null
|
||||
|
||||
datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some
|
||||
if(!istype(M, /mob/living))
|
||||
return 0
|
||||
@@ -80,6 +84,10 @@ datum/reagent/proc/on_mob_life(var/mob/living/M as mob)
|
||||
holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
|
||||
return
|
||||
|
||||
// Called when this reagent is removed while inside a mob
|
||||
datum/reagent/proc/on_mob_delete(mob/M)
|
||||
return
|
||||
|
||||
datum/reagent/proc/on_move(var/mob/M)
|
||||
return
|
||||
|
||||
@@ -121,9 +129,6 @@ datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
|
||||
M << "<span class = 'boldannounce'>You're not feeling good at all! You really need some [name].</span>"
|
||||
return
|
||||
|
||||
/datum/reagent/proc/reagent_deleted()
|
||||
return
|
||||
|
||||
datum/reagent/blood
|
||||
data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
|
||||
name = "Blood"
|
||||
@@ -212,14 +217,6 @@ datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the
|
||||
newVirus.holder = blood_prop
|
||||
return
|
||||
|
||||
/* Must check the transfering of reagents and their data first. They all can point to one disease datum.
|
||||
|
||||
Del()
|
||||
if(src.data["virus"])
|
||||
var/datum/disease/D = src.data["virus"]
|
||||
D.cure(0)
|
||||
..()
|
||||
*/
|
||||
datum/reagent/vaccine
|
||||
//data must contain virus type
|
||||
name = "Vaccine"
|
||||
|
||||
@@ -158,10 +158,8 @@ datum/reagent/toxin/zombiepowder/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/toxin/zombiepowder/Del()
|
||||
if(holder && ismob(holder.my_atom))
|
||||
var/mob/M = holder.my_atom
|
||||
M.status_flags &= ~FAKEDEATH
|
||||
datum/reagent/toxin/zombiepowder/on_mob_delete(mob/M)
|
||||
M.status_flags &= ~FAKEDEATH
|
||||
..()
|
||||
|
||||
datum/reagent/toxin/mindbreaker
|
||||
|
||||
Reference in New Issue
Block a user