diff --git a/init.lua b/init.lua index 98254cb..3a95abe 100644 --- a/init.lua +++ b/init.lua @@ -131,6 +131,11 @@ modlib = setmetatable({ modlib.mod = minetest and dofile(get_resource(modlib.modname, "mod.lua")) +-- HACK force load minetest/gametime.lua to ensure that the globalstep is registered earlier than globalsteps of mods depending on modlib +if minetest then + dofile(get_resource(modlib.modname, "minetest", "gametime.lua")) +end + if minetest then local ie = minetest.request_insecure_environment() if ie then diff --git a/minetest.lua b/minetest.lua index cffa9be..b35951d 100644 --- a/minetest.lua +++ b/minetest.lua @@ -2,6 +2,7 @@ local _ENV = setmetatable({}, {__index = _G}) local function load(filename) assert(loadfile(modlib.mod.get_resource(modlib.modname, "minetest", filename .. ".lua")))(_ENV) end +-- minetest/gametime.lua is forceloaded in init.lua load"misc" load"collisionboxes" load"liquid" diff --git a/minetest/gametime.lua b/minetest/gametime.lua new file mode 100644 index 0000000..ebe44aa --- /dev/null +++ b/minetest/gametime.lua @@ -0,0 +1,16 @@ +local gametime +minetest.register_globalstep(function(dtime) + if gametime then + gametime = gametime + dtime + return + end + gametime = assert(minetest.get_gametime()) + function modlib.minetest.get_gametime() + local imprecise_gametime = minetest.get_gametime() + if imprecise_gametime > gametime then + minetest.log("warning", "modlib.minetest.get_gametime(): Called after increment and before first globalstep") + return imprecise_gametime + end + return gametime + end +end) \ No newline at end of file diff --git a/minetest/misc.lua b/minetest/misc.lua index d0dc3de..7ec823c 100644 --- a/minetest/misc.lua +++ b/minetest/misc.lua @@ -12,37 +12,6 @@ function override(function_name, function_builder) minetest[function_name] = function_builder(func) end --- TODO fix modlib.minetest.get_gametime() messing up responsible "mod" determined by engine on crash -get_gametime = minetest.get_gametime -local get_gametime_initialized -local function get_gametime_init(dtime) - if get_gametime_initialized then - -- if the profiler is being used, the globalstep can't be unregistered - return - end - get_gametime_initialized = true - local gametime = minetest.get_gametime() - assert(gametime) - function modlib.minetest.get_gametime() - local imprecise_gametime = minetest.get_gametime() - if imprecise_gametime > gametime then - minetest.log("warning", "modlib.minetest.get_gametime(): Called after increment and before first globalstep") - return imprecise_gametime - end - return gametime - end - for index, globalstep in pairs(minetest.registered_globalsteps) do - if globalstep == get_gametime_init then - -- globalsteps of mods which depend on modlib will execute after this - minetest.registered_globalsteps[index] = function(dtime) - gametime = gametime + dtime - end - break - end - end -end -minetest.register_globalstep(get_gametime_init) - delta_times={} delays={} callbacks={}