z_mirror/Krastorio2

git clone https://git.raiguard.me/z_mirror/Krastorio2

Caleb HeuerChange to four-space indentation07409ca6

four-space-indentation
3.0 KiB90 linesraw
1local flib_position = require("__flib__.position")
2
3--- @param turbine LuaEntity
4local function build_collision(turbine)
5    for _, existing_collision in
6        pairs(
7            turbine.surface.find_entities_filtered({ name = "kr-wind-turbine-collision", position = turbine.position })
8        )
9    do
10        if flib_position.eq(existing_collision.position, turbine.position) then
11            return
12        end
13    end
14
15    turbine.surface.create_entity({
16        name = "kr-wind-turbine-collision",
17        position = turbine.position,
18        force = turbine.force,
19        create_build_effect_smoke = false,
20    })
21end
22
23--- @param turbine LuaEntity
24local function destroy_collision(turbine)
25    for _, collision in
26        pairs(
27            turbine.surface.find_entities_filtered({ name = "kr-wind-turbine-collision", position = turbine.position })
28        )
29    do
30        if flib_position.eq(collision.position, turbine.position) then
31            collision.destroy()
32        end
33    end
34end
35
36--- @param e EntityBuiltEvent
37local function on_entity_built(e)
38    local entity = e.entity or e.destination
39    if not entity or not entity.valid or entity.name ~= "kr-wind-turbine" then
40        return
41    end
42
43    build_collision(entity)
44end
45
46--- @param e EntityDestroyedEvent
47local function on_entity_destroyed(e)
48    local entity = e.entity
49    if not entity or not entity.valid or entity.name ~= "kr-wind-turbine" then
50        return
51    end
52
53    destroy_collision(entity)
54end
55
56--- @class wind_turbine_handler: event_handler
57local wind_turbine_handler = {}
58
59function wind_turbine_handler.on_configuration_changed()
60    for _, surface in pairs(game.surfaces) do
61        for _, entity in
62            pairs(surface.find_entities_filtered({ name = { "kr-wind-turbine", "kr-wind-turbine-collision" } }))
63        do
64            if entity.name == "kr-wind-turbine" then
65                build_collision(entity)
66            elseif entity.name == "kr-wind-turbine-collision" then
67                local existing_turbine = entity.surface.find_entity("kr-wind-turbine", entity.position)
68                if not existing_turbine or not flib_position.eq(existing_turbine.position, entity.position) then
69                    entity.destroy()
70                end
71            end
72        end
73    end
74end
75
76wind_turbine_handler.events = {
77    [defines.events.on_built_entity] = on_entity_built,
78    [defines.events.on_entity_cloned] = on_entity_built,
79    [defines.events.on_entity_died] = on_entity_destroyed,
80    [defines.events.on_player_mined_entity] = on_entity_destroyed,
81    [defines.events.on_robot_built_entity] = on_entity_built,
82    [defines.events.on_robot_mined_entity] = on_entity_destroyed,
83    [defines.events.on_space_platform_built_entity] = on_entity_built,
84    [defines.events.on_space_platform_mined_entity] = on_entity_destroyed,
85    [defines.events.script_raised_built] = on_entity_built,
86    [defines.events.script_raised_destroy] = on_entity_destroyed,
87    [defines.events.script_raised_revive] = on_entity_built,
88}
89
90return wind_turbine_handler