ABM optimizations, doors cleanup, sponge small fixes

This commit is contained in:
MoNTE48 2019-06-29 01:46:24 +02:00
parent 94c855455f
commit 9ea8b529f1
2 changed files with 16 additions and 8 deletions

View File

@ -1,33 +1,41 @@
local jobs = {} local jobs = {}
local time = 0.0 local time = 0.0
local time_next = math.huge
core.register_globalstep(function(dtime) core.register_globalstep(function(dtime)
time = time + dtime time = time + dtime
if #jobs < 1 then if time < time_next then
return return
end end
time_next = math.huge
-- Iterate backwards so that we miss any new timers added by -- Iterate backwards so that we miss any new timers added by
-- a timer callback, and so that we don't skip the next timer -- a timer callback.
-- in the list if we remove one.
for i = #jobs, 1, -1 do for i = #jobs, 1, -1 do
local job = jobs[i] local job = jobs[i]
if time >= job.expire then if time >= job.expire then
core.set_last_run_mod(job.mod_origin) core.set_last_run_mod(job.mod_origin)
job.func(unpack(job.arg)) job.func(unpack(job.arg))
table.remove(jobs, i) local jobs_l = #jobs
jobs[i] = jobs[jobs_l]
jobs[jobs_l] = nil
elseif job.expire < time_next then
time_next = job.expire
end end
end end
end) end)
function core.after(after, func, ...) function core.after(after, func, ...)
assert(tonumber(after) and type(func) == "function", assert(tonumber(after) and type(func) == "function",
"Invalid core.after invocation") "Invalid minetest.after invocation")
local expire = time + after
jobs[#jobs + 1] = { jobs[#jobs + 1] = {
func = func, func = func,
expire = time + after, expire = expire,
arg = {...}, arg = {...},
mod_origin = core.get_last_run_mod() mod_origin = core.get_last_run_mod()
} }
time_next = math.min(time_next, expire)
end end

View File

@ -187,7 +187,7 @@ end)
local time = 0 local time = 0
local update_time = 0.5 local update_time = 1
core.register_globalstep(function(dtime) core.register_globalstep(function(dtime)
time = time + dtime time = time + dtime
if time > update_time then if time > update_time then