qdel and Destroy again.

This commit is contained in:
ESwordTheCat
2014-07-16 02:05:14 -08:00
parent 8ecfeb19e3
commit cec11d467e
15 changed files with 118 additions and 165 deletions

View File

@@ -176,7 +176,7 @@ var/const/tk_maxrange = 15
O.icon_state = "nothing" O.icon_state = "nothing"
flick("empdisable",O) flick("empdisable",O)
spawn(5) spawn(5)
O.delete() qdel(O)
return return

View File

@@ -21,63 +21,54 @@ var/datum/garbage_collector/garbageCollector
// To let them know how hardworking am I :^). // To let them know how hardworking am I :^).
var/dels_count = 0 var/dels_count = 0
var/hard_dels = 0 var/hard_dels = 0
var/processing = 1
/datum/garbage_collector/proc/addTrash(const/datum/D) /datum/garbage_collector/proc/addTrash(const/atom/movable/AM)
if(!D) if(isnull(AM) || !istype(AM))
return return
if(del_everything) if(del_everything)
del(D) del(AM)
hard_dels++ hard_dels++
dels_count++ dels_count++
return return
if(!istype(D, /atom/movable))
del(D)
hard_dels++
dels_count++
return
var/atom/movable/AM = D
var/timeofday = world.timeofday var/timeofday = world.timeofday
AM.timeDestroyed = timeofday AM.timeDestroyed = timeofday
queue -= "\ref[AM]" queue -= "\ref[AM]"
queue["\ref[AM]"] = timeofday queue["\ref[AM]"] = timeofday
/datum/garbage_collector/proc/process() /datum/garbage_collector/proc/process()
if(processing) var/remainingCollectionPerTick = GC_COLLECTIONS_PER_TICK
var/remainingCollectionPerTick = GC_COLLECTIONS_PER_TICK var/remainingForceDelPerTick = GC_FORCE_DEL_PER_TICK
var/remainingForceDelPerTick = GC_FORCE_DEL_PER_TICK var/collectionTimeScope = world.timeofday - GC_COLLECTION_TIMEOUT
var/collectionTimeScope = world.timeofday - GC_COLLECTION_TIMEOUT
while(queue.len && --remainingCollectionPerTick >= 0) while(queue.len && --remainingCollectionPerTick >= 0)
var/refID = queue[1] var/refID = queue[1]
var/destroyedAtTime = queue[refID] 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 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. gc_hard_del_types |= "[AM.type]"
if(A && A.timeDestroyed == destroyedAtTime)
if(remainingForceDelPerTick <= 0)
break
#ifdef GC_DEBUG del(AM)
WARNING("gc process force delete [A.type]")
#endif
gc_hard_del_types |= "[A.type]" hard_dels++
remainingForceDelPerTick--
del(A) queue.Cut(1, 2)
dels_count++
hard_dels++
remainingForceDelPerTick--
queue.Cut(1, 2)
dels_count++
#ifdef GC_DEBUG #ifdef GC_DEBUG
#undef GC_DEBUG #undef GC_DEBUG
@@ -87,31 +78,30 @@ var/datum/garbage_collector/garbageCollector
#undef GC_COLLECTION_TIMEOUT #undef GC_COLLECTION_TIMEOUT
#undef GC_COLLECTIONS_PER_TICK #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 return
if (!garbageCollector) if(isnull(garbageCollector))
del(O) del(AM)
return return
if (!istype(O, /datum)) if(!istype(AM))
del(O) WARNING("qdel() passed object of type [AM.type]. qdel() can only handle /atom/movable types.")
del(AM)
garbageCollector.hard_dels++ garbageCollector.hard_dels++
garbageCollector.dels_count++ garbageCollector.dels_count++
return return
var/datum/D = O if(isnull(AM.gcDestroyed))
if (isnull(D.gcDestroyed))
// Let our friend know they're about to get fucked up. // Let our friend know they're about to get fucked up.
D.Destroy() AM.Destroy()
garbageCollector.addTrash(D) garbageCollector.addTrash(AM)
/datum
// Garbage collection (qdel).
var/gcDestroyed
/datum/controller /datum/controller
var/processing = 0 var/processing = 0
@@ -124,21 +114,12 @@ var/datum/garbage_collector/garbageCollector
. = ..() . = ..()
tag = "[type]:NOGC" tag = "[type]:NOGC"
/datum/Del()
// Pass to Destroy().
if(isnull(gcDestroyed))
Destroy()
sleep(-1)
..()
/* /*
* Like Del(), but for qdel. * Like Del(), but for qdel.
* Called BEFORE qdel moves shit. * Called BEFORE qdel moves shit.
*/ */
/datum/proc/Destroy() /datum/proc/Destroy()
tag = null tag = null
gcDestroyed = "Bye world!"
/client/proc/qdel_toggle() /client/proc/qdel_toggle()
set name = "Toggle qdel Behavior" set name = "Toggle qdel Behavior"

