diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm new file mode 100644 index 00000000000..8cea3c60514 --- /dev/null +++ b/code/controllers/Processes/timer.dm @@ -0,0 +1,81 @@ +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(last_object in processing_timers) + var/datum/timedevent/event = last_object + if(!event.thingToCall || qdeleted(event.thingToCall)) + qdel(event) + if(event.timeToRun <= world.time) + 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 + 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 d65e0ad4547..0b932735ca4 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"