|
-
Zugriff auf Variablen in Instanzen-Definitionen
Ist es möglich auf Variablen zuzugreifen während eine Instanz erstellt wird?
In meinem naiven Test, war eine variable immer auf "0" während die Instanz erzeugt wird.
Erst in Init_Global() hatte die variable ihr vorher gespeicherten Wert (hier: 2).
In meinem Fall möchte ich während einer Instanz-Erstellung (spawn eines NPC) eine variable auswerten und entsprechend dieser verschiedene Werte, wie Visual, setzen.
Bei allem anderen außer dem Visual lässt sich das umgehen, indem ich in der Init_Global über alle NPC rüberlaufe und entsprechend die Werte modifiziere.
-
Schau mal wann zCParser::LoadGlobalVars aufgerufen wird. Darin werden die Variablenwerte geladen. Ich weiß gerade nicht aus dem Kopf, ob das vor dem Laden der Welt oder erst danach geschieht.
PS: Es ist auch wichtig, ob es eine globale Variable war oder eine Instanz.variable. Letztere lassen sich aus einer Instanzfunktion nicht referenzieren.
-
Zitat von mud-freak
Schau mal wann zCParser::LoadGlobalVars aufgerufen wird. Darin werden die Variablenwerte geladen. Ich weiß gerade nicht aus dem Kopf, ob das vor dem Laden der Welt oder erst danach geschieht.
PS: Es ist auch wichtig, ob es eine globale Variable war oder eine Instanz.variable. Letztere lassen sich aus einer Instanzfunktion nicht referenzieren.
LoadGlobalVars wird erst nach dem Laden der Welt und dem Eintritt ausgeführt.
Es ist definitiv eine Globale Variable (Story_Globals.d, var int ABC; )
Interessant ist auch das ich hierbei einen Stackoverflow erzeuge. Dabei funktioniert dieser Code während des laufenden Spiels an einer anderen Stelle problemlos.
Gleiches passiert auch mit MEM_World.voblist. Ich tippe hier auf die Funktionsaufrufe, da es ohne diese funktioniert (nur Mem_info(...)).
Code:
var int list; list = MEM_World.voblist_npcs;
var zCListSort l;
while(list);
l = _^(list);
if (l.data && (l.data != playerPtr)) {
var C_NPC npc; npc = _^(l.data);
if (npc.guild < GIL_SEPERATOR_HUM) {
B_SetAttributesToChapter(npc, npc.aivar[AIV_REAL_LEVEL]);
} else {
B_MM_SetAttributesToChapter(npc, npc.aivar[AIV_REAL_LEVEL]);
};
};
list = l.next;
end;
Geändert von Kirides (01.03.2021 um 12:33 Uhr)
-
Zitat von Kirides
LoadGlobalVars wird erst nach dem Laden der Welt und dem Eintritt ausgeführt.
Es ist definitiv eine Globale Variable (Story_Globals.d, var int ABC; )
Das ist dann die traurige Nachricht.
Zitat von Kirides
Interessant ist auch das ich hierbei einen Stackoverflow erzeuge.
Ist es ein Überlauf im Datenstack von Daedalus (Fehlermeldung) oder vom Maschinenstack (Access Violation)?
Beim Datenstack wäre es wahrscheinlich genau das. Eine der beiden Funktionen, die du wiederholt aufrufst, lässt Daten auf dem Stack zurück, die sich ansammeln. Das kommt vor allem vor, wenn Rückgabewerte von Funktionsaufrufen oder von Ausdrücken nicht "abgeholt" werden.
Zitat von Kirides
Dabei funktioniert dieser Code während des laufenden Spiels an einer anderen Stelle problemlos.
Wo rufst du den Code denn auf? Vielleicht an einer Stelle, wo da schon ein wenig auf dem Datenstack liegt.
-
Zitat von mud-freak
Das ist dann die traurige Nachricht.
Dann muss ich mit dem Visual Problem leben. Der rest scheint nicht betroffen zu sein.
Das interessante ist, wie ich finde: NPCs behalten ihre Werte und Attribute exakt so, wie bei der ersten Konstruktion des NPC (instance function aufruf)
Obwohl jedes mal beim Laden einer Welt, die Instance func wieder aufgerufen wird (bestätigt durch Mem_info) und die Werte auch "schein"-verändert werden. (MEM_Info liefert "schein" Werte, ein "O" in den NPC beweist jedoch, das dieser die richtigen Werte hat)
Zitat von mud-freak
Ist es ein Überlauf im Datenstack von Daedalus (Fehlermeldung) oder vom Maschinenstack (Access Violation)?
Beim Datenstack wäre es wahrscheinlich genau das. Eine der beiden Funktionen, die du wiederholt aufrufst, lässt Daten auf dem Stack zurück, die sich ansammeln. Das kommt vor allem vor, wenn Rückgabewerte von Funktionsaufrufen oder von Ausdrücken nicht "abgeholt" werden.
Wo rufst du den Code denn auf? Vielleicht an einer Stelle, wo da schon ein wenig auf dem Datenstack liegt.
INIT_GLOBAL als 2 Funktion direkt nach MEM_InitAll();
- Keine der Funktionen hat einen Rückgabewert. (alles func void)
- Innerhalb der Funktion wird Npc_SetTalentSkill (Engine, func void) aufgerufen
- keine Merkwürdigen "int;" push-statements
Ich kann es aber nicht zuverlässig reproduzieren.
Bei einigen Savegames tritt der Fehler mal auf und mal nicht.
Es hat z.B. 9x nicht geklappt und dann ging es. Nach einem weiteren Neustart ging es dann 5x und ist bei 6x abgeschmiert. (Stack Push error, wahrscheinlich das mit dem Datenstack wovon du sprachst)
Geändert von Kirides (01.03.2021 um 14:32 Uhr)
-
Zitat von Kirides
INIT_GLOBAL als 2 Funktion direkt nach MEM_InitAll();
- Keine der Funktionen hat einen Rückgabewert. (alles func void)
- Innerhalb der Funktion wird Npc_SetTalentSkill (Engine, func void) aufgerufen
- keine Merkwürdigen "int;" push-statements
Ich kann es aber nicht zuverlässig reproduzieren.
Bei einigen Savegames tritt der Fehler mal auf und mal nicht.
Es hat z.B. 9x nicht geklappt und dann ging es. Nach einem weiteren Neustart ging es dann 5x und ist bei 6x abgeschmiert. (Stack Push error, wahrscheinlich das mit dem Datenstack wovon du sprachst)
Ein paar Ideen:- Da es in Init_Global (der möglicherweise letztgeparsten Funktion) auftritt; hast du die neuste Ikarus Version (1.2.2)?
- Erhältst du im zSpy irgendwelche interessanten Infos (z.B. über leere Instanzen)?
- Kannst du mit Prints festmachen, ob das Problem vor, in (dann wo genau) oder nach der Schleife auftritt?
- Du kannst innerhalb der Schleifendurchläufe den Stackpointer (MEM_Parser.datastack_sptr) ausgeben lassen, um noch einmal sicher zu gehen, dass er sich nicht kontinuierlich erhöht.
- Es ist gut möglich, dass der Stack-Fehler ein Folgefehler ist und im Datenstack selbst kein Problem vorliegt. In dem Falle müsstest du etwas weiter nachforschen, was die Umstände angeht und, ob es sich immer um genau den gleichen Fehler handelt.
-
PS: Diesen Text von dir habe ich erst gerade gesehen. Der war dir in mein Zitat hinein gerutscht:
Zitat von Kirides
Das interessante ist, wie ich finde: NPCs behalten ihre Werte und Attribute exakt so, wie bei der ersten Konstruktion des NPC (instance function aufruf)
Obwohl jedes mal beim Laden einer Welt, die Instance func wieder aufgerufen wird (bestätigt durch Mem_info) und die Werte auch "schein"-verändert werden. (MEM_Info liefert "schein" Werte, ein "O" in den NPC beweist jedoch, das dieser die richtigen Werte hat)
Ja, das ist richtig. Was hier passiert ist, dass während des Unarchiverens eines NPCs, dessen Instanzfunktion aufgerufen wird (für feste Werte die sich nicht ändern) und anschließend werden weitere Werte unarchiviert und darüber gelegt.
Übrigens musst du schauen, ob die Nutzung von MEM_Info innerhalb Instanzfunktionen nicht die Instanz verändert.
-
Zitat von mud-freak
Ein paar Ideen: - Da es in Init_Global (der möglicherweise letztgeparsten Funktion) auftritt; hast du die neuste Ikarus Version (1.2.2)?
- Erhältst du im zSpy irgendwelche interessanten Infos (z.B. über leere Instanzen)?
- Kannst du mit Prints festmachen, ob das Problem vor, in (dann wo genau) oder nach der Schleife auftritt?
- Du kannst innerhalb der Schleifendurchläufe den Stackpointer (MEM_Parser.datastack_sptr) ausgeben lassen, um noch einmal sicher zu gehen, dass er sich nicht kontinuierlich erhöht.
- Es ist gut möglich, dass der Stack-Fehler ein Folgefehler ist und im Datenstack selbst kein Problem vorliegt. In dem Falle müsstest du etwas weiter nachforschen, was die Umstände angeht und, ob es sich immer um genau den gleichen Fehler handelt.
- Verwende Ikarus 1.2.2
- zSPY zeigt mir nichts (printe "self.name", dazwischen ist nichts)
- Anhand von MEM_Info konnte ich ausmachen, das es am Ende der schleife passiert. (wenn l.next == 0)
- Leider bekomme ich den Fehler aktuell nicht mehr reproduziert. Ich merke mir das mit dem datastack_sptr für die Zukunft.
-
Zitat von Kirides
- Anhand von MEM_Info konnte ich ausmachen, das es am Ende der schleife passiert. (wenn l.next == 0)
Ich weiß nicht, ob die NPC in der Liste sortiert werden, aber wenn die Einfügereihenfolge erhalten bleibt könnte es der MEM_Helper aus Ikarus oder der ItemHelper aus LeGo (falls verwendet) sein. Die sind beide minimal und könnten vielleicht Probleme machen, falls in den Funktionen etwas gelesen wird was nicht festgelegt ist. Aber das ist nur reine Spekulation. Da wird wahrscheinlich noch etwas testen nötig sein, bis du das Problem ausmachen kannst.
Konntest du feststellen, welcher NPC gerade an der Reihe war als es zum Fehler kam (immer der selbe)?
-
Zitat von mud-freak
Ich weiß nicht, ob die NPC in der Liste sortiert werden, aber wenn die Einfügereihenfolge erhalten bleibt könnte es der MEM_Helper aus Ikarus oder der ItemHelper aus LeGo (falls verwendet) sein. Die sind beide minimal und könnten vielleicht Probleme machen, falls in den Funktionen etwas gelesen wird was nicht festgelegt ist. Aber das ist nur reine Spekulation. Da wird wahrscheinlich noch etwas testen nötig sein, bis du das Problem ausmachen kannst.
Konntest du feststellen, welcher NPC gerade an der Reihe war als es zum Fehler kam (immer der selbe)?
Der letzte NPC an der Reihe war immer der Selbe (eine Instanz einer meiner eigenen NPC) das führe ich daraf zurück, das dieser NPC beschworen wurde und deswegen ganz am Ende steht.
Der NPC ist aber lediglich ein Wolf genau wie der beschworene Wolf eines Magiers.
Von der Instanz-definition ist alles ist exakt wie beim beschworenen Wolf, nur das in der ZS_MM_Summoned nicht auf die Beschwörungszeit geachtet wird.
Aber da das Problem jetzt gerade nicht mehr auftaucht, lasse ich die nachforschungen erstmal.
Sobald mir ein Tester etwas mitteilt, oder es mir selbst wieder passiert, prüfe ich wieder nach.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|