View File

@@ -69,6 +69,9 @@
DeleteFromProfiler() DeleteFromProfiler()
//world << "[type] - [tag] - [x].[y].[z]" //world << "[type] - [tag] - [x].[y].[z]"
if(reagents)
reagents.Destroy()
reagents = null
density = 0 density = 0

View File

@@ -20,6 +20,7 @@
var/global/guid = 0 var/global/guid = 0
// Garbage collection (controller). // Garbage collection (controller).
var/gcDestroyed
var/timeDestroyed var/timeDestroyed
/atom/movable/New() /atom/movable/New()
@@ -27,6 +28,19 @@
areaMaster = get_area_master(src) areaMaster = get_area_master(src)
tag = "[++guid]" tag = "[++guid]"
/atom/movable/Destroy()
areaMaster = null
gcDestroyed = "Bye world!"
loc = null
..()
/atom/movable/Del()
// Pass to Destroy().
if(!gcDestroyed)
Destroy()
..()
/atom/movable/Move() /atom/movable/Move()
var/atom/A = src.loc var/atom/A = src.loc
. = ..() . = ..()
@@ -195,11 +209,6 @@
return src.master.attack_hand(a, b, c) return src.master.attack_hand(a, b, c)
return return
/atom/movable/Destroy()
areaMaster = null
loc = null
..()
///////////////////////////// /////////////////////////////
// SINGULOTH PULL REFACTOR // SINGULOTH PULL REFACTOR
///////////////////////////// /////////////////////////////

View File

@@ -143,7 +143,7 @@
pulse2.dir = pick(cardinal) pulse2.dir = pick(cardinal)
spawn(10) spawn(10)
pulse2.delete() qdel(pulse2)
if (on) if (on)
turn_off() turn_off()
spawn(severity*300) spawn(severity*300)

View File

@@ -866,7 +866,7 @@ Auto Patrol: []"},
pulse2.anchored = 1 pulse2.anchored = 1
pulse2.dir = pick(cardinal) pulse2.dir = pick(cardinal)
spawn(10) spawn(10)
pulse2.delete() qdel(pulse2)
var/list/mob/living/carbon/targets = new var/list/mob/living/carbon/targets = new
for (var/mob/living/carbon/C in view(12,src)) for (var/mob/living/carbon/C in view(12,src))
if (C.stat==2) if (C.stat==2)

View File

@@ -1160,7 +1160,7 @@ About the new airlock wires panel:
return return
/obj/machinery/door/airlock/New() /obj/machinery/door/airlock/New()
..() . = ..()
wires = new(src) wires = new(src)
if(src.closeOtherId != null) if(src.closeOtherId != null)
spawn (5) spawn (5)

View File

