diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 43429420c0..7115c77a61 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -203,3 +203,15 @@ //usually called via datum/controller/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) //should attempt to salvage what it can from the old instance of subsystem /datum/controller/subsystem/Recover() + +// Suspends this subsystem from being queued for running. If already in the queue, sleeps until idle. Returns FALSE if the subsystem was already suspended. +/datum/controller/subsystem/proc/suspend() + . = (can_fire > 0) // Return true if we were previously runnable, false if previously suspended. + can_fire = FALSE + // Safely sleep in a loop until the subsystem is idle, (or its been un-suspended somehow) + while(can_fire <= 0 && state != SS_IDLE) + stoplag() // Safely sleep in a loop until + +// Wakes a suspended subsystem. +/datum/controller/subsystem/proc/wake() + can_fire = TRUE diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index 903dc58b8d..5fa66e3b47 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -41,6 +41,7 @@ var/prev_shuttle_queue_state = SSshuttles.block_init_queue SSshuttles.block_init_queue = TRUE + var/machinery_was_awake = SSmachines.suspend() // Suspend machinery (if it was not already suspended) var/list/atom/atoms = list() var/list/area/areas = list() @@ -74,6 +75,8 @@ var/area/A = I A.power_change() + if(machinery_was_awake) + SSmachines.wake() // Wake only if it was awake before we tried to suspended it. SSshuttles.block_init_queue = prev_shuttle_queue_state SSshuttles.process_init_queues() // We will flush the queue unless there were other blockers, in which case they will do it.