z_mirror/PipeVisualizer

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

Caleb HeuerUpdate require syntax9443616

main
3.5 KiB129 linesraw
1local renderer = require("scripts.renderer")
2
3--- @class EntityData
4--- @field connections table<FluidSystemID, PipeConnectionExt[]>
5--- @field connection_objects table<FluidSystemID, RenderObjectID[]>
6--- @field shape RenderObjectID?
7--- @field entity LuaEntity
8--- @field fluidbox LuaFluidBox
9--- @field unit_number UnitNumber
10
11--- @class PipeConnectionExt: PipeConnection
12--- @field direction defines.direction
13--- @field shape_position MapPosition
14--- @field target_owner LuaEntity?
15
16--- Assumes that the positions are in exact cardinals.
17--- @param connection PipeConnection
18--- @return defines.direction
19local function get_cardinal_direction(connection)
20  local from, to = connection.position, connection.target_position
21  if from.y > to.y then
22    return defines.direction.north
23  elseif from.x < to.x then
24    return defines.direction.east
25  elseif from.y < to.y then
26    return defines.direction.south
27  else
28    return defines.direction.west
29  end
30end
31
32--- @class EntityDataModule
33local entity_data = {}
34
35--- @param iterator Iterator
36--- @param entity LuaEntity
37--- @return EntityData?
38function entity_data.create(iterator, entity)
39  local unit_number = entity.unit_number
40  if not unit_number then
41    return
42  end
43
44  local data = iterator.entities[unit_number]
45  if data then
46    -- ---@diagnostic disable-next-line: missing-fields
47    -- entity.surface.create_entity({
48    --   name = "flying-text",
49    --   text = "Redraw",
50    --   color = { r = 1, g = 0.3, b = 0.3 },
51    --   position = entity.position,
52    -- })
53    entity_data.remove(iterator, data)
54  end
55
56  --- @type EntityData
57  local data = {
58    connection_objects = {},
59    connections = {},
60    entity = entity,
61    fluidbox = entity.fluidbox,
62    unit_number = unit_number,
63  }
64
65  for i = 1, #data.fluidbox do
66    --- @cast i uint
67    local id = data.fluidbox.get_fluid_system_id(i)
68    if not id then
69      goto continue
70    end
71    --- @type PipeConnectionExt
72    local connections = data.fluidbox.get_pipe_connections(i)
73    for _, connection in pairs(connections) do
74      connection.direction = get_cardinal_direction(connection)
75      connection.shape_position = {
76        x = connection.position.x + (connection.target_position.x - connection.position.x) / 2,
77        y = connection.position.y + (connection.target_position.y - connection.position.y) / 2,
78      }
79      if connection.target then
80        connection.target_owner = connection.target.owner
81      end
82    end
83    data.connections[id] = connections
84    ::continue::
85  end
86
87  iterator.entities[unit_number] = data
88  return data
89end
90
91--- @param iterator Iterator
92--- @param data EntityData
93function entity_data.remove(iterator, data)
94  renderer.clear(data)
95  iterator.entities[data.unit_number] = nil
96end
97
98--- @param iterator Iterator
99--- @param data EntityData
100--- @param fluid_system_id FluidSystemID
101function entity_data.remove_system(iterator, data, fluid_system_id)
102  if renderer.clear_system(iterator, data, fluid_system_id) then
103    iterator.entities[data.unit_number] = nil
104  end
105end
106
107--- @param iterator Iterator
108--- @param entity LuaEntity
109--- @return EntityData?
110function entity_data.get(iterator, entity)
111  local unit_number = entity.unit_number
112  if not unit_number then
113    return
114  end
115  return iterator.entities[unit_number]
116end
117
118--- @param iterator Iterator
119--- @param entity LuaEntity
120--- @return EntityData?
121function entity_data.get_or_create(iterator, entity)
122  local data = entity_data.get(iterator, entity)
123  if data then
124    return data
125  end
126  return entity_data.create(iterator, entity)
127end
128
129return entity_data