@@ -162,13 +162,10 @@
return return
door_animate("deny") door_animate("deny")
return
/obj/machinery/door/blob_act() /obj/machinery/door/blob_act()
if (prob(BLOB_PROBABILITY)) if(prob(BLOB_PROBABILITY))
src = null qdel(src)
return
/obj/machinery/door/proc/door_animate(var/animation as text) /obj/machinery/door/proc/door_animate(var/animation as text)
switch (animation) switch (animation)
@@ -267,16 +264,13 @@
if (!glass) if (!glass)
src.SetOpacity(1) src.SetOpacity(1)
// TODO: analyze this proc
update_nearby_tiles()
// TODO: rework how fire works on doors // TODO: rework how fire works on doors
var/obj/fire/F = locate() in loc var/obj/fire/F = locate() in loc
if (F) if(F)
F = null qdel(F)
update_nearby_tiles()
operating = 0 operating = 0
return
/obj/machinery/door/New() /obj/machinery/door/New()
. = ..() . = ..()
@@ -286,7 +280,6 @@
layer = 3.1 layer = 3.1
explosion_resistance = initial(explosion_resistance) explosion_resistance = initial(explosion_resistance)
update_heat_protection(get_turf(src))
else else
// under all objects if opened. 2.7 due to tables being at 2.6 // under all objects if opened. 2.7 due to tables being at 2.6
layer = 2.7 layer = 2.7
@@ -302,13 +295,10 @@
bound_height = width * world.icon_size bound_height = width * world.icon_size
update_nearby_tiles() update_nearby_tiles()
return
/obj/machinery/door/Destroy() /obj/machinery/door/Destroy()
density = 0
update_nearby_tiles() update_nearby_tiles()
..() ..()
return
/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) /obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group) return 0 if(air_group) return 0
@@ -345,17 +335,12 @@
return 1 return 1
/obj/machinery/door/proc/update_nearby_tiles() /obj/machinery/door/proc/update_nearby_tiles()
if (isnull(air_master)) if(!air_master)
return 0 return 0
var/T for(var/turf in locs)
update_heat_protection(turf)
for (T in locs.Copy()) air_master.mark_for_update(turf)
if (!isturf(T))
continue
update_heat_protection(T)
air_master.mark_for_update(T)
return 1 return 1

View File

@@ -147,7 +147,7 @@ Class Procs:
pulse2.dir = pick(cardinal) pulse2.dir = pick(cardinal)
spawn(10) spawn(10)
pulse2.delete() qdel(pulse2)
..() ..()
/obj/machinery/ex_act(severity) /obj/machinery/ex_act(severity)

View File

