diff options
author | Loïc Blot <nerzhul@users.noreply.github.com> | 2017-01-22 11:17:41 +0100 |
---|---|---|
committer | Loïc Blot <nerzhul@users.noreply.github.com> | 2017-03-13 23:56:05 +0100 |
commit | 2c19d51409ca903021e0b508e5bc15299c4e51dc (patch) | |
tree | 8df932580abc289160aadbc40487099fd033c7d8 /builtin/common | |
parent | d7bc346981e189851e490f2417ed015a38bca79b (diff) | |
download | minetest-2c19d51409ca903021e0b508e5bc15299c4e51dc.tar.gz minetest-2c19d51409ca903021e0b508e5bc15299c4e51dc.tar.bz2 minetest-2c19d51409ca903021e0b508e5bc15299c4e51dc.zip |
[CSM] sound_play & sound_stop support + client_lua_api doc (#5096)
* squashed: CSM: Implement register_globalstep
* Re-use fatal error mechanism from server to disconnect client on CSM error
* Little client functions cleanups
* squashed: CSM: add core.after function
* core.after is shared code between client & server
* ModApiUtil get_us_time feature enabled for client
Diffstat (limited to 'builtin/common')
-rw-r--r-- | builtin/common/after.lua | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/builtin/common/after.lua b/builtin/common/after.lua new file mode 100644 index 000000000..30a9c7bad --- /dev/null +++ b/builtin/common/after.lua @@ -0,0 +1,43 @@ +local jobs = {} +local time = 0.0 +local last = core.get_us_time() / 1000000 + +core.register_globalstep(function(dtime) + local new = core.get_us_time() / 1000000 + if new > last then + time = time + (new - last) + else + -- Overflow, we may lose a little bit of time here but + -- only 1 tick max, potentially running timers slightly + -- too early. + time = time + new + end + last = new + + 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 |