diff --git a/code/controllers/garbage.dm b/code/controllers/garbage.dm index 412a4bdef10..c22cd9577c6 100644 --- a/code/controllers/garbage.dm +++ b/code/controllers/garbage.dm @@ -34,6 +34,7 @@ var/global/list/uncollectable_vars=list( "y", "z", ) + /datum/controller/garbage_collector var/list/queue=list() var/list/destroyed=list() @@ -82,19 +83,21 @@ var/global/list/uncollectable_vars=list( destroyed.Add("\ref[A]") queue.Remove(A) - proc/process() - for(var/i=0;i= world.time - GC_COLLECTION_TIMEOUT) - // Something's still referring to the qdel'd object. Kill it. - del(A) - destroyed.Remove(refID) +/datum/controller/garbage_collector/proc/process() + for (var/i = 0, ++i <= min(waiting, GC_COLLECTIONS_PER_TICK)) + if (waiting--) + Pop() + + for (var/i = 0, ++i <= min(destroyed.len, GC_COLLECTIONS_PER_TICK)) + if (destroyed.len) + var/refID = destroyed[1] + var/atom/A = locate(refID) + + if (A && A.gc_destroyed && A.gc_destroyed >= world.timeofday - GC_COLLECTION_TIMEOUT) + // Something's still referring to the qdel'd object. Kill it. + del A + + destroyed.Remove(refID) /** * NEVER USE THIS FOR ANYTHING OTHER THAN /atom/movable diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 26c67f062d8..9801447af4e 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -311,6 +311,7 @@ datum/controller/game_controller/proc/processMobs() #endif if(PROCESS_KILL == Machinery.process()) + Machinery.inMachineList = 0 Machinery.removeAtProcessing() continue diff --git a/code/datums/sun.dm b/code/datums/sun.dm index 687ae838788..caa2e5e5a5b 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -41,7 +41,7 @@ lastAngle = angle - if (!round(time / nextTime)) + if (world.time < nextTime) return nextTime += updatePer diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e6720a31796..c6e2eaf381f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -84,7 +84,7 @@ // Like Del(), but for qdel. // Called BEFORE qdel moves shit. /atom/proc/Destroy() - gc_destroyed=world.time + gc_destroyed = world.timeofday /atom/proc/assume_air(datum/gas_mixture/giver) return null diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 416e2198824..eac1a662f61 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -114,6 +114,8 @@ Class Procs: var/panel_open = 0 var/area/myArea + var/inMachineList = 1 // For debugging. + /obj/machinery/New() addAtProcessing() return ..() diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 581d1b1dcf9..f3eed9b3f70 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -28,6 +28,7 @@ log_admin("New singularity made, all touchers. [prints]. Last touched by [fingerprintslast].") new /obj/machinery/singularity/(get_turf(src), 50) + qdel(src) /obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench))