Is the only way to detect whether it has been X amount of minutes by using wait() or loops?

local timeToWait = 5 --Seconds
local start = os.clock()

while os.clock() - start < timeToWait do
    wait() --or RunService.RenderStepped:Wait() (since you don't want to use wait())
end

That’s literally what wait() does? It’s based off runservice.