47 lines
1.3 KiB
Lua
47 lines
1.3 KiB
Lua
local _nth_tick = {}
|
|
|
|
---@alias NthTickEvent { handler_name: string, metadata: table }
|
|
|
|
---@param tick Tick
|
|
local function register_nth_tick_handler(tick)
|
|
script.on_nth_tick(tick, function(nth_tick_data)
|
|
local event_data = global.nth_tick_events[nth_tick_data.nth_tick]
|
|
local handler = GLOBAL_HANDLERS[event_data.handler_name] ---@type function
|
|
handler(event_data.metadata)
|
|
util.nth_tick.cancel(tick)
|
|
end)
|
|
end
|
|
|
|
|
|
---@param desired_tick Tick
|
|
---@param handler_name string
|
|
---@param metadata table
|
|
---@return Tick
|
|
function _nth_tick.register(desired_tick, handler_name, metadata)
|
|
local actual_tick = desired_tick
|
|
-- Search until the next free nth_tick is found
|
|
while (global.nth_tick_events[actual_tick] ~= nil) do
|
|
actual_tick = actual_tick + 1
|
|
end
|
|
|
|
global.nth_tick_events[actual_tick] = {handler_name=handler_name, metadata=metadata}
|
|
register_nth_tick_handler(actual_tick)
|
|
|
|
return actual_tick -- let caller know which tick they actually got
|
|
end
|
|
|
|
---@param tick Tick
|
|
function _nth_tick.cancel(tick)
|
|
script.on_nth_tick(tick, nil)
|
|
global.nth_tick_events[tick] = nil
|
|
end
|
|
|
|
function _nth_tick.register_all()
|
|
if not global.nth_tick_events then return end
|
|
for tick, _ in pairs(global.nth_tick_events) do
|
|
register_nth_tick_handler(tick)
|
|
end
|
|
end
|
|
|
|
return _nth_tick
|