97 lines
2.3 KiB
Lua
97 lines
2.3 KiB
Lua
-- This file is public domain. Created by Tangent, the fox, the legend.
|
|
|
|
local update_after = function(self, delta)
|
|
if self.run_time >= self.deadline then return true end
|
|
self.run_time = self.run_time + delta
|
|
if self.run_time >= self.deadline then
|
|
if self.callback then
|
|
self.callback(unpack(self.args))
|
|
end
|
|
return true
|
|
end
|
|
end
|
|
|
|
local update_every = function(self, delta)
|
|
self.run_time = self.run_time + delta
|
|
while self.run_time >= self.interval do
|
|
if self.callback then
|
|
self.callback(unpack(self.args))
|
|
end
|
|
self.run_time = self.run_time - self.interval
|
|
end
|
|
end
|
|
|
|
local timer_metatable = {
|
|
__index = {
|
|
get_deadline = function(self)
|
|
return self.deadline
|
|
end,
|
|
get_interval = function(self)
|
|
return self.interval
|
|
end,
|
|
get_run_time = function(self)
|
|
return self.run_time
|
|
end,
|
|
reset = function(self, time)
|
|
self.run_time = time or 0
|
|
end,
|
|
set_deadline = function(self, deadline)
|
|
assert(self.deadline, "set_deadline() is only for timer.after() timers.")
|
|
self.deadline = deadline
|
|
end,
|
|
set_interval = function(self, interval)
|
|
assert(self.interval, "set_interval() is only for timer.every() timers.")
|
|
self.interval = interval
|
|
end,
|
|
set_manual = function(self, manual)
|
|
if manual then
|
|
self.manual = true
|
|
else
|
|
self.manual = nil
|
|
end
|
|
end,
|
|
},
|
|
}
|
|
|
|
local timers = {}
|
|
|
|
local new_timer = function(callback, update, ...)
|
|
local timer = setmetatable({
|
|
callback = callback,
|
|
update = update,
|
|
args = {...},
|
|
run_time = 0,
|
|
}, timer_metatable)
|
|
|
|
timers[timer] = timer
|
|
return timer
|
|
end
|
|
|
|
return {
|
|
version = "v1.2.0",
|
|
after = function(deadline, callback, ...)
|
|
local timer = new_timer(callback, update_after, ...)
|
|
timer.deadline = deadline
|
|
return timer
|
|
end,
|
|
every = function(interval, callback, ...)
|
|
local timer = new_timer(callback, update_every, ...)
|
|
timer.interval = interval
|
|
return timer
|
|
end,
|
|
update = function(delta)
|
|
local expired = {}
|
|
for timer in pairs(timers) do
|
|
if not timer.manual then
|
|
if timer:update(delta) then
|
|
expired[timer] = true
|
|
end
|
|
end
|
|
end
|
|
for timer in pairs(expired) do
|
|
timers[timer] = nil
|
|
end
|
|
return expired
|
|
end,
|
|
}
|