I’ve been thinking about a method on making a round timer without using wait. However, I have absolutely zero idea on how to avoid using wait. So how would I do that? If you don’t know why I want to do this check this resource out:
But the article is about wait() not wait(n), n > 0 then why do you want to avoid it? Also: it’s impossible to make a round timer without wait in a sensible way.
Actually you can use RenderStepped and tick() to check if a certain amount of time has passed but what is the point of that if you can simply use wait.
1 Like
To be precise, this article is for beginners who spam “if” or similar requirements with loop, like
repeat wait() until epic == true do
Which is something i actually used to do a long time ago, simply because i was not aware that Changed or OnClientEvent & similar behavior that is triggered upon call existed.
Got a solution, here’s an OOP approach using Quenty’s nevemore engine
-- Timer manager
-- @classmod Timer
local Timer = {}
Timer.ClassName = "Timer"
Timer.__index = Timer
local require = require(game:GetService("ReplicatedStorage"):WaitForChild("Nevermore"))
local Maid = require("Maid")
local Signal = require("Signal")
local RunService = game:GetService("RunService")
local Stepped = RunService.Stepped
function Timer.new(time)
local self = {}
setmetatable(self, Timer)
-- state
self._time = time
self._timerTask = nil
-- lifecycle
self._maid = Maid.new()
self._signal = Signal.new()
return self;
end
function Timer:SetTime(time)
self._time = time
end
function Timer:GetTime()
return self._time
end
function Timer:Start(endTime)
if not self._timer then
self._timerTask = self._maid:GiveTask(
coroutine.wrap(function()
local elapsed = 0
while elapsed < endTime do
elapsed = elapsed + Stepped:Wait()
self._signal:Fire()
end
self._maid:DoCleaning()
self._timerTask = nil
end)
)
self._maid[self._timerTask]()
end
end
function Timer:Connect(newFunction)
return self._signal:Connect(newFunction)
end
return Timer;
2 Likes