Milk hard dels, snacks hard dels, ghosts hard dels (#37655)

* More hard dels tracking

* Ghost hard del 2

* Revert "More hard dels tracking"

This reverts commit 2b357a7d92.

* The great reagent goose chase of 2025

* Hitler

* On PEUT le fairegit add code/*

* better fix
This commit is contained in:
ShiftyRail
2025-06-02 13:48:47 +01:00
committed by GitHub
parent 04374cc2c2
commit 3de904b6fa
26 changed files with 61 additions and 70 deletions

View File

@@ -184,9 +184,7 @@ var/global/list/ghdel_profiling_roundstart = list()
INVOKE_EVENT(src, /event/throw_impact, "hit_atom" = hit_atom, "speed" = speed, "user" = user, "thrown_atom" = src)
/atom/Destroy()
reagents?.my_atom = null // This solves a really mysterious and frankly strange hard-delete
QDEL_NULL(reagents)
if(density)
densityChanged()
// Idea by ChuckTheSheep to make the object even more unreferencable.

View File

@@ -152,10 +152,9 @@
for(var/turf/T in dview(covered_range, epicenter, INVISIBILITY_MAXIMUM))
if(cheap_pythag(T.x - epicenter.x,T.y - epicenter.y) <= covered_range + 0.5)
if(test_reach(epicenter,T,PASSTABLE|PASSGRILLE|PASSMOB|PASSMACHINE|PASSGIRDER|PASSRAILING))
var/datum/reagents/R = new/datum/reagents(5)
R.my_atom = T
R.add_reagent(WATER, 5)
var/obj/effect/foam/fire/F = new /obj/effect/foam/fire(T,R)
create_reagents(5)
reagents.add_reagent(WATER, 5)
var/obj/effect/foam/fire/F = new /obj/effect/foam/fire(T,reagents)
var/turf/F_turf = get_turf(F)
F.reagents.reaction(F_turf, TOUCH)
for(var/atom/atm in F_turf)

View File

@@ -467,9 +467,7 @@ steam.start() -- spawns the effect
/datum/effect/system/smoke_spread/chem/New()
..()
chemholder = new/obj()
var/datum/reagents/R = new/datum/reagents(500)
chemholder.reagents = R
R.my_atom = chemholder
chemholder.create_reagents(500)
/datum/effect/system/smoke_spread/chem/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct)
if(n > 20)

View File

@@ -185,7 +185,6 @@
for(var/a=0, a<REAGENT_USE, a++)
spawn(0)
var/datum/reagents/R = new/datum/reagents(5)
R.my_atom = src
reagents.trans_to_holder(R,1)
var/obj/effect/water/spray/W = new /obj/effect/water/spray/( get_turf(src))
var/ccolor = mix_color_from_reagents(R.reagent_list)
@@ -267,7 +266,6 @@
for(var/a=0, a<REAGENT_USE, a++)
spawn(0)
var/datum/reagents/R = new/datum/reagents(5)
R.my_atom = src
reagents.trans_to_holder(R,1)
var/obj/effect/foam/fire/W
if(has_slimes & SLIME_BLUE)

View File

@@ -104,8 +104,7 @@
/obj/item/weapon/kitchen/utensil/spoon/New()
..()
reagents = new(10)
reagents.my_atom = src
create_reagents(10)
/obj/item/weapon/kitchen/utensil/spoon/examine(mob/user)
..()
@@ -207,8 +206,7 @@
/obj/item/weapon/kitchen/utensil/spork/New()
..()
reagents = new(10)
reagents.my_atom = src
create_reagents(10)
/obj/item/weapon/kitchen/utensil/spork/examine(mob/user)
..()
@@ -316,8 +314,7 @@
/obj/item/weapon/kitchen/utensil/fork/New()
..()
reagents = new(10)
reagents.my_atom = src
create_reagents(10)
/obj/item/weapon/kitchen/utensil/fork/attack(var/mob/living/carbon/M, var/mob/living/carbon/user)
if(!istype(M) || !istype(user))

View File

@@ -964,6 +964,11 @@
reagents.add_reagent(FUEL, 50)
slotone.add_reagent(SACID, 50)
/obj/item/weapon/reagent_containers/glass/fuelcan/Destroy()
QDEL_NULL(slotone)
QDEL_NULL(slotzero)
. = ..()
/obj/item/weapon/reagent_containers/glass/fuelcan/attack_self(mob/user as mob)
if(!slot)
slotzero = reagents

View File

@@ -15,9 +15,7 @@
pixel_x = rand(-5, 5) * PIXEL_MULTIPLIER //Randomizes position slightly.
pixel_y = rand(-5, 5) * PIXEL_MULTIPLIER
var/datum/reagents/R = new/datum/reagents(50)
reagents = R
R.my_atom = src
create_reagents(50)
if(custom_plantname)
plantname = custom_plantname

View File

@@ -368,7 +368,6 @@
for(var/a=0, a<5, a++)
spawn(0)
var/datum/reagents/R = new/datum/reagents(5)
R.my_atom = src
reagents.trans_to_holder(R,1)
var/obj/effect/foam/fire/W = new /obj/effect/foam/fire(get_turf(chassis), R)
if(!W || !src)

View File

@@ -11,9 +11,7 @@
. *= 2 // Drones are slow
/mob/living/carbon/alien/humanoid/drone/New()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
if(src.name == "alien drone")
src.name = text("alien drone ([rand(1, 1000)])")
src.real_name = src.name
@@ -23,4 +21,4 @@
..()
add_spell(new /spell/aoe_turf/conjure/choice/alienresin, "alien_spell_ready", /obj/abstract/screen/movable/spell_master/alien)
add_spell(new /spell/corrosive_acid, "alien_spell_ready", /obj/abstract/screen/movable/spell_master/alien)
add_spell(new /spell/aoe_turf/evolve/drone, "alien_spell_ready", /obj/abstract/screen/movable/spell_master/alien)
add_spell(new /spell/aoe_turf/evolve/drone, "alien_spell_ready", /obj/abstract/screen/movable/spell_master/alien)

View File

@@ -12,9 +12,7 @@
return ..() * 0.9 // Hunters are fast.
/mob/living/carbon/alien/humanoid/hunter/New()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
if(name == "alien hunter")
name = text("alien hunter ([rand(1, 1000)])")
real_name = name

View File

@@ -11,9 +11,7 @@
//As far as movement goes, Sentinels are average
/mob/living/carbon/alien/humanoid/sentinel/New()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
if(name == "alien sentinel")
name = text("alien sentinel ([rand(1, 1000)])")
real_name = name
@@ -22,4 +20,4 @@
/mob/living/carbon/alien/humanoid/sentinel/add_spells_and_verbs()
..()
add_spell(new /spell/targeted/projectile/alienneurotoxin, "alien_spell_ready", /obj/abstract/screen/movable/spell_master/alien)
add_spell(new /spell/corrosive_acid, "alien_spell_ready", /obj/abstract/screen/movable/spell_master/alien)
add_spell(new /spell/corrosive_acid, "alien_spell_ready", /obj/abstract/screen/movable/spell_master/alien)

View File

@@ -12,9 +12,7 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
if(name == "alien")
name = text("alien ([rand(1, 1000)])")
real_name = name

View File

@@ -16,9 +16,7 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/larva/New()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
if(name == "alien larva")
name = "alien larva ([rand(1, 1000)])"
real_name = name

View File

@@ -12,9 +12,7 @@
universal_understand = 1
/mob/living/carbon/brain/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
create_reagents(1000)
..()
verbs -= /mob/living/carbon/verb/mob_sleep

View File

@@ -44,9 +44,8 @@
var/unmonkey_anim = "monkey2h"
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
create_reagents(1000)
if(namenumbers)
name = "[name] ([rand(1, 1000)])"

View File

@@ -69,9 +69,7 @@
/mob/living/carbon/slime/New()
lifestage_updates() //Set values according to whether the slime is a baby or an adult.
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
name = "[colour] slime ([rand(1, 1000)])"
desc = "\An [lifestage_name()] [colour] slime."
icon_state = "[iconstate_color()] [lifestage_name()] slime"
@@ -527,9 +525,7 @@
/obj/item/slime_extract/New()
..()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
icon_state_backup = icon_state
if (Uses > 1)
update_icon()
@@ -1078,9 +1074,7 @@
/obj/item/slime_core/New()
..()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
create_reagents(100)
POWERFLAG = rand(1,10)
Uses = rand(7, 25)
//flags |= NOREACT

View File

@@ -335,6 +335,10 @@ They can only use one tool at a time, they can't choose modules, and they have 1
udder.my_atom = src
..()
/mob/living/silicon/robot/mommi/Destroy()
QDEL_NULL(udder)
return ..()
/mob/living/silicon/robot/mommi/Life()
if(timestopped)
return 0 //under effects of time magick

View File

@@ -150,6 +150,10 @@
milkable_reagents = new(150)
milkable_reagents.my_atom = src
/mob/living/simple_animal/cow/Destroy()
QDEL_NULL(milkable_reagents)
return ..()
/mob/living/simple_animal/cow/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
user.visible_message("<span class='notice'>[user] milks [src] using \the [O].</span>")

View File

@@ -284,6 +284,10 @@
udder.my_atom = src
..()
/mob/living/simple_animal/hostile/retaliate/polyp/Destroy()
QDEL_NULL(udder)
. = ..()
/mob/living/simple_animal/hostile/retaliate/polyp/Life()
if(timestopped)
return 0 //under effects of time magick
@@ -404,6 +408,10 @@
udder.my_atom = src
..()
/mob/living/simple_animal/hostile/retaliate/cattle_specimen/Destroy()
QDEL_NULL(udder)
. = ..()
/mob/living/simple_animal/hostile/retaliate/cattle_specimen/Life()
if(timestopped)
return 0 //under effects of time magick

View File

@@ -390,9 +390,7 @@
origin_tech = Tc_MATERIALS + "=2;" + Tc_SYNDICATE + "=5"
/obj/item/weapon/pen/paralysis/New()
var/datum/reagents/R = new/datum/reagents(25)
reagents = R
R.my_atom = src
R.add_reagent(ZOMBIEPOWDER, 10)
R.add_reagent(CRYPTOBIOLIN, 15)
create_reagents(25)
reagents.add_reagent(ZOMBIEPOWDER, 10)
reagents.add_reagent(CRYPTOBIOLIN, 15)
..()

View File

@@ -979,7 +979,12 @@ trans_to_atmos(var/datum/gas_mixture/target, var/amount=1, var/multiplier=1, var
reagent_list.Cut()
if(my_atom)
my_atom.reagents = null
// Sometimes atoms use /datum/reagents internal vars which are NOT their actual reagents datums
// This causes them to hard-del because the atom.reagents is nulled early in the Destroy() chain
// And is never deleted properly.
// The proper fix is of course to rework how datum/reagents work but I'll not do that.
if (my_atom.reagents == src)
my_atom.reagents = null
my_atom = null
..()
@@ -1113,6 +1118,9 @@ trans_to_atmos(var/datum/gas_mixture/target, var/amount=1, var/multiplier=1, var
* max_vol is maximum volume of holder
*/
/atom/proc/create_reagents(const/max_vol)
if (reagents)
stack_trace("double reagents creation for [type]")
QDEL_NULL(reagents)
reagents = new/datum/reagents(max_vol)
reagents.my_atom = src

View File

@@ -58,13 +58,13 @@
var/image/extra_food_overlay
/obj/item/weapon/reagent_containers/food/snacks/Destroy()
QDEL_NULL(dip)
var/turf/T = get_turf(src)
if(contents.len)
for(var/atom/movable/A in src)
A.forceMove(T)
visible_message("<span class='warning'>The items sloppily placed within fall out of \the [src]!</span>")
..()
QDEL_NULL(dip)
//Proc for effects that trigger on eating that aren't directly tied to the reagents.
/obj/item/weapon/reagent_containers/food/snacks/proc/after_consume(var/mob/user, var/datum/reagents/reagentreference)

View File

@@ -28,9 +28,9 @@
icon = original
/obj/item/weapon/reagent_containers/food/snacks/meat/Destroy()
..()
if(poisonsacs)
QDEL_NULL(poisonsacs)
return ..()
/obj/item/weapon/reagent_containers/food/snacks/meat/animal //This meat spawns when an animal is butchered, and its name is set to '[animal.species_name] meat' (like "cat meat")
var/animal_name = "animal"

View File

@@ -299,12 +299,10 @@
amount_per_transfer_from_this = 5
/obj/item/weapon/reagent_containers/glass/bottle/gbs/New()
var/datum/reagents/R = new/datum/reagents(20)
reagents = R
R.my_atom = src
create_reagents(20)
var/datum/disease/F = new /datum/disease/gbs
var/list/data = list("virus"= F)
R.add_reagent(BLOOD, 20, data)
reagents.add_reagent(BLOOD, 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs
name = "GBS culture bottle"
@@ -336,9 +334,7 @@
amount_per_transfer_from_this = 5
/obj/item/weapon/reagent_containers/glass/bottle/rhumba_beat/New()
var/datum/reagents/R = new/datum/reagents(20)
reagents = R
R.my_atom = src
create_reagents(20)
var/datum/disease/F = new /datum/disease/rhumba_beat
var/list/data = list("virus"= F)
R.add_reagent(BLOOD, 20, data)

View File

@@ -800,6 +800,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
/// Public: called by event when the mob loses the spell
/spell/proc/on_removed(mob/user)
holder = null
return
/// Public: called by event when the mob fucking dies

View File

@@ -170,8 +170,7 @@ var/list/virusdishes = list()
/obj/item/weapon/virusdish/New(loc)
..()
reagents = new(10)
reagents.my_atom = src
create_reagents(10)
virusdishes.Add(src)
/obj/item/weapon/virusdish/Destroy()