Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / EffectVar: got any, but expected &?
- - By Octagon (More than 200 posts.) Date 16.02.2015 11:25 Edited 16.02.2015 11:27
Ich habe versucht, eine Funktion GrabEffects zu schreiben, die analog zu GrabObjectInfo die einer Suchmaske entsprechenden Effekte eines Objektes klaut und sie einem anderen Objekt gibt.
Nachdem der neue Effekt erstellt wird, will ich noch die EffectVars übertragen.

Allerdings schmeißt die Zeile
EffectVar(iVarIndex, pTo, iNewEffect) = EffectVar(iVarIndex, pFrom, iOldEffect);
einen Fehler, wenn ich versuche, mehr als eine EffectVar zu übertragen.
Operator "=": left side: got "any", but expected "&"!

Ich verstehe nicht, warum das nicht funktioniert. Meine erste Vermutung war, dass EffectVars im Effekt initialisiert werden müssen, aber das ist nicht der Fall.
Die Übertragung von EffectVars ist so ziemlich der Hauptzweck dieser Funktion, also ist der Verzicht auf dieses Feature keine Lösung.

(Ja, der Effekt existiert.)
Parent - - By Luchs (More than 1000 posts.) Date 16.02.2015 15:32
EffectVar gibt nur dann keine Referenz zurück, wenn der Effekt nicht existiert oder dein iVarIndex negativ ist.
Parent - - By Pitri (More than 200 posts.) Date 17.02.2015 13:32 Edited 17.02.2015 13:39
Dann müsste man das ja mit IsRef(var) filtern können, oder? (Ich hab die funktion noch nie wirklich benutzt)
Parent - - By Luchs (More than 1000 posts.) Date 17.02.2015 17:14
Ich glaube, die Referenz geht verloren, wenn du das Ergebnis von EffectVar in einer Variable speicherst (zumindest sieht man ja häufig das Muster, dass die Effektvariablen zuerst schön in benannte Variablen gepackt werden und am Ende wieder zurück). Von daher überprüft man wohl besser einfach davor, ob der Effekt existiert. Da der hier aber frisch erzeugt wird, liegt das Problem wohl eher woanders.
Parent - - By Pitri (More than 200 posts.) Date 18.02.2015 12:26
Naja, eigentlich meinte ich damit IsRef(EffectVar(...)). Ich hatte es lediglich in etwas kürzerer Form geschrieben und gehofft, dass es nicht falsch verstanden wird. :P
Parent - By Luchs (More than 1000 posts.) Date 18.02.2015 17:47
Aber dann muss man ja auch zwei mal EffectVar aufrufen und gewinnt nichts gegenüber einem GetEffect davor.
Parent - By Octagon (More than 200 posts.) Date 19.02.2015 10:19 Edited 19.02.2015 10:26
Meine Tests widersprechen dem. IsRef gibt auch bei vorher nicht benutzten EffectVars false zurück!

Der Error kam allerdings daher, dass ich zu weit iteriert habe und die Prozedur dann doch auf einen nicht existenten Effekt ausgeführt werden sollte. Jetzt funktioniert alles, wie es soll.
Parent - - By Sven2 (More than 500 posts.) Date 18.02.2015 21:10

> (Ja, der Effekt existiert.)


Erzeugst du einfach eine Kopie mit AddEffect? Denn das wuerde ja auch den Start-Callback des Effektes aufrufen und sich ggf. gleich wieder entfernen oder sonstige komische Dinge tun.
Parent - By Octagon (More than 200 posts.) Date 19.02.2015 10:13
Ja - ein anderer Weg ist mir nicht bewusst - aber ich habe es bisher nur mit einem eigenen Effekt ausprobiert, der sowas eigentlich nicht tut.
Die aktuelle Laufzeit und sowas kann es natürlich auch nicht kopieren, also taugt es nur für bestimmte Effekte.
- - By Octagon (More than 200 posts.) Date 19.02.2015 10:26
Jetzt habe ich noch eine weitere Frage.
Laut Doku werden die Effect Vars ja in einer Liste gespeichert.

>Es sind theoretisch beliebig viele Variablen möglich; da aber die Liste beim Abfragen von Variablen außerhalb des erzeugten Bereiches neu erstellt werden muss, sollten hier nicht größere Werte als nötig genommen werden.


Kann es "Lücken" in der Liste der existierenden EffectVars geben? Das heißt, wenn ich Effect Var 20 definiere, werden dann 0-19 automatisch mit zur Referenz?
Wenn nein, könnte ich die Schleife ja bis zur ersten Non-reference durchlaufen lassen und damit sicherstellen, dass ich alle Effect Vars kopiere.
Parent - By Luchs (More than 1000 posts.) Date 19.02.2015 10:43
Die Liste kann keine Lücken haben (vom Speicherlayout her). Soweit ich das sehe, wird die Liste aber auch schon bei einem lesenden Zugriff über das letzte Element hinaus vergrößert. Daher denke ich nicht, dass du uninitialisierte Werte (für die IsRef ja scheinbar false zurückgibt, obwohl es durchaus schreibbare Referenzen sind) am Listenende von solchen zwischendrin unterscheiden kannst.

Du bekommst aber vermutlich eine zuverlässigere Antwort, wenn du das ausprobierst, ein Blick in den Sourcecode verrät da nicht alle Feinheiten.
Up Topic Deutsch / Hilfestellung / EffectVar: got any, but expected &?

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill