diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 33127fa0347..24171b74f96 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -176,7 +176,7 @@ var/const/tk_maxrange = 15 O.icon_state = "nothing" flick("empdisable",O) spawn(5) - O.delete() + qdel(O) return diff --git a/code/controllers/garbage.dm b/code/controllers/garbage.dm index 7c5bcd194a4..869024ca101 100644 --- a/code/controllers/garbage.dm +++ b/code/controllers/garbage.dm @@ -21,63 +21,54 @@ var/datum/garbage_collector/garbageCollector // To let them know how hardworking am I :^). var/dels_count = 0 var/hard_dels = 0 - var/processing = 1 -/datum/garbage_collector/proc/addTrash(const/datum/D) - if(!D) +/datum/garbage_collector/proc/addTrash(const/atom/movable/AM) + if(isnull(AM) || !istype(AM)) return if(del_everything) - del(D) + del(AM) hard_dels++ dels_count++ return - if(!istype(D, /atom/movable)) - del(D) - hard_dels++ - dels_count++ - return - - var/atom/movable/AM = D var/timeofday = world.timeofday AM.timeDestroyed = timeofday queue -= "\ref[AM]" queue["\ref[AM]"] = timeofday /datum/garbage_collector/proc/process() - if(processing) - var/remainingCollectionPerTick = GC_COLLECTIONS_PER_TICK - var/remainingForceDelPerTick = GC_FORCE_DEL_PER_TICK - var/collectionTimeScope = world.timeofday - GC_COLLECTION_TIMEOUT + var/remainingCollectionPerTick = GC_COLLECTIONS_PER_TICK + var/remainingForceDelPerTick = GC_FORCE_DEL_PER_TICK + var/collectionTimeScope = world.timeofday - GC_COLLECTION_TIMEOUT - while(queue.len && --remainingCollectionPerTick >= 0) - var/refID = queue[1] - var/destroyedAtTime = queue[refID] + while(queue.len && --remainingCollectionPerTick >= 0) + var/refID = queue[1] + var/destroyedAtTime = queue[refID] - if(destroyedAtTime > collectionTimeScope) + if(destroyedAtTime > collectionTimeScope) + break + + var/atom/movable/AM = locate(refID) + + // Something's still referring to the qdel'd object. Kill it. + if(AM && AM.timeDestroyed == destroyedAtTime) + if(remainingForceDelPerTick <= 0) break - var/atom/movable/A = locate(refID) + #ifdef GC_DEBUG + WARNING("gc process force delete [AM.type]") + #endif - // Something's still referring to the qdel'd object. Kill it. - if(A && A.timeDestroyed == destroyedAtTime) - if(remainingForceDelPerTick <= 0) - break + gc_hard_del_types |= "[AM.type]" - #ifdef GC_DEBUG - WARNING("gc process force delete [A.type]") - #endif + del(AM) - gc_hard_del_types |= "[A.type]" + hard_dels++ + remainingForceDelPerTick-- - del(A) - - hard_dels++ - remainingForceDelPerTick-- - - queue.Cut(1, 2) - dels_count++ + queue.Cut(1, 2) + dels_count++ #ifdef GC_DEBUG #undef GC_DEBUG @@ -87,31 +78,30 @@ var/datum/garbage_collector/garbageCollector #undef GC_COLLECTION_TIMEOUT #undef GC_COLLECTIONS_PER_TICK -/proc/qdel(const/O) - if (!O) +/* + * NEVER USE THIS FOR ANYTHING OTHER THAN /atom/movable + * OTHER TYPES CANNOT BE QDEL'D BECAUSE THEIR LOC IS LOCKED OR THEY DON'T HAVE ONE. + */ +/proc/qdel(const/atom/movable/AM) + if(isnull(AM)) return - if (!garbageCollector) - del(O) + if(isnull(garbageCollector)) + del(AM) return - if (!istype(O, /datum)) - del(O) + if(!istype(AM)) + WARNING("qdel() passed object of type [AM.type]. qdel() can only handle /atom/movable types.") + del(AM) garbageCollector.hard_dels++ garbageCollector.dels_count++ return - var/datum/D = O - - if (isnull(D.gcDestroyed)) + if(isnull(AM.gcDestroyed)) // Let our friend know they're about to get fucked up. - D.Destroy() + AM.Destroy() - garbageCollector.addTrash(D) - -/datum - // Garbage collection (qdel). - var/gcDestroyed + garbageCollector.addTrash(AM) /datum/controller var/processing = 0 @@ -124,21 +114,12 @@ var/datum/garbage_collector/garbageCollector . = ..() tag = "[type]:NOGC" -/datum/Del() - // Pass to Destroy(). - if(isnull(gcDestroyed)) - Destroy() - - sleep(-1) - ..() - /* * Like Del(), but for qdel. * Called BEFORE qdel moves shit. */ /datum/proc/Destroy() tag = null - gcDestroyed = "Bye world!" /client/proc/qdel_toggle() set name = "Toggle qdel Behavior" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 654233e656b..9841faace55 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -69,6 +69,9 @@ DeleteFromProfiler() //world << "[type] - [tag] - [x].[y].[z]" + if(reagents) + reagents.Destroy() + reagents = null density = 0 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index f571a2bca5b..73b1a85da11 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -20,6 +20,7 @@ var/global/guid = 0 // Garbage collection (controller). + var/gcDestroyed var/timeDestroyed /atom/movable/New() @@ -27,6 +28,19 @@ areaMaster = get_area_master(src) tag = "[++guid]" +/atom/movable/Destroy() + areaMaster = null + gcDestroyed = "Bye world!" + loc = null + ..() + +/atom/movable/Del() + // Pass to Destroy(). + if(!gcDestroyed) + Destroy() + + ..() + /atom/movable/Move() var/atom/A = src.loc . = ..() @@ -195,11 +209,6 @@ return src.master.attack_hand(a, b, c) return -/atom/movable/Destroy() - areaMaster = null - loc = null - ..() - ///////////////////////////// // SINGULOTH PULL REFACTOR ///////////////////////////// diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index eb342e83c14..bb69c70146b 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -143,7 +143,7 @@ pulse2.dir = pick(cardinal) spawn(10) - pulse2.delete() + qdel(pulse2) if (on) turn_off() spawn(severity*300) diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index e703c52edd6..175c64855f4 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -866,7 +866,7 @@ Auto Patrol: []"}, pulse2.anchored = 1 pulse2.dir = pick(cardinal) spawn(10) - pulse2.delete() + qdel(pulse2) var/list/mob/living/carbon/targets = new for (var/mob/living/carbon/C in view(12,src)) if (C.stat==2) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 94be134cb85..39d88da0e36 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1160,7 +1160,7 @@ About the new airlock wires panel: return /obj/machinery/door/airlock/New() - ..() + . = ..() wires = new(src) if(src.closeOtherId != null) spawn (5) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 4e90062ecdc..b7246409967 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -162,13 +162,10 @@ return door_animate("deny") - return /obj/machinery/door/blob_act() - if (prob(BLOB_PROBABILITY)) - src = null - - return + if(prob(BLOB_PROBABILITY)) + qdel(src) /obj/machinery/door/proc/door_animate(var/animation as text) switch (animation) @@ -267,16 +264,13 @@ if (!glass) src.SetOpacity(1) - // TODO: analyze this proc - update_nearby_tiles() - // TODO: rework how fire works on doors var/obj/fire/F = locate() in loc - if (F) - F = null + if(F) + qdel(F) + update_nearby_tiles() operating = 0 - return /obj/machinery/door/New() . = ..() @@ -286,7 +280,6 @@ layer = 3.1 explosion_resistance = initial(explosion_resistance) - update_heat_protection(get_turf(src)) else // under all objects if opened. 2.7 due to tables being at 2.6 layer = 2.7 @@ -302,13 +295,10 @@ bound_height = width * world.icon_size update_nearby_tiles() - return /obj/machinery/door/Destroy() - density = 0 update_nearby_tiles() ..() - return /obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group) return 0 @@ -345,17 +335,12 @@ return 1 /obj/machinery/door/proc/update_nearby_tiles() - if (isnull(air_master)) + if(!air_master) return 0 - var/T - - for (T in locs.Copy()) - if (!isturf(T)) - continue - - update_heat_protection(T) - air_master.mark_for_update(T) + for(var/turf in locs) + update_heat_protection(turf) + air_master.mark_for_update(turf) return 1 diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 034e6366260..00f09ee7e2f 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -147,7 +147,7 @@ Class Procs: pulse2.dir = pick(cardinal) spawn(10) - pulse2.delete() + qdel(pulse2) ..() /obj/machinery/ex_act(severity) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 5ba168cc104..d6bddcf64c4 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -16,47 +16,35 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/effect/water name = "water" - icon = 'icons/effects/effects.dmi' icon_state = "extinguish" var/life = 15.0 - flags = TABLEPASS - mouse_opacity = 0 - -/obj/effect/proc/delete() - loc = null - if(reagents) - reagents.my_atom = null - reagents.delete() - return - /obj/effect/effect/water/New() - ..() + . = ..() //var/turf/T = src.loc //if (istype(T, /turf)) // T.firelevel = 0 //TODO: FIX - spawn( 70 ) - delete() - return - return + + spawn(70) + qdel(src) /obj/effect/effect/water/Destroy() //var/turf/T = src.loc //if (istype(T, /turf)) // T.firelevel = 0 //TODO: FIX - src.delete() - ..() - return -/obj/effect/effect/water/Move(turf/newloc) + ..() + +/obj/effect/effect/water/Move(NewLoc,Dir=0,step_x=0,step_y=0) //var/turf/T = src.loc //if (istype(T, /turf)) // T.firelevel = 0 //TODO: FIX - if (--src.life < 1) + + if (--life < 1) //SN src = null - delete() - if(newloc.density) + qdel(src) return 0 + .=..() /obj/effect/effect/water/Bump(atom/A) @@ -64,7 +52,6 @@ would spawn and follow the beaker, even if it is carried or thrown. reagents.reaction(A) return ..() - /datum/effect/effect/system var/number = 3 var/cardinals = 0 @@ -102,7 +89,6 @@ steam.start() -- spawns the effect ///////////////////////////////////////////// /obj/effect/effect/steam name = "steam" - icon = 'icons/effects/effects.dmi' icon_state = "extinguish" density = 0 @@ -131,7 +117,8 @@ steam.start() -- spawns the effect sleep(5) step(steam,direction) spawn(20) - if(steam) steam.delete() + if(steam) + qdel(steam) ///////////////////////////////////////////// //SPARK SYSTEM (like steam system) @@ -144,8 +131,7 @@ steam.start() -- spawns the effect name = "sparks" desc = "it's a spark what do you need to know?" icon_state = "sparks" - anchored = 1.0 - mouse_opacity = 0 + anchored = 1 var/inertia_dir = 0 var/energy = 0 @@ -166,9 +152,9 @@ steam.start() -- spawns the effect var/turf/T = src.loc if (istype(T, /turf)) - T.hotspot_expose(1000,100) + T.hotspot_expose(1000, 100) + ..() - return /obj/effect/effect/sparks/Move() ..() @@ -223,8 +209,7 @@ steam.start() -- spawns the effect name = "smoke" icon_state = "smoke" opacity = 1 - anchored = 0.0 - mouse_opacity = 0 + anchored = 0 var/amount = 6.0 var/time_to_live = 100 @@ -234,10 +219,9 @@ steam.start() -- spawns the effect pixel_y = -32 /obj/effect/effect/smoke/New() - ..() - spawn (time_to_live) - delete() - return + . = ..() + spawn(time_to_live) + qdel(src) /obj/effect/effect/smoke/HasEntered(mob/living/carbon/M as mob ) ..() @@ -372,7 +356,7 @@ steam.start() -- spawns the effect sleep(10) step(smoke,direction) spawn(smoke.time_to_live*0.75+rand(10,30)) - if (smoke) smoke.delete() + if (smoke) qdel(smoke) src.total_smoke-- @@ -490,7 +474,7 @@ steam.start() -- spawns the effect sleep(10) step(smoke,direction) spawn(150+rand(10,30)) - if(smoke) smoke.delete() + if(smoke) qdel(smoke) src.total_smoke-- // Goon compat. @@ -558,7 +542,7 @@ steam.start() -- spawns the effect flick("ion_fade", I) I.icon_state = "blank" spawn( 20 ) - if(I) I.delete() + if(I) qdel(I) spawn(2) if(src.on) src.processing = 1 @@ -617,8 +601,8 @@ steam.start() -- spawns the effect I.icon_state = "blank" II.icon_state = "blank" spawn( 20 ) - if(I) I.delete() - if(II) II.delete() + if(I) qdel(I) + if(II) qdel(II) spawn(2) if(src.on) src.processing = 1 @@ -658,7 +642,7 @@ steam.start() -- spawns the effect src.oldposition = get_turf(holder) I.dir = src.holder.dir spawn(10) - if(I) I.delete() + if(I) qdel(I) src.number-- spawn(2) if(src.on) @@ -687,15 +671,13 @@ steam.start() -- spawns the effect anchored = 1 density = 0 layer = OBJ_LAYER + 0.9 - mouse_opacity = 0 var/amount = 3 var/expand = 1 animate_movement = 0 var/metal = 0 - /obj/effect/effect/foam/New(loc, var/ismetal=0) - ..(loc) + . = ..(loc) icon_state = "[ismetal ? "m":""]foam" metal = ismetal playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3) @@ -712,8 +694,7 @@ steam.start() -- spawns the effect flick("[icon_state]-disolve", src) sleep(5) - delete() - return + qdel(src) // on delete, transfer any reagents to the floor /obj/effect/effect/foam/Destroy() @@ -758,7 +739,7 @@ steam.start() -- spawns the effect flick("[icon_state]-disolve", src) spawn(5) - delete() + qdel(src) /obj/effect/effect/foam/HasEntered(var/atom/movable/AM) @@ -837,18 +818,6 @@ steam.start() -- spawns the effect desc = "A lightweight foamed metal wall." var/metal = 1 // 1=aluminum, 2=iron - New() - ..() - update_nearby_tiles() - - - - Destroy() - - density = 0 - update_nearby_tiles() - ..() - proc/updateicon() if(metal == 1) icon_state = "metalfoam" @@ -920,6 +889,14 @@ steam.start() -- spawns the effect return 1 +/obj/structure/foamedmetal/New() + . = ..() + update_nearby_tiles() + +/obj/structure/foamedmetal/Destroy() + update_nearby_tiles() + ..() + /datum/effect/effect/system/reagents_explosion var/amount // TNT equivalent var/flashing = 0 // does explosion creates flash effect? diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 8bff463e445..11359495e61 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -15,7 +15,7 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0) pulse.name = "emp pulse" pulse.anchored = 1 spawn(20) - pulse.delete() + qdel(pulse) if(heavy_range > light_range) light_range = heavy_range diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index af7431562de..608e64db4bd 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -45,9 +45,6 @@ if(istype(src.loc, /mob)) var/mob/H = src.loc H.drop_from_inventory(src) // items at the very least get unequipped from their mob before being deleted - if(reagents && istype(reagents)) - reagents.my_atom = null - reagents.delete() if(hasvar(src, "holder")) src:holder = null /* BROKEN, FUCK BYOND diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 893cd472aa7..195f1e301a0 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -47,7 +47,7 @@ var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) - spawn(8) T.delete() + spawn(8) qdel(T) else playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) var/obj/O = new saved_item(src) @@ -59,7 +59,7 @@ var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) - spawn(8) T.delete() + spawn(8) qdel(T) /obj/item/device/chameleon/proc/disrupt(var/delete_dummy = 1) if(active_dummy) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index c6a243a8226..adad135052c 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -603,11 +603,12 @@ datum //world << "reagent data set ([reagent_id])" D.data = new_data - delete() - for(var/datum/reagent/R in reagent_list) - R.holder = null - if(my_atom) - my_atom.reagents = null +/datum/reagents/Destroy() + for(var/datum/reagent/reagent in reagent_list) + reagent.holder = null + + if(my_atom) + my_atom = null /////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index a120845c27e..1ccae500116 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -66,7 +66,7 @@ D.reagents.reaction(A_turf) sleep(2) sleep(3) - D.reagents.delete() + D.reagents.Destroy() D.loc = null playsound(get_turf(src), 'sound/effects/spray2.ogg', 50, 1, -6)