mirror of https://github.com/minetest/minetest.git
CSM: add core.after function
* core.after is shared code between client & server * ModApiUtil get_us_time feature enabled for client
This commit is contained in:
parent
f0154c7912
commit
afad90ec41
|
@ -4,6 +4,7 @@ local clientpath = scriptpath.."client"..DIR_DELIM
|
||||||
local commonpath = scriptpath.."common"..DIR_DELIM
|
local commonpath = scriptpath.."common"..DIR_DELIM
|
||||||
|
|
||||||
dofile(clientpath .. "register.lua")
|
dofile(clientpath .. "register.lua")
|
||||||
|
dofile(commonpath .. "after.lua")
|
||||||
dofile(commonpath .. "chatcommands.lua")
|
dofile(commonpath .. "chatcommands.lua")
|
||||||
dofile(clientpath .. "preview.lua")
|
dofile(clientpath .. "preview.lua")
|
||||||
|
|
||||||
|
|
|
@ -37,3 +37,6 @@ core.register_chatcommand("dump", {
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
core.after(2, function()
|
||||||
|
print("After 2")
|
||||||
|
end)
|
||||||
|
|
|
@ -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
|
|
@ -17,6 +17,7 @@ if core.setting_getbool("profiler.load") then
|
||||||
profiler = dofile(scriptpath.."profiler"..DIR_DELIM.."init.lua")
|
profiler = dofile(scriptpath.."profiler"..DIR_DELIM.."init.lua")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
dofile(commonpath .. "after.lua")
|
||||||
dofile(gamepath.."item_entity.lua")
|
dofile(gamepath.."item_entity.lua")
|
||||||
dofile(gamepath.."deprecated.lua")
|
dofile(gamepath.."deprecated.lua")
|
||||||
dofile(gamepath.."misc.lua")
|
dofile(gamepath.."misc.lua")
|
||||||
|
|
|
@ -4,50 +4,6 @@
|
||||||
-- Misc. API functions
|
-- Misc. API functions
|
||||||
--
|
--
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
function core.check_player_privs(name, ...)
|
function core.check_player_privs(name, ...)
|
||||||
local arg_type = type(name)
|
local arg_type = type(name)
|
||||||
if (arg_type == "userdata" or arg_type == "table") and
|
if (arg_type == "userdata" or arg_type == "table") and
|
||||||
|
|
|
@ -706,6 +706,11 @@ Call these functions only at load time!
|
||||||
* `parameters` is a sound parameter table
|
* `parameters` is a sound parameter table
|
||||||
* `minetest.sound_stop(handle)`
|
* `minetest.sound_stop(handle)`
|
||||||
|
|
||||||
|
### Timing
|
||||||
|
* `minetest.after(time, func, ...)`
|
||||||
|
* Call the function `func` after `time` seconds, may be fractional
|
||||||
|
* Optional: Variable number of arguments that are passed to `func`
|
||||||
|
|
||||||
### Misc.
|
### Misc.
|
||||||
* `minetest.parse_json(string[, nullvalue])`: returns something
|
* `minetest.parse_json(string[, nullvalue])`: returns something
|
||||||
* Convert a string containing JSON data into the Lua equivalent
|
* Convert a string containing JSON data into the Lua equivalent
|
||||||
|
|
|
@ -530,6 +530,8 @@ void ModApiUtil::InitializeClient(lua_State *L, int top)
|
||||||
{
|
{
|
||||||
API_FCT(log);
|
API_FCT(log);
|
||||||
|
|
||||||
|
API_FCT(get_us_time);
|
||||||
|
|
||||||
API_FCT(setting_set);
|
API_FCT(setting_set);
|
||||||
API_FCT(setting_get);
|
API_FCT(setting_get);
|
||||||
API_FCT(setting_setbool);
|
API_FCT(setting_setbool);
|
||||||
|
|
Loading…
Reference in New Issue