local Jobs = {} local LastTime = nil function RunAt(h, m, cb) Jobs[#Jobs + 1] = { h = h, m = m, cb = cb, } end function GetUnixTimestamp() return os.time() end function OnTime(time) for i = 1, #Jobs, 1 do local scheduledTimestamp = os.time({ hour = Jobs[i].h, minute = Jobs[i].m, second = 0, -- Assuming tasks run at the start of the minute day = os.date("%d", time), month = os.date("%m", time), year = os.date("%Y", time), }) if time >= scheduledTimestamp and (not LastTime or LastTime < scheduledTimestamp) then Jobs[i].cb(Jobs[i].h, Jobs[i].m) end end end function Tick() local time = GetUnixTimestamp() if not LastTime or os.date("%M", time) ~= os.date("%M", LastTime) then OnTime(time) LastTime = time end SetTimeout(60000, Tick) end LastTime = GetUnixTimestamp() Tick() AddEventHandler("cron:runAt", function(h, m, cb) RunAt(h, m, cb) end)