From 8dba8b3cfb14dc029b89476af7fe1256f6c0ada8 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 19 Mar 2019 20:03:22 -0700 Subject: [PATCH] New trigger queue management. No longer "merges" triggers to the same node. Rate limits triggers. 16/s max. After that, exponentially decay limit triggers for a while to each node. Tight loop circuits are controlled well this way. Some larger loops will continue to function. --- mods/mech/init.lua | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/mods/mech/init.lua b/mods/mech/init.lua index c40127c..09d71a6 100644 --- a/mods/mech/init.lua +++ b/mods/mech/init.lua @@ -45,20 +45,45 @@ local function dehash_vector(s) end local defer_tbl = {} +local rate_tbl = {} +local rate_time = 1.0 minetest.register_globalstep(function(dtime) local t = table.copy(defer_tbl) defer_tbl = {} - for pos, func in pairs(t) do - func(minetest.string_to_pos(pos)) + for _, item in pairs(t) do + item.func(item.pos) + end + + -- prune rate_tbl occasionally + rate_time = rate_time - dtime + if rate_time > 0 then + return + end + rate_time = 1.0 + + -- simple decay prune + local count = 0 + for k, v in pairs(rate_tbl) do + count = count + 1 + if v > 1 then + rate_tbl[k] = math.floor(v / 2) + else + rate_tbl[k] = nil + end end end) local function defer(pos, func) local p = minetest.pos_to_string(pos) - if not defer_tbl[p] then - defer_tbl[p] = func + + local r = rate_tbl[p] or 1 + rate_tbl[p] = r + 1 + if r > 15 then + return end + + defer_tbl[#defer_tbl + 1] = {pos = pos, func = func} end function mech.trigger(pos) -- 2.11.4.GIT