Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 10 von 10
  1. Beiträge anzeigen #1 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline

    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.

  2. Beiträge anzeigen #2 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    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.

  3. Beiträge anzeigen #3 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    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)

  4. Beiträge anzeigen #4 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    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 Zitat von Kirides Beitrag anzeigen
    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 Zitat von Kirides Beitrag anzeigen
    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.

  5. Beiträge anzeigen #5 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    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 Zitat von mud-freak Beitrag anzeigen
    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)

  6. Beiträge anzeigen #6 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    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.

  7. Beiträge anzeigen #7 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    PS: Diesen Text von dir habe ich erst gerade gesehen. Der war dir in mein Zitat hinein gerutscht:

    Zitat Zitat von Kirides Beitrag anzeigen
    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.

  8. Beiträge anzeigen #8 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    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.

  9. Beiträge anzeigen #9 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    - 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)?

  10. Beiträge anzeigen #10 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    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
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide