z_mirror/FluidMustFlow

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

Caleb Heuerfix: Check for and preserve duct quality when merging390a5b8

trunk
2.1 KiB61 linesraw
1-- The only thing we're doing is auto-join, so don't even bother if it's not enabled
2if not settings.startup["fmf-enable-duct-auto-join"].value then
3  return
4end
5
6--- Calculates the midpoint between two positions.
7--- @param pos_1 MapPosition
8--- @param pos_2 MapPosition
9--- @return MapPosition
10local function get_midpoint(pos_1, pos_2)
11  return {
12    x = (pos_1.x + pos_2.x) / 2,
13    y = (pos_1.y + pos_2.y) / 2,
14  }
15end
16
17--- @param e EventData.on_built_entity|EventData.on_robot_built_entity|EventData.script_raised_built|EventData.script_raised_revive
18local function join_ducts(e)
19  --- @type LuaEntity
20  local entity = e.entity
21  if not entity or not entity.valid then
22    return
23  end
24
25  for _, connection in pairs(entity.get_fluid_box_pipe_connections(1)) do
26    local neighbour = entity.surface.find_entity({ name = entity.name, quality = entity.quality }, connection.target_position)
27    if neighbour then
28      local direction = entity.direction
29      local force = entity.force
30      local last_user = entity.last_user
31      local name = entity.name == "duct-small" and "duct" or "duct-long"
32      local quality = entity.quality
33      local position = get_midpoint(entity.position, neighbour.position)
34      local surface = entity.surface
35
36      entity.destroy({ raise_destroy = true })
37      neighbour.destroy({ raise_destroy = true })
38
39      surface.create_entity({
40        name = name,
41        quality = quality,
42        position = position,
43        direction = direction,
44        force = force,
45        player = last_user,
46        raise_built = true,
47        create_build_effect_smoke = false,
48      })
49
50      -- Only do one join per build
51      break
52    end
53  end
54end
55
56local event_filter = { { filter = "name", name = "duct-small" }, { filter = "name", name = "duct" } }
57
58script.on_event(defines.events.on_built_entity, join_ducts, event_filter)
59script.on_event(defines.events.on_robot_built_entity, join_ducts, event_filter)
60script.on_event(defines.events.script_raised_built, join_ducts, event_filter)
61script.on_event(defines.events.script_raised_revive, join_ducts, event_filter)