From 80ae2796b7c8cc4793f038d95f1d35cd6e4309dc Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 9 Feb 2016 08:45:56 -0500 Subject: [PATCH 1/3] Ports TG's Timer Controller --- code/controllers/Processes/timer.dm | 77 +++++++++++++++++++++++++++++ paradise.dme | 1 + 2 files changed, 78 insertions(+) create mode 100644 code/controllers/Processes/timer.dm diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm new file mode 100644 index 00000000000..0ee54b954ed --- /dev/null +++ b/code/controllers/Processes/timer.dm @@ -0,0 +1,77 @@ +var/global/datum/controller/process/timer/PStimer + +/datum/controller/process/timer + var/list/processing_timers = list() + var/list/hashes = list() + +/datum/controller/process/timer/setup() + name = "timer" + schedule_interval = 5 //every 0.5 seconds + PStimer = src + +/datum/controller/process/timer/statProcess() + ..() + stat(null, "[processing_timers.len] timers") + +/datum/controller/process/timer/doWork() + if(!processing_timers.len) + disabled = 1 //nothing to do, lets stop firing. + return + for(var/datum/timedevent/event in processing_timers) + if(!event.thingToCall || qdeleted(event.thingToCall)) + qdel(event) + if(event.timeToRun <= world.time) + spawn(-1) + call(event.thingToCall, event.procToCall)(arglist(event.argList)) + qdel(event) + SCHECK + +/datum/timedevent + var/thingToCall + var/procToCall + var/timeToRun + var/argList + var/id + var/hash + var/static/nextid = 1 + +/datum/timedevent/New() + id = nextid + nextid++ + +/datum/timedevent/Destroy() + PStimer.processing_timers -= src + PStimer.hashes -= hash + return QDEL_HINT_IWILLGC + +/proc/addtimer(thingToCall, procToCall, wait, unique = FALSE, ...) + if(!PStimer) //can't run timers before the mc has been created + return + if(!thingToCall || !procToCall || wait <= 0) + return + if(PStimer.disabled) + PStimer.disabled = 0 + + var/datum/timedevent/event = new() + event.thingToCall = thingToCall + event.procToCall = procToCall + event.timeToRun = world.time + wait + event.hash = list2text(args) + if(args.len > 4) + event.argList = args.Copy(5) + + // Check for dupes if unique = 1. + if(unique) + if(event.hash in PStimer.hashes) + return + // If we are unique (or we're not checking that), add the timer and return the id. + PStimer.processing_timers += event + PStimer.hashes += event.hash + return event.id + +/proc/deltimer(id) + for(var/datum/timedevent/event in PStimer.processing_timers) + if(event.id == id) + qdel(event) + return 1 + return 0 \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index e31271b9e11..8ffb6a10df8 100644 --- a/paradise.dme +++ b/paradise.dme @@ -167,6 +167,7 @@ #include "code\controllers\Processes\shuttles.dm" #include "code\controllers\Processes\sun.dm" #include "code\controllers\Processes\ticker.dm" +#include "code\controllers\Processes\timer.dm" #include "code\controllers\Processes\vote.dm" #include "code\controllers\Processes\shuttles\emergency.dm" #include "code\controllers\Processes\shuttles\supply.dm" From ba5433476ebfef811496bbdb848320f16a05439b Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 9 Feb 2016 22:40:33 -0500 Subject: [PATCH 2/3] faster loop --- code/controllers/Processes/timer.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm index 0ee54b954ed..426770a2ad9 100644 --- a/code/controllers/Processes/timer.dm +++ b/code/controllers/Processes/timer.dm @@ -17,7 +17,8 @@ var/global/datum/controller/process/timer/PStimer if(!processing_timers.len) disabled = 1 //nothing to do, lets stop firing. return - for(var/datum/timedevent/event in processing_timers) + for(last_object in processing_timers) + var/datum/timedevent/event = last_object if(!event.thingToCall || qdeleted(event.thingToCall)) qdel(event) if(event.timeToRun <= world.time) From 412952e2c6c0eb28baa389b70884cc62709abeed Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 11 Feb 2016 05:06:25 -0500 Subject: [PATCH 3/3] wait for it --- code/controllers/Processes/timer.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm index 426770a2ad9..8cea3c60514 100644 --- a/code/controllers/Processes/timer.dm +++ b/code/controllers/Processes/timer.dm @@ -22,11 +22,14 @@ var/global/datum/controller/process/timer/PStimer if(!event.thingToCall || qdeleted(event.thingToCall)) qdel(event) if(event.timeToRun <= world.time) - spawn(-1) - call(event.thingToCall, event.procToCall)(arglist(event.argList)) + runevent(event) qdel(event) SCHECK +/datum/controller/process/timer/proc/runevent(datum/timedevent/event) + set waitfor = 0 + call(event.thingToCall, event.procToCall)(arglist(event.argList)) + /datum/timedevent var/thingToCall var/procToCall