• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Lua Variablen persistent machen?

satanklaus

Geomaster
Ich speichere eine Referenz auf die zuletzt besuchte Zone in einer globalen lua Variablen.
Diese Variable wird beim onExit jeder Zone aktualisiert.
Leider überlebt der Variablen-Inhalt kein Save/Restore.

Mein Ansatz, die Variable persistent zu machen, stammt aus irgendeinem Web-Tutorial und sieht so aus:
Code:
currentStartZone=nil
objZoneRefPersistenceTest.ZVariables.currentStartZone=currentStartZone

Scheint nicht zu passen. Aber wie dann?

Ein runtergestripptes Demo Urwigo Projekt:Anhang anzeigen ZoneRefPersistence.zip
Dort gibt es zum Debuggen eine Konsolen-Ausgabe bei den einzelnen Events wie auch ein Display-Item in Inventar.

Danke!
 

Charlenni

Geomaster
Die ZVariable liegt im Cartridge Objekt. Dort muss nur der Name der Variablen hinterlegt sein. Es geht also folgendes:

Code:
cartDeinName.ZVariables.Variablenname = true

oder

Code:
cartDeinName.ZVariables["Variablenname"] = 5
 
OP
satanklaus

satanklaus

Geomaster
Wunderbar, so tut es. Danke, Charlenni.

Ich hatte den Code zum manuellen Hinzufügen von Einträgen zur ZVariables Table einfach übernommen, ohne wirklich zu verstehen, was ich da genau tue. Ist ja auch nirgends dokumentiert. Man kann also nur raten.
Es scheint so zu sein, dass der Value in dem Key-Value-Pair, das man hinzufügt, lediglich irgendwie "true" sein muss. Also ein bool Wert von "true", eine Zahl !=0 oder eben generell != nil. Die Interpretation scheint so zu sein: gehe beim Speichern über die Table und speichere jedes Object Key, dessen Value hier true ist. Diese Table scheint also statisch zu sein gar nicht direkt die Werte zu enthalten, sondern nur Flags für die Werte.
Zu dem Zeitpunkt, wo ich den Eintrag erzeuge, steht die Variable aber noch auf nil und bekommt erst später einen Wert. Kann dann nicht gehen, wenn man weiß, wie es verwendet wird.

Ich bin inzwischen auch auf eine eigene Lösung gekommen.
Da ich von der Zone eigentlich nur den Namen und den OriginalPoint/Mittelpunkt brauche und zusätzlich noch den Zeitpunkt, wann sie verlassen wurde, habe ich mir diese Infos jetzt gleich in einer Sub-Table gespeichert. Diese wird dann ZVariables hinzugefügt. Hier der Code, vielleicht nützt er jemandem...

Code:
lastZoneAsTable={}
objZoneRefPersistenceTest.ZVariables.lastZoneAsTable=lastZoneAsTable

-- ---------------------------------------------------------------------------------------
function updateStartZone(zone)
	-- print("Setting last zone to ".. zone.Name)
	objStartZoneDisplay.Name=zone.Name
	table.remove(lastZoneAsTable,1)
	table.insert(lastZoneAsTable,{zoneName=zone.Name,origPoint=zone.OriginalPoint,timeStamp=os.time()} )
	k,v=pairs(lastZoneAsTable[1])
	print("SET ",v.zoneName,v.origPoint,v.timeStamp)
end
-- ---------------------------------------------------------------------------------------
function zoneRefSave()
	if not (next(lastZoneAsTable) == nil) then
		k,v=pairs(lastZoneAsTable[1])
		print("SAVE ",v.zoneName,v.origPoint,v.timeStamp)
	end
end
-- ---------------------------------------------------------------------------------------
function zoneRefRestore()
	if not (next(lastZoneAsTable) == nil) then
		k,v=pairs(lastZoneAsTable[1])
		print("LOAD ",v.zoneName,v.origPoint,v.timeStamp)
		objStartZoneDisplay.Name=v.zoneName
	end
end
 
OP
satanklaus

satanklaus

Geomaster
Charlenni schrieb:
Die ZVariable liegt im Cartridge Objekt. Dort muss nur der Name der Variablen hinterlegt sein. Es geht also folgendes:

Code:
cartDeinName.ZVariables.Variablenname = true

oder

Code:
cartDeinName.ZVariables["Variablenname"] = 5

...übrigens: in Urwigo muss der Präfix für das Cartridge-Objekt 'obj' sein. Mit 'cart' wie oben steigt der Compiler aus.
 

Charlenni

Geomaster
Bezüglich des Cartridgenamens: bitte einen festen in Urwigo vergeben, dann muss man nicht raten ;)

Bezüglich der Einträge: im Key-Value-Paar ist Value tatsächlich völlig egal. Muss nicht true ergeben. Kann auch eine Zeichenkette sein. Wichtig ist nur, dass die Tabelle ZVariables (nichts anderes ist es ja) den Namen der Variablen als Key enthält. Dann wird der Inhalt der Variablen gespeichert. Ist der Wert der Value allerdings Nil, dann wird kein Key angelegt. Deshalb dein Problem.
 
OP
satanklaus

satanklaus

Geomaster
Danke für die Bestätigung.

Bezüglich des Cartridgenamens: bitte einen festen in Urwigo vergeben, dann muss man nicht raten
Ah verstehe, du hast den Namen verwendet, welchen du an Stelle des automatisch generierten angelegt hast.

Ist der Wert der Value allerdings Nil, dann wird kein Key angelegt.
Ja, das habe ich inzwischen auch raus gefunden: man kann in Lua einen Table-Eintrag z.B. auch löschen, indem man dem Key einen nil Value zuweist.
Ich hatte also in einem Schritt einen Eintrag angelegt und wieder gelöscht :roll:
 
Oben