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

Zonen per LUA aktivieren und deaktivieren

austriaka

Geocacher
Ich arbeite gerade an meinem ersten WIG und habe das (wohl nicht seltene) Problem, zu einem bestimmten Zeitpunkt mehr als 7 Zonen überwachen zu müssen.
Ich habe mir in LUA schon eine "Zonenüberwachung" gebastelt, mit einem Timer, der alle 5 Sekunden die Distanz zu meinen 10 Punkten berechnet und die 3 nächstgelegenen aktiv schaltet, die anderen dagegen inaktiv.
Der erste Teil klappt super, allerdings habe ich Probleme mit dem Aktivieren und Deaktivieren der Zonen per LUA.
Blauäugig bin ich davon ausgegangen, dass wenn ich Wherigo.Zone(zonename).Active=true setze, die Zone auch wirklich aktiv ist, denn der Urwigo-Player stellt sie dann rosa dar. Allerdings lässt sich diese Zone mit Wherigo.Zone(zonename).Active=false nicht mehr inaktiv schalten, überhaupt ist diese Zone nur rosarot, aber sonst nicht wirklich aktiv (kein feuern onEnter, kein Proximity-Alarm...)
Alle Beispiele, die ich zur Zonenüberwachung per LUA gefunden habe, verschieben gleichzeitig die Zone, das will ich aber gar nicht. Ich will nur die 3 nächstgelegenen Zonen aktiv schalten, wenn der Player herumwandert. Muss ich trotzdem die komplette Zone neu in LUA bauen? Oder was habe ich da übersehen?
dank euch schön
Karin
 
OP
austriaka

austriaka

Geocacher
habe meinen Fehler gefunden. Es darf natürlich nicht Wherigo.Zone(zonename).Active=true lauten, sondern bei einer Zone, die bereits registriert ist zonename.Active=true
 

Krolock

Geocacher
Genaugenommen heißt die Variabel objzonenname, es sei denn du hast zonename nicht nur als Name, sondern auch als Identifier genommen.
Um eine Übersicht über den generierten lua-Code zu bekommen, kann man das Project als gwz packen und dieses mit einem Packer (winzip, winrar, 7zip...) entpacken.
Du erhälst dann eine _cartridge.lua wo der generierte Code enthalten ist.
 
OP
austriaka

austriaka

