Skip to content

Instantly share code, notes, and snippets.

@sofar
Last active March 9, 2022 00:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sofar/32bf4525a0060e6be0f7c82cf154074e to your computer and use it in GitHub Desktop.
Save sofar/32bf4525a0060e6be0f7c82cf154074e to your computer and use it in GitHub Desktop.
--[[
Timer - a high precision, saveable timer class
Copyright (C) 2017 - Auke Kok <sofar@foo-projects.org
"timer" is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1
of the license, or (at your option) any later version.
]]--
---
--- static data: active timers
---
local timers = {}
---
--- Timer class
---
Timer = {}
Timer.__index = Timer
setmetatable(Timer, {
__call = function(c, ...)
return c.new(...)
end,
})
function Timer.new(name_or_table, interval, repeats)
print("new")
local self = setmetatable({}, Timer)
self.modname = minetest.get_current_modname()
if type(name_or_table) == "table" then
self.name = name_or_table.name
self.interval = name_or_table.interval
self.repeats = name_or_table.repeats
self.active = name_or_table.active
if self.active then
self.elapsed = name_or_table.elapsed or 0.0
end
elseif type(name_or_table) == "string" then
self.name = name_or_table
self.interval = interval
self.repeats = repeats or true
self.active = false
self.elapsed = 0.0
else
minetest.log("error", self.modname .. "Can't create new Timer without valid parameters")
return nil
end
if self.name == nil then
minetest.log("error", "Can't create new Timer without function name")
return false
elseif _G[self.name] == nil or type(_G[self.name]) ~= "function" then
minetest.log("error", "Can't create new Timer - incorrect function name passed")
return false
end
if type(name_or_table) == "table" and self.active then
self:start()
end
return self
end
function Timer:start()
print("start")
if self.active then
return
end
self.fn = _G[self.name]
self.active = true
self.registration = function(dtime)
print("step")
if self.active then
self.elapsed = self.elapsed + dtime
if self.elapsed > self.interval then
self:expire()
end
end
end
timers[self.registration] = true
end
function Timer:stop()
print("stop")
if self.active then
self.active = false
end
timers[self.registration] = nil
self.registration = nil
end
function Timer:set_interval(interval)
assert(self.active == false)
self.interval = interval
end
function Timer:expire()
print("expire")
self.fn()
self.elapsed = 0.0 + (self.interval - self.elapsed)
end
function Timer:to_table()
return {
name = self.name,
interval = self.interval,
repeats = self.repeats,
active = self.active,
elapsed = self.elapsed,
}
end
---
--- our globalstep function
---
minetest.register_globalstep(function(dtime)
for k, _ in pairs(timers) do
k(dtime)
end
end)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment