1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-30 23:17:53 +02:00
ComfyFactorio/modules/entity_spawn_queue.lua
2021-03-24 16:46:00 +01:00

90 lines
2.1 KiB
Lua

-- Queue entities to spawn at certain ticks -- mewmew
-- Add entities via .add_to_queue(tick, surface, entity_data, non_colliding_position_search_radius)
-- Example Esq.add_to_queue(3486, game.surfaces.nauvis, {name = "small-biter", position = {16, 17}, force = "player"}, false)
local Event = require 'utils.event'
local Global = require 'utils.global'
local table_insert = table.insert
local Public = {}
local ESQ = {}
Global.register(
ESQ,
function(tbl)
ESQ = tbl
end
)
local function spawn_entity(surface_index, entity_data, non_colliding_position_search_radius)
local surface = game.surfaces[surface_index]
if not surface then
return
end
if not surface.valid then
return
end
if non_colliding_position_search_radius then
local p = surface.find_non_colliding_position(entity_data.name, entity_data.position, non_colliding_position_search_radius, 0.5)
if p then
entity_data.position = p
end
end
surface.create_entity(entity_data)
end
function Public.add_to_queue(tick, surface, entity_data, non_colliding_position_search_radius)
if not surface then
return
end
if not surface.valid then
return
end
if not entity_data then
return
end
if not entity_data.position then
return
end
if not entity_data.name then
return
end
if not tick then
return
end
local queue = ESQ.queue
local entity = {}
for k, v in pairs(entity_data) do
entity[k] = v
end
tick = tostring(tick)
if not queue[tick] then
queue[tick] = {}
end
table_insert(queue[tick], {surface.index, entity, non_colliding_position_search_radius})
end
local function on_tick()
local tick = tostring(game.tick)
if not ESQ.queue[tick] then
return
end
for _, v in pairs(ESQ.queue[tick]) do
spawn_entity(v[1], v[2], v[3])
end
ESQ.queue[tick] = nil
end
local function on_init()
ESQ.queue = {}
end
Event.on_init(on_init)
Event.add(defines.events.on_tick, on_tick)
return Public