mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-14 10:13:13 +02:00
90 lines
2.2 KiB
Lua
90 lines
2.2 KiB
Lua
local Event = require 'utils.event'
|
|
local Global = require 'utils.global'
|
|
local math = require 'utils.math'
|
|
|
|
local floor = math.floor
|
|
local max = math.max
|
|
|
|
local chest = defines.inventory.chest
|
|
|
|
local died_entities = {}
|
|
|
|
Global.register(
|
|
died_entities,
|
|
function(tbl)
|
|
died_entities = tbl
|
|
end
|
|
)
|
|
|
|
return function(config)
|
|
local entity_name = config.entity_name
|
|
Event.add(
|
|
defines.events.on_entity_died,
|
|
function(event)
|
|
local entity = event.entity
|
|
|
|
if not entity.valid then
|
|
return
|
|
end
|
|
|
|
local type = entity.type
|
|
if type ~= 'container' and type ~= 'logistic-container' then
|
|
return
|
|
end
|
|
|
|
local inventory = entity.get_inventory(chest)
|
|
if not inventory or not inventory.valid then
|
|
return
|
|
end
|
|
|
|
local count = inventory.get_item_count()
|
|
if count == 0 then
|
|
return
|
|
end
|
|
|
|
local area = entity.bounding_box
|
|
local left_top, right_bottom = area.left_top, area.right_bottom
|
|
local x1, y1 = floor(left_top.x), floor(left_top.y)
|
|
local x2, y2 = floor(right_bottom.x), floor(right_bottom.y)
|
|
|
|
local size_x = x2 - x1 + 1
|
|
local size_y = y2 - y1 + 1
|
|
local amount = floor(count / (size_x * size_y))
|
|
amount = max(amount, 1)
|
|
|
|
local create_entity = entity.surface.create_entity
|
|
|
|
for x = x1, x2 do
|
|
for y = y1, y2 do
|
|
create_entity({name = entity_name, position = {x, y}, amount = amount})
|
|
end
|
|
end
|
|
|
|
died_entities[entity.unit_number] = true
|
|
end
|
|
)
|
|
|
|
Event.add(
|
|
defines.events.on_post_entity_died,
|
|
function(event)
|
|
local unit_number = event.unit_number
|
|
if not unit_number then
|
|
return
|
|
end
|
|
|
|
if not died_entities[unit_number] then
|
|
return
|
|
end
|
|
|
|
died_entities[unit_number] = nil
|
|
|
|
local ghost = event.ghost
|
|
if not ghost or not ghost.valid then
|
|
return
|
|
end
|
|
|
|
ghost.destroy()
|
|
end
|
|
)
|
|
end
|