summaryrefslogtreecommitdiff
path: root/builtin/common/after.lua
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2017-06-03 14:55:10 -0400
committerShadowNinja <shadowninja@minetest.net>2017-06-03 14:55:10 -0400
commitcaecdb681c428c1aab9c0f7eec2570c0460f995c (patch)
treee5115982ea59bbf2343ba9b35bc4a0cfbb56f407 /builtin/common/after.lua
parent81d56b94919dceb7b2e51d70b21a7ca22f852bd5 (diff)
parent80dc961d24e1964e25d57039ddb2ba639f9f4d22 (diff)
downloadminetest-caecdb681c428c1aab9c0f7eec2570c0460f995c.tar.gz
minetest-caecdb681c428c1aab9c0f7eec2570c0460f995c.tar.bz2
minetest-caecdb681c428c1aab9c0f7eec2570c0460f995c.zip
Merge 0.4.16 into stable-0.4
Diffstat (limited to 'builtin/common/after.lua')
-rw-r--r--builtin/common/after.lua33
1 files changed, 33 insertions, 0 deletions
diff --git a/builtin/common/after.lua b/builtin/common/after.lua
new file mode 100644
index 000000000..cdfaaab86
--- /dev/null
+++ b/builtin/common/after.lua
@@ -0,0 +1,33 @@
+local jobs = {}
+local time = 0.0
+
+core.register_globalstep(function(dtime)
+ time = time + dtime
+
+ if #jobs < 1 then
+ return
+ end
+
+ -- Iterate backwards so that we miss any new timers added by
+ -- a timer callback, and so that we don't skip the next timer
+ -- in the list if we remove one.
+ for i = #jobs, 1, -1 do
+ local job = jobs[i]
+ if time >= job.expire then
+ core.set_last_run_mod(job.mod_origin)
+ job.func(unpack(job.arg))
+ table.remove(jobs, i)
+ end
+ end
+end)
+
+function core.after(after, func, ...)
+ assert(tonumber(after) and type(func) == "function",
+ "Invalid core.after invocation")
+ jobs[#jobs + 1] = {
+ func = func,
+ expire = time + after,
+ arg = {...},
+ mod_origin = core.get_last_run_mod()
+ }
+end