mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
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:
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)])"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -979,6 +979,11 @@ trans_to_atmos(var/datum/gas_mixture/target, var/amount=1, var/multiplier=1, var
|
||||
reagent_list.Cut()
|
||||
|
||||
if(my_atom)
|
||||
// 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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user