mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 02:16:05 +00:00
qdel and Destroy again.
This commit is contained in:
@@ -176,7 +176,7 @@ var/const/tk_maxrange = 15
|
||||
O.icon_state = "nothing"
|
||||
flick("empdisable",O)
|
||||
spawn(5)
|
||||
O.delete()
|
||||
qdel(O)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
DeleteFromProfiler()
|
||||
|
||||
//world << "[type] - [tag] - [x].[y].[z]"
|
||||
if(reagents)
|
||||
reagents.Destroy()
|
||||
reagents = null
|
||||
|
||||
density = 0
|
||||
|
||||
|
||||
@@ -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
|
||||
/////////////////////////////
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
pulse2.dir = pick(cardinal)
|
||||
|
||||
spawn(10)
|
||||
pulse2.delete()
|
||||
qdel(pulse2)
|
||||
if (on)
|
||||
turn_off()
|
||||
spawn(severity*300)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ Class Procs:
|
||||
pulse2.dir = pick(cardinal)
|
||||
|
||||
spawn(10)
|
||||
pulse2.delete()
|
||||
qdel(pulse2)
|
||||
..()
|
||||
|
||||
/obj/machinery/ex_act(severity)
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user