-
Ich habe mir mal einen MEM_Debug Print für ZSpy in der Init ausgeben lassen. Wird bei jedem Ladevorgang korrekt ausgegeben. Die Init wird folglich immer richtig aufgerufen. Nur die AI-Functions wollen nicht immer.
Meine Version ist "LeGo 2.7.1"
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Zitat von Bisasam
Ich habe mir mal einen MEM_Debug Print für ZSpy in der Init ausgeben lassen. Wird bei jedem Ladevorgang korrekt ausgegeben. Die Init wird folglich immer richtig aufgerufen. Nur die AI-Functions wollen nicht immer.
Meine Version ist "LeGo 2.7.1"
Danke, das sieht ja soweit sehr gut aus.
Würdest du vielleicht noch ein paar MEM_Debug Prints in die PC_SCHMIEDEN_TEST_Info und an den Anfang der AI-Funktion schreiben? (Falls du das nicht schon getan hast.)
-
Hello Bisasam,
maybe there is an issue with TauscheSchwert, EntferneRohstahl - is it using self variable within ?
Code:
AI_Function (self,TauscheSchwert);
AI_Function (self,EntferneRohstahl);
If so this might be the cause of issue, self is not initialized by default. Try to update it by yourself:
Code:
func void TauscheSchwert (){
//self is not initialized by AI_Function, you have to do it by yourself atm -->
self = _^ (ECX);
};
func void EntferneRohstahl (){
//self is not initialized by AI_Function, you have to do it by yourself atm -->
self = _^ (ECX);
};
I am using slightly modified version of LeGo, where I have updated function _AI_FUNCTION_EVENT in AI_Function.d to do it by default (I believe mud-freak confirmed future version of LeGo will do this, but for now maybe you can update it as well in your script):
Code:
func void _AI_FUNCTION_EVENT() {
var string s0; var string s1;
var int i0; var int i1; var int fnc;
var int ptr; ptr = EBP + 88;
MEMINT_StackPushVar(ptr);
var string AniName; AniName = MEMINT_PopString();
//--- >MOD
//Initialize self
self = _^ (ECX);
//--- <MOD
-
final()
Ich möchte einfach nur mal sagen, das "final()" genial ist.
Ich bin von Go(lang) sowas von verwöhnt, was "defer" Statements angeht.
Durch Final kann ich viele doppelte Funktionsaufrufe in verschachtelungen entfernen und mir sicher sein, das Pointer auch wirklich frei sind oder "Globale" variablen richtig zurückgesetzt wurden
-
Zitat von Cryp18Struct
Ich verstehe zwar nicht warum da 2 mal DIAG_Reset aufgerufen wird(Dialoggesten werden ja gar nicht manipuliert?), aber auffälliges kann ich da nicht entdecken.
Ich nehme an das Problem ist nicht reproduzierbar mit diesem Trialog und ist nur bei dem einem Spieler passiert?
Ich greife mein Trialog-Problem hier noch mal auf, weil sich ein zweiter Spieler gemeldet hat, bei dem dasselbe Problem aufgetreten ist -- allem anschein nach beimselben Trialog.
Das Spiel denkt, dass der Trialog noch läuft, und eventuell sind auch ein paar Npc nicht korrekt in ihre richtigen Körper versetzt. Das klingt für mich so, als würde _TRIA_Finish() nicht ausgeführt. Kann es etwas geben, wodurch nach TRIA_Finish die AI_Queue des Spielers kaputt geht? (dort wird ja _TRIA_FINISH eingetragen)
Was mir sonst noch auffällt:
TRIA_LAST und TRIA_SELF sind in diesem Spielstand unterschiedliche Werte, obwohl im Trialog, der angeblich noch läuft, der letzte Npc-Wechsel ist "TRIA_Next(TRIA_Calvin);" und
Code:
var c_npc TRIA_Calvin; TRIA_Calvin = Hlp_GetNpc(loa_none_6601_calvin);
ist auch der Npc, der im Dialog "self" sein sollte (in der Instanz als npc eingetragen ist). Hat das eventuell etwas zu bedeuten?
-
Habt ihr vielleicht irgendwelchen code, der ausgeführt wird während der Trialog läuft?
Triggerscript-Schleife oder framefunctions die irgendwelchen Kram prüft und dann Npc_ClearAIQueue aufruft?
Könnte irgendwas sein was mit dem Trialog gar nichts zu tun hat...
Code:
func void calledEverySecond(){
if(MIS_XYZ == LOG_RUNNING{
if(abc){
// do x, do y, do z...
[...]
Npc_ClearAIQueue(hero);
};
};)
};
)
Da müsste man dann mit InfoManager_hasFinished() oder so sicherstellen das solcher kram nur gemacht wird wenn gerade kein Dialog läuft.
-
ich habe mal wieder bisschen mit dem zSpy gelauscht und dabei leider festgestellt, das ich für meinen Geschmack zu viele Handles missbrauche. (Anim8)
Bevor ich mir jetzt ein halbgaren Handle-Pool dafür schreibe, wollte ich mal fragen, ob jemand diese Arbeit bereits gemacht hat.
Edit: ich sehe gerade, das Anim8 sicht nicht wirklich recyclen lässt zumindest fällt mir da nichts ein, was getan werden kann ohne mindestens eine "wenn anim-queue leer" funktion.
Theoretisch könnte man hier ja "einfach" jedes Handle direkt wegsichern und prüfen ob die queue leer ist und nur dann ein handle zum "poolen" gültig machen, aber das ist irgendwie unsauber :/
Geändert von Kirides (20.02.2021 um 15:45 Uhr)
-
Zitat von Kirides
ich habe mal wieder bisschen mit dem zSpy gelauscht und dabei leider festgestellt, das ich für meinen Geschmack zu viele Handles missbrauche. (Anim8)
Bevor ich mir jetzt ein halbgaren Handle-Pool dafür schreibe, wollte ich mal fragen, ob jemand diese Arbeit bereits gemacht hat.
Edit: ich sehe gerade, das Anim8 sicht nicht wirklich recyclen lässt zumindest fällt mir da nichts ein, was getan werden kann ohne mindestens eine "wenn anim-queue leer" funktion.
Theoretisch könnte man hier ja "einfach" jedes Handle direkt wegsichern und prüfen ob die queue leer ist und nur dann ein handle zum "poolen" gültig machen, aber das ist irgendwie unsauber :/
Du missbrauchst die Handles ja nicht. Du (ver)brauchst sie. Über welche Größenordnung sprechen wir denn? Wir haben neulich die mögliche Handlezahl verdoppelt (noch nicht in der neusten LeGo Version).
Es gäbe noch die Möglichkeit Anim8 auch handle-los zur Verfügung zustellen. Etwa wie man das von View-Pointer vs. View-Handle Funktionen, bzw. create vs. new kennt. Das hatte ich mal angesprochen, aber wegen der erhöhten Handlezahl wieder verworfen.
Andernfalls sollte das Recyclen von Anim8-Handles doch recht einfach sein oder irre ich mich da?
Das Anim8-Objekt ohne “RemoveIfEmpty” erstellen und jedes mal beim Anlegen eines Anim8-Objektes abfragen ob ein leeres Verfügbar ist und dieses dann anstatt eines neuen weiterverwenden (neue Befehle der Queue anhängen Startwerte und Data aktualisieren).
-
Zitat von mud-freak
Du missbrauchst die Handles ja nicht. Du (ver)brauchst sie. Über welche Größenordnung sprechen wir denn? Wir haben neulich die mögliche Handlezahl verdoppelt (noch nicht in der neusten LeGo Version).
Es gäbe noch die Möglichkeit Anim8 auch handle-los zur Verfügung zustellen. Etwa wie man das von View-Pointer vs. View-Handle Funktionen, bzw. create vs. new kennt. Das hatte ich mal angesprochen, aber wegen der erhöhten Handlezahl wieder verworfen.
Andernfalls sollte das Recyclen von Anim8-Handles doch recht einfach sein oder irre ich mich da?
Das Anim8-Objekt ohne “RemoveIfEmpty” erstellen und jedes mal beim Anlegen eines Anim8-Objektes abfragen ob ein leeres Verfügbar ist und dieses dann anstatt eines neuen weiterverwenden (neue Befehle der Queue anhängen Startwerte und Data aktualisieren).
Wir reden hier ein einer Grßenzahl von 5 Handles (2x Head, 3xCommand) pro Aktion und diese müssten auch nicht gespeichert werden, da diese sehr kurzlebig sind.
Ganz speziell geht es hier um den Quickloot Patch welchen ich noch immer nicht 100%-ig freigeben möchte.
Dort wird eine xy bewegung eines TextView mit Anim8 realisiert für die aufgehobenen Items. Schnell schießt die Handlezahl weit über 1000 und das *nur* für den Quickloot Patch (+ mods die diesen integrieren)
Eine Handle-lose alternative wäre wirklich super.
Aber ich möchte natürlich auch nicht unnötig aufwand erzeugen, bisher habe ich keine Berichte über kaputte savegames durch Quickloot erhalten. Und ich denke auch nicht, das dies sehr wahrscheinlich ist.
Edit: mir ist auch aufgefallen, das "Anim8_RemoveDataIfEmpty" nur ausgeführt wird, wenn "Anim8_RemoveIfEmpty" auch gesetzt ist (Und das es keine Version für Pointer (free) gibt)
Geändert von Kirides (21.02.2021 um 12:59 Uhr)
-
Du musst bedenken, dass es 2^32 gültige Handles gibt und sich die Performance durch verbrauchte Handles nicht beeinflussen lassen sollte. Selbst bei 1000 Handles pro Sekunde hast du noch ca. 16 Millionen Sekunden bzw ~4600 Stunden Spielzeit vor dir, bis das Limit erreicht ist.
-
Zitat von Lehona
Du musst bedenken, dass es 2^32 gültige Handles gibt und sich die Performance durch verbrauchte Handles nicht beeinflussen lassen sollte. Selbst bei 1000 Handles pro Sekunde hast du noch ca. 16 Millionen Sekunden bzw ~4600 Stunden Spielzeit vor dir, bis das Limit erreicht ist.
Oh, irgendwie hatte ich 65.000 (ushort) handles im Kopf und nicht uint. Das macht das alles natürlich fraglich
Woran erkenn ich eingentlich ob ein Handle im savegame landet, oder einfach nur "verbraucht" wird ? (archive-flag?)
ich schaue mir grade viele Stellen im code an, da bei mir plötzlich das Speichern ~1.5 Sekunden gedauert hat (LeGo PermMem dauer)
Da wollte ich einfach mal wissen wie viel davon an irgendwelchen Handles liegen kann. Benutze in meiner Mod nur 3 Frame-Functions und sonst fast ausschließlich EngineHooks und Anim8 sachen.
-
Zitat von Kirides
Woran erkenn ich eingentlich ob ein Handle im savegame landet, oder einfach nur "verbraucht" wird ? (archive-flag?)
Was genau meinst du? Alle aktuell gültigen Handles und deren Objekte siehst du in der SCRPTSAVE.SAV Datei. Sobald ein Handle gelöscht wird, ist davon im Spielstand auch nichts mehr übrig.
Zitat von Kirides
ich schaue mir grade viele Stellen im code an, da bei mir plötzlich das Speichern ~1.5 Sekunden gedauert hat (LeGo PermMem dauer)
Da wollte ich einfach mal wissen wie viel davon an irgendwelchen Handles liegen kann. Benutze in meiner Mod nur 3 Frame-Functions und sonst fast ausschließlich EngineHooks und Anim8 sachen.
Was am Speichervorgang in PermMem am längsten dauert ist meines Wissens nach das Sortieren des Handle-Hashtables (abgesehen vom Schreiben der SCRPTSAVE.SAV Datei). Dabei spielt wieder nur die Anzahl der aktuell gültigen Handles eine Rolle (wie viele es jemals gab ist nicht ausschlaggebend).
-
Zitat von mud-freak
Was am Speichervorgang in PermMem am längsten dauert ist meines Wissens nach das Sortieren des Handle-Hashtables (abgesehen vom Schreiben der SCRPTSAVE.SAV Datei). Dabei spielt wieder nur die Anzahl der aktuell gültigen Handles eine Rolle (wie viele es jemals gab ist nicht ausschlaggebend).
Das ist übrigens nur ein Insertion-Sort und damit tendenziell ziemlich langsam. Das könnte man entweder durch eine richtige Sortierfunktion ersetzen oder überlegen, ob man das überhaupt sortieren muss Sortierte Handles sind nett zum Debuggen, aber sonst nicht weiter nützlich - glaube ich.
-
Zitat von Lehona
Das ist übrigens nur ein Insertion-Sort und damit tendenziell ziemlich langsam. Das könnte man entweder durch eine richtige Sortierfunktion ersetzen oder überlegen, ob man das überhaupt sortieren muss Sortierte Handles sind nett zum Debuggen, aber sonst nicht weiter nützlich - glaube ich.
Anstatt in einer verketteten Liste könnte man aus dem Hashtable ein zCArray machen und dann qsort aus der Engine nehmen.
Sortierte Handles waren wenn ich mich nicht irre teilweise für Objekte sinnvoll, die andere Handles referenzieren. Damit waren die Handles beim Unarchiven bereits gültig. Ein anderes Beispiel ist die Priority von Sprites.
-
Wir haben ja die LeGo FrameFunction... Gibts auch ne LeGo SecondFunction also für jede Sekunde statt jeden Frame? Ich hab mir die vorhandenen Funktionen angesehen, aber ich bin unsicher ob das abgedeckt ist. Bisher arbeite ich mit Triggerscripts in der Welt...
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Zitat von https://lego.worldofplayers.de/?FrameFunctions
delay : Verzögerung zwischen den Aufrufen in Millisekunden. (0 == jeden Frame)
wenn du da 1000 rein schreibst, ist es eine Sekunde.
Code:
FF_ApplyExt(myFunc, 1000, -1); // myFunc aufrufen, alle 1000ms (== 1 Sekunde), unendlich oft
-
Zitat von Kirides
mir ist auch aufgefallen, das "Anim8_RemoveDataIfEmpty" nur ausgeführt wird, wenn "Anim8_RemoveIfEmpty" auch gesetzt ist (Und das es keine Version für Pointer (free) gibt)
Ich weiß nicht, ob da nicht eine tiefere Absicht hinter steckte. Ein Anim8-Objekt, das mit Daten erstellt wurde, geht davon aus, dass die Handler-Funktion auch einen entsprechenden Parameter erwartet. Wenn später das Anim8-Objekt "leer" ist und die Daten auf Null gesetzt werden, könnte es ja sein, dass später nur etwas der Queue angehängt aber keine neuen Daten angehängt werden. Dann legt die Anim8-Loop beim Aufruf der Handler-Funktion ein Argument zu wenig auf den Datenstack. Die Handler-Funktion nimmt dann etwas vom Stack, was sie gar nicht soll und das könnte unschöne Folgen haben.
Da die Absicht des Nicht-Löschens wahrscheinlich ist, das Anim8-Objekt weiter zu verwenden und dessen Queue neu zu füllen, tut man dies ja sowieso manuell. Zu dem Zeitpunkt kann man die Daten ja manuell löschen, bzw. ersetzen.
Zitat von Kirides
(Und das es keine Version für Pointer (free) gibt)
Ich muss zugeben, ich verstehe diesen Satz leider nicht.
Meinst du damit, dir fehlt eine Variante Daten als Pointer anstatt als Handle anzuhängen? Das war wohl Absicht so, denn Anim8-Objekte wandern ja in den Spielstand. Nach Spiellanden wäre ein Pointer als Daten ungültig und es gibt auch keinen sinnvollen Weg das zu prüfen. Ansonsten können die Daten sein, was du möchtest (solange es ein Integer ist), solang du nicht Anim8_RemoveDataIfEmpty verwendest.
-
Möglicherweise war das so zu verstehen, dass Kirides sich eine Funktion Anim8_Free() wünschen würde?
“Da ist auch noch ein anderer Geruch in der Luft, der Geruch von Feuern, die in der Ferne brennen, mit einem Hauch Zimt darin - so riecht das Abenteuer!”
― aus Walter Moers' "Die 13 1/2 Leben des Käpt'n Blaubär"
-
Zitat von GiftGrün
Möglicherweise war das so zu verstehen, dass Kirides sich eine Funktion Anim8_Free() wünschen würde?
mehr oder weniger.
Anim8 arbeitet immer mit handles und das automatische schließen einer Animation kann auch nur mit handles arbeiten.
Das macht auch vollkommen sinn, so wie Anim8 aufgebaut ist - es erlaubt dir Animationen über Spielstände hinweg zu sichern.
Das ganze war nur jammern auf höchstem Niveau.
Im Endeffekt stimme ich mudfreak da zu. Ich hatte nur fälschlicherweise die Annahme das "Handles" auf wenige zehntausende begrenzt waren. bei 3 Handles 3-5 Handles pro Aufruf und Sekunde hätte das nicht lange gehalten.
Aber wie gesagt - falsche Annahme meinerseits.
-
Ich habe ein Problem, vermutlich mit LeGo-Talente.
In der B_InitNpcGlobals (ausgerufen aus der Init unserer Welt) haben wir folgenden Code:
Code:
// Said's concubines don't fight
TAL_SetValue(SaidConcubine1, AIV_DontFight, TRUE);
TAL_SetValue(SaidConcubine2, AIV_DontFight, TRUE);
TAL_SetValue(SaidConcubine3, AIV_DontFight, TRUE);
// Crazy Monk does not fight
TAL_SetValue(loa_wm_6722_CrazyMonk, AIV_DontFight, TRUE);
Mit diesen Zeilen in der Init-Funktion kommt während des Ladens zwei mal der Stacktrace im zSpy:
Code:
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_BOWRUN, this:T_BOW_2_BOWRUN .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_BOWRUN, this:T_BOW_2_BOWRUN .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_CBOWRUN, this:T_CBOW_2_CBOWRUN .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_CBOWRUN, this:T_CBOW_2_CBOWRUN .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKL_2_WALK .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKR_2_WALK .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKL_2_WALK .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKR_2_WALK .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKL_2_WALK .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKR_2_WALK .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WOUNDED, this:S_DEAD .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WOUNDEDB, this:S_DEADB .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WOUNDED, this:T_DEAD .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WOUNDEDB, this:T_DEADB .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WOUNDEDB, this:T_WOUNDEDB_2_DEADB .... <zModelProto.cpp,#3352>
00:37 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WOUNDED, this:T_WOUNDED_2_DEAD .... <zModelProto.cpp,#3352>
00:47 Warn: 0 U: WAY: Ladder highpoint error (LOA_FM_TOSWAMP_005/LOA_FM_TOSWAMP_006 .... <oWaynet.cpp,#236>
00:47 Warn: 0 U: WAY: Ladder highpoint error (LOA_HAFEN_BOOTSBAUER_WERFT_OBEN_07/LOA_HAFEN_BOOTSBAUER_WERFT_OBEN_06 .... <oWaynet.cpp,#236>
00:47 Warn: 0 U: WAY: Ladder highpoint error (LOA_ST_TURM_OBEN_01/LOA_ST_TURM_OBEN_02 .... <oWaynet.cpp,#236>
00:47 Warn: 0 U: WAY: Ladder highpoint error (LOA_ST_TURM_18/LOA_ST_TURM_17 .... <oWaynet.cpp,#236>
00:48 Warn: 0 U: WAY: Ladder highpoint error (BL_13/BL_22 .... <oWaynet.cpp,#236>
00:48 Warn: 0 U: WAY: Ladder highpoint error (LOA_ISLE_KORSAREN_WT_02/LOA_ISLE_KORSAREN_WT_01 .... <oWaynet.cpp,#236>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_FISTRUN_2_FISTRUNL .... <zModelProto.cpp,#3352>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_MAGRUN_2_MAGRUNL .... <zModelProto.cpp,#3352>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_RUN_2_RUNL .... <zModelProto.cpp,#3352>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_MAG_2_MAGRUN .... <zModelProto.cpp,#4016>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_MAGRUN_2_MAG .... <zModelProto.cpp,#4016>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_FISTRUN_2_FISTRUNL .... <zModelProto.cpp,#4016>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_FISTRUN_2_FISTRUNL .... <zModelProto.cpp,#4016>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_FISTRUNL_2_JUMP .... <zModelProto.cpp,#4016>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_JUMP_2_STAND .... <zModelProto.cpp,#4016>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_FISTWALKL_2_FISTWALK .... <zModelProto.cpp,#4016>
00:48 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_FISTWALKL_2_FISTWALK .... <zModelProto.cpp,#4016>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_SWIMF_2_SWIM .... <zModelProto.cpp,#3352>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_SWIM_2_SWIMF .... <zModelProto.cpp,#3352>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKL_2_WALK .... <zModelProto.cpp,#3352>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKR_2_WALK .... <zModelProto.cpp,#3352>
00:48 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_RUN, this:T_RUNL_2_RUN .... <zModelProto.cpp,#3352>
00:49 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_RUN, this:T_RUNR_2_RUN .... <zModelProto.cpp,#3352>
00:49 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKBL_2_WALK .... <zModelProto.cpp,#3352>
00:49 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKBR_2_WALK .... <zModelProto.cpp,#3352>
00:49 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKL_2_WALK .... <zModelProto.cpp,#3352>
00:49 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKR_2_WALK .... <zModelProto.cpp,#3352>
00:49 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: S_FISTATTACK .... <zModelProto.cpp,#4016>
00:49 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: S_FISTATTACK .... <zModelProto.cpp,#4016>
00:49 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: S_FISTRUNL .... <zModelProto.cpp,#4016>
00:49 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: S_FISTWALKL .... <zModelProto.cpp,#4016>
00:49 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_FALL_2_FALLEN .... <zModelProto.cpp,#4016>
00:50 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_FISTWALKL_2_FISTWALK .... <zModelProto.cpp,#3352>
00:50 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_FISTWALKR_2_FISTWALK .... <zModelProto.cpp,#3352>
00:52 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: S_FISTRUNL .... <zModelProto.cpp,#4016>
00:52 Warn: 0 N: MSB: Frame-Number is out of bounds (AniEvents), ani: T_FISTRUNL_2_FISTRUN .... <zModelProto.cpp,#4016>
00:54 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKL_2_WALK .... <zModelProto.cpp,#3352>
00:54 Warn: 0 D: zModel(zCModelAni::ResolveReferences): Could not find nextAni: S_WALK, this:T_WALKR_2_WALK .... <zModelProto.cpp,#3352>
00:56 Warn: 0 Q: Deleted 0 corrupted light vobs out of 4490 total light vobs.
00:56 Fault: 0 Q: [start of stacktrace]
00:56 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 62 bytes
00:56 Fault: 0 Q: MEM_WARN('MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 21 bytes
00:56 Fault: 0 Q: MEM_PTRTOINST(238378308) + 77 bytes
00:56 Fault: 0 Q: MEM_ARRAYWRITE(0, 2, 1) + 28 bytes
00:56 Fault: 0 Q: TAL_SETVALUE((instance)643072056, 2, 1) + 133 bytes
00:56 Fault: 0 Q: B_INITNPCGLOBALS() + 60 bytes
00:56 Fault: 0 Q: INIT_WORLD() + 25 bytes
00:56 Fault: 0 Q: [end of stacktrace]
00:56 Warn: 0 Q: MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.
00:56 Fault: 0 Q: [start of stacktrace]
00:57 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_ArrayWrite: pos out of bounds: 2') + 62 bytes
00:57 Fault: 0 Q: MEM_ERROR('MEM_ArrayWrite: pos out of bounds: 2') + 21 bytes
00:57 Fault: 0 Q: MEM_ARRAYWRITE(0, 2, 1) + 92 bytes
00:57 Fault: 0 Q: TAL_SETVALUE((instance)643072056, 2, 1) + 133 bytes
00:57 Fault: 0 Q: B_INITNPCGLOBALS() + 60 bytes
00:57 Fault: 0 Q: INIT_WORLD() + 25 bytes
00:57 Fault: 0 Q: [end of stacktrace]
00:57 Fault: 0 Q: MEM_ArrayWrite: pos out of bounds: 2
00:58 Warn: 0 C: SCRIPT: Wld_SetMobRoutine(): could not find a vob with name: LIGHTTOWER .... <oGameExternal.cpp,#252>
00:58 Warn: 0 C: SCRIPT: last parser func-name: INIT_WORLD .... <oGameExternal.cpp,#262>
00:58 Warn: 0 C: SCRIPT: Wld_SetMobRoutine(): could not find a vob with name: FIREPLACE .... <oGameExternal.cpp,#252>
00:58 Warn: 0 C: SCRIPT: last parser func-name: INIT_WORLD .... <oGameExternal.cpp,#262>
00:58 Warn: 0 C: SCRIPT: Wld_SetMobRoutine(): could not find a vob with name: FIREPLACE .... <oGameExternal.cpp,#252>
00:58 Warn: 0 C: SCRIPT: last parser func-name: INIT_WORLD .... <oGameExternal.cpp,#262>
00:58 Warn: 0 C: SCRIPT: Wld_SetMobRoutine(): could not find a vob with name: LIGHTTOWER .... <oGameExternal.cpp,#252>
00:59 Warn: 0 C: SCRIPT: last parser func-name: INIT_WORLD .... <oGameExternal.cpp,#262>
00:59 Warn: 0 D: zModel.cpp(zCModel::StartAni): Ani not found: CALL II 9118160 1 5472 .... <zModel.cpp,#2581>
00:59 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
00:59 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
00:59 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
00:59 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
00:59 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
00:59 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Warn: 0 U: NPC: No Route found :Santor \ LOA_KMP_6605_SANTOR (LOA_FLMain_Mittelhaus_009) .... <oNpc_Move.cpp,#1481>
01:00 Fatal:-1 U: PAR: Error DoStack. ( line 160 ) .... <zParser.cpp,#599>
01:02 Warn: 0 X: [RND3D-Destructor]: Can't uninitialize D3DX Utility Library ! Error: D3DXERR_D3DXNOTSTARTEDYET .... <zRndD3D.h,#127>
sowie eine Error-Box (array position 2 out of bounds), mit der das Spiel aber (noch) nicht abstürzt.
und dann nach 2 Sekunden oder so im Spiel kommt der Fehler
DoStack (line 160)
im zSpy, Spiel beendet sich, sonst keine Fehlermeldung, keine "verwandten" Infos im zSpy selbst mit Level 10 und alle Infos etc. an.
Wenn ich die SaidConcubine# auskommentiere, dann kommen die StackTraces nicht mehr im zSpy, aber das Spiel stürzt noch ab mit DoStack error.
Wenn ich die Zeile des CrazyMonk auskommentiere, kommt der Absturz nicht mehr. Wenn ich dann mit goto vob loa_wm_6722_CrazyMonk zu ihm fliege, dann bekomme ich ständig
Code:
02:02 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 62 bytes
02:02 Fault: 0 Q: MEM_WARN('MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 21 bytes
02:02 Fault: 0 Q: MEM_PTRTOINST(247618884) + 77 bytes
02:02 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 22 bytes
02:02 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:02 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:02 Fault: 0 Q: [end of stacktrace]
02:02 Warn: 0 Q: MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.
02:02 Fault: 0 Q: [start of stacktrace]
02:02 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_ArrayRead: pos out of bounds: 2') + 62 bytes
02:02 Fault: 0 Q: MEM_ERROR('MEM_ArrayRead: pos out of bounds: 2') + 21 bytes
02:02 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 86 bytes
02:02 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:02 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:02 Fault: 0 Q: [end of stacktrace]
02:02 Fault: 0 Q: MEM_ArrayRead: pos out of bounds: 2
02:02 Fault: 0 Q: [start of stacktrace]
02:02 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_Realloc: ptr is 0 but oldsize is not 0.') + 62 bytes
02:02 Fault: 0 Q: MEM_ERROR('MEM_Realloc: ptr is 0 but oldsize is not 0.') + 21 bytes
02:02 Fault: 0 Q: MEM_REALLOC(0, 0, 6) + 50 bytes
02:02 Fault: 0 Q: _TAL_CHECKSIZE(9) + 73 bytes
02:02 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 74 bytes
02:02 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:02 Fault: 0 Q: [end of stacktrace]
02:02 Fault: 0 Q: MEM_Realloc: ptr is 0 but oldsize is not 0.
02:02 Fault: 0 Q: [start of stacktrace]
02:02 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 62 bytes
02:02 Fault: 0 Q: MEM_WARN('MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 21 bytes
02:02 Fault: 0 Q: MEM_PTRTOINST(247618884) + 77 bytes
02:02 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 22 bytes
02:02 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:02 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:02 Fault: 0 Q: [end of stacktrace]
02:02 Warn: 0 Q: MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.
02:02 Fault: 0 Q: [start of stacktrace]
02:02 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_ArrayRead: pos out of bounds: 2') + 62 bytes
02:02 Fault: 0 Q: MEM_ERROR('MEM_ArrayRead: pos out of bounds: 2') + 21 bytes
02:02 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 86 bytes
02:02 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:02 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:02 Fault: 0 Q: [end of stacktrace]
02:02 Fault: 0 Q: MEM_ArrayRead: pos out of bounds: 2
02:03 Fault: 0 Q: [start of stacktrace]
02:03 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_Realloc: ptr is 0 but oldsize is not 0.') + 62 bytes
02:03 Fault: 0 Q: MEM_ERROR('MEM_Realloc: ptr is 0 but oldsize is not 0.') + 21 bytes
02:03 Fault: 0 Q: MEM_REALLOC(0, 0, 6) + 50 bytes
02:03 Fault: 0 Q: _TAL_CHECKSIZE(9) + 73 bytes
02:03 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 74 bytes
02:03 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:03 Fault: 0 Q: [end of stacktrace]
02:03 Fault: 0 Q: MEM_Realloc: ptr is 0 but oldsize is not 0.
02:03 Fault: 0 Q: [start of stacktrace]
02:03 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 62 bytes
02:03 Fault: 0 Q: MEM_WARN('MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 21 bytes
02:03 Fault: 0 Q: MEM_PTRTOINST(247618884) + 77 bytes
02:03 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 22 bytes
02:03 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:03 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:03 Fault: 0 Q: [end of stacktrace]
02:03 Warn: 0 Q: MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.
02:03 Fault: 0 Q: [start of stacktrace]
02:03 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_ArrayRead: pos out of bounds: 2') + 62 bytes
02:03 Fault: 0 Q: MEM_ERROR('MEM_ArrayRead: pos out of bounds: 2') + 21 bytes
02:03 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 86 bytes
02:03 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:03 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:03 Fault: 0 Q: [end of stacktrace]
02:03 Fault: 0 Q: MEM_ArrayRead: pos out of bounds: 2
02:03 Fault: 0 Q: [start of stacktrace]
02:03 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_Realloc: ptr is 0 but oldsize is not 0.') + 62 bytes
02:03 Fault: 0 Q: MEM_ERROR('MEM_Realloc: ptr is 0 but oldsize is not 0.') + 21 bytes
02:03 Fault: 0 Q: MEM_REALLOC(0, 0, 6) + 50 bytes
02:03 Fault: 0 Q: _TAL_CHECKSIZE(9) + 73 bytes
02:03 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 74 bytes
02:03 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:03 Fault: 0 Q: [end of stacktrace]
02:03 Fault: 0 Q: MEM_Realloc: ptr is 0 but oldsize is not 0.
02:03 Fault: 0 Q: [start of stacktrace]
02:03 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 62 bytes
02:03 Fault: 0 Q: MEM_WARN('MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.') + 21 bytes
02:03 Fault: 0 Q: MEM_PTRTOINST(247618884) + 77 bytes
02:03 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 22 bytes
02:03 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:03 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:03 Fault: 0 Q: [end of stacktrace]
02:03 Warn: 0 Q: MEM_PtrToInst: ptr is NULL. Use MEM_NullToInst if that's what you want.
02:03 Fault: 0 Q: [start of stacktrace]
02:03 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'MEM_ArrayRead: pos out of bounds: 2') + 62 bytes
02:03 Fault: 0 Q: MEM_ERROR('MEM_ArrayRead: pos out of bounds: 2') + 21 bytes
02:03 Fault: 0 Q: MEM_ARRAYREAD(0, 2) + 86 bytes
02:03 Fault: 0 Q: TAL_GETVALUE((instance)632363208, 2) + 122 bytes
02:03 Fault: 0 Q: B_ASSESSENEMY() + 1615 bytes
02:03 Fault: 0 Q: [end of stacktrace]
02:03 Fault: 0 Q: MEM_ArrayRead: pos out of bounds: 2
02:04 Warn: 0 D: zModel.cpp(zCModel::StartAni): Ani not found: R_ROAM1 .... <zModel.cpp,#2581>
02:05 Warn: 0 D: zModel.cpp(zCModel::StartAni): Ani not found: R_ROAM2 .... <zModel.cpp,#2581>
02:05 Warn: 0 D: zModel.cpp(zCModel::StartAni): Ani not found: R_ROAM2 .... <zModel.cpp,#2581>
02:06 Warn: 0 D: zModel.cpp(zCModel::StartAni): Ani not found: R_ROAM1 .... <zModel.cpp,#2581>
02:06 Warn: 0 D: zModel.cpp(zCModel::StartAni): Ani not found: R_ROAM3 .... <zModel.cpp,#2581>
02:07 Warn: 0 D: OBJ: Memory leaks found! .... <zObject.cpp,#699>
(kein Absturz, aber natürlich trotzdem nicht schön)
Was könnte da mit den Talenten passiert sein?
Wir haben in der AI_Constants.d
Code:
var int AIV_DontFight;
Und in der Init_global() Funktion
Code:
/* Hier werden die Talent-"Konstanten" einmalig befüllt, daher diese Konstruktion mit der Variablen*/
if (!createTalents) {
// AIV_CHAINLIGHTNING = TAL_CreateTalent();
// AIV_LIGHTNINGSTORM = TAL_CreateTalent();
// AIV_CROSSBOW_UPGRADE = TAL_CreateTalent();
// AIV_GREETED = TAL_CreateTalent();
// AIV_TRADER = TAL_CreateTalent();
AIV_FORGET_ATTACK = TAL_CreateTalent();
//MEM_Error(ConcatStrings("AIV_FORGET_ATTACK: ", IntToString(AIV_FORGET_ATTACK)));
AIV_DontFight = TAL_CreateTalent();
//MEM_Error(ConcatStrings("AIV_DontFight: ", IntToString(AIV_DontFight)));
AIV_IgnoreWeapon = TAL_CreateTalent();
//MEM_Error(ConcatStrings("AIV_IgnoreWeapon: ", IntToString(AIV_IgnoreWeapon)));
AIV_MAKE_MINIMAL_DAMAGE = TAL_CreateTalent();
//MEM_Error(ConcatStrings("AIV_MAKE_MINIMAL_DAMAGE: ", IntToString(AIV_MAKE_MINIMAL_DAMAGE)));
LOA_FAKE_GUILD_SAID_BANDITS = TAL_CreateTalent();
//MEM_Error(ConcatStrings("LOA_FAKE_GUILD_SAID_BANDITS: ", IntToString(LOA_FAKE_GUILD_SAID_BANDITS)));
createTalents = TRUE;
};
sowie in der Startup.d definiert
Code:
var int createTalents;
an diverse Stellen in den Wahrnehmungen fragen wir ab
Code:
if (TAL_GetValue(self, AIV_DontFight) == TRUE)
weil diese Npc praktisch alles in der Welt ignorieren
Ich habe einen Spielstand, bei dem das verlässlich auftritt, kann also ggf. munter testen
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|