z_mirror/Krastorio2

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

Caleb HeuerWind turbine 2.0 (#654)74419633

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