mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-30 23:17:53 +02:00
90 lines
2.1 KiB
Lua
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
|