95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --- Schedule tasks to be executed later.
 | |
| --- ```lua
 | |
| --- local flib_on_tick_n = require("__flib__/on-tick-n")
 | |
| --- ```
 | |
| --- @class flib_on_tick_n
 | |
| local on_tick_n = {}
 | |
| 
 | |
| --- Initialize the module's script data table.
 | |
| ---
 | |
| --- Must be called at the **beginning** of `on_init`. Can also be used to delete all current tasks.
 | |
| function on_tick_n.init()
 | |
|   if not global.__flib then
 | |
|     global.__flib = {}
 | |
|   end
 | |
|   --- @type table<number, Tasks>
 | |
|   global.__flib.on_tick_n = {}
 | |
| end
 | |
| 
 | |
| --- Retrieve the tasks for the given tick, if any.
 | |
| ---
 | |
| --- Must be called **during** `on_tick`.
 | |
| --- @param tick number
 | |
| --- @return Tasks?
 | |
| function on_tick_n.retrieve(tick)
 | |
|   -- Failsafe for rare cases where on_tick can fire before on_init
 | |
|   if not global.__flib or not global.__flib.on_tick_n then
 | |
|     return
 | |
|   end
 | |
|   local actions = global.__flib.on_tick_n[tick]
 | |
|   if actions then
 | |
|     global.__flib.on_tick_n[tick] = nil
 | |
|     return actions
 | |
|   end
 | |
| end
 | |
| 
 | |
| --- Add a task to execute on the given tick.
 | |
| --- @param tick number
 | |
| --- @param task any The data representing this task. This can be anything except for a `function`.
 | |
| --- @return TaskIdent ident An identifier for the task. Save this if you might remove the task before execution.
 | |
| function on_tick_n.add(tick, task)
 | |
|   local list = global.__flib.on_tick_n
 | |
|   local tick_list = list[tick]
 | |
|   if tick_list then
 | |
|     local index = #tick_list + 1
 | |
|     tick_list[index] = task
 | |
|     return { index = index, tick = tick }
 | |
|   else
 | |
|     list[tick] = { task }
 | |
|     return { index = 1, tick = tick }
 | |
|   end
 | |
| end
 | |
| 
 | |
| --- Remove a scheduled task.
 | |
| --- @param ident TaskIdent The identifier object for the task, as returned from `on-tick-n.add`.
 | |
| function on_tick_n.remove(ident)
 | |
|   local tick_list = global.__flib.on_tick_n[ident.tick]
 | |
|   if not tick_list or not tick_list[ident.index] then
 | |
|     return false
 | |
|   end
 | |
| 
 | |
|   tick_list[ident.index] = nil
 | |
| 
 | |
|   return true
 | |
| end
 | |
| 
 | |
| --- A unique identifier for a previously added task, used in `on-tick-n.remove`.
 | |
| --- @class TaskIdent
 | |
| --- @field tick number The tick this task is scheduled for.
 | |
| --- @field index number The tasks' index in the tick's `Tasks` table.
 | |
| 
 | |
| --- A table of tasks.
 | |
| ---
 | |
| --- Each task can be anything that is not a function, as specified in `on-tick-n.add`.
 | |
| ---
 | |
| --- **This is not an array, there may be gaps. Always use `pairs` to iterate this table.**
 | |
| ---
 | |
| --- # Example
 | |
| ---
 | |
| --- ```lua
 | |
| --- event.on_tick(function(e)
 | |
| ---   for _, task in pairs(on_tick_n.retrieve(e.tick) or {}) do
 | |
| ---     if task == "say_hi" then
 | |
| ---       game.print("Hello there!")
 | |
| ---     elseif task == "order_66" then
 | |
| ---       for _, player in pairs(game.players) do
 | |
| ---         player.die()
 | |
| ---       end
 | |
| ---     end
 | |
| ---   end
 | |
| --- end)
 | |
| --- ```
 | |
| --- @alias Tasks table<number, any>
 | |
| 
 | |
| return on_tick_n
 |