From 81a4c4f264d3740321c380e44c7ab7e8790bca8c Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Thu, 30 Oct 2025 15:50:05 +0300 Subject: [PATCH] added timer --- timer.lua | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 timer.lua diff --git a/timer.lua b/timer.lua new file mode 100644 index 0000000..7fa4f01 --- /dev/null +++ b/timer.lua @@ -0,0 +1,78 @@ +local function defaultTimeout() end + +---@class Timer +---@field duration number +---@field time number +---@field oneShot boolean +---@field timeout function +---@field data table +---@field paused boolean +Timer = { + duration = 1, + time = 1, + oneShot = false, + timeout = defaultTimeout, + data = {}, + paused = true +} + +---@param duration number|nil +---@param oneShot boolean|nil +---@param timeout function|nil +---@param data table|nil +---@return Timer +function Timer:new( duration, oneShot, timeout, data ) + local timer = { + duration = duration or self.duration, + time = duration or self.duration, + oneShot = oneShot or self.oneShot, + timeout = timeout or self.timeout, + data = data or self.data, + paused = self.paused, + } + setmetatable( timer, { __index = self } ) + + return timer +end + +---@param dt number +function Timer:tick( dt ) + if self.paused then + return + end + + self.time = self.time - dt + + if self.time <= 0 then + self.timeout( self.data ) + + if self.oneShot then + self.paused = true + self.time = 0 + else + self.time = self.duration + self.time + end + end +end + +---@param duration number|nil +function Timer:start( duration ) + self.paused = false + if duration ~= nil then + self.duration = duration + end + self.time = self.duration +end + +---@param emit boolean +function Timer:stop( emit ) + self.paused = true + self.time = 0 + if emit then + self.timeout( self.data ) + end +end + +function Timer:elapsed() + return self.duration - self.time +end