UnrealisticReactors/scripts/events/construct.lua
2024-07-14 22:14:25 +03:00

126 lines
3.2 KiB
Lua

local rpath = (...):match("(.-)[^%.]+$")
local rroot = rpath:match("^([^%.]+%.)")
local on = require(rpath .. "util").on
local network = require(rroot .. "heat.network")
local reactor = require(rroot .. "entity.reactor")
local interface = require(rroot .. "entity.interface")
local tower = require(rroot .. "entity.tower")
local sameposition = require(rroot .. "heat.util").sameposition
local util = require(rroot .. "entity.util")
local find_nuclear_entity = util.find_nuclear_entity
local find_nuclear_ghost = util.find_nuclear_ghost
local event_filters = {}
local event_listener = {}
local function on_ghost_interface_added(ghost)
-- this should tell factorio to not delete it between on_pre_built and on_built_entity
interface.remember(ghost)
end
local function on_reactor_added(entity, tick)
entity.active = false
entity.minable = true
reactor.add(entity, interface.create(entity.surface, {
name = E2I_NAME[entity.name],
position = entity.position,
force = entity.force,
}))
end
local function on_heatpipe_added(entity, tick)
network.add_heat_pipe(entity)
end
local function on_coolingtower_added(entity, tick)
tower.add(entity)
end
local function on_sarcophagus_added(entity)
entity.health = 0.1
entity.destructible = false
entity.minable = false
global.sarcophagus[entity.unit_number] = entity
local fallout = entity.surface.find_entities_filtered{name="permanent-radiation",area={{entity.position.x-5,entity.position.y-5},{entity.position.x+5,entity.position.y+5}}}
for i, ent in pairs (fallout) do
if i % 20 ~= 1 then
ent.destroy()
end
end
end
event_filters.ghost = {}
event_listener.ghost = {
[REACTOR_INTERFACE_ENTITY_NAME] = on_ghost_interface_added,
[BREEDER_INTERFACE_ENTITY_NAME] = on_ghost_interface_added,
}
local ghost_added = event_listener.ghost
for ghost_name in pairs(ghost_added) do
table.insert(event_filters.ghost, {mode = "or", filter = "ghost_name", name = ghost_name})
end
local function on_ghost_added(entity, ...)
ghost_added[entity.ghost_name](entity, ...)
end
event_listener.entity = {
["entity-ghost"] = on_ghost_added,
[REACTOR_ENTITY_NAME] = on_reactor_added,
[BREEDER_ENTITY_NAME] = on_reactor_added,
[TOWER_ENTITY_NAME] = on_coolingtower_added,
[SARCOPHAGUS_ENTITY_NAME] = on_sarcophagus_added,
}
event_filters.entity = {
{mode = "or", filter = "type", type = "heat-pipe"},
{mode = "or", filter = "type", type = "reactor"},
unpack(event_filters.ghost)
}
event_filters.ghost = nil -- dont set them, cuz not used
local entity_added = event_listener.entity
for entity_name,_ in pairs(entity_added) do
if entity_name ~= "entity-ghost" then
table.insert(event_filters.entity, {mode = "or", filter = "name", name = entity_name})
end
end
local function on_entity_added(entity, ...)
if reactor.is(entity) then
network.add_reactor(entity)
end
if entity.type == "heat-pipe" then
on_heatpipe_added(entity, ...)
else
on(entity_added, entity, ...)
end
end
local function on_player_pipette(player_index, item)
if I2E_NAME[item.name] then -- reactor interface
local player = game.players[player_index]
player.pipette_entity(I2E_NAME[item.name])
end
end
return { -- exports
entity = on_entity_added,
pipette = on_player_pipette,
filters = event_filters,
listeners = event_listener,
}