154 lines
5.8 KiB
Lua
154 lines
5.8 KiB
Lua
--[[ Copyright (c) 2017 Optera
|
|
* Part of Lighted Electric Poles +
|
|
*
|
|
* See LICENSE.md in the project directory for license information.
|
|
--]]
|
|
|
|
-- local logger = require("__OpteraLib__.script.logger")
|
|
local Filter_Poles = {{filter="type", type="electric-pole"}}
|
|
local Filter_Lamps = {{filter="type", type="lamp"}}
|
|
|
|
|
|
local function Pole_Created(event)
|
|
local entity = event.created_entity or event.entity
|
|
if entity and entity.valid and entity.type == "electric-pole" then
|
|
-- upgrade planner only raises create events; find and destroy hidden lamps; also prevents multiple lamps on top of another
|
|
local lamps = entity.surface.find_entities_filtered {name = global.lamp_namelist, position = entity.position}
|
|
for _, lamp in pairs(lamps) do
|
|
-- log("removing hidden lamp "..lamp.name.." at "..entity.position.x..","..entity.position.y )
|
|
lamp.destroy()
|
|
end
|
|
|
|
if global.pole_lamp_dict[entity.name] then
|
|
-- log("placing hidden lamp for "..entity.name.." at "..entity.position.x..","..entity.position.y )
|
|
local lamp = entity.surface.create_entity{name = global.pole_lamp_dict[entity.name], position = entity.position, force = entity.force}
|
|
lamp.destructible = false
|
|
lamp.minable = false
|
|
end
|
|
end
|
|
end
|
|
|
|
local function Pole_Removed(event)
|
|
local entity = event.entity
|
|
if entity and entity.valid and global.pole_lamp_dict[entity.name] then
|
|
local lamps = entity.surface.find_entities_filtered {name = global.pole_lamp_dict[entity.name], position = entity.position}
|
|
for _, lamp in pairs(lamps) do
|
|
-- log("removing hidden lamp for "..entity.name.." at "..entity.position.x..","..entity.position.y )
|
|
lamp.destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
--[[
|
|
Event table returned with the event
|
|
player_index = player_index, --The index of the player who moved the entity
|
|
moved_entity = entity, --The entity that was moved
|
|
start_pos = position --The position that the entity was moved from
|
|
]]--
|
|
function EntityMoved(event)
|
|
-- log(tostring(event.player_index)..", entity: "..tostring(event.moved_entity.name)..", new pos: "..event.moved_entity.position.x..","..event.moved_entity.position.y..", old pos: "..event.start_pos.x..","..event.start_pos.y)
|
|
local entity = event.moved_entity
|
|
|
|
if entity and entity.type == "electric-pole" and global.pole_lamp_dict[entity.name] then
|
|
local lamps = entity.surface.find_entities_filtered{name = global.pole_lamp_dict[entity.name], position = event.start_pos}
|
|
for _, lamp in pairs(lamps) do
|
|
lamp.teleport(entity.position)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
local function register_events()
|
|
-- register creation events
|
|
script.on_event( defines.events.on_built_entity, Pole_Created, Filter_Poles )
|
|
script.on_event( defines.events.on_robot_built_entity, Pole_Created, Filter_Poles )
|
|
script.on_event( {defines.events.script_raised_built, defines.events.script_raised_revive}, Pole_Created )
|
|
|
|
-- register removal events
|
|
script.on_event( defines.events.on_pre_player_mined_item, Pole_Removed, Filter_Poles )
|
|
script.on_event( defines.events.on_entity_died, Pole_Removed, Filter_Poles )
|
|
script.on_event( defines.events.on_robot_pre_mined, Pole_Removed, Filter_Poles )
|
|
script.on_event( defines.events.script_raised_destroy, Pole_Removed )
|
|
|
|
--register to PickerExtended
|
|
if remote.interfaces["picker"] and remote.interfaces["picker"]["dolly_moved_entity_id"] then
|
|
script.on_event(remote.call("picker", "dolly_moved_entity_id"), EntityMoved)
|
|
end
|
|
--register to PickerDollies
|
|
if remote.interfaces["PickerDollies"] and remote.interfaces["PickerDollies"]["dolly_moved_entity_id"] then
|
|
script.on_event(remote.call("PickerDollies", "dolly_moved_entity_id"), EntityMoved)
|
|
end
|
|
end
|
|
|
|
local function initialize(event)
|
|
-- enable researched recipes
|
|
for i, force in pairs(game.forces) do
|
|
for _, tech in pairs(force.technologies) do
|
|
if tech.researched then
|
|
for _, effect in pairs(tech.effects) do
|
|
if effect.type == "unlock-recipe" then
|
|
force.recipes[effect.recipe].enabled = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- build name lists for lighted poles and lamps
|
|
local prototype_poles = game.get_filtered_entity_prototypes(Filter_Poles)
|
|
local prototype_lamps = game.get_filtered_entity_prototypes(Filter_Lamps)
|
|
global.pole_lamp_dict = {}
|
|
for name, pole in pairs(prototype_poles) do
|
|
if string.find(pole.name, "lighted%-") and prototype_lamps[pole.name.."-lamp"] then
|
|
global.pole_lamp_dict[pole.name] = pole.name.."-lamp"
|
|
end
|
|
end
|
|
-- log("[LEP+] DEBUG: pole names:"..serpent.block(global.pole_lamp_dict))
|
|
|
|
global.pole_namelist = {}
|
|
global.lamp_namelist = {"hidden-small-lamp"}
|
|
for pole_name, lamp_name in pairs(global.pole_lamp_dict) do
|
|
table.insert(global.pole_namelist, pole_name)
|
|
table.insert(global.lamp_namelist, lamp_name)
|
|
end
|
|
end
|
|
|
|
-- take care of orphaned lamps and poles
|
|
-- removing all hidden lamps and placing them at lighted poles should be faster than checking for lamps without poles and poles without lamps
|
|
local function rebuild_lamps()
|
|
-- replace existing lamps
|
|
for _, surface in pairs(game.surfaces) do
|
|
local lamps = surface.find_entities_filtered {name = global.lamp_namelist}
|
|
for _, lamp in pairs(lamps) do
|
|
lamp.destroy()
|
|
end
|
|
|
|
local poles = surface.find_entities_filtered {name = global.pole_namelist}
|
|
for _, pole in pairs(poles) do
|
|
local lamp = pole.surface.create_entity{name = pole.name.."-lamp", position = pole.position, force = pole.force}
|
|
if lamp then
|
|
lamp.destructible = false
|
|
lamp.minable = false
|
|
else
|
|
game.print("[LEP+] Error creating lamp for pole "..tostring(pole.name).." on surface "..tostring(surface.name) )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
script.on_load(function()
|
|
register_events()
|
|
end)
|
|
|
|
script.on_init(function()
|
|
register_events()
|
|
initialize()
|
|
end)
|
|
|
|
script.on_configuration_changed(function(event)
|
|
register_events()
|
|
initialize()
|
|
rebuild_lamps()
|
|
end) |