1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-08 00:39:30 +02:00
ComfyFactorio/modules/entity_spawn_queue.lua
2020-10-19 18:26:24 +02:00

65 lines
1.8 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