From f60c024b2a8e1926cf0aa991f1993cd4ff4c6516 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 14 Jun 2017 00:27:16 -0400 Subject: [PATCH] Fixes objects using walk_to() not being able to be garbage collected. * Okay evidently walk_to(A, B) doesn't stop when A reaches B, but keeps running in the background forever until it is manually canceled! Therefore in order to be garbage collected, we must cancel walking on any object that might have initiated it. * Fixes this on chemsmoke, spiders, and aiholos. * The same story applies to walk_towards; fixed for dust, meteors and immovablerod, and also to walk_away; fixed for flashbangs. * Also fixed chemsmoke actually getting qdeled at the right time. --- code/game/gamemodes/events/clang.dm | 4 ++++ code/game/gamemodes/events/dust.dm | 4 ++++ code/game/gamemodes/meteor/meteors.dm | 2 +- code/game/objects/effects/chem/chemsmoke.dm | 6 +++++- code/game/objects/effects/effect_system.dm | 6 ++++-- code/game/objects/effects/spiders.dm | 5 +++-- code/game/objects/items/weapons/grenades/flashbang.dm | 4 ++++ code/modules/vore/eating/silicon_vr.dm | 4 ++++ 8 files changed, 29 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/events/clang.dm b/code/game/gamemodes/events/clang.dm index 8ab197a1cb4..e88492e5d1a 100644 --- a/code/game/gamemodes/events/clang.dm +++ b/code/game/gamemodes/events/clang.dm @@ -41,6 +41,10 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(clong && prob(25)) src.loc = clong.loc + Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /proc/immovablerod() var/startx = 0 var/starty = 0 diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 2397ae1a142..d7d551396e4 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -90,6 +90,10 @@ The "dust" will damage the hull of the station causin minor hull breaches. walk_towards(src, goal, 1) return + Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + touch_map_edge() qdel(src) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index c5096d12d8b..f0135c53565 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -133,7 +133,7 @@ /obj/effect/meteor/Destroy() walk(src,0) //this cancels the walk_towards() proc - ..() + return ..() /obj/effect/meteor/New() ..() diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 45cfcc83488..be7e759a636 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -12,6 +12,10 @@ create_reagents(500) return +/obj/effect/effect/smoke/chem/Destroy() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /datum/effect/effect/system/smoke_spread/chem smoke_type = /obj/effect/effect/smoke/chem var/obj/chemholder @@ -166,7 +170,7 @@ sleep(150+rand(0,20)) // turning it off before it is deleted results in cleaner smoke.set_opacity(0) // lighting and view range updates fadeOut(smoke) - qdel(src) + qdel(smoke) /datum/effect/effect/system/smoke_spread/chem/spores/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1) var/obj/effect/effect/smoke/chem/spores = new /obj/effect/effect/smoke/chem(location) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 4c930d23cf2..a3b3ab81cbe 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -179,8 +179,10 @@ steam.start() -- spawns the effect /obj/effect/effect/smoke/New() ..() - spawn (time_to_live) - qdel(src) + if(time_to_live) + spawn (time_to_live) + if(!QDELETED(src)) + qdel(src) /obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob ) ..() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4396465bc98..c38b07f4020 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -94,7 +94,7 @@ var/obj/item/organ/external/O = loc O.implants -= src - ..() + return ..() /obj/effect/spider/eggcluster/process() amount_grown += rand(0,2) @@ -138,7 +138,8 @@ /obj/effect/spider/spiderling/Destroy() processing_objects -= src - ..() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() /obj/effect/spider/spiderling/Bump(atom/user) if(istype(user, /obj/structure/table)) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index d02ccf21854..940029e735d 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -91,6 +91,10 @@ M << "Your ears start to ring!" M.update_icons() +/obj/item/weapon/grenade/flashbang/Destroy() + walk(src, 0) // Because we might have called walk_away, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve desc = "Use of this weapon may constiute a war crime in your area, consult your local Colony Director." name = "clusterbang" diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm index 1324a5f9000..3cbb1c0e66f 100644 --- a/code/modules/vore/eating/silicon_vr.dm +++ b/code/modules/vore/eating/silicon_vr.dm @@ -11,6 +11,10 @@ color = HOLO_ORIGINAL_COLOR //This is the blue from icons.dm that it was before. desc = "A hologram representing an AI persona." +/obj/effect/overlay/aiholo/Destroy() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /obj/effect/overlay/aiholo/proc/get_prey(var/mob/living/prey) if(bellied) return playsound('sound/effects/stealthoff.ogg',50,0)