------------------------------- -- Action timers -- Mod handling action timers -- action_timers = {} action_timers.timers = {} action_timers.limits = {} action_timers.api = {} function action_timers.api.register_timer(name, limit) if action_timers.timers[name] then minetest.log("error", "[ACTimers] Cannot register timer " .. name .. " a second time") return elseif not limit then minetest.log("error", "[ACTimers] Cannot register timer " .. name .. " without limit") return end action_timers.timers[name] = limit action_timers.limits[name] = limit minetest.log("action", "[ACTimers] Timer " .. name .. " registered with time limit " .. limit) end function action_timers.api.do_action(name, func, params) if not action_timers.timers[name] then minetest.log("error", "[ACTimers] Timer " .. name .. " doesn't exist") return elseif not func then minetest.log("error", "[ACTimers] Function passed to time checker for " .. name .. " is nil") return elseif action_timers.timers[name] > 0 then minetest.log("error", "[ACTimers] Timer " .. name .. " is still up to 0") return action_timers.timers[name] end action_timers.timers[name] = action_timers.limits[name] if not params then return func() else return func(unpack(params)) end end function action_timers.api.get_timer(name) return action_timers.timers[name] end local function step() for name, _ in pairs(action_timers.timers) do if (action_timers.timers[name] > 0) then action_timers.timers[name] = action_timers.timers[name] - 1 end end minetest.after(1, step) end minetest.after(0, step) minetest.log("action", "[ACTimers] Loaded") function action_timers.wrapper(pname, name, timername, value, func, params) if not action_timers.api.get_timer(timername) then action_timers.api.register_timer(timername, value) return func(unpack(params)) else local res = action_timers.api.do_action(timername, func, params) if tonumber(res) then minetest.chat_send_player(pname, "Please retry later, you used " .. name .. " last time less than " .. value .. " seconds ago.") minetest.chat_send_player(pname, "Retry in: " .. math.floor(res) .. " seconds.") minetest.log("action", "[action_timers] Player " .. pname .. " tried to use'" .. name .. "' within forbidden interval.") return false elseif res == true then return res end end end