Was ist ce.hub.util?
Dieses Paket enthält Hilfsfunktionen für die persistente Ablage kleiner Zustände in EEP-Datenslots und in Rollingstock-Tags.
Es wird produktiv in mehreren Paketen der Bibliothek verwendet, z.B. in ce.mods.road, ce.mods.transit, ce.rail sowie in den Hub-Datenbereichen unter ce.hub.data.*.
Dateien
StorageUtility.luaZentrale Hilfsfunktionen zum Registrieren, Speichern, Laden und Debuggen von Storage-Daten.
Wichtige Einschränkungen
StorageUtility.saveTable()undStorageUtility.loadTable()arbeiten bewusst mit String-Werten.- Vor dem Speichern müssen Zahlen und Boolean-Werte daher mit
tostring(...)serialisiert werden. - Nach dem Laden müssen Werte mit
tonumber(...)oderStorageUtility.toboolean(...)zurückgewandelt werden. - Schlüssel und Werte dürfen keine Kommata enthalten, da das Format intern als
key=value,gespeichert wird. - Für
EEPSaveDatabegrenztStorageUtilitydie Länge des erzeugten Strings auf999Zeichen. - Für Rollingstock-Tags liegt die Grenze bei
1024Zeichen.
Zentrale Funktionen
StorageUtility.registerId(eepSaveId, name)
Reserviert einen EEP-Speicherslot zwischen 1 und 1000.
Wird dieselbe ID mehrfach verwendet, löst das Modul absichtlich einen Fehler aus.
StorageUtility.saveTable(eepSaveId, table, name)
Speichert eine Tabelle mit String-Schlüsseln und String-Werten in einem EEP-Datenslot.
StorageUtility.loadTable(eepSaveId, name)
Lädt einen Datenslot und gibt immer eine Tabelle zurück. Nicht vorhandene oder leere Slots führen zu einer leeren Tabelle.
StorageUtility.loadTableRollingStock(rollingStockName)
Lädt String-Daten aus EEPRollingstockGetTagText(...) und wandelt sie in dieselbe Tabellenstruktur um.
StorageUtility.toboolean(value)
Konvertiert den String "true" zu true.
Andere Werte ergeben false.
Beispiel
local StorageUtility = require("ce.hub.util.StorageUtility")
StorageUtility.registerId(700, "Meine Kreuzung")
local data = {
b = tostring(true),
z = tostring(5),
n = "Nord"
}
StorageUtility.saveTable(700, data, "Meine Kreuzung")
local loaded = StorageUtility.loadTable(700, "Meine Kreuzung")
local belegt = StorageUtility.toboolean(loaded.b)
local zaehler = tonumber(loaded.z)
local name = loaded.n
Empfehlung
Für persistente Zustände kurze Schlüssel wie b, z, r oder t verwenden und optionale Felder beim Speichern lieber weglassen als Platzhalter wie "nil" abzulegen.
Architekturbeschreibung: README_DEV.md