@@ -16,47 +16,35 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/effect/water /obj/effect/effect/water
name = "water" name = "water"
icon = 'icons/effects/effects.dmi'
icon_state = "extinguish" icon_state = "extinguish"
var/life = 15.0 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() /obj/effect/effect/water/New()
..() . = ..()
//var/turf/T = src.loc //var/turf/T = src.loc
//if (istype(T, /turf)) //if (istype(T, /turf))
// T.firelevel = 0 //TODO: FIX // T.firelevel = 0 //TODO: FIX
spawn( 70 )
delete() spawn(70)
return qdel(src)
return
/obj/effect/effect/water/Destroy() /obj/effect/effect/water/Destroy()
//var/turf/T = src.loc //var/turf/T = src.loc
//if (istype(T, /turf)) //if (istype(T, /turf))
// T.firelevel = 0 //TODO: FIX // 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 //var/turf/T = src.loc
//if (istype(T, /turf)) //if (istype(T, /turf))
// T.firelevel = 0 //TODO: FIX // T.firelevel = 0 //TODO: FIX
if (--src.life < 1)
if (--life < 1)
//SN src = null //SN src = null
delete() qdel(src)
if(newloc.density)
return 0 return 0
.=..() .=..()
/obj/effect/effect/water/Bump(atom/A) /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) reagents.reaction(A)
return ..() return ..()
/datum/effect/effect/system /datum/effect/effect/system
var/number = 3 var/number = 3
var/cardinals = 0 var/cardinals = 0
@@ -102,7 +89,6 @@ steam.start() -- spawns the effect
///////////////////////////////////////////// /////////////////////////////////////////////
/obj/effect/effect/steam /obj/effect/effect/steam
name = "steam" name = "steam"
icon = 'icons/effects/effects.dmi'
icon_state = "extinguish" icon_state = "extinguish"
density = 0 density = 0
@@ -131,7 +117,8 @@ steam.start() -- spawns the effect
sleep(5) sleep(5)
step(steam,direction) step(steam,direction)
spawn(20) spawn(20)
if(steam) steam.delete() if(steam)
qdel(steam)
///////////////////////////////////////////// /////////////////////////////////////////////
//SPARK SYSTEM (like steam system) //SPARK SYSTEM (like steam system)
@@ -144,8 +131,7 @@ steam.start() -- spawns the effect
name = "sparks" name = "sparks"
desc = "it's a spark what do you need to know?" desc = "it's a spark what do you need to know?"
icon_state = "sparks" icon_state = "sparks"
anchored = 1.0 anchored = 1
mouse_opacity = 0
var/inertia_dir = 0 var/inertia_dir = 0
var/energy = 0 var/energy = 0
@@ -166,9 +152,9 @@ steam.start() -- spawns the effect
var/turf/T = src.loc var/turf/T = src.loc
if (istype(T, /turf)) if (istype(T, /turf))
T.hotspot_expose(1000,100) T.hotspot_expose(1000, 100)
..() ..()
return
/obj/effect/effect/sparks/Move() /obj/effect/effect/sparks/Move()
..() ..()
@@ -223,8 +209,7 @@ steam.start() -- spawns the effect
name = "smoke" name = "smoke"
icon_state = "smoke" icon_state = "smoke"
opacity = 1 opacity = 1
anchored = 0.0 anchored = 0
mouse_opacity = 0
var/amount = 6.0 var/amount = 6.0
var/time_to_live = 100 var/time_to_live = 100
@@ -234,10 +219,9 @@ steam.start() -- spawns the effect
pixel_y = -32 pixel_y = -32
/obj/effect/effect/smoke/New() /obj/effect/effect/smoke/New()
..() . = ..()
spawn (time_to_live) spawn(time_to_live)
delete() qdel(src)
return
/obj/effect/effect/smoke/HasEntered(mob/living/carbon/M as mob ) /obj/effect/effect/smoke/HasEntered(mob/living/carbon/M as mob )
..() ..()
@@ -372,7 +356,7 @@ steam.start() -- spawns the effect
sleep(10) sleep(10)
step(smoke,direction) step(smoke,direction)
spawn(smoke.time_to_live*0.75+rand(10,30)) spawn(smoke.time_to_live*0.75+rand(10,30))
if (smoke) smoke.delete() if (smoke) qdel(smoke)
src.total_smoke-- src.total_smoke--
@@ -490,7 +474,7 @@ steam.start() -- spawns the effect
sleep(10) sleep(10)
step(smoke,direction) step(smoke,direction)
spawn(150+rand(10,30)) spawn(150+rand(10,30))
if(smoke) smoke.delete() if(smoke) qdel(smoke)
src.total_smoke-- src.total_smoke--
// Goon compat. // Goon compat.
@@ -558,7 +542,7 @@ steam.start() -- spawns the effect
flick("ion_fade", I) flick("ion_fade", I)
I.icon_state = "blank" I.icon_state = "blank"
spawn( 20 ) spawn( 20 )
if(I) I.delete() if(I) qdel(I)
spawn(2) spawn(2)
if(src.on) if(src.on)
src.processing = 1 src.processing = 1
@@ -617,8 +601,8 @@ steam.start() -- spawns the effect
I.icon_state = "blank" I.icon_state = "blank"
II.icon_state = "blank" II.icon_state = "blank"
spawn( 20 ) spawn( 20 )
if(I) I.delete() if(I) qdel(I)
if(II) II.delete() if(II) qdel(II)
spawn(2) spawn(2)
if(src.on) if(src.on)
src.processing = 1 src.processing = 1
@@ -658,7 +642,7 @@ steam.start() -- spawns the effect
src.oldposition = get_turf(holder) src.oldposition = get_turf(holder)
I.dir = src.holder.dir I.dir = src.holder.dir
spawn(10) spawn(10)
if(I) I.delete() if(I) qdel(I)
src.number-- src.number--
spawn(2) spawn(2)
if(src.on) if(src.on)
@@ -687,15 +671,13 @@ steam.start() -- spawns the effect
anchored = 1 anchored = 1
density = 0 density = 0
layer = OBJ_LAYER + 0.9 layer = OBJ_LAYER + 0.9
mouse_opacity = 0
var/amount = 3 var/amount = 3
var/expand = 1 var/expand = 1
animate_movement = 0 animate_movement = 0
var/metal = 0 var/metal = 0
/obj/effect/effect/foam/New(loc, var/ismetal=0) /obj/effect/effect/foam/New(loc, var/ismetal=0)
..(loc) . = ..(loc)
icon_state = "[ismetal ? "m":""]foam" icon_state = "[ismetal ? "m":""]foam"
metal = ismetal metal = ismetal
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3) playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
@@ -712,8 +694,7 @@ steam.start() -- spawns the effect
flick("[icon_state]-disolve", src) flick("[icon_state]-disolve", src)
sleep(5) sleep(5)
delete() qdel(src)
return
// on delete, transfer any reagents to the floor // on delete, transfer any reagents to the floor
/obj/effect/effect/foam/Destroy() /obj/effect/effect/foam/Destroy()
@@ -758,7 +739,7 @@ steam.start() -- spawns the effect
flick("[icon_state]-disolve", src) flick("[icon_state]-disolve", src)
spawn(5) spawn(5)
delete() qdel(src)
/obj/effect/effect/foam/HasEntered(var/atom/movable/AM) /obj/effect/effect/foam/HasEntered(var/atom/movable/AM)
@@ -837,18 +818,6 @@ steam.start() -- spawns the effect
desc = "A lightweight foamed metal wall." desc = "A lightweight foamed metal wall."
var/metal = 1 // 1=aluminum, 2=iron var/metal = 1 // 1=aluminum, 2=iron
New()
..()
update_nearby_tiles()
Destroy()
density = 0
update_nearby_tiles()
..()
proc/updateicon() proc/updateicon()
if(metal == 1) if(metal == 1)
icon_state = "metalfoam" icon_state = "metalfoam"
@@ -920,6 +889,14 @@ steam.start() -- spawns the effect
return 1 return 1
/obj/structure/foamedmetal/New()
. = ..()
update_nearby_tiles()
/obj/structure/foamedmetal/Destroy()
update_nearby_tiles()
..()
/datum/effect/effect/system/reagents_explosion /datum/effect/effect/system/reagents_explosion
var/amount // TNT equivalent var/amount // TNT equivalent
var/flashing = 0 // does explosion creates flash effect? var/flashing = 0 // does explosion creates flash effect?

