--[[ 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)