-- Compiled with roblox-ts v3.0.0 local CallbackTimer local Builder do Builder = setmetatable({}, { __tostring = function() return "Builder" end, }) Builder.__index = Builder function Builder.new(...) local self = setmetatable({}, Builder) return self:constructor(...) or self end function Builder:constructor() self.timer_ = CallbackTimer.new() self.auto_start_ = false end function Builder:Create() return Builder.new() end function Builder:WithTimer(callback) callback(self.timer_) return self end function Builder:WithWaitTime(value) self.timer_.WaitTime = value return self end function Builder:WithOneShot(value) self.timer_.OneShot = value return self end function Builder:WithTimeOutCallback(callback) self.timer_:SetCallback(callback) return self end function Builder:WithYieldAfterCall(value) self.timer_.YieldAfterCall = value return self end function Builder:WithTerminateOld(value) self.timer_.TerminateOld = value return self end function Builder:WithAutoStart() self.auto_start_ = true return self end function Builder:Build() if self.auto_start_ then self.timer_:Start() end return self.timer_ end end setmetatable(Builder, { __call = function() return Builder.new() end, }) do CallbackTimer = setmetatable({}, { __tostring = function() return "CallbackTimer" end, }) CallbackTimer.__index = CallbackTimer function CallbackTimer.new(...) local self = setmetatable({}, CallbackTimer) return self:constructor(...) or self end function CallbackTimer:constructor() self.WaitTime = 1 self.YieldAfterCall = false self.TerminateOld = false self.start_time_ = 0 self.OneShot = true self.stopped_ = true self.callback_ = function() end end function CallbackTimer:IsStopped() return self.stopped_ end function CallbackTimer:SetCallback(callback) self.callback_ = callback return self end function CallbackTimer:Start(time_sec) if time_sec == nil then time_sec = -1 end if time_sec > 0 then self.WaitTime = time_sec end --stops the existing timer self:Stop() self.start_time_ = os.clock() --takes stopped flag away self.stopped_ = false self.thread_ = task.spawn(function() return self:Cycle() end) end function CallbackTimer:TerminateCallbackThread() if self.callback_thread_ == nil then return nil end task.cancel(self.callback_thread_) self.callback_thread_ = nil end function CallbackTimer:Cycle() while true do local _value = task.wait(self.WaitTime) if not (_value ~= 0 and _value == _value and _value) then break end if self.TerminateOld then self:TerminateCallbackThread() end if self.YieldAfterCall then self.callback_() else self.callback_thread_ = task.spawn(self.callback_) end if self.OneShot then break end end --cannot stop the thread from inside; self.stopped_ = true end function CallbackTimer:StopInThread(terminate_callback) if terminate_callback == nil then terminate_callback = false end self.stopped_ = true if terminate_callback then self:TerminateCallbackThread() end end function CallbackTimer:Stop(terminate_callback) if terminate_callback == nil then terminate_callback = false end if self.thread_ ~= nil then task.cancel(self.thread_) self.thread_ = nil end if terminate_callback then self:TerminateCallbackThread() end self.stopped_ = true end function CallbackTimer:GetTimeLeft() return math.max(self.WaitTime - (os.clock() - self.start_time_), 0) end function CallbackTimer:Destroy() self:Stop() end CallbackTimer.Builder = Builder end return { CallbackTimer = CallbackTimer, }