diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index c053529959f..5ab04a30a43 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -26,7 +26,6 @@ var/area_uid var/id_tag = null - var/hibernate = 0 //Do we even process? var/pump_direction = 1 //0 = siphoning, 1 = releasing var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND @@ -99,6 +98,7 @@ /obj/machinery/atmospherics/unary/vent_pump/Destroy() + SSmachines.wake_vent(WEAKREF(src)) // So we are removed from hibernating list unregister_radio(src, frequency) if(initial_loc) initial_loc.air_vent_info -= id_tag @@ -204,9 +204,6 @@ /obj/machinery/atmospherics/unary/vent_pump/process() ..() - if (hibernate) - return 1 - if (!node) update_use_power(USE_POWER_OFF) if(!can_pump()) @@ -237,9 +234,7 @@ if(pump_direction && pressure_checks == PRESSURE_CHECK_EXTERNAL && Master.iteration > 10) //99% of all vents //Fucking hibernate because you ain't doing shit. - hibernate = 1 - addtimer(VARSET_CALLBACK(src, hibernate, 0), rand(10 SECONDS,20 SECONDS), TIMER_DELETE_ME) //hibernate randomly - + SSmachines.hibernate_vent(src) if (power_draw >= 0) last_power_draw = power_draw @@ -318,7 +313,7 @@ if(stat & (NOPOWER|BROKEN)) return - hibernate = 0 + SSmachines.wake_vent(WEAKREF(src)) //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 755cc29f137..d52225e3dfd 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -18,7 +18,6 @@ var/frequency = 1439 var/datum/radio_frequency/radio_connection - var/hibernate = 0 //Do we even process? var/scrubbing = 1 //0 = siphoning, 1 = scrubbing var/list/scrubbing_gas = list(GAS_CO2, GAS_PHORON) @@ -50,6 +49,7 @@ id_tag = num2text(uid) /obj/machinery/atmospherics/unary/vent_scrubber/Destroy() + SSmachines.wake_vent(WEAKREF(src)) // So we are removed from hibernating list unregister_radio(src, frequency) if(initial_loc) initial_loc.air_scrub_info -= id_tag @@ -137,9 +137,6 @@ /obj/machinery/atmospherics/unary/vent_scrubber/process() ..() - if (hibernate) - return 1 - if (!node) update_use_power(USE_POWER_OFF) //broadcast_status() @@ -162,8 +159,7 @@ if(scrubbing && power_draw < 0 && Master.iteration > 10) //99% of all scrubbers //Fucking hibernate because you ain't doing shit. - hibernate = 1 - addtimer(VARSET_CALLBACK(src, hibernate, 0), rand(10 SECONDS,20 SECONDS), TIMER_DELETE_ME) //hibernate randomly + SSmachines.hibernate_vent(src) if (power_draw >= 0) last_power_draw = power_draw diff --git a/code/controllers/subsystems/machines.dm b/code/controllers/subsystems/machines.dm index 5fc3e67f948..a8d9f845b2d 100644 --- a/code/controllers/subsystems/machines.dm +++ b/code/controllers/subsystems/machines.dm @@ -24,6 +24,7 @@ SUBSYSTEM_DEF(machines) var/list/current_run = list() var/list/all_machines = list() + var/list/hibernating_vents = list() var/list/networks = list() var/list/processing_machines = list() @@ -93,6 +94,7 @@ SUBSYSTEM_DEF(machines) msg += "MC:[SSmachines.processing_machines.len]|" msg += "PN:[SSmachines.powernets.len]|" msg += "PO:[SSmachines.powerobjs.len]|" + msg += "HV:[SSmachines.hibernating_vents.len]|" msg += "MC/MS:[round((cost ? SSmachines.processing_machines.len/cost_machinery : 0),0.1)]" return ..() @@ -115,6 +117,7 @@ SUBSYSTEM_DEF(machines) /datum/controller/subsystem/machines/proc/process_machinery(resumed = 0) if (!resumed) + update_hibernating_vents() src.current_run = processing_machines.Copy() var/wait = src.wait @@ -186,6 +189,40 @@ SUBSYSTEM_DEF(machines) powernets = SSmachines.powernets powerobjs = SSmachines.powerobjs +/datum/controller/subsystem/machines/proc/update_hibernating_vents() + // pick at random + var/i = rand(20,40) + while(i-- > 0) + if(!hibernating_vents.len) + break + wake_vent(hibernating_vents[pick(hibernating_vents)]) + // do first 10 entries + i = 10 + for(var/key in hibernating_vents) + if(i <= 0 || !hibernating_vents.len) + break + wake_vent(hibernating_vents[key]) + i-- + +/datum/controller/subsystem/machines/proc/hibernate_vent(var/obj/machinery/atmospherics/unary/V) + if(!V) + return + var/datum/weakref/WR = WEAKREF(V) + if(!WR) + return + hibernating_vents[WR.reference] = WR + STOP_MACHINE_PROCESSING(V) + +/datum/controller/subsystem/machines/proc/wake_vent(var/datum/weakref/WR) + if(!WR) + return + var/obj/machinery/atmospherics/unary/V = WR.resolve() + if(V) + START_MACHINE_PROCESSING(V) + if(WR.reference) + hibernating_vents[WR.reference] = null + hibernating_vents.Remove(WR.reference) + #undef SSMACHINES_PIPENETS #undef SSMACHINES_MACHINERY #undef SSMACHINES_POWERNETS