diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index f085bf60e04..9f3662ae8ed 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -16,8 +16,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/proc/delete()
loc = null
if(reagents)
- reagents.delete()
- return
+ qdel(reagents)
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.alpha == 0) //Handle already transparent case
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 037b2f4101f..7703be7fc73 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -37,4 +37,4 @@
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- R.delete() //GC the reagents
\ No newline at end of file
+ qdel(R)
\ No newline at end of file
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
index c5f2b3a0e7d..d130f56e32b 100644
--- a/code/modules/projectiles/firing.dm
+++ b/code/modules/projectiles/firing.dm
@@ -25,8 +25,7 @@
if(reagents && BB.reagents)
reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets
- reagents.delete()
- return
+ qdel(reagents)
/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params)
var/turf/curloc = user.loc
diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm
index dc5c861c78a..7693d241c0b 100644
--- a/code/modules/reagents/Chemistry-Goon-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm
@@ -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"
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 247958b2288..48ddea37276 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -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
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
index fba7c13d64f..05d8190e3f3 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
@@ -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 << "You're not feeling good at all! You really need some [name]."
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"
diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
index 8da693caa4b..96a1095694e 100644
--- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
@@ -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
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index b9113455466..5dc00bd72e0 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -325,7 +325,7 @@
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- R.delete()
+ qdel(R)
ejectItem(TRUE)
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src]'s chemical chamber has sprung a leak!")
@@ -337,7 +337,7 @@
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- R.delete()
+ qdel(R)
ejectItem(TRUE)
warn_admins(usr, "[chosenchem] smoke")
investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor")
@@ -424,7 +424,7 @@
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- R.delete()
+ qdel(R)
ejectItem(TRUE)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!.")
@@ -736,4 +736,4 @@
if(priority) //For truly dangerous relics that may need an admin's attention. BWOINK!
message_admins("[RelicType] relic activated by [key_name(user, user.client)](?) in ([T.x],[T.y],[T.z] - JMP)",0,1)
log_game(log_msg)
- investigate_log(log_msg, "experimentor")
\ No newline at end of file
+ investigate_log(log_msg, "experimentor")