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 local quality = "-normal" if signal.signal.quality then quality = signal.signal.quality.name end netParts[#netParts + 1] = ("%s:red:%s:%d"):format(combinatorFlags.name, signal.signal.name.."-"..quality, 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 SendChunked(table.concat(netParts, "\n")) end