View File

@@ -15,7 +15,7 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
pulse.name = "emp pulse" pulse.name = "emp pulse"
pulse.anchored = 1 pulse.anchored = 1
spawn(20) spawn(20)
pulse.delete() qdel(pulse)
if(heavy_range > light_range) if(heavy_range > light_range)
light_range = heavy_range light_range = heavy_range

View File

@@ -45,9 +45,6 @@
if(istype(src.loc, /mob)) if(istype(src.loc, /mob))
var/mob/H = src.loc var/mob/H = src.loc
H.drop_from_inventory(src) // items at the very least get unequipped from their mob before being deleted 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")) if(hasvar(src, "holder"))
src:holder = null src:holder = null
/* BROKEN, FUCK BYOND /* BROKEN, FUCK BYOND

View File

@@ -47,7 +47,7 @@
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
T.icon = 'icons/effects/effects.dmi' T.icon = 'icons/effects/effects.dmi'
flick("emppulse",T) flick("emppulse",T)
spawn(8) T.delete() spawn(8) qdel(T)
else else
playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
var/obj/O = new saved_item(src) var/obj/O = new saved_item(src)
@@ -59,7 +59,7 @@
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
T.icon = 'icons/effects/effects.dmi' T.icon = 'icons/effects/effects.dmi'
flick("emppulse",T) flick("emppulse",T)
spawn(8) T.delete() spawn(8) qdel(T)
/obj/item/device/chameleon/proc/disrupt(var/delete_dummy = 1) /obj/item/device/chameleon/proc/disrupt(var/delete_dummy = 1)
if(active_dummy) if(active_dummy)

View File

@@ -603,11 +603,12 @@ datum
//world << "reagent data set ([reagent_id])" //world << "reagent data set ([reagent_id])"
D.data = new_data D.data = new_data
delete() /datum/reagents/Destroy()
for(var/datum/reagent/R in reagent_list) for(var/datum/reagent/reagent in reagent_list)
R.holder = null reagent.holder = null
if(my_atom)
my_atom.reagents = null if(my_atom)
my_atom = null
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////

View File

@@ -66,7 +66,7 @@
D.reagents.reaction(A_turf) D.reagents.reaction(A_turf)
sleep(2) sleep(2)
sleep(3) sleep(3)
D.reagents.delete() D.reagents.Destroy()
D.loc = null D.loc = null
playsound(get_turf(src), 'sound/effects/spray2.ogg', 50, 1, -6) playsound(get_turf(src), 'sound/effects/spray2.ogg', 50, 1, -6)