Geocacher
danke für deine Antwort!
"zonename" ist natürlich nur als Platzhalter zu verstehen. Ich habe den Dingen, die ich per LUA ansprechen will, im Urwigo eigene Variablennamen vergeben, weil das erst mit dem automatisch vergebenen Namen erst nicht geklappt hat.
Das mit der gwz habe ich inzwischen auch hinbekommen, nachdem ich die Fileendung auf zip geändert habe - vorher war die entpackte Datei nämlich leer :(
 

bodenseepingu

Geomaster
Übrigens habe ich bei groundspeak foren eine nette LUA-Routine gefunden, mit der man alle definierten Zonen abarbeiten kann....da liesse sich die Aktivierung der 3 nächstgelegenen Zonen ein bisschen besser automatisieren...

siehe http://forums.groundspeak.com/GC/index.php?showtopic=280707


...das Cartridge Objekt muss man bei dieser Routine ggf. noch aus dem erzeugten LUA rausnehmen - Obfuscating müsste denke ich ausgeschaltet werden, sonst wirds schwierig.
 
OP
austriaka

austriaka

Geocacher
danke, hatte ich auch schon gefunden (und Ideen draus verwendet).
Meine Funktion ist eigentlich recht schlank (finde ich) und wenn man nicht gerade 3 nächstgelegene braucht, wird es noch kürzer.

points_tbl {} hält für jede Zone einen Punkt zu dem ich den Abstand berechne
zones_tbl {} sind die Zonen

Code:
function wobinich()
	standort = Player.ObjectLocation
	min_dist1 = 10000
	min_dist2 = 10000
	min_dist3 = 10000
	nextzone = {}

	for k,v in pairs(points_tbl) do
 		zones_tbl[k].Active = false
 		dist_q = Wherigo.VectorToPoint(standort, v):GetValue "m"
 		if  (dist_q < min_dist1) then 
 			min_dist3 = min_dist2
 			min_dist2 = min_dist1
 			min_dist1 = dist_q
 			nextzone[3] = nextzone[2]
 			nextzone[2] = nextzone[1]
 			nextzone[1] = k
 		elseif (dist_q < min_dist2) then 
 			min_dist3 = min_dist2
 			min_dist2 =  dist_q
 			nextzone[3] = nextzone[2]
 			nextzone[2] = k
 		elseif (dist_q < min_dist3) then 
 			min_dist3 =  dist_q
 			nextzone[3] = k
		end
	end
	for i=1, 3, 1 do
		akt_zone = zones_tbl[nextzone[i]]
		akt_zone.Active = true
	end
	nextzon = nextzone[1]
end

Das funktioniert auch sehr schön
 
OP
austriaka

austriaka

Geocacher
Klar hab ich das gesehen und viel davon gelernt. Ich wollte nur nicht Zonen durch die Gegend schieben.
Ich habe für mein Skript gar keine Zonen definiert, sondern in jeder Zone einen Punkt angelegt, der für die Abstandsmessung vewendet wird. Das ist ein einfacher Array.
zones_tbl sind keine kompletten Zonen sondern nur ein Array mit den Namen
 

bodenseepingu

Geomaster
bodenseepingu schrieb:
Übrigens habe ich bei groundspeak foren eine nette LUA-Routine gefunden, mit der man alle definierten Zonen abarbeiten kann....da liesse sich die Aktivierung der 3 nächstgelegenen Zonen ein bisschen besser automatisieren...

siehe http://forums.groundspeak.com/GC/index.php?showtopic=280707

Leider scheint der OpenWig/WhereyouGo-Player die zcart:GetAllOfType - Methode nicht zu mögen - gibt eine "Bug"-Absturzmeldung....schade schade...(hab einen test gemacht - im Emulator top, im Android Absturz, ich hoffe mal daß nicht was grundlegend anderes die Fehlerursache war - aber ich hab den Test mit ner ansonsten funktionierenden Cartridge gemacht - bin mir schon ziemlich sicher, daß die GetAllOfType Methode den Absturz verursacht...)
 

sTeamTraen

Geocacher
Bugs mit WhereYouGo/OpenWiG können über den GC.com-Wherigo-Forum an matejcik gemeldet worden; die meisten werden schnell im einen folgenden Release corrigiert.
 

bodenseepingu

Geomaster
ja - es gibt aber hier eine Alternative - #-Zeichen verwenden...

Laut OpenWig-Ersteller ist table.getn old fashioned...aber er wirds denke ich reinmachen...dauert halt - wenns in OpenWig ist, muss der WhereYouGo-Hersteller den Code bei sich übernehmen...da muss man ggf. auch mal nachfragen, wenn sich die Anzahl der Bugs lohnt.

Hier ne Testcartridge, die ich extra für die GetAllOfType gebaut hab....
..auf dem Oregon läuft es...

Supergut wäre auch die Funktion durch die Tasks durchzugehen per Loop und die erledigten zu zählen...hab ich im Test-Code eingebaut...läuft dann (hoffe ich) auch bald mit OpenWig und WhereYouGo..
 

Anhänge

  • getalloftype.zip
    36,3 KB · Aufrufe: 12

bodenseepingu

Geomaster
Ach ja, an alle Apfel-Besitzer.

Wäre toll, wenn mal jemand die Funktionen auf einem I-Phone austestet. Wir wollen ja schließlich, daß in Zukunft alle Cartridges auf allen Geräten laufen.

Falls es da Probleme gibt, wärs auch schön, wenn jemand den Kontakt zu den Programmierern sucht...
 

Krolock

Geocacher
bodenseepingu schrieb:
Falls es da Probleme gibt, wärs auch schön, wenn jemand den Kontakt zu den Programmierern sucht...

Das hatte ich schon wegen dem Zugriff auch nicht vorhandene table index vor
Code:
if mytable[7] == nil
liefert nicht true sondern einen Fehler, wenn #mytable <=6, also wenn die Tabelle weniger als 7 Elemente hat.

Bei android und oregon kommt true zurück

Ich hab nur (bei kurzer Suche) keine Möglichkeit gesehen, dies an den Entwickler zu senden.

Weiß jemand, ob es da ne eAddy gibt, oder ne Websites um Bugs zu melden bzw. wegen Verhalten anzufragen. (Das obrige Verhalten kenn ich auch aus anderen Programmiersprachen, z.B ArrayIndexOutOfBoundException in Java. Es muss also kein Fehlverhalten sein)
 

bodenseepingu

Geomaster
probieren, weiss ich nicht - am einfachsten ist es immer eine kleine testcartridge zu machen - wenn es auf android oder garmin dann getestet werden soll - kein Problem, mache ich dann schon...
 
OP
austriaka

austriaka

Geocacher
nur schnell im Lua-Debugger ausprobiert:

Code:
function count_table()
	print('numerischer Table getn',table.getn(numtbl))
	print('generischer Table getn',table.getn(gentbl))
	print('numerischer Table #',#numtbl)
	print('generischer Table #',#gentbl)
	count = 0
	count1 = 0
	for k,v in pairs(numtbl) do count=count+1 end
	for k1,v1 in pairs(gentbl) do count1=count1+1 end
	print('numerischer Table for-Schleife',count)
	print('generischer Table for-Schleife',count1)
end

ergibt (von unten nach oben)
Code:
generischer Table for-Schleife	4
numerischer Table for-Schleife	5
generischer Table #	0
numerischer Table #	5
generischer Table getn	0
numerischer Table getn	5

Das heißt, generische Tables lassen sich weder mit table.getn noch mit #mytable zählen...
 
OP
austriaka

austriaka

Geocacher
Ich verzweifel gerade an meiner schönen Funktion :(
Sie funktioniert wunderbar, dh alle 5 Sekunden wird die Distanz des Spielers zu den 10 Punkten berechnet und die 3 nächstgelegenen werden aktiv geschaltet.
Was mich zur Verzweiflung bringt:
das Aktivieren/Deaktivieren der Zone verändert die berechnete Distanz ohne dass sich der Spieler bewegt.
Ich habe alles abgeklopft, die Punkte verändern sich nicht, weder der Spieler noch die Zonenpunkte. Trotzdem gibt der Aufruf von d, b = Wherigo.VectorToPoint(standort, myZone.OriginalPoint) bei jedem Schleifendurchlauf einen anderen Wert aus.
Ich habe es mit ZonePoint, Item.ObjectLocation und zuletzt mit OriginalPoint ausprobiert, es passiert immer das gleiche: sobald eine Zone im Schleifendurchlauf aktiviert oder deaktiviert wird, ist die Distanz des Spielers zum Punkt verändert.
Kann das jemand nachvollziehen? Gibt es dafür eine Erklärung?
 

bodenseepingu

Geomaster
Ich hab damit absolut keine Probleme - die Zonen sind doch statisch - und Player.ObjectLocation ist die Variable...Ich habe doch die Testcartridge hier mit 100 Locations - die ist als Play Anywhere angelegt - d.h.
die kannst du ohne Probleme testen - ich wüsste nicht, daß es da irgendwelche Probleme gibt.

Eines ist klar - wenn eine Zone verschoben wird, dann wirkt die Verschiebung nur nach einem Active-Setzen

Hier nochmals der Link - versuch die Cartridge und vergleiche mal was ich da gemacht habe und was
du gemacht hast.
http://www.geoclub.de/viewtopic.php?f=74&t=52208
 
Oben