Greatly improved train trip perfomance by culling table after sending Fixed formatting in many places
176 lines
5.3 KiB
Lua
176 lines
5.3 KiB
Lua
local function getMetricsStorageData(entity)
|
|
local unit = entity.unit_number
|
|
storage.metrics[unit] = storage.metrics[unit] or {
|
|
name = "",
|
|
enabled = false,
|
|
}
|
|
return storage.metrics[unit]
|
|
end
|
|
|
|
function CreateMetricsEntry(event)
|
|
if event.entity.name == "metrics-combinator"
|
|
and event.entity.valid then
|
|
---@type LuaEntity
|
|
local entity = event.entity
|
|
storage.metrics[entity.unit_number] = storage.metrics[entity.unit_number] or {
|
|
name = "",
|
|
enabled = false
|
|
}
|
|
end
|
|
end
|
|
|
|
local function open_metrics_gui(player, entity)
|
|
if player.gui.screen.metrics_frame then
|
|
player.gui.screen.metrics_frame.destroy()
|
|
end
|
|
|
|
local frame = player.gui.screen.add {
|
|
type = "frame",
|
|
name = "metrics_frame",
|
|
direction = "vertical"
|
|
}
|
|
|
|
-- Titelzeile mit Close-Button
|
|
local titlebar = frame.add {
|
|
type = "flow",
|
|
direction = "horizontal"
|
|
}
|
|
|
|
titlebar.drag_target = frame
|
|
|
|
titlebar.add {
|
|
type = "label",
|
|
caption = "Metrics Combinator",
|
|
style = "frame_title"
|
|
}
|
|
|
|
local spacer = titlebar.add {
|
|
type = "empty-widget",
|
|
style = "draggable_space_header",
|
|
}
|
|
spacer.style.horizontally_stretchable = true
|
|
spacer.drag_target = frame
|
|
|
|
titlebar.add {
|
|
type = "sprite-button",
|
|
name = "metrics_close",
|
|
sprite = "utility/close",
|
|
style = "frame_action_button"
|
|
}
|
|
|
|
-- Inhalt
|
|
frame.add {
|
|
type = "textfield",
|
|
name = "metrics_name",
|
|
text = storage.metrics[entity.unit_number].name
|
|
}
|
|
|
|
frame.add {
|
|
type = "checkbox",
|
|
name = "metrics_enabled",
|
|
caption = "Enabled",
|
|
state = storage.metrics[entity.unit_number].enabled
|
|
}
|
|
|
|
frame.force_auto_center()
|
|
frame.tags = { entity_unit_number = entity.unit_number }
|
|
player.opened = frame
|
|
end
|
|
|
|
function onGuiClick(event)
|
|
if event.element.name ~= "metrics_close" then return end
|
|
|
|
local player = game.get_player(event.player_index)
|
|
if not player then return end
|
|
if player.gui.screen.metrics_frame then
|
|
player.gui.screen.metrics_frame.destroy()
|
|
end
|
|
end
|
|
|
|
function onGuiOpened(event)
|
|
if event.gui_type ~= defines.gui_type.entity then return end
|
|
if not (event.entity and event.entity.valid and event.entity.name == "metrics-combinator") then
|
|
return
|
|
end
|
|
|
|
local player = game.get_player(event.player_index)
|
|
|
|
-- SCHLÜSSELZEILE: Engine-GUI sofort schließen
|
|
player.opened = nil
|
|
|
|
open_metrics_gui(player, event.entity)
|
|
end
|
|
|
|
function onClosedCombinatorGui(event)
|
|
if event.element and event.element.name == "metrics_frame" then
|
|
event.element.destroy()
|
|
end
|
|
end
|
|
|
|
function onGuiTextChanged(event)
|
|
if event.element.name ~= "metrics_name" then return end
|
|
|
|
local player = game.get_player(event.player_index)
|
|
if not player then return end
|
|
local entity = player.opened
|
|
if not (entity and entity.valid) then return end
|
|
|
|
local data = getMetricsStorageData(game.get_entity_by_unit_number(entity.tags.entity_unit_number))
|
|
data.name = event.text
|
|
end
|
|
|
|
function onGuiCheckedState(event)
|
|
if event.element.name ~= "metrics_enabled" then return end
|
|
|
|
local player = game.get_player(event.player_index)
|
|
if not player then return end
|
|
local frame = player.opened
|
|
if not (frame and frame.valid) then return end
|
|
|
|
|
|
local data = getMetricsStorageData(game.get_entity_by_unit_number(frame.tags.entity_unit_number))
|
|
data.enabled = event.element.state
|
|
|
|
-- optional: echtes Abschalten
|
|
--frame.active = data.enabled
|
|
end
|
|
|
|
function onMetricsCombinatorDied(event)
|
|
if event.entity.name ~= "metrics-combinator" then return end
|
|
storage.metrics[event.entity.unit_number] = nil
|
|
end
|
|
|
|
function onMetricsCombinatorMined(event)
|
|
if event.entity.name ~= "metrics-combinator" then return end
|
|
storage.metrics[event.entity.unit_number] = nil
|
|
end
|
|
|
|
function SendCombinatorMetrics()
|
|
local netParts = {}
|
|
netParts[#netParts + 1] = "---circuit-stats---\n"
|
|
for unitNumber, combinatorFlags in pairs(storage.metrics) do
|
|
if combinatorFlags.enabled then
|
|
local entity = game.get_entity_by_unit_number(unitNumber)
|
|
if entity and entity.valid then
|
|
---@type LuaCircuitNetwork?
|
|
local redNet = entity.get_circuit_network(defines.wire_connector_id.circuit_red)
|
|
---@type LuaCircuitNetwork?
|
|
local greenNet = entity.get_circuit_network(defines.wire_connector_id.circuit_green)
|
|
if redNet then
|
|
for _, signal in pairs(redNet.signals) do
|
|
netParts[#netParts + 1] = ("%s:red:%s:%d"):format(combinatorFlags.name,
|
|
signal.signal.name .. signal.signal.quality.name, signal.count)
|
|
end
|
|
end
|
|
if greenNet then
|
|
for _, signal in pairs(greenNet.signals) do
|
|
netParts[#netParts + 1] = ("%s:green:%s:%d"):format(combinatorFlags.name,
|
|
signal.signal.name .. signal.signal.quality.name, signal.count)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
helpers.send_udp(udpAddress, table.concat(netParts, "\n"), serverIndex)
|
|
end
|