diff --git a/code/__HELPERS/qdel.dm b/code/__HELPERS/qdel.dm
new file mode 100644
index 00000000000..14b1f9d9594
--- /dev/null
+++ b/code/__HELPERS/qdel.dm
@@ -0,0 +1,2 @@
+#define QDEL_IN(item, time) addtimer(GLOBAL_PROC, "qdel", time, FALSE, item)
+#define QDEL_NULL(item) qdel(item); item = null
\ No newline at end of file
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 183bd35da56..071b24dd6d6 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1162,13 +1162,6 @@
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
-
-/obj/machinery/vending/eva
- name = "\improper Hardsuit Kits"
- desc = "Conversion kits for your alien hardsuit needs."
- products = list(/obj/item/device/modkit = 6,/obj/item/device/modkit/tajaran = 6,/obj/item/device/modkit/unathi = 6,/obj/item/device/modkit/skrell = 6,/obj/item/device/modkit/vox = 6)
-
-
/obj/machinery/vending/sustenance
name = "\improper Sustenance Vendor"
desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement."
diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm
index 991d04fbd63..3125c24837a 100644
--- a/code/game/objects/items/dehy_carp.dm
+++ b/code/game/objects/items/dehy_carp.dm
@@ -8,6 +8,11 @@
var/mob/owner = null // Carp doesn't attack owner, set when using in hand
var/owned = 1 // Boolean, no owner to begin with
+
+/obj/item/toy/carpplushie/dehy_carp/Destroy()
+ owner = null
+ return ..()
+
// Attack self
/obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user as mob)
src.add_fingerprint(user) // Anyone can add their fingerprints to it with this
diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm
deleted file mode 100644
index a81f96a1efc..00000000000
--- a/code/game/objects/items/devices/modkit.dm
+++ /dev/null
@@ -1,87 +0,0 @@
-#define MODKIT_HELMET 1
-#define MODKIT_SUIT 2
-#define MODKIT_FULL 3
-
-/obj/item/device/modkit
- name = "hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user."
- icon_state = "modkit"
- var/parts = MODKIT_FULL
- var/target_species = "Human"
-
- var/list/permitted_types = list(
- /obj/item/clothing/head/helmet/space/hardsuit,
- /obj/item/clothing/suit/space/hardsuit
- )
-
-/obj/item/device/modkit/afterattack(obj/item/O, mob/user as mob, proximity)
- if(!proximity)
- return
-
- if(!target_species)
- return //it shouldn't be null, okay?
-
- if(!parts)
- to_chat(user, "This kit has no parts for this modification left.")
- user.unEquip(src)
- qdel(src)
- return
-
- var/allowed = 0
- for(var/permitted_type in permitted_types)
- if(istype(O, permitted_type))
- allowed = 1
-
- var/obj/item/clothing/I = O
- if(!istype(I) || !allowed)
- to_chat(user, "[src] is unable to modify that.")
- return
-
- var/excluding = ("exclude" in I.species_restricted)
- var/in_list = (target_species in I.species_restricted)
- if(excluding ^ in_list)
- to_chat(user, "[I] is already modified.")
- return
-
- if(!isturf(O.loc))
- to_chat(user, "[O] must be safely placed on the ground for modification.")
- return
-
- playsound(user.loc, O.usesound, 100, 1)
-
- user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].")
-
- I.refit_for_species(target_species)
-
- if(istype(I, /obj/item/clothing/head/helmet))
- parts &= ~MODKIT_HELMET
- if(istype(I, /obj/item/clothing/suit))
- parts &= ~MODKIT_SUIT
-
- if(!parts)
- user.unEquip(src)
- qdel(src)
-
-/obj/item/device/modkit/examine(mob/user)
- ..(user)
- to_chat(user, "It looks as though it modifies hardsuits to fit [target_species] users.")
-
-/obj/item/device/modkit/tajaran
- name = "Tajaran hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran."
- target_species = "Tajaran"
-
-/obj/item/device/modkit/unathi
- name = "Unathi hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Unathi."
- target_species = "Unathi"
-
-/obj/item/device/modkit/skrell
- name = "Skrell hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Skrell."
- target_species = "Skrell"
-
-/obj/item/device/modkit/vox
- name = "Vox hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Vox."
- target_species = "Vox"
\ No newline at end of file
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index e734f22b97f..4483a920355 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -32,6 +32,9 @@
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
+/obj/item/device/multitool/Destroy()
+ buffer = null
+ return ..()
/obj/item/device/multitool/ai_detect
var/track_cooldown = 0
@@ -56,7 +59,7 @@
multitool_detect()
icon_state = "[initial(icon_state)][detect_state]"
track_cooldown = world.time + track_delay
-
+
/obj/item/device/multitool/ai_detect/proc/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/living/silicon/ai/AI in ai_list)
@@ -76,7 +79,7 @@
if(get_dist(our_turf, detect_turf) < rangewarning)
detect_state = PROXIMITY_NEAR
break
-
+
/obj/item/device/multitool/ai_detect/admin
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
track_delay = 5
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 25e975fa920..a0d997362ac 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -27,6 +27,8 @@
/obj/item/device/powersink/Destroy()
processing_objects.Remove(src)
processing_power_items.Remove(src)
+ PN = null
+ attached = null
return ..()
/obj/item/device/powersink/attackby(var/obj/item/I, var/mob/user)
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index f0c4f1e60d6..810b5a95749 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -48,6 +48,7 @@ LIGHTERS ARE IN LIGHTERS.DM
/obj/item/clothing/mask/cigarette/Destroy()
if(reagents)
qdel(reagents)
+ reagents = null
processing_objects -= src
return ..()
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index bd6a18b73c1..bc006ed48f0 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -18,10 +18,11 @@
..()
/obj/item/weapon/grenade/plastic/Destroy()
- qdel(nadeassembly)
- nadeassembly = null
+ if(nadeassembly)
+ qdel(nadeassembly)
+ nadeassembly = null
target = null
- ..()
+ return ..()
/obj/item/weapon/grenade/plastic/attackby(obj/item/I, mob/user, params)
if(!nadeassembly && istype(I, /obj/item/device/assembly_holder))
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 71dafff99ff..5e3baf381c8 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -34,6 +34,7 @@
if(ptank)
qdel(ptank)
ptank = null
+ previousturf = null
return ..()
diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm
index 04470cf7854..196b0d269a0 100644
--- a/code/game/objects/items/weapons/garrote.dm
+++ b/code/game/objects/items/weapons/garrote.dm
@@ -13,6 +13,10 @@
var/improvised = 0
var/garrote_time
+/obj/item/weapon/twohanded/garrote/Destroy()
+ strangling = null
+ return ..()
+
/obj/item/weapon/twohanded/garrote/update_icon()
if(strangling) // If we're strangling someone we want our icon to stay wielded
icon_state = "garrot_unwrap"
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 6ca1d53e5db..85f9374bc7c 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -26,6 +26,14 @@
payload_name += " " // formatting, ignore me
update_icon()
+/obj/item/weapon/grenade/chem_grenade/Destroy()
+ if(nadeassembly)
+ qdel(nadeassembly)
+ nadeassembly = null
+ for(var/thing in beakers)
+ qdel(thing)
+ beakers.Cut()
+ return ..()
/obj/item/weapon/grenade/chem_grenade/examine(mob/user)
..(user)
diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm
index dac93f9cb04..1a5542b5ef5 100644
--- a/code/game/objects/items/weapons/holosign.dm
+++ b/code/game/objects/items/weapons/holosign.dm
@@ -13,6 +13,12 @@
var/list/signs = list()
var/max_signs = 20
+/obj/item/weapon/holosign_creator/Destroy()
+ for(var/sign in signs)
+ qdel(sign)
+ signs.Cut()
+ return ..()
+
/obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag)
if(flag)
var/turf/T = get_turf(target)
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 2e197926291..4495f637e56 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -18,6 +18,7 @@
var/mopspeed = 30
/obj/item/weapon/mop/New()
+ ..()
create_reagents(mopcap)
janitorial_equipment += src
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index f2bd9cafedf..c3995876136 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -201,11 +201,17 @@
stunforce = 5
hitcost = 3750
slot_flags = SLOT_BACK
- var/obj/item/device/assembly/igniter/sparkler = 0
+ var/obj/item/device/assembly/igniter/sparkler = null
/obj/item/weapon/melee/baton/cattleprod/New()
..()
- sparkler = new (src)
+ sparkler = new(src)
+
+/obj/item/weapon/melee/baton/cattleprod/Destroy()
+ if(sparkler)
+ qdel(sparkler)
+ sparkler = null
+ return ..()
/obj/item/weapon/melee/baton/cattleprod/baton_stun()
if(sparkler.activate())
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 045f58d577d..eb904d41bd7 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -19,6 +19,11 @@
burntime = 15
var/obj/item/weapon/canvas/painting = null
+/obj/structure/easel/Destroy()
+ if(painting)
+ qdel(painting)
+ painting = null
+ return ..()
//Adding canvases
/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 2ced72cbcfe..4ff25d9da47 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -22,6 +22,15 @@ var/global/list/captain_display_cases = list()
var/obj/item/device/assembly/prox_sensor/sensor = null
var/state = DISPLAYCASE_FRAME_CIRCUIT
+/obj/structure/displaycase_frame/Destroy()
+ if(circuit)
+ qdel(circuit)
+ circuit = null
+ if(sensor)
+ qdel(sensor)
+ sensor = null
+ return ..()
+
/obj/structure/displaycase_frame/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
var/pstate = state
var/turf/T = get_turf(src)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index c2c5fc083fa..316e011a190 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -17,6 +17,12 @@
/obj/structure/door_assembly/New()
update_state()
+/obj/structure/door_assembly/Destroy()
+ if(electronics)
+ qdel(electronics)
+ electronics = null
+ return ..()
+
/obj/structure/door_assembly/door_assembly_com
base_icon_state = "com"
base_name = "Command Airlock"
diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm
index 594139f8d70..98ce429bea4 100644
--- a/code/game/objects/structures/engicart.dm
+++ b/code/game/objects/structures/engicart.dm
@@ -14,6 +14,33 @@
var/obj/item/weapon/storage/toolbox/emergency/myredtoolbox = null
var/obj/item/taperoll/engineering/myengitape = null
+/obj/structure/engineeringcart/Destroy()
+ if(myglass)
+ qdel(myglass)
+ myglass = null
+ if(mymetal)
+ qdel(mymetal)
+ mymetal = null
+ if(myplasteel)
+ qdel(myplasteel)
+ myplasteel = null
+ if(myflashlight)
+ qdel(myflashlight)
+ myflashlight = null
+ if(mybluetoolbox)
+ qdel(mybluetoolbox)
+ mybluetoolbox = null
+ if(myyellowtoolbox)
+ qdel(myyellowtoolbox)
+ myyellowtoolbox = null
+ if(myredtoolbox)
+ qdel(myredtoolbox)
+ myredtoolbox = null
+ if(myengitape)
+ qdel(myengitape)
+ myengitape = null
+ return ..()
+
/obj/structure/engineeringcart/proc/put_in_cart(obj/item/I, mob/user)
user.drop_item()
I.loc = src
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index e5a89aa1fad..0f39494d361 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -8,6 +8,11 @@
var/obj/item/weapon/extinguisher/has_extinguisher = new/obj/item/weapon/extinguisher
var/opened = 0
+/obj/structure/extinguisher_cabinet/Destroy()
+ if(has_extinguisher)
+ qdel(has_extinguisher)
+ has_extinguisher = null
+ return ..()
/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params)
if(isrobot(user) || isalien(user))
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 614af2d4ff4..d3f766aac3b 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -19,12 +19,24 @@
/obj/structure/janitorialcart/New()
+ ..()
create_reagents(100)
janitorial_equipment += src
-
/obj/structure/janitorialcart/Destroy()
janitorial_equipment -= src
+ if(mybag)
+ qdel(mybag)
+ mybag = null
+ if(mymop)
+ qdel(mymop)
+ mymop = null
+ if(myspray)
+ qdel(myspray)
+ myspray = null
+ if(myreplacer)
+ qdel(myreplacer)
+ myreplacer = null
return ..()
/obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user)
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index 49175dfa9e3..e7f29ccd78a 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -8,6 +8,7 @@
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
/obj/structure/mopbucket/New()
+ ..()
create_reagents(100)
janitorial_equipment += src
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 504b2abfa80..1a4b1595b42 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -8,45 +8,50 @@
flags = CONDUCT
var/obj/item/target/pinned_target // the current pinned target
- Move()
- ..()
- // Move the pinned target along with the stake
- if(pinned_target in view(3, src))
- pinned_target.loc = loc
+/obj/structure/target_stake/Destroy()
+ if(pinned_target)
+ qdel(pinned_target)
+ pinned_target = null
+ return ..()
- else // Sanity check: if the pinned target can't be found in immediate view
- pinned_target = null
- density = 1
+/obj/structure/target_stake/Move()
+ ..()
+ // Move the pinned target along with the stake
+ if(pinned_target in view(3, src))
+ pinned_target.loc = loc
- attackby(obj/item/W as obj, mob/user as mob, params)
- // Putting objects on the stake. Most importantly, targets
- if(pinned_target)
- return // get rid of that pinned target first!
+ else // Sanity check: if the pinned target can't be found in immediate view
+ pinned_target = null
+ density = 1
- if(istype(W, /obj/item/target))
- density = 0
- W.density = 1
- user.drop_item(src)
- W.loc = loc
- W.layer = 3.1
- pinned_target = W
- to_chat(user, "You slide the target into the stake.")
- return
+/obj/structure/target_stake/attackby(obj/item/W, mob/user, params)
+ // Putting objects on the stake. Most importantly, targets
+ if(pinned_target)
+ return // get rid of that pinned target first!
- attack_hand(mob/user as mob)
- // taking pinned targets off!
- if(pinned_target)
- density = 1
- pinned_target.density = 0
- pinned_target.layer = OBJ_LAYER
+ if(istype(W, /obj/item/target))
+ density = 0
+ W.density = 1
+ user.drop_item(src)
+ W.loc = loc
+ W.layer = 3.1
+ pinned_target = W
+ to_chat(user, "You slide the target into the stake.")
- pinned_target.loc = user.loc
- if(ishuman(user))
- if(!user.get_active_hand())
- user.put_in_hands(pinned_target)
- to_chat(user, "You take the target out of the stake.")
- else
- pinned_target.loc = get_turf(user)
+/obj/structure/target_stake/attack_hand(mob/user)
+ // taking pinned targets off!
+ if(pinned_target)
+ density = 1
+ pinned_target.density = 0
+ pinned_target.layer = OBJ_LAYER
+
+ pinned_target.loc = user.loc
+ if(ishuman(user))
+ if(!user.get_active_hand())
+ user.put_in_hands(pinned_target)
to_chat(user, "You take the target out of the stake.")
+ else
+ pinned_target.loc = get_turf(user)
+ to_chat(user, "You take the target out of the stake.")
- pinned_target = null
\ No newline at end of file
+ pinned_target = null
\ No newline at end of file
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 26d97a52671..fa59fdc3cd1 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -14,9 +14,13 @@
/obj/structure/toilet/New()
+ ..()
open = round(rand(0, 1))
update_icon()
+/obj/structure/toilet/Destroy()
+ swirlie = null
+ return ..()
/obj/structure/toilet/attack_hand(mob/living/user)
if(swirlie)
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index ceba6687143..2da2d982ac2 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -34,6 +34,9 @@ obj/structure/windoor_assembly/New(dir=NORTH)
obj/structure/windoor_assembly/Destroy()
density = 0
+ if(electronics)
+ qdel(electronics)
+ electronics = null
air_update_turf(1)
return ..()
diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm
index 0683394ce9f..23ba6f522a3 100644
--- a/code/modules/clothing/suits/hood.dm
+++ b/code/modules/clothing/suits/hood.dm
@@ -10,7 +10,9 @@
..()
/obj/item/clothing/suit/hooded/Destroy()
- qdel(hood)
+ if(hood)
+ qdel(hood)
+ hood = null
return ..()
/obj/item/clothing/suit/hooded/proc/MakeHood()
diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm
index e2204788016..b293ccefd4f 100644
--- a/code/modules/garbage_collection/garbage_collector.dm
+++ b/code/modules/garbage_collection/garbage_collector.dm
@@ -82,7 +82,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
#undef GC_COLLECTIONS_PER_TICK
/datum/controller/process/garbage_collector/proc/hardDel(var/datum/D)
- gc_hard_del_types |= D.type
+ gc_hard_del_types["[D.type]"]++
D.hard_deleted = 1
if(!D.gcDestroyed)
spawn(-1)
diff --git a/code/modules/garbage_collection/gc_testing.dm b/code/modules/garbage_collection/gc_testing.dm
index b1b413a0398..2a61c8dd462 100644
--- a/code/modules/garbage_collection/gc_testing.dm
+++ b/code/modules/garbage_collection/gc_testing.dm
@@ -25,9 +25,9 @@
to_chat(usr, "No hard del()'d types found.")
return
- to_chat(usr, "Types hard del()'d by the GC:")
+ to_chat(usr, "Types hard del()'d by the GC and number of times failed:")
for(var/A in gc_hard_del_types)
- to_chat(usr, "[A]")
+ to_chat(usr, "[A] - [gc_hard_del_types[A]] times")
#ifdef TESTING
/client/var/running_find_references
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index ce393c16e15..4f6ce988093 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -34,6 +34,9 @@
if(beaker)
qdel(beaker)
beaker = null
+ if(files)
+ qdel(files)
+ files = null
return ..()
/obj/machinery/biogenerator/ex_act(severity)
@@ -208,7 +211,7 @@
/obj/machinery/biogenerator/attack_hand(mob/user)
interact(user)
-
+
/obj/machinery/biogenerator/attack_ghost(mob/user)
interact(user)
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 95e195caaf7..ba8feb3c5ad 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -24,13 +24,26 @@
/obj/machinery/plantgenes/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/plantgenes(src)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/circuitboard/plantgenes(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
RefreshParts()
+/obj/machinery/plantgenes/Destroy()
+ core_genes.Cut()
+ reagent_genes.Cut()
+ trait_genes.Cut()
+ target = null
+ if(seed)
+ qdel(seed)
+ seed = null
+ if(disk)
+ qdel(disk)
+ disk = null
+ return ..()
+
/obj/machinery/plantgenes/RefreshParts()
rating = 0
for(var/I in component_parts)
@@ -90,7 +103,7 @@
if(..())
return
interact(user)
-
+
/obj/machinery/plantgenes/attack_ghost(mob/user)
interact(user)
@@ -282,9 +295,9 @@
repaint_seed()
if("extract")
if(disk && !disk.read_only)
- disk.gene = G
- if(istype(G, /datum/plant_gene/core/potency))
- var/datum/plant_gene/core/gene = G
+ disk.gene = G.Copy()
+ if(istype(disk.gene, /datum/plant_gene/core/potency))
+ var/datum/plant_gene/core/gene = disk.gene
gene.value = min(gene.value, max_extract_pot)
disk.update_name()
qdel(seed)
@@ -370,6 +383,12 @@
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
+/obj/item/weapon/disk/plantgene/Destroy()
+ if(gene)
+ qdel(gene)
+ gene = null
+ return ..()
+
/obj/item/weapon/disk/plantgene/attackby(obj/item/weapon/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/pen))
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 2322bbad5ca..d27495f26c7 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -39,7 +39,11 @@
transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
add_juice()
-
+/obj/item/weapon/reagent_containers/food/snacks/grown/Destroy()
+ if(seed)
+ qdel(seed)
+ seed = null
+ return ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/add_juice()
if(reagents)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 64d2eff90b7..0c79b99fbda 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -31,6 +31,11 @@
transform *= TransformUsingVariable(seed.potency, 100, 0.5)
add_juice()
+/obj/item/weapon/grown/Destroy()
+ if(seed)
+ qdel(seed)
+ seed = null
+ return ..()
/obj/item/weapon/grown/attackby(obj/item/O, mob/user, params)
..()
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index d35621e4c59..9aa93f9f92b 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -68,6 +68,12 @@
for(var/reag_id in reagents_add)
genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
+/obj/item/seeds/Destroy()
+ for(var/thing in genes)
+ qdel(thing)
+ genes.Cut()
+ return ..()
+
/obj/item/seeds/proc/Copy()
var/obj/item/seeds/S = new type(null, 1)
// Copy all the stats
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 286af5d4863..70d2a9f76c0 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -48,8 +48,7 @@
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
- if(!cube.wrapped)
- cube.Expand()
+ cube.Expand()
// Dehydrated carp
if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 9d49cb03291..dd3856afcc4 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -1146,11 +1146,11 @@
update()
return
-
+
/obj/structure/disposalpipe/trunk/Destroy()
if(istype(linked, /obj/structure/disposaloutlet))
var/obj/structure/disposaloutlet/O = linked
- O.expel()
+ O.expel(animation = 0)
else if(istype(linked, /obj/machinery/disposal))
var/obj/machinery/disposal/D = linked
if(D.trunk == src)
@@ -1207,7 +1207,7 @@
playsound(loc, W.usesound, 100, 1)
to_chat(user, "Slicing the disposal pipe.")
if(do_after(user, 30 * W.toolspeed, target = src))
- if(!W.isOn())
+ if(!W.isOn())
return
welded()
else
@@ -1290,12 +1290,13 @@
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
- proc/expel(var/obj/structure/disposalholder/H)
+ proc/expel(var/obj/structure/disposalholder/H, animation = 1)
- flick("outlet-open", src)
- playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
- sleep(20) //wait until correct animation frame
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
+ if(animation)
+ flick("outlet-open", src)
+ playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
+ sleep(20) //wait until correct animation frame
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
if(H)
for(var/atom/movable/AM in H)
@@ -1308,7 +1309,6 @@
H.vent_gas(src.loc)
qdel(H)
- return
attackby(var/obj/item/I, var/mob/user, params)
if(!I || !user)
diff --git a/code/modules/spacepods/construction.dm b/code/modules/spacepods/construction.dm
index 0426b940d0b..4fcd4aa5e52 100644
--- a/code/modules/spacepods/construction.dm
+++ b/code/modules/spacepods/construction.dm
@@ -19,6 +19,12 @@
dir = EAST
+/obj/structure/spacepod_frame/Destroy()
+ if(construct)
+ qdel(construct)
+ construct = null
+ return ..()
+
/obj/structure/spacepod_frame/attackby(obj/item/W as obj, mob/user as mob, params)
if(!construct || !construct.action(W, user))
..()
diff --git a/paradise.dme b/paradise.dme
index b87c0b16ab0..c057e4ea176 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -66,6 +66,7 @@
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\names.dm"
+#include "code\__HELPERS\qdel.dm"
#include "code\__HELPERS\sanitize_values.dm"
#include "code\__HELPERS\text.dm"
#include "code\__HELPERS\time.dm"
@@ -724,7 +725,6 @@
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\megaphone.dm"
-#include "code\game\objects\items\devices\modkit.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"