Add metrics combinator entity, GUI, and related functionality; enhance power and production stats tracking
Greatly improved train trip perfomance by culling table after sending Fixed formatting in many places
This commit is contained in:
175
metrics-combinator.lua
Normal file
175
metrics-combinator.lua
Normal file
@@ -0,0 +1,175 @@
|
||||
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
|
||||
Reference in New Issue
Block a user