Archiv verlassen und diese Seite im Standarddesign anzeigen : [Skriptpaket] LeGo #3
Edit durch die Moderation:
Weiter geht es hier https://forum.worldofplayers.de/forum/threads/1505251-Skriptpaket-LeGo-4
$$\.................$$$$$$\..............$$$$$$\..
$$.|...............$$..__$$\............$$..__$$\.
$$.|......$$$$$$\..$$./..\__|.$$$$$$\...\__/..$$.|
$$.|.....$$..__$$\.$$.|$$$$\.$$..__$$\...$$$$$$..|
$$.|.....$$$$$$$$.|$$.|\_$$.|$$./..$$.|.$$..____/.
$$.|.....$$...____|$$.|..$$.|$$.|..$$.|.$$.|......
$$$$$$$$\\$$$$$$$\.\$$$$$$..|\$$$$$$..|.$$$$$$$$\.
\________|\_______|.\______/..\______/..\________|
»Es gibt Lego, es gibt Minecraft, aber nichts ist so toll wie LeGo \o/«
-Lehona
LeGo [LehonaGottfried] ist, wie aus dem Titel ersichtlich, ein Skriptpaket das auf Ikarus aufbaut. Während Ikarus grundlegende Möglichkeiten bereitstellt, wird hier der Fokus auf die praktische Anwendung gelegt. Alle enthaltenen Funktionen sind sehr einfach gehalten und müssen nicht in ein tolles Script eingeflochten werden um Sinn zu ergeben, sondern sind auch alleinstehend mächtig. Über pixelgenaues Erzeugen von Texten und Texturen auf dem Bildschirm und einem schönen Interface für Trialoge (eigentlich "Polyloge"), bis hin zu "Triggerlosen Triggerschleifen" die mit nur einer Zeile aktiviert werden können beinhaltet LeGo sicher für jeden Scripter eine interressante Erweiterung die ihm von Nutzen sein kann.
Sicher sind manche Pakete sehr speziell oder einfach nur nutzloser als andere, das liegt daran dass LeGo nicht aus einer Idee "Lass uns ein Scriptpaket machen!" entstanden ist. Ursprünglich war alles was hier zu finden ist als Grundlage für unseren Beitrag zum Modding-Contest gedacht, da Lehona und ich aber leider nicht fertig geworden sind (aus eigener Faulheit, zugegebenermaßen) lag dieser Featurehaufen noch ungeordnet und ohne Nutzen auf unseren Platten. Nun, da wir beide nette Menschen sind haben wir uns überlegt den ganzen Kram zu sortieren, kommentieren und zu erklären (was bei unserer Arbeitweise beim besten Willen nicht einfach war) und hier zur Verfügung zu stellen.
Sektenspinners zweifellos vorhandene Unterstützung sei natürlich auch noch erwähnt. Ohne ihn hätte sich der Release entweder noch um ein paar Jahren hingezogen oder es gäbe gar keinen :)
LeGo wird (wenn interresse besteht) laufend erweitert, nicht zuletzt wenn DU gute Vorschläge für weitere Funktionen hast, daher eröffnen wir hier mal ganz konservativ mit der Version 1.0 :)
Zur Version 1.0 sei noch folgendes gesagt: Da LeGo mit momentan 15 Päckchen ziemlich umfangreich geworden ist können wir beide keine Fehlerfreiheit garantieren. Jedes Paket wurde bereits genutzt und sollte im Normalfall funktionieren, allerdings wurde in den letzten Tagen noch sehr viel modifiziert um es möglichst Nutzerfreundlich zu gestalten. Wenn du einen Fehler entdecken solltest (oder ein grundlosen Absturz bekommst, was auch immer ;)) dann schreib doch ein paar Zeilen in diesen Thread in denen du kurz erläuterst was genau du getan hast und welche der Pakete aktiv waren.
Ältere Threads
[Skriptpaket] LeGo (http://forum.worldofplayers.de/forum/threads/1023720-Skriptpaket-LeGo)
[Skriptpaket] LeGo #2 (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2)
Wiki
Beispiele und Dokumentationen aller Funktionen innerhalb des Scriptpaketes
Startseite (http://lego.worldofplayers.de)
Anwendungsbeispiele
Hook Einsammeln von Items (http://forum.worldofplayers.de/forum/threads/1023720-Skriptpaket-LeGo?p=16744409&viewfull=1#post16744409)
Sektenspinner & Milky-Way
Adresse von Funktionen zum Hooken mitsamt allen wichtigen Informationen (http://forum.worldofplayers.de/forum/threads/1023720-Skriptpaket-LeGo?p=17631567&viewfull=1#post17631567)
Zerxes
Respawn von Monstern - Ein Tutorial zu PermMem (http://forum.worldofplayers.de/forum/threads/1023720-Skriptpaket-LeGo?p=18317833&viewfull=1#post18317833) (Version 2) (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=19677272&viewfull=1#post19677272)
Lehona
Wichtige Grafik zur Benutzung von LeGo (http://forum.worldofplayers.de/forum/attachment.php?attachmentid=37602&d=1330992211)
Sektenspinner
Respawn von Pflanzen (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=18718274&viewfull=1#post18718274)
Umfi
Die Benutzung von ForEachHndl() (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=18727799&viewfull=1#post18727799)
Gottfried
Itemnamen im Inventar einfärben (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=19052987&viewfull=1#post19052987)
Lehona
Aufruf des Charaktermenüs überschreiben (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=19139009&viewfull=1#post19139009)
Lehona
Eine eigene Schadensberechnung (http://forum.worldofplayers.de/forum/threads/1149697-Script-Eigene-Schadensberechnung)
Lehona
Kollision von Pfeilen mit Triggerzonen ausschalten (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=20894916&viewfull=1#post20894916)
Sektenspinner
Zusätzliche Informationen im Charaktermenü (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=20906914&viewfull=1#post20906914)
Sektenspinner
Verkaufspreise kontextbasiert anpassen (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=21130811&viewfull=1#post21130811)
Lehona
Die Dialogliste im Dialog aktualisieren (http://forum.worldofplayers.de/forum/threads/1126551-Skriptpaket-LeGo-2?p=21187930&viewfull=1#post21187930)
Lehona & redleha
Das Verkaufen bestimmter Items verhindern (http://forum.worldofplayers.de/forum/threads/1346860-Inventar-Item-holen?p=24695536&viewfull=1#post24695536)
Frank-95
Download
Releaseversionen
LeGo 2.4.0 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_4_0.7z)
LeGo 2.3.6 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_6.7z)
LeGo 2.3.5 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_5.7z)
LeGo 2.3.4 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_4.7z)
LeGo 2.3.3 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_3.7z)
LeGo 2.3.2 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_2.7z)
LeGo 2.3 (http://upload.worldofplayers.de/files9/LeGo_2_3_0.7z)
LeGo 2.2.2 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_2_2.7z)
LeGo 2.2.1 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_2_1.7z)
LeGo 2.2 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_2.7z)
LeGo 2.1 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_1.7z)
LeGo 2.0.1 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_0_1.7z)
LeGo 2.0 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_0.7z)
LeGo 1.0.1 (https://subversion.assembla.com/svn/lego2/Release/LeGo_1_0_1.7z)
Letzte Revision
LeGo.zip (https://subversion.assembla.com/svn/lego2/LeGo.zip) (Nicht immer aktuell!)
Link zum SVN (https://www.assembla.com/code/lego2/subversion/nodes)
Viel Spaß mit diesem Paket wünschen euch
Gottfried und Lehona
Mit Revision 88 (Interface.d und _Hashtable.d aktualisiert) wurde das Problem mit PrintScreen und den Hashtables gefixt, d.h. PrintScreen landet jetzt nicht mehr in der AI-Queue und die Hashtables crashen jetzt nicht mehr, wenn sie vergrößert werden :)
Neuer Crash:
[f] 04:20 Fault: 0 Q: [start of stacktrace]
[f] 04:20 Fault: 0 Q: MEM_FREE_(513490552) + 6 bytes
[f] 04:20 Fault: 0 Q: VIEW_DELETETEXTSUB(1189572588) + 37 bytes
[f] 04:20 Fault: 0 Q: MEM_CALLBYID(8537) + 224 bytes
[f] 04:20 Fault: 0 Q: LIST_FOR(1189572588, 'View_DeleteTextSub') + 96 bytes
[f] 04:20 Fault: 0 Q: VIEW_DELETETEXT(16) + 57 bytes
[f] 04:20 Fault: 0 Q: TIMESHOWER() + 397 bytes
[f] 04:20 Fault: 0 Q: DAUERFUNC_01() + 8781 bytes
[f] 04:20 Fault: 0 Q: [end of stacktrace]
[f] 04:20 Fault: 0 Q: Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.
Aufgerufen wird das ganze von mir sekündlich so:
View_DeleteText (View_Time);
View_AddText (View_Time, 0, 0, Time, FONT_Screen);
Wie parst man die neue _Hashtables? Gibt bei mir nen Error, da ja nicht nur Daedelus-Code enthalten ist.
An welcher Stelle enthält die denn etwas anderes als Daedalus-Code? Bei mir wird alles problemlos geparst.
Ok vergiss das wieder, hatte noch die HTML-Tags drinnen, weil ich irgendwie nicht nur den Daedelus-Code, sondern den Seitenquelltext geladen habe. Jetzt geht es.
Ein Problem habe ich derzeit noch (auch schon mit älteren Versionen): Nach dem Laden eines Spielstands gibt mir der zSpy diese Fehlermeldung aus:
00:11 Info: 3 B: ---------- 95% ---------- .... <zViewProgressbar.cpp,#142>
00:11 Info: 3 B: ---------- 96% ---------- .... <zViewProgressbar.cpp,#142>
00:11 Info: 3 B: ---------- 97% ---------- .... <zViewProgressbar.cpp,#142>
00:11 Info: 3 B: ---------- 98% ---------- .... <zViewProgressbar.cpp,#142>
00:11 Info: 0 Q: Ikarus log functions now print in colour with prefix 'Q:'.
00:11 Info: 0 Q: LeGo 2.3.1 wird initialisiert.
00:11 Fault: 0 Q: [start of stacktrace]
00:11 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'STR_SubStr: The end of the desired substring exceeds the end of the string.') + 62 bytes
00:11 Fault: 0 Q: MEM_WARN('STR_SubStr: The end of the desired substring exceeds the end of the string.') + 21 bytes
00:11 Fault: 0 Q: STR_SUBSTR(' ', 0, 8) + 227 bytes
00:11 Fault: 0 Q: _BIN_GETSAVEFILEPATH(1) + 69 bytes
00:11 Fault: 0 Q: _BR_LOADGAME() + 65 bytes
00:11 Fault: 0 Q: LEGO_INITALWAYS(163263) + 106 bytes
00:11 Fault: 0 Q: LEGO_INIT(160189) + 109 bytes
00:11 Fault: 0 Q: INIT_GLOBAL() + 116 bytes
00:11 Fault: 0 Q: [end of stacktrace]
00:11 Warn: 0 Q: STR_SubStr: The end of the desired substring exceeds the end of the string.
00:11 Fault: 0 Q: [start of stacktrace]
00:11 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'MEM_Free: ptr is 0. Ignoring request.') + 62 bytes
00:11 Fault: 0 Q: MEM_WARN('MEM_Free: ptr is 0. Ignoring request.') + 21 bytes
00:11 Fault: 0 Q: MEM_FREE_(0) + 27 bytes
00:11 Fault: 0 Q: BR_OPENFILE('saves_SM/savegame1/SCRPTSAVE.SAV') + 219 bytes
00:11 Fault: 0 Q: _BR_LOADGAME() + 70 bytes
00:11 Fault: 0 Q: LEGO_INITALWAYS(163263) + 106 bytes
00:11 Fault: 0 Q: LEGO_INIT(160189) + 109 bytes
00:11 Fault: 0 Q: INIT_GLOBAL() + 116 bytes
00:11 Fault: 0 Q: [end of stacktrace]
00:11 Warn: 0 Q: MEM_Free: ptr is 0. Ignoring request.
00:11 Info: 0 Q: === PermMem::UnArchive ===
00:11 Info: 0 Q: Reset ALL the handles!
00:11 Info: 0 Q: Resetting done.
00:11 Info: 0 Q: Locals: Install at CREATE
00:11 Info: 0 Q: Offset is 11
00:11 Info: 0 Q: Locals: Install at _PM_LOAD
00:11 Info: 0 Q: Offset is 23
00:11 Info: 0 Q: Locals: Install at _PM_SAVESTRUCT_DELETEARR
00:11 Info: 0 Q: Offset is 11
00:11 Info: 0 Q: Locals: Install at _PM_CLASSTOINST_AUTO
00:11 Info: 0 Q: Offset is 11
00:11 Info: 0 Q: buffer used: 5188
00:11 Info: 0 Q: buffer cleaned: 5188
00:11 Info: 0 Q: objects created: 177
00:11 Info: 0 Q: objects cleaned: 177
00:11 Info: 0 Q: ellapsed time: 125
00:11 Info: 0 Q: === Done ===
00:11 Info: 0 Q: LeGo 2.3.1 wurde erfolgreich initialisiert.
00:11 Info: 0 Q: Locals: Install at FOREACHHNDL
00:11 Info: 0 Q: Offset is 17
...
Wenn ich danach ein neues handle erstelle, gibt es einen Absturz. Ne Idee womit das zusammenhängen kann?
Momentan kann ich den Absturz nicht rekonstruieren und den Fehler dementsprechend schlecht nachvollziehen :p
Gibt es bei denn noch eine finale Fehlermeldung (also wenn du ein Handle allozierst)? Existiert die Datei saves_SM\savegame1\SCRPTSAVE.SAV?
Die Datei existiert. Die Fehlermeldung sieht so aus, danach läuft das Spiel jedoch weiter:
00:33 Fault: 0 Q: [start of stacktrace]
00:33 Fault: 0 Q: MEMINT_HANDLEERROR(3, 'HT: A key has been assigned with two values!') + 62 bytes
00:33 Fault: 0 Q: MEM_ERROR('HT: A key has been assigned with two values!') + 21 bytes
00:33 Fault: 0 Q: _HT_INSERT(269059228, 268796076, 21) + 239 bytes
00:33 Fault: 0 Q: NEW(20560) + 91 bytes
00:33 Fault: 0 Q: MEM_CALLBYOFFSET(52753) + 22 bytes
00:33 Fault: 0 Q: LOCALS() + 3530 bytes
00:33 Fault: 0 Q: NEW(20560) + 11 bytes
...
Gelegentlich gibt es zusätzlich noch einen richtigen Absturz, ich habe keine Ahnung wann und warum.
Die Unterstützung hier bei der Benutzung von Lego ist zwar sehr lobenswert, aber ich werde es jetzt einfach so umbauen, dass ich ohne PermMem und forEachHandle auskomme. Das erspart mir eine Menge Ärger und Zeit, auch wenn ich dann 100 Zeilen mehr brauche.
Natürlich, ich will hier keinen zu irgendetwas zwingen :p
Leider kann ich Abstürze, die bei mir nicht auftreten und von denen ich keine Fehlermeldung bekomme, schlecht beheben. Mittlerweile rächt sich einfach, dass ich/wir damals noch nicht so viel vom Programmieren verstanden haben wie heute und eine komplette Neustrukturierung einfach zu viel des Guten wäre.
Ich hab mir das übrigens gerade nochmal angeschaut, die oberen beiden Fehlermeldungen scheinen harmlos zu sein, lassen sich aber leicht vermeiden wenn man kleine Änderungen im Lego-Code vornimmt. Die Funktionalität wird dadurch scheinbar nicht beeinflusst.
Ausschnitt aus der Saves.d
func string _BIN_GetSavefilePath(var int slot) {
var string path;
var string cmd; cmd = MEM_GetCommandLine();
var string _BIN_ini;
if(!STR_len(_BIN_ini)) {
MEM_Info(IntToString(STR_IndexOf(cmd, "-GAME:")));
_BIN_ini = STR_SubStr(cmd, STR_IndexOf(cmd, "-GAME:")+6, 1024);
_BIN_ini = STR_Split(_BIN_ini, ".", 0);
};
Der String cmd hat natürlich keine 1024 Zeichen, das steht wohl eher sicherheitshalber da, damit ja nicht zu wenig genommen wird. Wenn man 1024 ersetzt mit STR_len(cmd)-6 (oder so) dann kommt die Meldung nicht mehr, aber es passiert das gleiche.
Und hier aus der BinaryMachines.d aus der Funktion BR_OpenFile
if(len > _bin_clen) {
MEM_Free(_bin_ccnt);
_bin_ccnt = MEM_Alloc(len);
_bin_clen = len;
};
_bin_ccnt hat beim ersten Laden nach dem das Spiel gestartet wurde noch den Wert 0, daher gibt Ikarus eine Warnung. Wenn man einfach noch ein if (_bin_ccnt ) davor setzt, dann kommt ebenfalls keine Warnung und es passiert das gleiche.
Das nützt zwar nichts in Sachen Stabilität, hilft aber bei der Fehlersuche, da man nicht erst durch diese Warnungen fehlgeleitet wird.
TheEternal
08.01.2015, 22:40
Hallo,
ich habe diese orkischen Kriegsgräber ins Spiel gebracht.
http://www.worldofgothic.de/?go=moddb&action=view&fileID=874&cat=0&page=0&order=0&searchkey=ork&searchcat=0
Wenn diese einmal benutzt werden, fliegt die Steinplatte auf den Boden und kann aus realitätsgründen bei der Rücktransition der Ani nicht wieder auf dem Grab platziert werden. Dalai hatte deshalb die Anzahl, die man dieses Grab benutzen darf auf einmal limitiert mit einer Variable.
Soweit so gut.
ABER: Ich möchte diesen Container öfters öffnen können, deswegen dachte ich mir, gibt es doch bestimmt ne Funktion oder Möglichkeit den Containerinhalt einer Truhe/hier Orkgrab, per LeGo zu öffnen, Also Container holen und dann?
die Mobcontainer-Klasse hat nur contains als spezielles Attribut.
oder muss man da was hooken?
Welcome §wink
I have a small problem. I wrote a function of the compass. Function works, but there's a problem. When I change the world and return to the previous, the game is crashing. When the progress bar reaches 97%, zSpy logging :
[i] 22:34 Info: 3 B: ---------- 97% ---------- .... <zViewProgressbar.cpp,#142>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[f] 22:34 Fault: 0 Q: [start of stacktrace]
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : ZCPARSER.STACK_STACK .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : ZCPARSER.STACK_STACKSIZE .... <zParser_Symbol.cpp,#365>
[f] 22:34 Fault: 0 Q: [UNKNOWN] +2133882429 bytes
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : ZCPARSER.STACK_STACKSIZE .... <zParser_Symbol.cpp,#365>
[f] 22:34 Fault: 0 Q: [UNKNOWN] + 0 bytes
[f] 22:34 Fault: 0 Q: [end of stacktrace]
[f] 22:34 Fault: 0 Q: Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.
var int Compass;
var int CompassArrow;
Func void Compass_func ()
{
var zCVob her; her = Hlp_GetNpc (hero);
if (!MEM_Game.pause_screen) && (InfoManager_HasFinished ())
{
if (!Compass)
{
Print_GetScreenSize();
Compass = View_CreatePxl (Print_Screen[PS_X] - 192, Print_Screen[PS_Y] - (Print_Screen[PS_Y] - 32), Print_Screen[PS_X] - 32, Print_Screen[PS_Y] - (Print_Screen[PS_Y] - 192));
View_SetTexture (Compass, "Compass_tex.TGA");
View_Open (Compass);
};
if (CompassArrow){delete (CompassArrow);};
CompassArrow = Sprite_CreatePxl (Print_Screen[PS_X] - 112, Print_Screen[PS_Y] - (Print_Screen[PS_Y] - 109), 159, 159, COL_White, "Compass_arrow.TGA");
Sprite_SetPrio (CompassArrow, 100);
Sprite_SetRotationSC (CompassArrow, her.trafoObjToWorld[0], her.trafoObjToWorld[8]);
}
else
{
if (Compass) {View_Close (Compass); View_Delete (Compass); Compass = 0;};
if (CompassArrow){delete (CompassArrow); CompassArrow = 0;};
};
};
I'm not experienced enough to know what is reason of crash :dnuhr:
Is there any additional info you can provide, e.g. a screen of the Access Violation (if there is one)?
Does this only happen if you use the compass-script?
I can probably guess where the crash happens (roughly), but I can't quite say why. I'll check if I can find anything, although Sprites have been implemented by Gottfried alone.
@TheEternal: Kannst du nach dem ersten öffnen nicht einfach das Visual austauschen, so dass das Grab offen bleibt? Bzw. wenn das Visual auszutauschen ist kein Problem, wäre das eine Lösung? Kenne mich mit Animationskram nicht so aus.
Is there any additional info you can provide, e.g. a screen of the Access Violation (if there is one)?
Every time shows only window Gothic 2 has stopped working :dnuhr:
Does this only happen if you use the compass-script?
Yes.
I can probably guess where the crash happens (roughly), but I can't quite say why. I'll check if I can find anything, although Sprites have been implemented by Gottfried alone.
If you can, check it out :gratz
TheEternal
24.01.2015, 16:12
@TheEternal: Kannst du nach dem ersten öffnen nicht einfach das Visual austauschen, so dass das Grab offen bleibt? Bzw. wenn das Visual auszutauschen ist kein Problem, wäre das eine Lösung? Kenne mich mit Animationskram nicht so aus.
Gut, hat funktioniert mit dieser Funktion von Sekti, wäre alleine aber nicht drauf gekommen das richtig zu schreiben.... Muss mir endlich mal die Dokumentation von Ikarus durchlesen.
funcvoid SetVobVisual(varstring vobName,varstring newVis){ var int vobPtr; vobPtr = MEM_SearchVobByName(vobName);
if (vobPtr) {
const int zCVob__SetVisual = 6301312; //0x602680
CALL_zStringPtrParam(newVis);
CALL__thiscall(vobPtr, zCVob_SetVisual);
};
};
Das löst auch das Problem. Man macht dann einfach jeweil ein Grab mit offenem Deckel in Zustand S0 und beim AUstausch des visuals springt der neue Visual wieder auf Zustand S0.
Nicht alle Eigenschaften sind Bitfelder ;) Nur, was im Namen "Bitfield" trägt, muss über Bitoperatoren gesetzt oder abgefragt werden.
Das Visual kann man (als String) allerdings nicht einfach so setzen, probier es mal mit diesem Engine-Call:
func int zCVob_SetVisual(var int vob, var string visual) {
const int zVob__SetVisual = 6301312; //602680h
CALL_zStringPtrParam(visual);
CALL__thiscall(vob, zVob__SetVisual );
};
Ich kann nicht garantieren, dass das funktioniert, aber die Methode steht in der vftable von oCMobLockable, also sollte das so stimmen.
Edit: Grml, jetzt hab ich's umsonst gemacht :D Freut mich aber, dass es funktioniert.
TheEternal
28.01.2015, 23:04
Nicht alle Eigenschaften sind Bitfelder ;) Nur, was im Namen "Bitfield" trägt, muss über Bitoperatoren gesetzt oder abgefragt werden.
Das Visual kann man (als String) allerdings nicht einfach so setzen, probier es mal mit diesem Engine-Call:
func int zCVob_SetVisual(var int vob, var string visual) {
const int zVob__SetVisual = 6301312; //602680h
CALL_zStringPtrParam(visual);
CALL__thiscall(vob, zVob__SetVisual );
};
Ich kann nicht garantieren, dass das funktioniert, aber die Methode steht in der vftable von oCMobLockable, also sollte das so stimmen.
Edit: Grml, jetzt hab ich's umsonst gemacht :D Freut mich aber, dass es funktioniert.
Habs selbst gefunden, aber danke trotzdem und sorry wegen der unnötigen Arbeit.
Hab jetzt einen Bug gefunden bei der LeGo initialisierung.
Und zwar, wenn man das Spiel mit LeGo -init aufruf neu startet und darauf ein Wld_InsertNpc(npc, wp); aus einem Triggerevent aufruft, dann stürzt das Spiel ab ("deleting an already deleted object").
Wenn man vor dem Wld_insertNpc speichert und das G2 neu startet(also LeGo init weg), dann lädt und dann Wld_insertNpc per Triggerevent ausführt, stürzt es nicht ab. Also liegt es sehr wahrscheinlich an LeGo-initialisierung, die Einfluss auf die Session hat.
Ist der Bug bekannt? Gibts ne Lösung?
Habe mir damit schon einiges an Frustmomenten beschert, weil ich nicht wusste wieso das Spiel einfach so abstürzt. Und ich beim testen meist nen neues Spiel starte, um die neuen Skripts und Welt bereit zu haben.
Das klingt in der Tat sehr merkwürdig, zumal bei Wld_InsertNpc() doch gar kein Objekt gelöscht werden sollte §kratz
Ich werde mal versuchen, den Fehler zu reproduzieren.
hatrez123
09.02.2015, 19:56
Welcome §wink
I have a small problem. I wrote a function of the compass. Function works, but there's a problem. When I change the world and return to the previous, the game is crashing. When the progress bar reaches 97%, zSpy logging :
[i] 22:34 Info: 3 B: ---------- 97% ---------- .... <zViewProgressbar.cpp,#142>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[f] 22:34 Fault: 0 Q: [start of stacktrace]
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : ZCPARSER.STACK_STACK .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : ZCPARSER.STACK_STACKSIZE .... <zParser_Symbol.cpp,#365>
[f] 22:34 Fault: 0 Q: [UNKNOWN] +2133882429 bytes
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : MEMINT_STACKPOS.POSITION .... <zParser_Symbol.cpp,#365>
[i] 22:34 Info: 2 U: PAR: Adressing an empty Instance : ZCPARSER.STACK_STACKSIZE .... <zParser_Symbol.cpp,#365>
[f] 22:34 Fault: 0 Q: [UNKNOWN] + 0 bytes
[f] 22:34 Fault: 0 Q: [end of stacktrace]
[f] 22:34 Fault: 0 Q: Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.
var int Compass;
var int CompassArrow;
Func void Compass_func ()
{
var zCVob her; her = Hlp_GetNpc (hero);
if (!MEM_Game.pause_screen) && (InfoManager_HasFinished ())
{
if (!Compass)
{
Print_GetScreenSize();
Compass = View_CreatePxl (Print_Screen[PS_X] - 192, Print_Screen[PS_Y] - (Print_Screen[PS_Y] - 32), Print_Screen[PS_X] - 32, Print_Screen[PS_Y] - (Print_Screen[PS_Y] - 192));
View_SetTexture (Compass, "Compass_tex.TGA");
View_Open (Compass);
};
if (CompassArrow){delete (CompassArrow);};
CompassArrow = Sprite_CreatePxl (Print_Screen[PS_X] - 112, Print_Screen[PS_Y] - (Print_Screen[PS_Y] - 109), 159, 159, COL_White, "Compass_arrow.TGA");
Sprite_SetPrio (CompassArrow, 100);
Sprite_SetRotationSC (CompassArrow, her.trafoObjToWorld[0], her.trafoObjToWorld[8]);
}
else
{
if (Compass) {View_Close (Compass); View_Delete (Compass); Compass = 0;};
if (CompassArrow){delete (CompassArrow); CompassArrow = 0;};
};
};
I'm not experienced enough to know what is reason of crash :dnuhr:
Gothic always forgets Ikarus' global variables on world change, they need to be re-inited.
Elkenelke
07.03.2015, 19:14
Das besprochene Kompass-Material:
Geht das so für Dich? Genommen habe ich beim Export 500 x 500 px (PNG mit Transe) um den Nullpunkt (um den der Nadelbereich sich ja drehen muß), Größe und Leinewandgröße ist ja änderbar - wenn das nicht 100% sauber wird mache ich Exporte in angesagten Größen. Bin mal gespannt.
http://www.bilder-hochladen.net/files/f6bs-fc-5ea1.png
G_DX11_KOMPASS_A_[BACK]
http://www.bilder-hochladen.net/files/f6bs-fd-7bcd.png
G_DX11_KOMPASS_A_[NADEL]
http://www.bilder-hochladen.net/files/f6bs-fe-5737.png
G_DX11_KOMPASS_A_[ZIER]
hi, Gothic fans.
maybe somebody knows how to change color of dialog choices? Alreday done for colouring of conversation dialogues. I am changing array view to 4 MEM_Game.array_view[4], but no results.
func void ChangeConversationColor ()
{
var zCView view; view = MEM_PtrToInst (MEM_Game.array_view[1]);
var zCList list; list = MEM_PtrToInst (view.textLines_next);
var zCList list2; list2 = _^(list.next);
var zCViewText viewtext; viewtext = MEM_PtrToInst (list.data);
Print (IntToString (viewtext.color));
if (viewtext.color == -1)
{
viewtext.color = RGBA(210,255,255,255);//dialog Hero
}
else
{
// viewtext.color = RGBA(255,0,0,255);//dialog Hero
};
viewtext.colored = true;
};
I looked into it, but it's a mess, really. As far as I know, they're not stored in the MEM_Game-arrays but are managed by a zCViewPrint-object (which is not documented). They aren't of type zCViewText, either - instead they're called zCViewText2 (who the fuck uses such a name in a release build?) which seems to have an additional integer at the start. I've attached sample-code to show you how to color the first choice, you should be able to expand on it easily.
class zCViewText2 {
var int unknown;
/* zCViewText text; */
var int _vtbl;
var int posx;
var int posy;
var string text; //zSTRING //Die Entscheidende Eigenschaft.
var int font; //zCFont*
var int timer; //zREAL //übrige Zeit für PrintScreen anzeigen die nur eine bestimmte Zeit dauern?
var int inPrintWin; //zBOOL //vermutlich für anzeigen mit "Print", die nach oben weggeschoben werden.
var int color; //zCOLOR
var int timed; //zBOOL
var int colored; //zBOOL //klingt interessant. Vielleicht kann man hiermit was anfangen.
};
func void colorOneChoice() {
var oCInformationManager manager; manager = _^(MEMINT_oCInformationManager_Address);
var int choiceView; choiceView = manager.DlgChoice;
var zCArray arr; arr = _^(choiceView+172);
var zCViewText2 txt; txt = _^(MEM_ReadIntArray(arr.array, 0));
txt.color = RGBA(255, 255, 0, 255);
};
Fisk2033
23.03.2015, 10:23
Wird LeGo jetzt eig. noch "weiterentwickelt"? §wink
@Bonne6: Es ist jetzt zwar schon ein wenig her, aber ich kann deinen Bug nicht reproduzieren - tritt er erst nach einiger Zeit auf? Ggf. wäre es super, wenn du mir Code bereitstellen könntest, der den Bug/Crash hervorruft.
Wird LeGo jetzt eig. noch "weiterentwickelt"? §wink
Wenn du mir sagst, was noch fehlt und warum, dann vielleicht :p
Momentan werde ich höchstens noch Fehler beheben, aber es wird eventuell in Zukunft ein weiteres (kleineres) Framework von mir geben.
Fisk2033
23.03.2015, 13:59
Wenn du mir sagst, was noch fehlt und warum, dann vielleicht :p
Momentan werde ich höchstens noch Fehler beheben, aber es wird eventuell in Zukunft ein weiteres (kleineres) Framework von mir geben.
Du denkst wohl, dass ich das Moddertreffen 2013 vergessen habe? :rolleyes:
Das "rum-fliegen" Feature zum Beispiel §hehe
Du denkst wohl, dass ich das Moddertreffen 2013 vergessen habe? :rolleyes:
Das "rum-fliegen" Feature zum Beispiel §hehe
Das hat nichts mit LeGo zu tun und gehört dementsprechend auch nicht in das Paket :p Die Grundfunktionalität ist übrigens einfach (afaik nur movLock-Bitfeld setzen und dann einfach die Trafo ändern), den Arbeitsaufwand machen die "Edge-Cases" (levitieren darf nur aktiviert werden, wenn ich z.B. gerade kein Mob bediene) und das Finetuning der Einstellungen (Geschwindigkeit/Beschleunigung). Wobei man ersteres wohl größtenteils umgehen könnte, wenn man das nur per Zauber verfügbar macht.
Auf jedenfall solltest du das selber implementieren können, wenn du wolltest :)
hatrez123
23.03.2015, 15:28
Hi, Im working on LeGo Gothic 1.
If it's not a problem, it'll be nice if you could help me.
I don't know how to make trialoges work correctly.
It behaves like a normal dialogue and it stucks after spoken conversations.
All addresses all redirected ( expect cursor and this, what is showed below ).
Probably the problem is here:
func void _DIAG_Patch() {
const int oCNpc__StartDialogAniX = 7021070; // redirected
const int oCNpc__StartDialogAniY = 7021077; // redirected
const int address = 0;
if(address) {
return;
};
address = MEM_Alloc(19);
MemoryProtectionOverride(oCNpc__StartDialogAniX, 5);
MEM_WriteInt(oCNpc__StartDialogAniX + 0, 233);
MEM_WriteInt(oCNpc__StartDialogAniX + 1, address-(oCNpc__StartDialogAniX+5));
/*
mov ecx, [_DIAG_Max]
idiv ecx
add ebx, [_DIAG_Min]
*/
MEM_WriteByte(address+0, 139);
MEM_WriteByte(address+1, 013); MEM_WriteInt(address+2, MEM_GetIntAddress(_DIAG_Max));
MEM_WriteByte(address+6, 247);
MEM_WriteByte(address+7, 249);
MEM_WriteByte(address+8, 003);
MEM_WriteByte(address+9, 021); MEM_WriteInt(address+10, MEM_GetIntAddress(_DIAG_Min));
MEM_WriteByte(address+14, 233);
MEM_WriteInt (address+15, oCNpc__StartDialogAniY-(address+19));
};
I dunno know how to fix it
@Lehona, danke schon fur deine Hilfe. Konnen Sie des Hatrez mit eine Trialoge helfen, bitte?
Endschuldiguge fur mein schlecht Deutsch
PS your example script makes a crash after new game/load game.
So, does it get stuck if you don't apply those patches? The dialog gestures don't really have anything to do with it. However, you could show me your Trialog.d - I "recently" fixed a bug where you'd get stuck after a dialog (or trialog). Try to single out the point of failure, I can't really help if I can only guess.
@Lehona, danke schon fur deine Hilfe. Konnen Sie des Hatrez mit eine Trialoge helfen, bitte?
Endschuldiguge fur mein schlecht Deutsch
PS your example script makes a crash after new game/load game.
Just write in english if you're more comfortable doing that. And continue to kick me in the ass, because I'm a lazy bum :D
Which script, exactly? I'm always happy to fix bugs if I know where they occur :)
hatrez123
25.03.2015, 10:26
The dialog gestures don't really have anything to do with it.
My bad
So, does it get stuck if you don't apply those patches?
It does.
This is Trialog.d
/***********************************\
TRIALOGE
\***********************************/
//========================================
// EquipWeapon von Sektenspinner
// Wer diese Funktion schon besitzt kann
// sie hier einfach auskommentieren
//========================================
/* EquipWeapon_TogglesEquip configure the behaviour
when trying to equip an already equipped weapon:
0: EquipWeapon will do nothing
1: EquipWeapon will unequip this weapon
*/
const int EquipWeapon_TogglesEquip = 1;
func void EquipWeapon (var C_NPC slf, var int ItemInst) {
if (!Npc_HasItems (slf, ItemInst)) {
CreateInvItems (slf, ItemInst, 1);
};
if (!Npc_GetInvItem(slf, ItemInst)) {
MEM_AssertFail("Unexpected behaviour in EquipWeapon.");
return;
};
if ((item.mainflag == ITEM_KAT_NF) && (Npc_HasReadiedMeleeWeapon(slf)))
|| ((item.mainflag == ITEM_KAT_FF) && (Npc_HasReadiedRangedWeapon(slf))) {
MEM_Warn ("EquipWeapon: Caller wants to equip a weapon while weapon of the same type is readied. Ignoring request.");
return;
};
if (Npc_HasEquippedWeapon(slf))
&& (!EquipWeapon_TogglesEquip) {
/* calling EquipWeapon would unequip the weapon. */
MEM_Info ("EquipWeapon: This weapon is already equipped. Ignoring request.");
return;
};
CALL_PtrParam(MEM_InstToPtr(item));
CALL__thiscall(MEM_InstToPtr(slf), oCNpc__EquipWeapon);
};
//========================================
// Hilfsfunktionen
//========================================
func int Npc_GetArmor(var c_npc slf) {
if(!Npc_HasEquippedArmor(slf)) { return -1; };
var c_item itm; itm = Npc_GetEquippedArmor(slf);
return Hlp_GetInstanceID(itm);
};
func int Npc_GetMeleeWeapon(var c_npc slf) {
if(!Npc_HasEquippedMeleeWeapon(slf)) { return 0; };
var c_item itm; itm = Npc_GetEquippedMeleeWeapon(slf);
return Hlp_GetInstanceID(itm);
};
func int Npc_GetRangedWeapon(var c_npc slf) {
if(!Npc_HasEquippedRangedWeapon(slf)) { return 0; };
var c_item itm; itm = Npc_GetEquippedRangedWeapon(slf);
return Hlp_GetInstanceID(itm);
};
//========================================
// Userkonstanten
//========================================
const int TRIA_MaxNPC = 256; // Wie viele Npcs nehmen maximal an einem Trialog teil?
//========================================
// Dialogkamera neu einstellen
//========================================
func void DiaCAM_Update() {
// Diese Funktion wurde von Sektenspinner niedergeschrieben.
if(InfoManager_HasFinished()) { return; };
var int aiCam; aiCam = MEM_ReadInt(zCAICamera__current);
CALL_IntParam(1);
CALL__thiscall(aiCam, zCAICamera_StartDialogCam);
};
//========================================
// Dialogkamera abschalten
//========================================
func void DiaCAM_Disable() {
MemoryProtectionOverride(zCAICamera__StartDialogCam, 4);
MEM_WriteInt(zCAICamera__StartDialogCam, 268436674); // retn 4
};
//========================================
// Dialogkamera einschalten
//========================================
func void DiaCAM_Enable() {
MemoryProtectionOverride(zCAICamera__StartDialogCam, 4);
MEM_WriteInt(zCAICamera__StartDialogCam, 275316586);
};
//========================================
// [intern] Variablen
//========================================
var int TRIA_NpcPtr[TRIA_MaxNPC]; // Sammlung aller Teilnehmer
var int TRIA_Running; // Läuft ein Trialog?
var int TRIA_CPtr; // Zähler für die Sammlung
var int TRIA_Last; // Der Npc der zuletzt gesprochen hat
var int TRIA_Self; // Pointer auf self
var string TRIA_Camera; // Läuft eine Kamerafahrt?
func void ZS_TRIA() {};
func int ZS_TRIA_Loop() { return LOOP_CONTINUE; };
//========================================
// Npcs aufeinander warten lassen
//========================================
func void TRIA_Wait() {
AI_WaitTillEnd(hero, self);
AI_WaitTillEnd(self, hero);
AI_WaitTillEnd(hero, self);
};
//========================================
// [intern] Visuals aktualisieren
//========================================
func void _TRIA_UpdateVisual(var c_npc slf, var int armor) {
var oCNpc npc; npc = Hlp_GetNpc(slf);
Mdl_SetVisualBody(slf, npc.body_visualName, (npc.bitfield[0]&oCNpc_bitfield0_body_TexVarNr)>>14, 0, npc.head_visualName, (npc.bitfield[1]&oCNpc_bitfield1_head_TexVarNr)>>16, 0, armor);
};
//========================================
// Angelegte Waffe tauschen
//========================================
func void Npc_TradeItem(var c_npc slf, var int itm0, var int itm1) {
if(itm0) {
EquipWeapon(slf, itm0);
Npc_RemoveInvItem(slf, itm0);
};
if(itm1) {
CreateInvItem(slf, itm1);
EquipWeapon(slf, itm1);
};
};
//========================================
// [intern] Npcs kopieren
//========================================
class _TRIA_fltWrapper {
var float f0;
var float f1;
var float f2;
var float f3;
};
func void _TRIA_Copy(var int n0, var int n1) {
var c_npc np0; np0 = MEM_PtrToInst(n0);
var c_npc np1; np1 = MEM_PtrToInst(n1);
var int a0; a0 = Npc_GetArmor(np0);
var int a1; a1 = Npc_GetArmor(np1);
var _TRIA_fltWrapper fn0; fn0 = MEM_PtrToInst(n0+2032);
var _TRIA_fltWrapper fn1; fn1 = MEM_PtrToInst(n1+2032);
MEM_SwapBytes(n0+60, n1+60, 64); // trafo
MEM_SwapBytes(n0+260, n1+260, 20); // name
MEM_SwapBytes(n0+524, n1+524, 4); // voice
MEM_SwapBytes(n0+1948, n1+1948, 20); // bitfield
MEM_SwapBytes(n0+1972, n1+1972, 76); // visuals
MEM_SwapBytes(n0+228, n1+228, 20); //
Mdl_SetModelScale(np0, fn0.f0, fn0.f1, fn0.f2);
Mdl_SetModelScale(np1, fn1.f0, fn1.f1, fn1.f2);
Mdl_SetModelFatness(np0, fn0.f3);
Mdl_SetModelFatness(np1, fn1.f3);
_TRIA_UpdateVisual(np0, a1);
_TRIA_UpdateVisual(np1, a0);
Npc_RemoveInvItem(np0, a0);
Npc_RemoveInvItem(np1, a1);
var int mw0; mw0 = Npc_GetMeleeWeapon(np0);
var int rw0; rw0 = Npc_GetRangedWeapon(np0);
var int mw1; mw1 = Npc_GetMeleeWeapon(np1);
var int rw1; rw1 = Npc_GetRangedWeapon(np1);
Npc_TradeItem(np0, mw0, mw1);
Npc_TradeItem(np0, rw0, rw1);
Npc_TradeItem(np1, mw1, mw0);
Npc_TradeItem(np1, rw1, rw0);
};
//========================================
// [intern] Kopieren.
//========================================
func void _TRIA_CopyNpc(var int slf) {
if(slf == TRIA_Last) {
return;
};
if(slf == TRIA_Self) {
_TRIA_Copy(TRIA_Self, TRIA_Last);
}
else if(TRIA_Last == TRIA_Self) {
_TRIA_Copy(TRIA_Self, slf);
}
else {
_TRIA_Copy(TRIA_Self, TRIA_Last);
_TRIA_Copy(TRIA_Self, slf);
};
TRIA_Last = slf;
};
//========================================
// [intern] Npcs einstellen
//========================================
func void _TRIA_InitNPC(var c_npc slf) {
Npc_ClearAIQueue(slf);
AI_StandUp(slf);
AI_StopLookAt(slf);
AI_RemoveWeapon(slf);
AI_TurnToNpc(slf, hero);
AI_WaitTillEnd(hero, slf);
AI_StartState(slf, ZS_TRIA, 0, "");
};
//========================================
// Npc in das Gespräch einladen
//========================================
func void TRIA_Invite(var c_npc slf) {
if(TRIA_Running) {
MEM_Warn("TRIA_Invite: Der Trialog läuft bereits.");
return;
};
if(TRIA_CPtr == TRIA_MaxNPC) {
MEM_Error("TRIA_Invite: Zu viele Npcs. Erhöhe bitte TRIA_MaxNPC.");
return;
};
if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(hero)
|| Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(self)) {
MEM_Warn("TRIA_Invite: Der Held und/oder Self können nicht eingeladen werden. Sie sind bereits anwesend.");
return;
};
if((Npc_GetDistToNpc(slf, hero) > truncf(MEM_ReadInt(SPAWN_INSERTRANGE_Address)))
|| (Npc_IsDead(slf))
|| (!Hlp_IsValidNpc(slf))) {
MEM_Error(ConcatStrings("TRIA_Invite: Der Npc ist nicht in der KI-Glocke und/oder tot: ", slf.name));
return;
};
MEM_WriteStatArr(TRIA_NpcPtr, TRIA_CPtr, MEM_InstToPtr(slf));
TRIA_CPtr += 1;
};
//========================================
// Trialog starten
//========================================
func void TRIA_Start() {
if(TRIA_Running) {
MEM_Warn("TRIA_Start: Es läuft bereits ein Trialog.");
return;
};
var int i; i = 0;
var int p; p = MEM_StackPos.position;
if(i < TRIA_CPtr) {
var c_npc slf; slf = MEM_PtrToInst(MEM_ReadStatArr(TRIA_NpcPtr, i));
_TRIA_InitNpc(slf);
i += 1;
MEM_StackPos.position = p;
};
Npc_ClearAIQueue(self);
Npc_ClearAIQueue(hero);
Ai_Output(hero,self,"");
var c_npc selfCopy; selfCopy = Hlp_GetNpc(self);
self = MEM_NullToInst();
TRIA_Invite(selfCopy);
self = Hlp_GetNpc(selfCopy);
TRIA_Wait();
TRIA_Last = MEM_InstToPtr(self);
TRIA_Self = TRIA_Last;
TRIA_Running = 1;
};
//========================================
// Alle Npcs aufeinander warten lassen
//========================================
func void TRIA_Barrier() {
if(!TRIA_Running) {
MEM_Warn("TRIA_Next: Kein Trialog gestartet.");
return;
};
TRIA_Wait();
var int i; i = !1;
var int j; j = 0;
var c_npc last; last = MEM_PtrToInst(MEM_ReadStatArr(TRIA_NpcPtr, TRIA_CPtr)); // Ist immer self, aber so ist es verständlicher
var int p; p = MEM_StackPos.position;
if(i < TRIA_CPtr) {
var c_npc curr; curr = MEM_PtrToInst(MEM_ReadStatArr(TRIA_NpcPtr, i));
AI_WaitTillEnd(curr, last);
last = Hlp_GetNpc(curr);
i += 1;
MEM_StackPos.position = p;
};
if(!j) {
j = 1; i = 0;
MEM_StackPos.position = p;
};
};
//========================================
// Den nächsten Npc als "self" setzen
//========================================
func void TRIA_Next(var c_npc n0) {
if(!TRIA_Running) {
MEM_Warn("TRIA_Next: Kein Trialog gestartet.");
return;
};
if(Hlp_GetInstanceID(n0) == Hlp_GetInstanceID(hero)) {
MEM_Warn("TRIA_Next: 'hero' ist kein erlaubter Parameter für diese Funktion.");
return;
};
var int i; i = 0;
var int j; j = MEM_InstToPtr(n0);
var int p; p = MEM_StackPos.position;
if(i < TRIA_CPtr) {
if(MEM_ReadStatArr(TRIA_NpcPtr, i) != j) {
i += 1;
MEM_StackPos.position = p;
};
};
if(i == TRIA_CPtr) {
MEM_Error(ConcatStrings("TRIA_Next: Der Npc ist nicht eingeladen worden: ", n0.name));
return;
};
TRIA_Wait();
AI_Function_I(hero, _TRIA_Next, j);
};
func void _TRIA_Next(var int n0) {
_TRIA_CopyNpc(n0);
};
//========================================
// Kamerafahrt starten
//========================================
func void TRIA_Cam(var string evt) {
TRIA_Wait();
if(!STR_Len(evt)) {
if(!STR_Len(TRIA_Camera)) { return; };
AI_Function_S(hero, _TRIA_Uncam, TRIA_Camera);
}
else {
if(STR_Len(TRIA_Camera)) {
AI_Function_S(hero, Wld_SendUntrigger, TRIA_Camera);
};
AI_Function_S(hero, _TRIA_Cam, evt);
};
TRIA_Camera = evt;
};
func void _TRIA_Cam(var string evt) {
DiaCAM_Disable();
Wld_SendTrigger(evt);
};
func void _TRIA_Uncam(var string evt) {
DiaCAM_Enable();
DiaCAM_Update();
Wld_SendUntrigger(evt);
};
//========================================
// Trialog abschließen
//========================================
func void TRIA_Finish() {
if(!TRIA_Running) {
MEM_Warn("TRIA_Finish: Kein Trialog gestartet.");
return;
};
TRIA_Wait();
TRIA_Cam("");
AI_Function(hero, _TRIA_Finish);
};
func void _TRIA_Finish() {
if(TRIA_Last != TRIA_Self) {
_TRIA_Copy(TRIA_Self, TRIA_Last);
};
var int i; i = 0;
var int p; p = MEM_StackPos.position;
if(i < TRIA_CPtr-1) {
var c_npc slf; slf = MEM_PtrToInst(MEM_ReadStatArr(TRIA_NpcPtr, i));
AI_ContinueRoutine(slf);
i += 1;
MEM_StackPos.position = p;
};
TRIA_Running = 0;
TRIA_CPtr = 0;
};
Try removing line 260 (NPC_ClearAIQueue(self)) and line 380 (AI_ContinueRoutine(slf)).
hatrez123
25.03.2015, 15:26
Alright, it no longer stucks. :)
Do you know what is the problem that it behaves like a normal dialogue?
I was trying to search the problem.
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();
if(!STR_StartsWith(AniName, "CALL ")) {
return;
};
var string argc; argc = STR_Split(AniName, " ", 1);
if (Hlp_StrCmp(argc, "I")) {
i0 = STR_ToInt(STR_Split(AniName, " ", 2));
fnc = STR_ToInt(STR_Split(AniName, " ", 3));
MEM_PushIntParam(i0);
}
else if (Hlp_StrCmp(argc, "S")) {
s0 = STR_Unescape(STR_Split(AniName, " ", 2));
fnc = STR_ToInt(STR_Split(AniName, " ", 3));
MEM_PushStringParam(s0);
}
else if (Hlp_StrCmp(argc, "II")) {
i0 = STR_ToInt(STR_Split(AniName, " ", 2));
i1 = STR_ToInt(STR_Split(AniName, " ", 3));
fnc = STR_ToInt(STR_Split(AniName, " ", 4));
MEM_PushIntParam(i0);
MEM_PushIntParam(i1);
}
else if (Hlp_StrCmp(argc, "SS")) {
s0 = STR_Unescape(STR_Split(AniName, " ", 2));
s1 = STR_Unescape(STR_Split(AniName, " ", 3));
fnc = STR_ToInt(STR_Split(AniName, " ", 4));
MEM_PushStringParam(s0);
MEM_PushStringParam(s1);
}
else if (Hlp_StrCmp(argc, "SI")) {
s0 = STR_Unescape(STR_Split(AniName, " ", 2));
i1 = STR_ToInt(STR_Split(AniName, " ", 3));
fnc = STR_ToInt(STR_Split(AniName, " ", 4));
MEM_PushStringParam(s0);
MEM_PushIntParam(i1);
}
else if (Hlp_StrCmp(argc, "IS")) {
i0 = STR_ToInt(STR_Split(AniName, " ", 2));
s1 = STR_Unescape(STR_Split(AniName, " ", 3));
fnc = STR_ToInt(STR_Split(AniName, " ", 4));
MEM_PushIntParam(i0);
MEM_PushStringParam(s1);
}
else {
fnc = STR_ToInt(argc);
};
MEM_CallByID(fnc);
};
The red colored function causes crashes.
http://i59.tinypic.com/29nw38j.png
No, it doesn't cause the crash, as seen in the Callstack (unless the callstack is unrelated and it's just an error/warning). I've spoken with Gottfried and apparently he fucked up :p DIAG_Reset() is most likely causing the crash and shouldn't even work in the "original" version. For now you could try fixing the maximum length in _DIAG_SetAni to 17 (so check if ani.len is bigger than 17 instead of 15). He suggested upping it to 19, the maximum possible length, so try either of those and whether it fixes it.
Give me an example for your trialogs and I can see if I can find anything.
@Lehona, here is zspy error screen of crash caused by appying ur example func coloronechoice using FF. post no #30. I am using G1.
http://ifotos.pl/zobacz/spy-error_wehewns.jpg
http://ifotos.pl/zobacz/spy-error_weheweq.jpg
hatrez123
25.03.2015, 18:16
No, it doesn't cause the crash, as seen in the Callstack (unless the callstack is unrelated and it's just an error/warning). I've spoken with Gottfried and apparently he fucked up :p DIAG_Reset() is most likely causing the crash and shouldn't even work in the "original" version. For now you could try fixing the maximum length in _DIAG_SetAni to 17 (so check if ani.len is bigger than 17 instead of 15). He suggested upping it to 19, the maximum possible length, so try either of those and whether it fixes it.
Give me an example for your trialogs and I can see if I can find anything.
I've upped it to 17 and trialog works. It behaves like a trialog (expect camera and gestures but it's not important ).
Thank you bro. You're awesome.
There is another one problem.
Function STR_IndexOf(MEM_GetCommandLine(), "-GAME:")+6 is cause of crash during saving the game, it's terrible.
zCViewText2 txt; txt = _^(MEM_ReadIntArray(arr.array, 0));
As far as I know, reading from position 0 causes crash in Gothic 1.
Well, those functions are implemented in Ikarus, not in LeGo. What exactly makes it crash?
@Lehona, here is zspy error screen of crash caused by appying ur example func coloronechoice using FF. post no #30. I am using G1.
http://ifotos.pl/zobacz/spy-error_wehewns.jpg
http://ifotos.pl/zobacz/spy-error_weheweq.jpg
Well, I didn't know that and my offset (172) is probably only applicable to G2. You could also try reading from the second index (i.e. 1 instead of 0). All I know is that it works in G2.
Well, those functions are implemented in Ikarus, not in LeGo. What exactly makes it crash?
Well, I didn't know that and my offset (172) is probably only applicable to G2. You could also try reading from the second index (i.e. 1 instead of 0). All I know is that it works in G2.
it makes no change and still cause a crash.
hatrez123
26.03.2015, 06:49
Well, those functions are implemented in Ikarus, not in LeGo. What exactly makes it crash?
When saving the game, at the end, the game gets crash.
When saving the game, at the end, the game gets crash.
That is not what I asked. Does it still crash when you comment out "STR_IndexOf(MEM_GetCommandLine(), "-GAME:")+6"? Does MEM_GetCommandLine() crash? Or STR_IndexOf()? Does it only crash during saving the game or would those functioncalls crash even when called "normally"?
hatrez123
26.03.2015, 15:30
That is not what I asked. Does it still crash when you comment out "STR_IndexOf(MEM_GetCommandLine(), "-GAME:")+6"? Does MEM_GetCommandLine() crash? Or STR_IndexOf()? Does it only crash during saving the game or would those functioncalls crash even when called "normally"?
I sense hostility attitude...
It crash even when called normally.
STR_IndexOf() does that.
This is the rest of the code:
func string _BIN_GetSavefilePath(var int slot) {
var string path;
var string cmd; cmd = MEM_GetCommandLine();
var string _BIN_ini;
if(!STR_len(_BIN_ini)) {
_BIN_ini = STR_SubStr(cmd, STR_IndexOf(cmd, "-GAME:")+6, STR_Len(cmd)-6);
_BIN_ini = STR_Split(_BIN_ini, ".", 0);
};
if(Hlp_StrCmp(_BIN_ini, "GOTHICGAME") || (Hlp_StrCmp(_BIN_ini, ""))) {
path = "saves";
}
else {
path = ConcatStrings("saves_", _BIN_ini);
};
if(slot) {
path = ConcatStrings(path, "/savegame");
path = ConcatStrings(path, IntToString(slot));
}
else {
path = ConcatStrings(path, "/quicksave");
};
path = ConcatStrings(path, "/SCRPTSAVE.SAV");
return path;
};
I'm sorry, but "remote debugging" is very infuriating, especially when we're not exactly on the same wavelength. I sometimes assume too much and explain too little.
Also, if the crash occurrs in STR_IndexOf() (as you've said), then the LeGo code has nothing to do with it. As for now I can see nothing wrong with STR_IndexOf() (it's not even version specific, i.e. it works the same for G1 and G2), what kind of crash do you get? Any additional information?
I would like to say that sometimes I also have a crash during load saved game.Then I will always found some extra lines in gothic.ini about resolution sets. I always delete it and it works till the next similar crash situation.
I advice to set Zsy to 10 while playing and make screenshots
HERE IS THE SCRIPT FOR G1, IT WORKS LEHONA & hATREZ , THANKS A LOT DUDES!
func void colorOneChoice() {
var oCInformationManager manager; manager = _^(MEMINT_oCInformationManager_Address);
var int choiceView; choiceView = manager.DlgChoice;
var zCArray arr; arr = _^(choiceView+172);
if (arr.array) {
var zCViewText2 txt; txt = _^(MEM_ReadIntArray(arr.array, 0));
txt.color = RGBA(255, 255, 0, 255);
};
return;
};
|I will try with DlgTrade to color the trade box too!
hatrez123
26.03.2015, 17:10
I'm sorry, but "remote debugging" is very infuriating, especially when we're not exactly on the same wavelength. I sometimes assume too much and explain too little.
I understand :D
Also, if the crash occurrs in STR_IndexOf() (as you've said), then the LeGo code has nothing to do with it. As for now I can see nothing wrong with STR_IndexOf() (it's not even version specific, i.e. it works the same for G1 and G2), what kind of crash do you get? Any additional information?
Crash occurrs when I try to find from MEM_GetCommandLine():
STR_IndexOf(MEM_GetCommandLine(), "-GAME:")
http://i58.tinypic.com/2sba22u.jpg
Otherwise:
STR_IndexOf("Blah blah -GAME: blah blah", "-GAME:")
it works.
I think it would be better if we will not talk about things which have nothing to do with LeGo but it would be nice if we will finish this problem :P.
(http://ifotos.pl/zobacz/crash3JPG_werwswq.jpg)
I understand :D
Crash occurrs when I try to find from MEM_GetCommandLine():
STR_IndexOf(MEM_GetCommandLine(), "-GAME:")
http://i58.tinypic.com/2sba22u.jpg
Otherwise:
STR_IndexOf("Blah blah -GAME: blah blah", "-GAME:")
it works.
I think it would be better if we will not talk about things which have nothing to do with LeGo but it would be nice if we will finish this problem :P.
Have you printed MEM_GetCommandLine() to see if it actually contains "-GAME:"? Because STR_IndexOf returns -1 if if doesn't. Then you add 6, wich makes no sense in that case. Try:
[func string _BIN_GetSavefilePath(var int slot) {
var string path;
var string cmd; cmd = MEM_GetCommandLine();
var string _BIN_ini;
if(!STR_len(_BIN_ini) && STR_IndexOf(cmd, "-GAME:") != -1) {
_BIN_ini = STR_SubStr(cmd, STR_IndexOf(cmd, "-GAME:")+6, STR_Len(cmd)-6);
_BIN_ini = STR_Split(_BIN_ini, ".", 0);
};
if(Hlp_StrCmp(_BIN_ini, "GOTHICGAME") || (Hlp_StrCmp(_BIN_ini, ""))) {
path = "saves";
}
else {
path = ConcatStrings("saves_", _BIN_ini);
};
if(slot) {
path = ConcatStrings(path, "/savegame");
path = ConcatStrings(path, IntToString(slot));
}
else {
path = ConcatStrings(path, "/quicksave");
};
path = ConcatStrings(path, "/SCRPTSAVE.SAV");
return path;
};
hatrez123
29.03.2015, 07:42
Have you printed MEM_GetCommandLine() to see if it actually contains "-GAME:"? Because STR_IndexOf returns -1 if if doesn't. Then you add 6, wich makes no sense in that case. Try:
[func string _BIN_GetSavefilePath(var int slot) {
var string path;
var string cmd; cmd = MEM_GetCommandLine();
var string _BIN_ini;
if(!STR_len(_BIN_ini) && STR_IndexOf(cmd, "-GAME:") != -1) {
_BIN_ini = STR_SubStr(cmd, STR_IndexOf(cmd, "-GAME:")+6, STR_Len(cmd)-6);
_BIN_ini = STR_Split(_BIN_ini, ".", 0);
};
if(Hlp_StrCmp(_BIN_ini, "GOTHICGAME") || (Hlp_StrCmp(_BIN_ini, ""))) {
path = "saves";
}
else {
path = ConcatStrings("saves_", _BIN_ini);
};
if(slot) {
path = ConcatStrings(path, "/savegame");
path = ConcatStrings(path, IntToString(slot));
}
else {
path = ConcatStrings(path, "/quicksave");
};
path = ConcatStrings(path, "/SCRPTSAVE.SAV");
return path;
};
This is result when I printed out MEM_GetCommandLine():
http://i60.tinypic.com/a4vq7d.png
func void test() {
Print(MEM_GetCommandLine());
};
And this is log when I used your proposed version:
http://i61.tinypic.com/2qjvwja.png
Did you change any of the Ikarus code? Did you initialize Ikarus correctly with MEM_InitAll()?
This problem is most likely not related to LeGo. The second error is only natural since the value that should be in MEM_GetCommandLine() is missing. LeGo can't work properly without Ikarus.
hatrez123
29.03.2015, 19:35
No, I didn't change Ikarus' code and yes, I did initialize it correctly.
Just ZenEgine from G1 is so fackin worst and has more bugs than ZenEngine from G2.
It's infuriating.
Chances are, there is no CommandLine for Gothic 1. Maybe you can find the needed value inside the ocGame class or somewhere else?
TheEternal
30.03.2015, 14:48
@Lehona: Wie siehts denn jetzt mit den Framefunctions aus, hatteste Zeit dir das anzuschauen, wieso die im Savegame nicht notiert wurden?
hatrez123
30.03.2015, 14:52
Alright, I resolved the problem.
func string GetParmValue(var string str) {
CALL_zStringPtrParam(str);
CALl_RetValIszString();
CALL__thisCall(MEM_ReadInt(zoptions_Pointer_Address), 4586784);
return CALL_RetValAszString();
};
func string _BIN_GetSavefilePath(var int slot) {
var string path;
var string _BIN_ini;
if(!STR_len(_BIN_ini)) {
_BIN_ini = GetParmValue("GAME"); // Yea, I've lost a lot of time and patience to resolve crash during saving the game.
_BIN_ini = STR_Split(_BIN_ini, ".", 0);
};
if(Hlp_StrCmp(_BIN_ini, "GOTHICGAME") || (Hlp_StrCmp(_BIN_ini, ""))) {
path = "saves";
}
else {
path = ConcatStrings("saves_", _BIN_ini);
};
if(slot) {
path = ConcatStrings(path, "/savegame");
path = ConcatStrings(path, IntToString(slot));
}
else {
path = ConcatStrings(path, "/quicksave");
};
path = ConcatStrings(path, "/SCRPTSAVE.SAV");
return path;
};
Thank you every1 for help. §wink
I have another trouble-shooting problem , which you can called "mess" which is not connected directly by Lego, but can be resolved by this paket.
In Gothic 1 Mob Switch change always his state after loading saved game (bug of Piranhas?).
example:
we pull vwhell to pos. 1 , the gate is closed. the body states shows : "s1".
After loading save, the same mob switch has starting value of pos which is 0 (s0 for bodystates) and the gate is stucked for good. Till saving the game in pos.1 of mob switch everything is working fine.
Can we modify what data will be stored by saves?
hatrez123
03.04.2015, 11:53
So.. if someone is intrested in LeGo for Gothic 1, I invite you to enjoy.
https://www.dropbox.com/s/gyhu0bjpc6b684a/LeGo_G1.rar?dl=0
Only bloodsplats are not available.
Milky-Way
05.04.2015, 03:40
Would you like to upload the file as an attachment or here:
http://upload.worldofplayers.de/upload2.cgi
(password to be found here: http://forum.worldofplayers.de/forum/threads/804184-WoP-Upload?p=12799565&viewfull=1#post12799565)
From my own experience, I delete or move dropbox content from time to time, and it would be unfortunate to loose your work that way. :)
hatrez123
05.04.2015, 09:29
Alright then.
Here it is.
http://upload.worldofplayers.de/files10/UmNaLM7LeGo_G1.rar
hatrez123
23.04.2015, 16:42
It's me again.
I noticed that the characters don't want to gesticulate, lips move only.
Where is the problem?
It's me again.
I noticed that the characters don't want to gesticulate, lips move only.
Where is the problem?
Uh, I have no idea? :p
Is the link you provided in the last post up to date? I might try to get a Gothic Installation working and test it myself. That said, I have no idea how the gestures are working and last time I looked at the code I was flabbergasted.
Additionally, I remember Gottfried saying something that now you had to provide your own animations - I don't know whether this means there are none by default?
hatrez123
23.04.2015, 18:43
Uh, I have no idea? :p
Is the link you provided in the last post up to date? I might try to get a Gothic Installation working and test it myself. That said, I have no idea how the gestures are working and last time I looked at the code I was flabbergasted.
Additionally, I remember Gottfried saying something that now you had to provide your own animations - I don't know whether this means there are none by default?
Yup, it is up to date.
In Gothic 2 I had the same problem.
Also I'll add that the animations do not want to play after the trialogue, it forces to end the conversation and talk again.
Yup, it is up to date.
In Gothic 2 I had the same problem.
Also I'll add that the animations do not want to play after the trialogue, it forces to end the conversation and talk again.
If it didn't work in Gothic 2, I don't know if I can fix it on my own, I'll try to get hold of Gottfried.
Please give me an example for the animation things.
hatrez123
23.04.2015, 18:56
If it didn't work in Gothic 2, I don't know if I can fix it on my own, I'll try to get hold of Gottfried.
Please give me an example for the animation things.
Could you expand the mind?
I don't understand :D
Could you expand the mind?
I don't understand :D
What? I'll try to fix the gestures bug with the help of Gottfried and I'd like to have a script example for the non-working animations (i.e. a dialog where it should work but doesn't).
That is what everybody should do when submitting bugs, by the way... Post minimal code that should do something (specifiy what), but doesn't do it (specify what happens instead[ and why it shouldn't happen]). This makes it a hell of a lot easier to fix it and I can know for sure whether I fixed the problem completely.
hatrez123
23.04.2015, 19:21
What? I'll try to fix the gestures bug with the help of Gottfried and I'd like to have a script example for the non-working animations (i.e. a dialog where it should work but doesn't).
That is what everybody should do when submitting bugs, by the way... Post minimal code that should do something (specifiy what), but doesn't do it (specify what happens instead[ and why it shouldn't happen]). This makes it a hell of a lot easier to fix it and I can know for sure whether I fixed the problem completely.
I meant this:
Please give me an example for the animation things.
That's sample tria:
var c_npc Diego; Diego = Hlp_GetNpc(PC_Thief);
var c_npc Test; Test = Hlp_GetNpc(TEST_999_Trialoge);
var c_npc Test2; Test2 = Hlp_GetNpc(TEST_998_Trialoge);
TRIA_Invite(Test);
TRIA_Invite(Test2);
TRIA_Start();
TRIA_Next(Diego);
DIAG_Reset();
AI_Output (self, other, "TRIA_TEST_00"); // bla bla
TRIA_Next(Test);
AI_Output (other, self, "TRIA_TEST_01"); // bla bla
AI_GotoNpc(self, other);
AI_TurnToNpc(other, self);
AI_Output (self, other, "TRIA_TEST_02"); // bla bla
DIAG("Nervous", 1, 2);
AI_Output (other, self, "TRIA_TEST_03"); // bla bla
DIAG_Reset();
TRIA_Cam("CAMERASTART");
TRIA_Next(Test2);
AI_TurnToNpc(other, self);
DIAG("No", 0, 1);
AI_Output (self, other, "TRIA_TEST_04"); // bla bla
TRIA_Next(Diego);
DIAG("NotSure", 0, 1);
AI_Output (other, self, "TRIA_TEST_05"); // bla bla
AI_TurnToNpc(other, self);
TRIA_Cam("");
DIAG("Angry", 0, 4);
AI_Output (self, other, "TRIA_TEST_06"); // bla bla
DIAG_Reset();
AI_Output (other, self, "TRIA_TEST_07"); // bla bla.
TRIA_Finish();
You didn't tell me whats supposed to happen and what happens instead (e.g. what is missing), but I presume you're talking about the dialog gestures? I thought you reported another bug in Post #59.
hatrez123
23.04.2015, 20:01
You didn't tell me whats supposed to happen and what happens instead (e.g. what is missing), but I presume you're talking about the dialog gestures? I thought you reported another bug in Post #59.
Yes, dialog gestures. Fack my hard thinking dumb brain §wall
I should mention about that immadietly, sorry for wasted time :(
I just found (and fixed) a bug that has always been a mysterium for me.
(Somewhat technical explanation follows)
Whenever LeGo tried to save its data (i.e. PermMem objects), the last two didn't seem to land in the savegame. I had tinkered enough with PermMem to hate it at that point and decided to not hunt down the bug but simply allocate two empty objects right before saving. It's a dirty, dirty workaround, but it worked for me, so I let it slide.
What I didn't know was that this "off-by-two" error wasn't an "off-by-two" error. In fact, it was an "off-by-however-many-objects-you-deleted" error :p It never occurred to me since it seemed static to me - apparently LeGo deletes exactly two objects during initialisation via LeGo_Init(LeGo_All);.
This occured because I indirectly assumed the number of existing handles to be the key of the highest/newest handle (so when you deleted 2 old objects the number of handles is e.g. 7 while the "latest" handle has the number 9).
This is the same bug I observed with the LoA scripts (but couldn't find at that time).
LeGo 2.3.2 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_2.7z)
Edit: This version contains a new bug that may cause problems with bars (they appear empty), FrameFunctions (they don't seem to work after loading) and potetially other scripts - if you encounter any of these, waiting for a fix might be preferable. I identified the problem and should be able to fix it within this weekend.
Yes, dialog gestures. Fack my hard thinking dumb brain §wall
I should mention about that immadietly, sorry for wasted time :(
Don't worry about it :)
Frank-95
24.04.2015, 10:48
Two things:
I don't know if it was meant, but it seems that in the last package you uploaded there aren't the latest versions of every files. I made a check and view.d is still to the previous version (no viewptr_settexture for example), list isn't updated yet, and last change date of userconst and engineadr in the svn is more recent than in that package. Just saying :P I checked because I had used some function from the latest view that wasn't there.
Almost everything works now, no crash, correct TAL_GetValue. Apart that on the first loading stamina seems to not work. To make it work I just have to pause and unpause the game (ESC) and it works again. On second loading seems to work great. (and that annoying thing that I have to trigger FF on every loading but that is perfectly passable)
Two things:
I don't know if it was meant, but it seems that in the last package you uploaded there aren't the latest versions of every files. I made a check and view.d is still to the previous version (no viewptr_settexture for example), list isn't updated yet, and last change date of userconst and engineadr in the svn is more recent than in that package. Just saying :P I checked because I had used some function from the latest view that wasn't there.
Almost everything works now, no crash, correct TAL_GetValue. Apart that on the first loading stamina seems to not work. To make it work I just have to pause and unpause the game (ESC) and it works again. On second loading seems to work great. (and that annoying thing that I have to trigger FF on every loading but that is perfectly passable)
I have literally no idea how that would've happened, but I updated the files, so it should be correct now.
I'll see if we can find the cause.
hatrez123
24.04.2015, 18:06
What about those dialogue gestures?
Still I don't know why they're refusing to obey.
Edit:
I don't have that much time and I'd rather spend it fixing bugs I know I can fix. I'll get to them eventually.
Alright, thank you :)
What about those dialogue gestures?
Still I don't know why they're refusing to obey.
I don't have that much time and I'd rather spend it fixing bugs I know I can fix. I'll get to them eventually.
TheEternal
24.05.2015, 15:00
hab grad einen Absturz bei einem Trialog bekommen.
Hier der Code aus der Dialogguestures.d , der ihn auslöst
42835
//========================================// Animation direkt setzen
//========================================
func void _DIAG_SetAni(var string AniName) {
_DIAG_Patch();
const int T_DIALOGGESTURE_ = 9148264; // 0x8B9768
MemoryProtectionOverride(T_DIALOGGESTURE_, 16);
AniName = STR_Upper(AniName);
var zString ani; ani = MEM_PtrToInst(STR_GetAddress(AniName));
if(ani.len < 1 || ani.len > 15) {
MEM_Error("DIAG_SetAni: Length of AniName has to be between 0 and 16");
};
MEM_CopyBytes(ani.ptr, T_DIALOGGESTURE_, ani.len+1); // +1 für \0
};
Ich habe soweit ich weiß nix an den Anis verändert. Absturz ist reproduzierbar und tritt auf, wenn ich den Npc zum ersten Mal anspreche. Also erster Dialog ist ein Trialog mit 4 Gesprächspartnern.
Hier ein Ausschnitt...
var c_npc TRIA_Adrion; TRIA_Adrion = Hlp_GetNpc(loa_kdf_6194_AdrionST);
var c_npc TRIA_Cortez; TRIA_Cortez = Hlp_GetNpc(LOA_MIL_6192_CortezST);
var c_npc TRIA_Magus; TRIA_Magus = Hlp_GetNpc(LOA_KDF_6193_MagusST);
var c_npc TRIA_Flint; TRIA_Flint = Hlp_GetNpc(loa_kmp_6191_FlintST);
TRIA_Invite(TRIA_Adrion);
TRIA_Invite(TRIA_Cortez);
TRIA_Invite(TRIA_Magus);
TRIA_Start();
DIAG_Reset();
TRIA_Next(TRIA_Flint);
AI_TurnToNpc(self, other);
TRIA_Next(TRIA_Adrion);
AI_TurnToNpc(self, TRIA_Flint);
TRIA_Next(TRIA_Magus);
AI_TurnToNpc(self, other);
TRIA_Next(TRIA_Cortez);
AI_TurnToNpc(self, TRIA_Magus);
TRIA_Next(TRIA_Flint);
>>Ah, na hallo. Wiedersehen macht Freude, was?
>>Ich hatte schon befürchtet, dass ihr mir noch alle aufs Dach steigt.
<<Oh Mann. Ich dachte zwischendurch noch, ich würde ersticken. Wie könnt ihr das mit dem Teleportieren überhaupt aushalten? Da dreht sich einem auf die Dauer doch der Magen um.
TRIA_Next(TRIA_Adrion);
...
DIAG_Reset();
TRIA_Finish();
Gottfried hat da irgendwie Code geschrieben, der standardmäßig eine Ausnahme hervorruft. Seine vorgeschlagene Änderung ist einfach in der Dialoggestures.d in Zeile 64 die 15 zu einer 19 (glaube ich) zu ändern. Werde mir das in nächster Zeit mal ein wenig tiefergehend anschauen, hatte das sowieso vor.
TheEternal
25.05.2015, 22:16
//========================================// Animation direkt setzen
//========================================
func void _DIAG_SetAni(var string AniName) {
_DIAG_Patch();
const int T_DIALOGGESTURE_ = 9148264; // 0x8B9768
MemoryProtectionOverride(T_DIALOGGESTURE_, 16);
AniName = STR_Upper(AniName);
var zString ani; ani = MEM_PtrToInst(STR_GetAddress(AniName));
if(ani.len < 1 || ani.len > 15) {
MEM_Error("DIAG_SetAni: Length of AniName has to be between 0 and 16");
};
MEM_CopyBytes(ani.ptr, T_DIALOGGESTURE_, ani.len+1); // +1 für \0
};
ich habe mir mit ner Infobox die ani.len ausgeben lassen. Es sagt 17.
Aber wieso muss die Anilänge kleiner 16 sein? Es werden doch 16 freigegeben und auch bei grün maximal 16 kopiert .
Ich habe übrigens keine neuen Dialoggestures hinzugefügt.
kann man nicht einfach T_DIALOGGESTURE_ größer machen?
EDIT: Die Lösung mit der 19 klappt zumindest vorerst. Ich behalte das im Auge.
TheEternal
01.06.2015, 19:17
Hallo,
ich würde gerne in der B_GiveDeathInv(var C_Npc slf) eine aivar des sterbenden Npcs verändern wollen.
Also in dem Fall. AIV_DEAD.
Bei mir geben die Testprints aber immer null aus.
Ich denke, es liegt an der Übergabeweise von Gothic der Parameter für die Funktion B_GiveDeathInv
Kann mir da jemand weiterhelfen, wie ich an die originale Instanz von slf komme, damit ich die manipulieren kann?
Dann sind vermutlich deine Tests falsch, eigentlich sollte das ganz normal funktionieren. Die B_GiveDeathInv() wird von den originalen Scripten aufgerufen, oder?
TheEternal
01.06.2015, 22:00
ja wird von der zs_dead aufgerufen, aber wenn ich da die aivar setze, dann verändert sich der Wert nicht. Oder es wird wohl bei einem anderen Npc gesetzt.
Hmm...
Edit: Wurde gelöst. Seltsamerweise kann man mit slf.aivar[] nix beim angesprochenen Npc setzen. Liegt wohl daran, dass der Npc self als Kopie in slf übergeben wird.
Ich habe dann das Setzen mit self.aivar gemacht und dann ging es auf einmal. Mit dem parameter slf. kann man aber weiterhin die Variablen abfragen, da ja slf eine kopie von self ist.
Milky-Way
01.06.2015, 22:24
Hast du mal mit Print(slf.name) oder ähnlichem geguckt, was angezeigt wird?
Milky-Way
24.06.2015, 14:51
Könntest du bitte den Link zum Wiki im ersten Beitrag aktualisieren? Milgos Seite leitet nicht mehr weiter. :)
I'm trying to call a function by hooking hero melee weapon attacks, but my problem is that the function is calling several times during one a single attack.
HookEngineF (7668064, 6, HeroAttack); //left
HookEngineF (7671040, 7, HeroAttack); //right
HookEngineF (7673808, 7, HeroAttack); //forward attack
HookEngineF (7664640, 6, HeroAttack); //combo
Is this possible to call function only once per attack?
TheEternal
30.06.2015, 15:13
I'm trying to call a function by hooking hero melee weapon attacks, but my problem is that the function is calling several times during one a single attack.
HookEngineF (7668064, 6, HeroAttack); //left
HookEngineF (7671040, 7, HeroAttack); //right
HookEngineF (7673808, 7, HeroAttack); //forward attack
HookEngineF (7664640, 6, HeroAttack); //combo
Is this possible to call function only once per attack?
I had the same problem. you could use a variable to only perform your desired action once when the attack is performed:
var int attackonce;
if attackright && attackonce == FALSE{
//your desired action
attackright = FALSE;
attackonce = TRUE;
}
Hello. I created queue which uses list to store handles to my new class items . But unfortunately it crashes sometimes when loading. Especialy when list is populated (loading save, which was done at time when list stored some handles ) with handles. I guess my function tries to use those handles but my class objects are not archived, so upon loading those handles refer to nothing and that causes crash. Do I need to create some kind of archiver as other lego classes have ? If yes, could you explain me how to do it ?
Mfg Mark
I can't say anything until you show me your code.
Looks like I sorted it out. I had to destory list in Init_global, in case it was not empty. More or less fixed... :D
Hi, anyone knows how to make 2-colored bar in Gothic 1 or 2?
I am making 2 bars on 1 surface, but the second bar is partially covered due to low transparency of first standard HP Bar.
Milky-Way
04.08.2015, 20:48
What exactly do you want it to look like?
Hello. I still have problem with those lists. So its notification system based on list. Notifications are added to the list and then one after another gets rendered and removed.
List is most of the time empty. Problem occurs when I save the game with list containing more nodes. Game crashes trying to use data from the list ( I guss ). I looked in the scriptsave.sav and the list is stored in there with the data (handles to NMsg ), but the handles itself are not in the file.
I really want to be able to save/load list and objects it stores handles to. Hope anyone can help me. :gratz
var int NMsg_List; // zCList
var int NMsg_Active; //
class NMsg
{
var int type;
var string text1;
var string text2;
var string sound;
};
instance NMsg@(NMsg);
func int List_CreateH(var int data) // create list return handle
{
var int hndl;
hndl = new (zCList@);
// var zCList l; l = _^(getPtr(hndl));
var zCList l; l = get(hndl);
l.data = data;
l.next = 0;
return hndl;
};
func void Notify_Init() // init_global
{
if (!(getPtr(NMsg_List)))
{
NMsg_List = List_CreateH(0);
};
};
func void NMsg_Create(var string text1,var string text2,var int Ntf_type,var string snd)
{
if (!(getPtr(NMsg_List)))
{
NMsg_List = List_CreateH(0);
};
PrintDebug("Notify: List_Add");
var int hndl; hndl = new(NMsg@);
var NMsg msg; msg = get(hndl);
msg.text1 = text1;
msg.text2 = text2;
msg.type = Ntf_type;
msg.sound = snd;
List_Add(getPtr(NMsg_List),hndl);
};
func void NMsg_Remove(var int hndl) // msg handle
{
if (!Hlp_IsValidHandle(hndl))
{
return;
};
PrintDebug("Notify: List_Remove");
List_Delete(getPtr(NMsg_List), List_Contains(getPtr(NMsg_List), hndl)); // remove from list
if (Hlp_IsValidHandle(hndl))
{
delete(hndl); // delete handle
};
};
func void NMsg_Show(var string txt1,var string font1,var string txt2,var string font2,var string sound)
{
NMsg_Active = true;
// stuff
NMsg_Active = false; // after short delay
};
func void Notify_func() // looped by ff fucntion
{
if(!Hlp_IsValidNpc(hero)) { return; };
if ((MEM_Game.pause_screen)) /*|| (!InfoManager_HasFinished()))*/ { return; };
if (!NMsg_List) { return; };
if (!getPtr(NMsg_List)) { return; };
if (NMsg_Active) { return; };
var zCList l; l = get(NMsg_List);
var NMsg msg;
if (l.next)
{
var int hndl;
hndl = List_Get(getPtr(NMsg_List),2);
msg = get(hndl);
NMsg_Show(msg.text1,NMsg_FontSmall,msg.text2,NMsg_FontSmall,msg.sound);
NMsg_Remove(h);
};
};
Uh, that looks correct. Everything created with new() should automatically land in the savefile - are you sure there's nothing in there?
If it crashes upon saving, that will most likely be the cause, although I don't see any reason why that would happen. What error messages are you getting?
Milky-Way
23.08.2015, 14:03
Kurze Frage:
Ich starte Gothic.
Ich starte ein neues Spiel und hooke eine Funktion.
Ich speichere das Spiel.
Ich beende Gothic.
Ich starte Gothic.
Ich lade den Spielstand (hooke die Funktion aber nicht wieder neu).
Kann der Hook noch irgendwie aktiv sein?
Nein. Beim Starten von Gothic wird die Gothic2.exe von der Festplatte in den Speicher geladen, ohne die Änderungen von HookEngine (die nie gespeichert werden).
Hello, I am thinking about using your button packet and I have one question.
if (Cursor_Left==KEY_PRESSED) {
MEM_PushIntParam(MEM_ReadStatArr(_Buttons, i));
MEM_CallByID(btn.on_click);
};
This is from function Buttons_Do in packet source. Does that PushIntParam mean that I can make function like bellow, and the button hadle is actually passed as parameter ?
func void Button_clickevent(var int hndl) {
// do stuff
};
hi, here is the script to change color of text in missions menu. It looks great till I skipped to another kind of log . (for example from missions running to missions failed)
Func void _ChangeFontColorLogItem()
{
ChangeFontColorMenuItem("MENU_ITEM_SEL_MISSIONS_OLD", RGBA(0,255,255,255));
ChangeFontColorMenuItem("MENU_ITEM_SEL_MISSIONS_ACT", RGBA(210,255,128,255));
func void ChangeFontColorMenuItem(var string menuItemName, var int color) {
var int menuIptr; menuIptr = MEM_GetMenuItemByString(menuItemName);
var int col; col = color;
if (menuIptr) {
var zCMenuItem menuI; menuI = _^(menuIptr);
if (menuI.m_pInnerWindow) {
var zCView viewI; viewI = _^(menuI.m_pInnerWindow);
if (viewI.textLines_next) {
var zCList listI; listI = _^(viewI.textLines_next);
if (listI.data) {
var zCViewText viewTI; viewTI = _^(listI.data);
MEM_WriteInt(_@(viewTI.color), col);
viewTI.colored = 1;
};
};
};
};
};
Hello, I am thinking about using your button packet and I have one question.
if (Cursor_Left==KEY_PRESSED) {
MEM_PushIntParam(MEM_ReadStatArr(_Buttons, i));
MEM_CallByID(btn.on_click);
};
This is from function Buttons_Do in packet source. Does that PushIntParam mean that I can make function like bellow, and the button hadle is actually passed as parameter ?
func void Button_clickevent(var int hndl) {
// do stuff
};
Yes exactly, I should've mentioned it in the wiki.
TheEternal
12.09.2015, 14:52
ich möchte mit einem Hook das Dropevent abfangen und dabei wissen, welches Item gedroppt wird.
Um auf ein spezielles Item reagieren zu können.
Hook funktioniert auch soweit an der Funktion
virtual int __thiscall oCNpc::DoDropVob(zCVob *)
func void HOOK_AI_Drop(){
PrintDebugg("HERO AI_Drop happened");
AMBVAR_DROPWP = Npc_GetNearestWP(hero);
Mdl_ApplyOverlayMdsTimed (Npc, "HUMANS_SPRINT.MDS", SPL_Duration_SPEED);
NewRout(Npc, "pickup");
};
HookEngineF ( 7622096, 6, HOOK_AI_Drop); // Hook AIDrop (/*0x00744DD0*/)
Kann mir einer helfen, wie ich da an das zCVob komme und das gegen etwas anderes vergleichen kann?
zB gegen ItMi_OldCoin oder ItMi_OldCoin.3ds
Milky-Way
12.09.2015, 17:12
Schau mal hier:
http://forum.worldofplayers.de/forum/threads/1023720-Skriptpaket-LeGo?p=16744409&viewfull=1#post16744409
Ich könnte mir vorstellen, dass NPC und Item an gleicher (relativer) Stelle zu finden sind.
Und dann gibt es aus der Externals.d
FUNC INT Hlp_IsItem (VAR C_Item item, VAR INT instanceName)
// Prüft, ob der Gegenstand 'item' den Instanznamen 'instanceName' trägt. Will man z.B. testen,
// ob die globale Variable item Pfeile sind (ItMuArrow) ruft man Hlp_IsItem(item,ItMuArrow) auf.
// Gribt bei Gleichheit TRUE, sonst FALSE zurück.
TheEternal
12.09.2015, 17:30
Jo, danke Milky-Way. Konnte es damit lösen.
Abuyin Sharidi
16.09.2015, 16:38
Bug report (not sure if it is a bug or not, to be honest):
FF_ApplyOnceExt(func, 1, -1); drops FPS. In Khorinis I had 22 - 25 FPS without any function, with two with the second parameter set to 1, I have 9 - 11 FPS.
Greetings! :gratz
Frank-95
16.09.2015, 18:27
Try to give more information about the problem, so that lehona or someone else could find a solution for a possible bug, or can just tell you what's going on.
Does it happen with different time steps too? Post here the called function, it will help.
Abuyin Sharidi
16.09.2015, 21:04
Those are all informations. FPS' just drop when setting it to apply 1000 times a second, only.
LeGo (tries to) guarantee that it will be called 1000x per second, even if that means calling it multiple times per frame. If you average around 25 FPS, that means 40ms/frame. So LeGo will call the function 40x per frame.
Never use small ms values unless you have a very specific reason to do so (I can't think of any). 0 will guarantee it's called exactly once per frame.
Hallo, ich wollte heute mal auf die neuste Version umsteigen. (Daten aus dem SVN)
Dann ist mir ein Problem mit PermMem aufgefallen.
Ich hab schon vor längerem einen Editor gebastelt, womit man das Aussehen das PC_Hero anpassen kann, und der hat auch immer funktioniert.
Nur mit der neusten Version eben nicht. Beim Laden eines Spielstandes wird das alte Visual geladen. (Das aus dem PC_Hero Skript)
In der SCRPTSAVE:SAV wird das Objekt korrekt gespeichert:
HNDL:31
PC_VISUAL_CHOOSER:PC_VISUAL_CHOOSER@
{
GENDER=i0
HEADMESH=sHum_Head_Psionic
FACETEXTURE=i107
SKINCOLOR=i1
VOICE=i0
SIZE=i1
}
Hier meine Klasse:
class PC_Visual_Chooser {
var int gender;
var string headmesh;
var int facetexture;
var int skincolor;
var int voice;
var int size;
};
instance PC_Visual_Chooser@(PC_Visual_Chooser);
//*************************************
// Erzeuge einen PC_Visual_Chooser
//*************************************
func void CreatePC_Visual_Chooser(var int g, var string hm, var int ft, var int sc, var int voice_nr, var int mySize) {
var int hndl; hndl = new(PC_Visual_Chooser@);
var PC_Visual_Chooser my_obj; my_obj = get(hndl);
my_obj.gender = g;
my_obj.headmesh = hm;
my_obj.facetexture = ft;
my_obj.skincolor = sc;
my_obj.voice = voice_nr;
my_obj.size = mySize;
};
//***************************************
// Visual angepassen
//***************************************
func void UpdateVisual() {
foreachHndl (PC_Visual_Chooser@, _UpdateVisualPC);
};
func int _UpdateVisualPC(var int hndl) {
var PC_Visual_Chooser my_obj; my_obj = get(hndl);
Mdl_SetVisualBody (hero, "hum_body_Naked0", 0, my_obj.skincolor, my_obj.headmesh, my_obj.facetexture, 0, -1);
return rContinue;
};
Jedoch wird beim laden nicht korrekt darauf zugegriffen, in der INIT_GLOBAL() rufe ich UpdateVisual() auf.
Ich habe mit einfachen Prints schon versucht das Problem einzugrenzen.
UpdateVisual() wird aufgerufen, jedoch wird _UpdateVisualPC nicht aufgerufen bzw mein Print(); erscheint nicht.
Frank-95
27.09.2015, 18:07
Is there a way for framefunctions to not count seconds while the game is in pause?
e.g
FF_ApplyOnceExt(functionx,30000,1)
This will call functionx after 30 seconds, counting seconds while game is paised. Could there be a solution to make it skip seconds while MEM_Game.singleStep (paused game) is true?
There is, in fact. However, you can only specifiy it for all FFs. Simply call Timer_SetPauseInMenu(true) (http://lego.worldofplayers.de/?Timer#Timer_SetPauseInMenu) once.
If you only want it for a single FF, you'll have to call it every frame and count the time yourself.
Frank-95
27.09.2015, 21:14
That's exactly what I was looking for! Thanks :D
Ich hab das Problem mal weiter eingegrenzt.
Da gibt es ein Problem mit foreachHndl.
Das lässt sich 100% reproduzieren.
z.B.: Ein weiteres Beispiel:
Startup.d
func void INIT_GLOBAL(){
FF_ApplyOnce (BuildingObject_Do);
};
Klasse
func void BuildingObject_Do() {
Print("outer");
foreachHndl (BuildingObject@, _BuildingObject_Do);
};
func void _BuildingObject_Do(var int hndl) {
var BuildingObject bo; bo = get(hndl);
Print("inner");
...
};
Beim ersten Start funktioniert alles, erst nach dem ersten laden nicht mehr.
Dabei wird "outer" immer geprintet, "inner" jedoch nur bis zum ersten laden.
Kannst du damit schon was anfangen, oder brauchst du mehr Informationen? :dnuhr:
An Informationen reicht das (ich gehe zumindest mal davon aus, dass ich das reproduzieren kann). Klingt nur nach einem unangenehmen Bug, weil PM ziemlich komplex ist und ich da bis heute noch nicht zu 100% durchgestiegen bin. Vielleicht kann ich Gottfried ja animieren, mir da zu helfen :p
Gottfried
05.10.2015, 17:12
Ho!
War zum Glück kein komplizierteres Problem und ließ sich ziemlich fix beheben.
Die korrigierte PermMem.d ist auf dem SVN und kann hier (https://www.assembla.com/spaces/lego2/subversion/source/HEAD/PermMem.d?_format=raw) direkt heruntergeladen werden :)
MfG Gottfried
Vielen Dank, nun funktioniert wieder alles. :gratz
Frank-95
08.10.2015, 10:07
Hi :) :)
Is there a way to delete suddenly every bloodsplats on the screen?
I mean a function that clears and removes instantly every previous bloodsplats.
There's no super clean and easy solution, but this should do (some pseudocode, so beware):
func void removeAllBloodsplats_sub(var int hndl) {
if (String_StartsWith(View_GetTexture(hndl), "BLOODSPLAT")) { // This part is pseudocode, but you can look up at the actual string functions used for this
View_Delete(hndl);
};
return rContinue;
};
func void RemoveAllBloodsplats() {
ForEachHndl(zCView@, removeAllBloodsplats_sub);
};
Thinking about it, this may cause a crash, because you don't own the views (and other things are still depending on it being there), thus you aren't allowed to simply delete it.
Maybe try this instead?
func void RemoveAllBloodsplats_sub(var int hndl) {
var A8Head h; h = get(hndl);
if (h.fnc == MEM_GetFuncPtr(_Bloodsplat_Handler)) {
delete(h.data);
delete(h);
};
return rContinue;
};
func void RemoveAllBloodsplats() {
ForEachHndl(A8Head@, RemoveAllBloodsplats_sub);
};
Frank-95
08.10.2015, 18:21
The second code works well if you set the first function to int instead of void :P
Anyway, I needed this function because I found a bug in bloodsplats.
If I called Bloodsplat(int), out of the usual context, so basically out of _B_HeroDamage(), and saved while some of them are stil on the screen, they would persist, and would not disappear, neither with the function you wrote, while "normal" bloodsplats would correctly go away.
Code written on fly just to explain myself better:
func void testbs()
{
BloodSplat(10); //random value
};
func void init_global()
{
[...]
FF_ApplyOnceExt(testbs, 1000, -1);
};
Since bloosplats are always on the screen, whenever I save, and reload, I will find some still blood on the screen, which does not go away after the call of your function, which works for everyother bloodsplat.
Can't reproduce it, but it may be related to the bug fixed in post #107. Did you apply the new version of PermMem.d?
Frank-95
09.10.2015, 09:53
The last version of permmem seems to have fixed it! Thank, good job :D:D
Frank-95
14.10.2015, 11:37
Hi, yes it's still me which I *might* have found another bug in lego :p :p (kill me if you want me to stop :D )
Basically I needed to print coloured text lines in a view. So I looked for some functions in view and interface, and I found out there were no specific functions for the purpose (only some in interface). So I wrote them by myself, using your code as base, and just changing some function calls (in red the differences).
func int Print_ColoredTextField(var int x, var int y, var string text, var string font, var int height, var int color)
{
var int cnt; cnt = STR_SplitCount(text, Print_LineSeperator);
var int i; i = 1;
var int ptr; ptr = Print_CreateTextPtrColored(STR_Split(text, Print_LineSeperator, 0), font, color);
var zCViewText txt; txt = _^(ptr);
txt.posx = x;
txt.posy = y;
var int list; list = List_Create(Ptr);
var int pos; pos = MEM_StackPos.position;
if (i >= cnt) {
return list;
};
ptr = Print_CreateTextPtrColored(STR_Split(text, Print_LineSeperator, i), font, color);
txt = _^(ptr);
txt.posx = x;
txt.posy = y+(height*i);
List_Add(list, ptr);
i+=1;
MEM_StackPos.position = pos;
};
func void ViewPtr_AddTextColored(var int ptr, var int x, var int y, var string text, var string font, var int color)
{
var zCView v; v = _^(ptr);
var int field; field = Print_ColoredTextField(x, y, text, font, Print_ToVirtual(Print_GetFontHeight(font), v.pposy+v.psizey), color);
if(v.textLines_next)
{
List_Concat(v.textLines_next, field);
}
else
{
v.textLines_next = field;
};
};
func void View_AddTextColored(var int hndl, var int x, var int y, var string text, var string font, var int color) {
ViewPtr_AddTextColored(getPtr(hndl), x, y, text, font, color);
};
That's it, pretty basic actually :p And it does work, but it causes other texts to bug. This is an example:
func void MenuStatusDeleteInfo()
{
View_DeleteText(InfoBox);
};
func void MenuStatusCircle1()
{
View_AddText(InfoBox, 500, 800, "I circolo della magia", "font_old_10_white.tga");
if(Npc_GetTalentSkill(hero, NPC_TALENT_MAGE) == 0)
{
if(hero.guild != GIL_KDF)
{
View_AddTextColored(InfoBox, 500, 1800, "Requisiti: Mago", "font_old_10_white.tga", COL_Red);
}
else
{
View_AddTextColored(InfoBox, 500, 1800, "Requisiti: Mago", "font_old_10_white.tga", COL_Green);
};
if(hero.lp < B_GetLearnCostTalent(hero, NPC_TALENT_MAGE, 1))
{
View_AddTextColored(InfoBox, 500, 2800, ConcatStrings("LP: ", IntToString(B_GetLearnCostTalent(hero, NPC_TALENT_MAGE, 1))), "font_old_10_white.tga", COL_Red);
}
else
{
View_AddTextColored(InfoBox, 500, 2800, ConcatStrings("LP: ", IntToString(B_GetLearnCostTalent(hero, NPC_TALENT_MAGE, 1))), "font_old_10_white.tga", COL_Green);
};
};
};
Circle1 = Button_CreateCenter(3200, 900, 400, 400, "g3_hud_circle_01_learned.tga", MenuStatusCircle1, MenuStatusDeleteInfo, MenuStatusNullFunc);
Basically the two coloured strings are printed correctly, while the white one (the first call), is either red or green according to the others two :dnuhr: Might it be a bug of Print_TextField?
Another thing, which is a suggestion request more than a question. I'm making (actually I have already made), a menu hud like gothic 3. It took me a lot to position every button and text in the right place, but I'm pretty satisfied about the result. As you may have noticed, the previous code is a part of this hud, and I run against some troublesome behaviour
Images printed with View, get the resolution much decreased, both in my lowest resolution (800x600), both in my highest (1280x1024). And I'm not printing them larger than they are (I could make screenshot if you like). Is this normal?
View package let me use virtual coordinates, and this is a good thing because in this way, icons in my menu stay to the right place both in low both in high resolution. This is not applied to text unfortunately, which is pretty big in low resolutions, and very small in high ones. This causes the text to not be centered or aligned anymore in high resolutions. Do I have to give up on this? Because I wouldn't really want to create an image for every text and print it with view :(
The previous two were graphic and minor problems, this is a major and scripting one. Every button I used in the hud has this structure (x, x, x, x, "tex", MenuStatusxxx, MenuStatusDeleteInfo, MenuStatusNullFunc). MenuStatusxx prints, on enter, the name and requirements of the talent on another view (like the previous code), and it is different for EVERY button. MenuStatusDeleteInfo delete any text from the info view, and it is called by every button on leave. MenuStatusNullFunc is just an empty void function. All of this works decently, but there are some bad problems that seems I can't resolve. Basically sometimes strings are not displayed because of timing. Sometimes OnLeave function of a button is called few milliseconds after OnEnter one of the next button causing the text to not be displayed. So, even if it is boooooring, I made something like this:
func void MenuStatusCircle1()
{
[...]
};
func void CallMenuStatusCircle1()
{
FF_ApplyOnceExt(MenuStatusCircle1, 100, 1);
};
Circle1 = Button_CreateCenter(3200, 900, 400, 400, "g3_hud_circle_01_learned.tga", CallMenuStatusCircle1, MenuStatusDeleteInfo, MenuStatusNullFunc);
This would work pretty good, BUT, unfortunately I have Timer_SetPauseInMenu(TRUE); called in the startup, which I cannot set it to FALSE, because it would result in so many more bugs: in fact according to the situation I could have several FF at the same moment, so I wouldn't really call it with FALSE. Any suggestion?? :(
Still thank you for the patience
TheEternal
22.10.2015, 21:48
Alas, I've found a way to get what you need.
Code
func
void onTradeLeft() {
value = MEM_ReadInt(ESP+20); // itm.value * multiplier
MEM_WriteInt(ESP+20, 123); // set new value
var oCItem itm; itm = _^(EBX); //Get the item
var oCNpc npc; npc = _^(MEM_InformationMan.npc); // Get the NPC
};
const int oCViewDialogTrade__OnTransferLeftX = 6863312; //0x68B9D0
HookEngineF(oCViewDialogTrade__OnTransferLeftX, 6, onTradeLeft);
This should only trigger when the hero sells something, buying is a completely different (well, similar, but different) thing.
The code should be self-explaining to you, if you have questions how to use it, go ahead an ask :)
Edit: The value seems to be capped at about 16k (I assume around 214 but didn't check it as I thought that wouldn't matter much to you).
Wäre es auch möglich den Kaufpreis Händlerabhängig zu ändern?
Gottfried
23.10.2015, 01:41
Wäre es auch möglich den Kaufpreis Händlerabhängig zu ändern?
Ziemlich Problemlos:
func void onTradeLeft() {
var int value; value = MEM_ReadInt(ESP+20);
var oCItem itm; itm = _^(EBX);
var oCNpc npc; npc = _^(MEM_InformationMan.npc);
if(Hlp_GetInstanceID(npc) == Hlp_GetInstanceID(VLK_416_Matteo)) {
value /= 2; // Halbiert für Matteo
};
MEM_WriteInt(ESP+20, value);
};
MfG Gottfried
Dinge, die Gottfried nicht getan hat: [x] Meinen Post gelesen.
Ich bin mir recht sicher, dass das nur beim Verkaufen von Items funktioniert (TransferLeft) :p
Dinge, die Lehona gerne macht: [x] Gottfried ärgern.
Frank-95
24.10.2015, 14:02
I repropose my (not so) old question.
I created some function for printing coloured text in views, since the feature is missing in LeGo.
func int Print_ColoredTextField(var int x, var int y, var string text, var string font, var int height, var int color)
{
var int cnt; cnt = STR_SplitCount(text, Print_LineSeperator);
var int i; i = 1;
var int ptr; ptr = Print_CreateTextPtrColored(STR_Split(text, Print_LineSeperator, 0), font, color);
var zCViewText txt; txt = _^(ptr);
txt.posx = x;
txt.posy = y;
var int list; list = List_Create(Ptr);
var int pos; pos = MEM_StackPos.position;
if (i >= cnt) {
return list;
};
ptr = Print_CreateTextPtrColored(STR_Split(text, Print_LineSeperator, i), font, color);
txt = _^(ptr);
txt.posx = x;
txt.posy = y+(height*i);
List_Add(list, ptr);
i+=1;
MEM_StackPos.position = pos;
};
func void ViewPtr_AddTextColored(var int ptr, var int x, var int y, var string text, var string font, var int color)
{
var zCView v; v = _^(ptr);
var int field; field = Print_ColoredTextField(x, y, text, font, Print_ToVirtual(Print_GetFontHeight(font), v.pposy+v.psizey), color);
if(v.textLines_next)
{
List_Concat(v.textLines_next, field);
}
else
{
v.textLines_next = field;
};
};
func void View_AddTextColored(var int hndl, var int x, var int y, var string text, var string font, var int color) {
ViewPtr_AddTextColored(getPtr(hndl), x, y, text, font, color);
};
The code prints correctly coloured text, but, after a fraction of second, any other printed text with View_AddText, which should be white, changes color to the last used with View_AddTextColored.
If you need I have a video filming the bug.
Is my code wrong or is it a known/unknown problem with LeGo?
Thank you :D
Sorry, I should've posted earlier. It's a known bug/feature with how zCViewText works. If viewtext.colored is set to 0, the text will assume the color that was used last. The fix should be easy enough, I simply haven't gotten to it. Expect a fix within the next days.
Frank-95
24.10.2015, 21:00
Thank you very much, I will stay tuned for an official update :)
Hi all! :)
I'm just approaching to the use of LeGo and I would like to ask a question about the HookEngine.
If I understood correctly, the engine let you execute your own functions before the hooked one is called, which will be called just after your functions, right?
So, my attempt was to change the fight animation when a certain weapon is equipped. So I hooked EquipItem (and Unequip):
HookEngineF(oCNpc__EquipItem, 7, _EV_EQUIPITEM);
HookEngineF(oCNpc__UnequipItem, 6, _EV_UNEQUIPITEM);
func void _EV_EQUIPITEM()
{
var int itmptr;
var C_ITEM itm;
var C_NPC slf;
if((!ECX) || (!ESP))
{
return;
};
itmptr = MEM_ReadInt(ESP + 4);
slf = _^(ECX);
if(!itmptr)
{
return;
}
else
{
itm = _^(itmptr);
if(MEM_InstHasFlagExt(itmptr, ITEM_2HD_MACE))
{
Equip_2H_Mace(slf);
}
else if((MEM_InstHasFlag(itmptr, ITEM_SWD) || MEM_InstHasFlag(itmptr, ITEM_AXE)) && (itm.cond_atr[2] != ATR_DEXTERITY))
{
Equip_1H_All(slf);
}
else if((MEM_InstHasFlag(itmptr, ITEM_SWD) || MEM_InstHasFlag(itmptr, ITEM_AXE)) && (itm.cond_atr[2] == ATR_DEXTERITY))
{
Equip_Foil(slf);
}
else if((MEM_InstHasFlag(itmptr, ITEM_2HD_SWD) || MEM_InstHasFlag(itmptr, ITEM_2HD_AXE)) && !MEM_InstHasFlagExt(itmptr, ITEM_2HD_MACE) && !MEM_InstHasFlagExt(itmptr, ITEM_WAND))
{
Equip_2H_SwdAxe(slf);
};
};
};
func void _EV_UNEQUIPITEM()
{
var int itmptr;
var C_ITEM itm;
var C_NPC slf;
if((!ECX) || (!ESP))
{
return;
};
itmptr = MEM_ReadInt(ESP + 4);
slf = _^(ECX);
if(!itmptr)
{
return;
}
else
{
itm = _^(itmptr);
if(MEM_InstHasFlagExt(itmptr, ITEM_2HD_MACE))
{
UnEquip_2H_Mace(slf);
}
else if((MEM_InstHasFlag(itmptr, ITEM_SWD) || MEM_InstHasFlag(itmptr, ITEM_AXE)) && (itm.cond_atr[2] != ATR_DEXTERITY))
{
UnEquip_1H_All(slf);
}
else if((MEM_InstHasFlag(itmptr, ITEM_SWD) || MEM_InstHasFlag(itmptr, ITEM_AXE)) && (itm.cond_atr[2] == ATR_DEXTERITY))
{
UnEquip_Foil(slf);
}
else if((MEM_InstHasFlag(itmptr, ITEM_2HD_SWD) || MEM_InstHasFlag(itmptr, ITEM_2HD_AXE)) && !MEM_InstHasFlagExt(itmptr, ITEM_2HD_MACE) && !MEM_InstHasFlagExt(itmptr, ITEM_WAND))
{
UnEquip_2H_SwdAxe(slf);
};
};
};
func void RemoveFightAnis(var C_NPC slf)
{
Mdl_RemoveOverlayMds(slf,"HUMANS_1HST1.MDS");
Mdl_RemoveOverlayMds(slf,"HUMANS_1HST2.MDS");
Mdl_RemoveOverlayMds(slf,"HUM_PIRSAB.MDS");
Mdl_RemoveOverlayMds(slf,"HUM_PIRSAB2.MDS");
Mdl_RemoveOverlayMds(slf,"HUMANS_O2HL2.MDS");
Mdl_RemoveOverlayMds(slf,"HUMANS_O2H.MDS");
Mdl_RemoveOverlayMds(slf,"HUMANS_2HST1.MDS");
Mdl_RemoveOverlayMds(slf,"HUMANS_2HST2.MDS");
};
func void Equip_Foil(var C_NPC slf)
{
RemoveFightAnis(slf);
if(TAL_GetValue(slf,NPC_TALENT_FENCING) == 1)
{
Mdl_ApplyOverlayMds(slf,"HUM_PIRSAB.MDS");
}
else if(TAL_GetValue(slf,NPC_TALENT_FENCING) == 2)
{
Mdl_ApplyOverlayMds(slf,"HUM_PIRSAB2.MDS");
};
};
func void UnEquip_Foil(var C_NPC slf)
{
Mdl_RemoveOverlayMds(slf,"HUM_PIRSAB.MDS");
Mdl_RemoveOverlayMds(slf,"HUM_PIRSAB2.MDS");
};
Optimisation apart (which sucks), every equip_xxx and unequip_xxx function has the same structure.
This code does not work because the animation is, at first, changed to HUM_PIRSAB, but then the original function is called and it is changed back to HUM_1HST1/2.
This behaviour is correct according with how HookEngine works.
Then I would like to ask two question:
1) How can I prevent the original function to be called?
2) Why did this work few days ago, and without doing anything it does not work now???
Of course the last one is not a real question: it's just that that code behaved like I wanted to, but NOT normally, and now like I don't want but normally :P ZenGin is so buggy :)
Thank you.
Frank-95
17.11.2015, 14:25
I have a question regarding FFs..
If I had several calls...
FF_ApplyExtData(function, 1000, -1, argument1);
FF_ApplyExtData(function, 1000, -1, argument2);
FF_ApplyExtData(function, 1000, -1, argument3);
FF_ApplyExtData(function, 1000, -1, argument4);
(note that the argument is always different, while function is always the same)
... and I called
FF_Remove(function);
Would every FFs be deleted right?
I have just written a function that delete only the function with the passed argument:
var int _FF_RemoveData;
func int _FF_RemoveLData(var int hndl) {
if(MEM_ReadInt(getPtr(hndl)) != _FF_Symbol) {
return continue;
};
var FFItem itm; itm = get(hndl);
if(itm.data != _FF_RemoveData)
{
return continue;
}
else
{
delete(hndl);
return break;
};
};
func void FF_RemoveData(var func function, var int data)
{
_FF_RemoveData = data;
_FF_Symbol = MEM_GetFuncPtr(function);
foreachHndl(FFItem@, _FF_RemoveLData);
};
This seems to work, but I have got to do some more test. What do you say? May it bring to some bug?
Abuyin Sharidi
17.11.2015, 19:12
I would make it like this:
while(FF_Active(function));
FF_Remove(function);
end;
Good work! I can't see anything wrong with it. If you don't mind I will probably include it in future releases?
FF_Remove() will only delete one FF, even if there are multiple active.
I would make it like this:
while(FF_Active(function));
FF_Remove(function);
end;
While that is also useful, it does something different.
Frank-95
18.11.2015, 08:11
Good work! I can't see anything wrong with it. If you don't mind I will probably include it in future releases?
Big thanks :D Do whatever you want with it :D
BTW, are you planning to implement the Coloured TextView bugfix in the future release too?
Demondays
24.11.2015, 12:23
Hello, Im not sure if this is right place to write, but Im having problem with initializing last version (2.3.2) of Lego script packet. Basically when I start new game it loads till the videos, but after them, game just shuts down. So I started game with the gothicstarter_mod and launched zspy (set o 4). Then after videos I got error, SmartHeat Library "Out of memory". After clicking ignore, error-message appeared "Q:Exception handler was invoked. Ikarus tried to print a Deadalus....". Then when I click OK, I get assertion failed error: http://i.imgur.com/Slk8nVf.jpg
Strange thing is that when I replaced Lego folder with the scripts from the 2.2.1 version it seems to be working fine. At least I can put LeGo_Init (LeGo_All); into startup and launch the game without a problem. Well, its probably just me doing something wrong but since I dont really have much experience with Ikarus&Lego, I ask for help.
Abuyin Sharidi
24.11.2015, 12:47
Have you installed this (http://www.worldofgothic.de/dl/download_278.htm)?
Demondays
24.11.2015, 13:12
Have you installed this (http://www.worldofgothic.de/dl/download_278.htm)?
Yes, seems I have it already installed. Also Im using systempack created by MaGoth (because of working shields).
You could try it without the Systempack (and just the report patch), just to see if the crash persists.
Is there more of the red text? That would more likely indicate the error. A screen of the green text would probably be helpful as well. As far as I can tell (the important part is cut off, sadly), the crash doesn't occur directly in the scripts, but rather in some function that is called via scripts (either an external or some engine-call shenanigans).
I think Bonne(?) reported some problems with inserting NPCs, so it could be the same problem.
Demondays
24.11.2015, 16:39
Tried without systempack but it still crashes. Every line at: 00:44 [fault] is in red. Here is whole log from zspy:
[i] 00:00 ++++++++++++++ Start by ++++++++++++++
[i] 00:00 Info: 3 B: VP: Initialize zBinkPlayer .... <zBinkPlayer.cpp,#45>
[i] 00:00 Info: 3 B: GMAN: Initialize GameManager .... <oGameManager.cpp,#476>
[i] 00:06 Info: 2 B: zOPT: Initialize configurations .... <zOption.cpp,#758>
[i] 00:06 Info: 3 B: zOPT: Found file paths.d .... <zOption.cpp,#785>
[w] 00:06 Warn: 0 B: GOTHIC: Abnormal exit of gothic detected. .... <zzBert.cpp,#152>
[w] 00:06 Warn: 0 N: Force Initializing VDFS after Crash. .... <zzBert.cpp,#163>
[i] 00:06 Info: 1 B: VFILE: Initializing filesystem (VDFS) .... <zDisk_Vdfs.cpp,#538>
[i] 00:06 Info: 2 B: zDSK: InitFileSystem .... <zDisk.cpp,#1629>
[i] 00:06 Info: 2 B: VFILE: VDFS successfully initialized: 0 drives, 0 found. .... <zDisk_Vdfs.cpp,#597>
[i] 00:06 Info: 3 D: RESMAN: Classes registered: zCSoundFX zCTexture .... <zResource.cpp,#366>
[i] 00:06 ---------------
[i] 00:06 Info: 0 D: *** ZenGin v1.00 - developed 1997-2001 Mad Scientists .... <zEngine.cpp,#137>
[i] 00:06 Info: 0 D: *** Mad Scientists: Hildebrandt, Wohlers, Speckels .... <zEngine.cpp,#138>
[i] 00:06 Info: 0 D: *** compiled: Oct 22 2003, release-build .... <zEngine.cpp,#145>
[i] 00:06 Info: 0 D: *** zEngine-Init ... .... <zEngine.cpp,#146>
[i] 00:06 Info: 2 X: RND_D3D: Initializing Direct3D ... .... <zRndD3D_Render.cpp,#147>
[i] 00:07 Info: 4 X: RND_D3D: SetMode .. .... <zRndD3D_Vid.cpp,#507>
[w] 00:07 Warn: 0 X: Failed to open window with x: 1920 y: 1080 .... <zRndD3D_Init.cpp,#1357>
[i] 00:08 Info: 3 D: TEX: texMaxSize: 16384, texScaleSize: 4, texScaleBPP: -1 .... <zTexture.cpp,#584>
[i] 00:08 Info: 4 X: RND_D3D: SetMode .. .... <zRndD3D_Vid.cpp,#507>
[i] 00:08 Info: 4 B: FONT: Loading Font-Data: \_WORK\DATA\TEXTURES\_COMPILED\FONT_DEFAULT.FNT .... <zFonts.cpp,#361>
[i] 00:08 Info: 4 N: MUS: Loading file System\Music.src or .dat .... <zMusic_Dm.cpp,#379>
[i] 00:09 Info: 4 N: SND: Loading file System\SFX.src or .dat .... <zSndMss.cpp,#584>
[i] 00:09 Info: 4 C: SND: opening reverb3 filter processor .... <zSndMss.cpp,#787>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: GROUNDSHADOW.MSH .... <zMesh.cpp,#3445>
[w] 00:09 Warn: 0 D: expected entry not found: rangeMax .... <zArchiverGeneric.cpp,#1354>
[w] 00:09 Warn: 0 D: expected entry not found: fadeScale .... <zArchiverGeneric.cpp,#1354>
[w] 00:09 Warn: 0 D: expected entry not found: rangeMax .... <zArchiverGeneric.cpp,#1354>
[w] 00:09 Warn: 0 D: expected entry not found: fadeScale .... <zArchiverGeneric.cpp,#1354>
[w] 00:09 Warn: 0 D: expected entry not found: fadeScale .... <zArchiverGeneric.cpp,#1354>
[i] 00:09 Info: 3 D: PFX: Loading file System\ParticleFX.src or .dat .... <zParticle.cpp,#257>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: DEMON_DIE.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: ROTATEFX.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: MFX_FEAR4.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: ICELANCE.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: SKULL.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: TELEPORT_AURA.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: THUNDERSTORM_DOME.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: ITPFX_BELIARWEAPON_1H_BLADE.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: ITPFX_BELIARWEAPON_1H_EYES.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: ITPFX_BELIARWEAPON_2H_BLADE.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: ITPFX_BELIARWEAPON_2H_EYES.MSH .... <zMesh.cpp,#3445>
[w] 00:09 Warn: 0 D: z3d(zCMesh::Load): Could not load Mesh: STARGATE_EDGES.3DS .... <zMesh.cpp,#436>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: EVT_ADDON_MAYA_PARTICEL_GATEDUMMY.MSH .... <zMesh.cpp,#3445>
[w] 00:09 Warn: 0 D: z3d(zCMesh::Load): Could not load Mesh: STARGATE_EDGES.3DS .... <zMesh.cpp,#436>
[w] 00:09 Warn: 0 D: z3d(zCMesh::Load): Could not load Mesh: STARGATE_EDGES.3DS .... <zMesh.cpp,#436>
[i] 00:09 Info: 3 D: MSH: Loading Mesh: TREASURE.MSH .... <zMesh.cpp,#3445>
[i] 00:09 Info: 3 D: PFX: Num ParticleFX: 552 .... <zParticle.cpp,#300>
[i] 00:09 Info: 4 D: INPUT: Initializing DirectInput .. .... <zInput_Win32.cpp,#912>
[i] 00:09 Info: 4 D: INPUT: keyboard initialized .... <zInput_Win32.cpp,#923>
[i] 00:09 Info: 4 D: INPUT: mouse initialized. .... <zInput_Win32.cpp,#930>
[i] 00:09 Info: 4 D: INPUT: joystick initialized. .... <zInput_Win32.cpp,#937>
[i] 00:09 Info: 0 D: *** zEngine-Init ... Done ! .... <zEngine.cpp,#159>
[i] 00:09 ---------------
[i] 00:09 Info: 4 B: GMAN: Open InitScreen .... <oGameManager.cpp,#811>
[i] 00:10 Info: 4 N: VFX: Loading file System\VisualFX.src or .dat .... <oVisFx.cpp,#863>
[i] 00:10 Info: 3 B: SG: Initializing savegame-manager ... .... <oSavegame.cpp,#277>
[i] 00:10 Info: 4 N: VFX: Loading file System\VisualFX.src or .dat .... <oVisFx.cpp,#863>
[i] 00:10 Info: 3 B: CSLib: loading library ... .... <zCCsLib.cpp,#33>
[i] 00:10 Info: 3 B: CSLib: Number of items: 21096 (UnArc) .... <zCCsLib.cpp,#39>
[i] 00:11 Info: 3 B: CSLib: Sorting library ... .... <zCCsLib.cpp,#57>
[i] 00:11 Info: 3 B: CSLib: finished loading library .... <zCCsLib.cpp,#64>
[i] 00:11 Info: 3 D: MSH: Loading Mesh: SKYDOME_LAYER1.MSH .... <zMesh.cpp,#3445>
[i] 00:11 Info: 3 D: MSH: Loading Mesh: SKYDOME_COLORLAYER.MSH .... <zMesh.cpp,#3445>
[i] 00:11 Info: 3 D: MSH: Loading Mesh: SKYDOME_LAYER2.MSH .... <zMesh.cpp,#3445>
[i] 00:11 Info: 3 D: MSH: Loading Mesh: SKYDOME_LAYER3.MSH .... <zMesh.cpp,#3445>
[i] 00:11 Info: 4 N: GAME: Loading file Content\Gothic.src or .dat .... <oGame.cpp,#739>
[i] 00:11 Info: 4 N: NPC: Loading file Content\Fight.src or .dat .... <oNpc_Fight.cpp,#184>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16406 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16409 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16450 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16453 Kto tu jest szefem? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16456 Co wiesz o obozie? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16459 Co możesz mi powiedzieć o obozowisku? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16462 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16465 Co wiesz o więźniach? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16470 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16473 Kto tu jest szefem? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16476 Co wiesz o obozie? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16479 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16482 Jak można się szybko wzbogacić? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16491 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16494 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16500 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16503 Co słychać? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16506 Co możesz mi powiedzieć o obozowisku? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16509 Co wiesz o Kruku? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16514 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16517 Co słychać? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16520 Co wiesz o tej dolinie? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16523 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16528 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16531 Powiedz mi coś więcej o tych najemnikach! .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16534 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16537 Co możesz mi powiedzieć o tej okolicy? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16540 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16545 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16548 Powiedz mi coś więcej o tych najemnikach! .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16551 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16554 Co możesz mi powiedzieć o tym miejscu? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16557 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16562 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16565 Powiedz mi coś więcej o tych najemnikach! .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16568 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16571 Co możesz mi powiedzieć o tym miejscu? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16574 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16579 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16582 Co możesz mi powiedzieć o najemnikach? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16585 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16588 Powiedz mi coś na temat okolicy. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16591 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16596 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16599 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16605 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16609 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16615 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16619 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16625 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16629 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16635 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16639 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16645 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16648 Co powinienem zrobić, aby wstąpić do straży? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16651 Słyszałem, że zniknęli jacyś ludzie. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16654 Opowiedz mi o tych paladynach. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16657 Co powinienem wiedzieć o tym mieście? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16660 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16665 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16668 Chcę wstąpić do straży. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16671 Co wiesz o paladynach? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16674 Jakie perspektywy daje to miasto? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16677 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16683 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16688 Potrzebuję pomocy w sprzątaniu sal nowicjuszy. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16693 Chcesz spróbować kiełbasy? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16698 Chciałbym zostać magiem. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16701 Kto jest przywódcą klasztoru? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16704 Co możesz mi powiedzieć o tym klasztorze? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16707 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16712 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16716 Potrzebuję pomocy w sprzątaniu sal nowicjuszy. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16719 Co powiesz na pyszną baranią kiełbasę? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16724 Co muszę zrobić, by zostać magiem? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16727 Kto sprawuje władzę w klasztorze? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16730 Opowiedz mi coś o tym klasztorze. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16733 Czy masz jakieś nowe informacje? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16738 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16741 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16744 Możesz mi coś powiedzieć o Górniczej Dolinie? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16747 Jak leci? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16752 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16755 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16758 Co wiesz o tej dolinie? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16761 Jak leci? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16766 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16769 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16772 Co wiesz o Górniczej Dolinie? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16775 Jak leci? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16780 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16783 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16786 Powiedz mi coś na temat sytuacji w Górniczej Dolinie. .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16789 Co słychać? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16794 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16797 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16803 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16806 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16812 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16815 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16821 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16824 .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16830 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16833 Chciałbym zostać paladynem! .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16836 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16839 Co paladyni robią tutaj, w Khorinis? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16842 Jak leci? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16847 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16850 Jak mogę zostać paladynem? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16853 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16856 Co paladyni robią tutaj, w Khorinis? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16859 Co nowego? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16864 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16867 Jak mogę zostać paladynem? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16870 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16873 Dlaczego wy, paladyni, przybyliście do Khorinis? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16876 Co słychać? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16881 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16884 Chcę się do was przyłączyć! .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16887 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16890 Czy chronicie farmerów? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16893 Co słychać? .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16898 KONIEC .... <oInfo.cpp,#465>
[i] 00:11 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16901 Chcę się do was przyłączyć! .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16904 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16907 Powiedz mi coś o farmie. .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16910 Co nowego? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16915 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16918 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16924 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16927 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16933 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16936 W jaki sposób mogę zostać obywatelem tego miasta? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16939 Kto jest tu w okolicy najważniejszy? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16942 Jakie ciekawe miejsca można odwiedzić w tym mieście? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16945 Co nowego? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16950 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16953 Chciałbym zostać obywatelem tego miasta! .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16956 Kto jest najważniejszy w mieście? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16959 Czy są tutaj jakieś interesujące rzeczy? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16962 Co nowego? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16967 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16970 Co powinienem zrobić, by zostać obywatelem miasta? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16973 Kim są najważniejsze osoby w mieście? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16976 Które z miejsc w Khorinis warto odwiedzić? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16979 Co nowego? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16984 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16987 W jaki sposób mogę zostać obywatelem tego miasta? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16990 Znasz jakichś wpływowych ludzi w Khorinis? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16993 Jak mam się poruszać po mieście, by nie stracić orientacji? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16996 Co nowego? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17001 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17004 Chciałbym zostać obywatelem tego miasta! .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17007 Którzy z obywateli miasta są najważniejsi? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17010 Czy są tutaj jakieś interesujące rzeczy? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17013 Co nowego? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17018 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17023 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17029 Co możesz mi powiedzieć o tym miejscu? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21583 (Daj miksturę leczniczą) .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21809 Co cię sprowadza do tego miejsca? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21814 Kto was tu przysłał? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21817 Jak mogę pokonać twego pana? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21820 Gdzie znajdę twego pana? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21825 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21828 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21831 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21834 Gdzie jest twój skarb? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21839 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21842 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21845 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21848 Któremu bogu służysz? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21853 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21856 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21859 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21862 Który z was, smoków, jest najpotężniejszy? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21867 KONIEC .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21870 .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21873 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:12 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21876 Gdzie znajdę resztę twoich ohydnych pobratymców? .... <oInfo.cpp,#465>
[i] 00:12 Info: 4 C: MENU: Initializing menusystem .... <zMenu.cpp,#106>
[i] 00:12 Info: 4 N: MENU: Loading file System\Menu.src or .dat .... <zMenu.cpp,#114>
[w] 00:12 Warn: 0 B: ERR: BLOCK-END in P:\dev\g2addon\release\ZenGin\_dieter\zEngine.cpp missed: at BLOCK-END in P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp line 572 .... <zError.cpp,#427>
[i] 00:12 Info: 4 B: FONT: Loading Font-Data: \_WORK\DATA\TEXTURES\_COMPILED\FONT_OLD_10_WHITE_HI.FNT .... <zFonts.cpp,#361>
[i] 00:12 Info: 4 B: FONT: Loading Font-Data: \_WORK\DATA\TEXTURES\_COMPILED\FONT_OLD_10_WHITE.FNT .... <zFonts.cpp,#361>
[i] 00:12 Info: 4 B: FONT: Loading Font-Data: \_WORK\DATA\TEXTURES\_COMPILED\FONT_OLD_20_WHITE.FNT .... <zFonts.cpp,#361>
[i] 00:12 Info: 4 B: FONT: Loading Font-Data: \_WORK\DATA\TEXTURES\_COMPILED\FONT_OLD_20_WHITE_HI.FNT .... <zFonts.cpp,#361>
[i] 00:12 Info: 4 B: GMAN: MenuScreen .... <oGameManager.cpp,#836>
[i] 00:12 Info: 3 B: GMAN: Entering Menu-Section .... <oGameManager.cpp,#1350>
[i] 00:12 Info: 3 B: VID: Videomode found .... <oGameManager.cpp,#1112>
[i] 00:12 Info: 3 B: VID: Secure videomode found: 800x600x16 .... <oGameManager.cpp,#1116>
[i] 00:12 Info: 4 B: GMAN: Menu started (outgame) .... <oGameManager.cpp,#1375>
[i] 00:14 Info: 4 B: GMAN: Menu finished .... <oGameManager.cpp,#1381>
[i] 00:14 Info: 4 B: MENU: NEW_GAME .... <oGameManager.cpp,#1430>
[i] 00:14 Info: 4 B: GMAN: Menu-Selection NEW_GAME Newworld\Newworld.ZEN .... <oGameManager.cpp,#1463>
[i] 00:14 Info: 1 B: GMAN: Loading the World ... .... <oGameManager.cpp,#1470>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16406 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16409 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16450 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16453 Kto tu jest szefem? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16456 Co wiesz o obozie? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16459 Co możesz mi powiedzieć o obozowisku? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16462 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16465 Co wiesz o więźniach? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16470 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16473 Kto tu jest szefem? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16476 Co wiesz o obozie? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16479 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16482 Jak można się szybko wzbogacić? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16491 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16494 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16500 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16503 Co słychać? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16506 Co możesz mi powiedzieć o obozowisku? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16509 Co wiesz o Kruku? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16514 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16517 Co słychać? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16520 Co wiesz o tej dolinie? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16523 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16528 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16531 Powiedz mi coś więcej o tych najemnikach! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16534 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16537 Co możesz mi powiedzieć o tej okolicy? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16540 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16545 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16548 Powiedz mi coś więcej o tych najemnikach! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16551 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16554 Co możesz mi powiedzieć o tym miejscu? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16557 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16562 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16565 Powiedz mi coś więcej o tych najemnikach! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16568 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16571 Co możesz mi powiedzieć o tym miejscu? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16574 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16579 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16582 Co możesz mi powiedzieć o najemnikach? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16585 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16588 Powiedz mi coś na temat okolicy. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16591 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16596 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16599 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16605 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16609 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16615 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16619 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16625 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16629 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16635 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16639 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16645 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16648 Co powinienem zrobić, aby wstąpić do straży? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16651 Słyszałem, że zniknęli jacyś ludzie. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16654 Opowiedz mi o tych paladynach. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16657 Co powinienem wiedzieć o tym mieście? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16660 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16665 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16668 Chcę wstąpić do straży. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16671 Co wiesz o paladynach? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16674 Jakie perspektywy daje to miasto? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16677 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16683 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16688 Potrzebuję pomocy w sprzątaniu sal nowicjuszy. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16693 Chcesz spróbować kiełbasy? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16698 Chciałbym zostać magiem. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16701 Kto jest przywódcą klasztoru? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16704 Co możesz mi powiedzieć o tym klasztorze? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16707 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16712 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16716 Potrzebuję pomocy w sprzątaniu sal nowicjuszy. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16719 Co powiesz na pyszną baranią kiełbasę? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16724 Co muszę zrobić, by zostać magiem? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16727 Kto sprawuje władzę w klasztorze? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16730 Opowiedz mi coś o tym klasztorze. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16733 Czy masz jakieś nowe informacje? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16738 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16741 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16744 Możesz mi coś powiedzieć o Górniczej Dolinie? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16747 Jak leci? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16752 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16755 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16758 Co wiesz o tej dolinie? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16761 Jak leci? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16766 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16769 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16772 Co wiesz o Górniczej Dolinie? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16775 Jak leci? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16780 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16783 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16786 Powiedz mi coś na temat sytuacji w Górniczej Dolinie. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16789 Co słychać? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16794 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16797 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16803 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16806 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16812 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16815 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16821 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16824 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16830 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16833 Chciałbym zostać paladynem! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16836 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16839 Co paladyni robią tutaj, w Khorinis? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16842 Jak leci? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16847 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16850 Jak mogę zostać paladynem? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16853 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16856 Co paladyni robią tutaj, w Khorinis? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16859 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16864 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16867 Jak mogę zostać paladynem? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16870 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16873 Dlaczego wy, paladyni, przybyliście do Khorinis? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16876 Co słychać? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16881 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16884 Chcę się do was przyłączyć! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16887 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16890 Czy chronicie farmerów? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16893 Co słychać? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16898 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16901 Chcę się do was przyłączyć! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16904 Kto tu dowodzi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16907 Powiedz mi coś o farmie. .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16910 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16915 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16918 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16924 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16927 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16933 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16936 W jaki sposób mogę zostać obywatelem tego miasta? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16939 Kto jest tu w okolicy najważniejszy? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16942 Jakie ciekawe miejsca można odwiedzić w tym mieście? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16945 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16950 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16953 Chciałbym zostać obywatelem tego miasta! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16956 Kto jest najważniejszy w mieście? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16959 Czy są tutaj jakieś interesujące rzeczy? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16962 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16967 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16970 Co powinienem zrobić, by zostać obywatelem miasta? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16973 Kim są najważniejsze osoby w mieście? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16976 Które z miejsc w Khorinis warto odwiedzić? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16979 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16984 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16987 W jaki sposób mogę zostać obywatelem tego miasta? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16990 Znasz jakichś wpływowych ludzi w Khorinis? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16993 Jak mam się poruszać po mieście, by nie stracić orientacji? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:16996 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17001 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17004 Chciałbym zostać obywatelem tego miasta! .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17007 Którzy z obywateli miasta są najważniejsi? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17010 Czy są tutaj jakieś interesujące rzeczy? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17013 Co nowego? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17018 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17023 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:17029 Co możesz mi powiedzieć o tym miejscu? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21583 (Daj miksturę leczniczą) .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21809 Co cię sprowadza do tego miejsca? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21814 Kto was tu przysłał? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21817 Jak mogę pokonać twego pana? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21820 Gdzie znajdę twego pana? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21825 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21828 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21831 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21834 Gdzie jest twój skarb? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21839 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21842 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21845 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21848 Któremu bogu służysz? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21853 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21856 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21859 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21862 Który z was, smoków, jest najpotężniejszy? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21867 KONIEC .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21870 .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21873 Kim jesteś? .... <oInfo.cpp,#465>
[i] 00:14 Warn: 0 U: INF: Skriptinfo:npc is not/wrong initialised:21876 Gdzie znajdę resztę twoich ohydnych pobratymców? .... <oInfo.cpp,#465>
[i] 00:15 Info: 3 B: ---------- 0% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:15 Info: 3 B: ---------- 11% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:15 Info: 3 U: GAM: Loading startup-data: "Newworld\Newworld.ZEN"... .... <oGame.cpp,#3127>
[i] 00:15 Info: 1 D: WORLD: Loading WorldFile.. NEWWORLD\NEWWORLD.ZEN .... <zWorld.cpp,#2604>
[i] 00:15 Info: 3 B: ---------- 13% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:15 Info: 3 D: BSP: Loading Mesh & BSP.. .... <zBsp.cpp,#6467>
[i] 00:15 Info: 3 D: MESH: Loading Mesh.. .... <zBsp.cpp,#6505>
[i] 00:15 Info: 3 D: BSP : Loading Tree.. .... <zBsp.cpp,#6517>
[i] 00:15 Info: 3 B: ---------- 19% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:16 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTSMALL_NW_POOR_LOCKED.MDS' .... <zModelProto.cpp,#4849>
[i] 00:16 Info: 3 D: MDL: Loading Model-Mesh: CHESTSMALL_NW_POOR_LOCKED.MDM .... <zModelProto.cpp,#5333>
[i] 00:16 Info: 3 B: ---------- 20% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:16 Info: 3 B: ---------- 21% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:16 Info: 3 B: ---------- 22% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:16 Info: 2 N: MSB: Loading Model-Script (binary) 'RMAKER_1.MDS' .... <zModelProto.cpp,#4849>
[i] 00:16 Info: 3 D: MDL: Loading Model-Mesh: RMAKER_1.MDM .... <zModelProto.cpp,#5333>
[i] 00:16 Info: 2 N: MSB: Loading Model-Script (binary) 'DOOR_NW_NORMAL_01.MDS' .... <zModelProto.cpp,#4849>
[i] 00:16 Info: 3 D: MDL: Loading Model-Mesh: DOOR_NW_NORMAL_01.MDM .... <zModelProto.cpp,#5333>
[i] 00:16 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTBIG_OCCHESTLARGELOCKED.MDS' .... <zModelProto.cpp,#4849>
[i] 00:16 Info: 3 D: MDL: Loading Model-Mesh: CHESTBIG_OCCHESTLARGELOCKED.MDM .... <zModelProto.cpp,#5333>
[i] 00:16 Info: 3 B: ---------- 23% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:17 Info: 2 N: MSB: Loading Model-Script (binary) 'SMOKE_WATERPIPE.MDS' .... <zModelProto.cpp,#4849>
[i] 00:17 Info: 3 D: MDL: Loading Model-Mesh: SMOKE_WATERPIPE.MDM .... <zModelProto.cpp,#5333>
[i] 00:17 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTBIG_OCCHESTMEDIUM.MDS' .... <zModelProto.cpp,#4849>
[i] 00:17 Info: 3 D: MDL: Loading Model-Mesh: CHESTBIG_OCCHESTMEDIUM.MDM .... <zModelProto.cpp,#5333>
[i] 00:17 Info: 2 N: MSB: Loading Model-Script (binary) 'DOOR_NW_RICH_01.MDS' .... <zModelProto.cpp,#4849>
[i] 00:17 Info: 3 D: MDL: Loading Model-Mesh: DOOR_NW_RICH_01.MDM .... <zModelProto.cpp,#5333>
[i] 00:17 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTSMALL_NW_POOR_OPEN.MDS' .... <zModelProto.cpp,#4849>
[i] 00:17 Info: 3 D: MDL: Loading Model-Mesh: CHESTSMALL_NW_POOR_OPEN.MDM .... <zModelProto.cpp,#5333>
[i] 00:17 Info: 2 N: MSB: Loading Model-Script (binary) 'DOOR_NW_DRAGONISLE_02.MDS' .... <zModelProto.cpp,#4849>
[i] 00:17 Info: 3 D: MDL: Loading Model-Mesh: DOOR_NW_DRAGONISLE_02.MDM .... <zModelProto.cpp,#5333>
[i] 00:17 Info: 3 B: ---------- 24% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:17 Info: 2 N: MSB: Loading Model-Script (binary) 'DOOR_NW_POOR_01.MDS' .... <zModelProto.cpp,#4849>
[i] 00:17 Info: 3 D: MDL: Loading Model-Mesh: DOOR_NW_POOR_01.MDM .... <zModelProto.cpp,#5333>
[i] 00:17 Info: 3 B: ---------- 25% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:17 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTBIG_NW_NORMAL_LOCKED.MDS' .... <zModelProto.cpp,#4849>
[i] 00:17 Info: 3 D: MDL: Loading Model-Mesh: CHESTBIG_NW_NORMAL_LOCKED.MDM .... <zModelProto.cpp,#5333>
[i] 00:17 Info: 3 B: ---------- 26% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:18 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTBIG_NW_RICH_LOCKED.MDS' .... <zModelProto.cpp,#4849>
[i] 00:18 Info: 3 D: MDL: Loading Model-Mesh: CHESTBIG_NW_RICH_LOCKED.MDM .... <zModelProto.cpp,#5333>
[i] 00:18 Info: 3 B: ---------- 27% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:18 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTBIG_OCCHESTMEDIUMLOCKED.MDS' .... <zModelProto.cpp,#4849>
[i] 00:18 Info: 3 D: MDL: Loading Model-Mesh: CHESTBIG_OCCHESTMEDIUMLOCKED.MDM .... <zModelProto.cpp,#5333>
[i] 00:18 Info: 2 N: MSB: Loading Model-Script (binary) 'BSCOOL_OC.MDS' .... <zModelProto.cpp,#4849>
[i] 00:18 Info: 3 D: MDL: Loading Model-Mesh: BSCOOL_OC.MDM .... <zModelProto.cpp,#5333>
[i] 00:18 Info: 2 N: MSB: Loading Model-Script (binary) 'BSSHARP_OC.MDS' .... <zModelProto.cpp,#4849>
[i] 00:18 Info: 3 D: MDL: Loading Model-Mesh: BSSHARP_OC.MDM .... <zModelProto.cpp,#5333>
[i] 00:18 Info: 2 N: MSB: Loading Model-Script (binary) 'BSANVIL_OC.MDS' .... <zModelProto.cpp,#4849>
[i] 00:18 Info: 3 D: MDL: Loading Model-Mesh: BSANVIL_OC.MDM .... <zModelProto.cpp,#5333>
[i] 00:18 Info: 2 N: MSB: Loading Model-Script (binary) 'BSFIRE_OC.MDS' .... <zModelProto.cpp,#4849>
[i] 00:18 Info: 3 D: MDL: Loading Model-Mesh: BSFIRE_OC.MDM .... <zModelProto.cpp,#5333>
[i] 00:18 Info: 3 B: ---------- 28% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:18 Info: 3 D: MORPH: Loading MorphMesh: ITRW_SLD_BOW.mmb .... <zMorphMesh.cpp,#376>
[i] 00:18 Info: 3 B: ---------- 29% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:19 Info: 3 D: MORPH: Loading MorphMesh: NW_MORPH_SKATE_01.mmb .... <zMorphMesh.cpp,#376>
[i] 00:19 Info: 3 D: MORPH: Loading MorphMesh: NW_MORPH_FISH_01.mmb .... <zMorphMesh.cpp,#376>
[i] 00:19 Info: 2 N: MSB: Loading Model-Script (binary) 'PAN_OC.MDS' .... <zModelProto.cpp,#4849>
[i] 00:19 Info: 3 D: MDL: Loading Model-Mesh: PAN_OC.MDM .... <zModelProto.cpp,#5333>
[i] 00:19 Info: 3 B: ---------- 30% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:19 Info: 2 N: MSB: Loading Model-Script (binary) 'LEVER_1_OC.MDS' .... <zModelProto.cpp,#4849>
[i] 00:19 Info: 3 D: MDL: Loading Model-Mesh: LEVER_1_OC.MDM .... <zModelProto.cpp,#5333>
[i] 00:19 Info: 2 N: MSB: Loading Model-Script (binary) 'TOUCHPLATE_STONE.MDS' .... <zModelProto.cpp,#4849>
[i] 00:19 Info: 3 D: MDL: Loading Model-Mesh: TOUCHPLATE_STONE.MDM .... <zModelProto.cpp,#5333>
[i] 00:19 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTBIG_NW_NORMAL_OPEN.MDS' .... <zModelProto.cpp,#4849>
[i] 00:19 Info: 3 D: MDL: Loading Model-Mesh: CHESTBIG_NW_NORMAL_OPEN.MDM .... <zModelProto.cpp,#5333>
[i] 00:19 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTBIG_NW_RICH_OPEN.MDS' .... <zModelProto.cpp,#4849>
[i] 00:19 Info: 3 D: MDL: Loading Model-Mesh: CHESTBIG_NW_RICH_OPEN.MDM .... <zModelProto.cpp,#5333>
[i] 00:19 Info: 3 B: ---------- 31% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:19 Info: 3 B: ---------- 32% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:19 Info: 3 D: MORPH: Loading MorphMesh: ITRW_CROSSBOW_L_02.mmb .... <zMorphMesh.cpp,#376>
[i] 00:19 Info: 3 D: MORPH: Loading MorphMesh: ITRW_CROSSBOW_L_01.mmb .... <zMorphMesh.cpp,#376>
[i] 00:19 Info: 3 D: MORPH: Loading MorphMesh: ITRW_BOW_L_01.mmb .... <zMorphMesh.cpp,#376>
[i] 00:20 Info: 3 B: ---------- 33% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:20 Info: 3 B: ---------- 34% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:20 Info: 3 D: MORPH: Loading MorphMesh: ITRW_BOW_L_02.mmb .... <zMorphMesh.cpp,#376>
[i] 00:20 Info: 2 N: MSB: Loading Model-Script (binary) 'VWHEEL_1_OC.MDS' .... <zModelProto.cpp,#4849>
[i] 00:20 Info: 3 D: MDL: Loading Model-Mesh: VWHEEL_1_OC.MDM .... <zModelProto.cpp,#5333>
[i] 00:20 Info: 2 N: MSB: Loading Model-Script (binary) 'BARBQ_NW_MISC_SHEEP_01.MDS' .... <zModelProto.cpp,#4849>
[i] 00:20 Info: 3 D: MDL: Loading Model-Mesh: BARBQ_NW_MISC_SHEEP_01.MDM .... <zModelProto.cpp,#5333>
[i] 00:20 Info: 3 B: ---------- 35% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:20 Info: 3 B: ---------- 36% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:21 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTSMALL_OCCHESTSMALLLOCKED.MDS' .... <zModelProto.cpp,#4849>
[i] 00:21 Info: 3 D: MDL: Loading Model-Mesh: CHESTSMALL_OCCHESTSMALLLOCKED.MDM .... <zModelProto.cpp,#5333>
[i] 00:21 Info: 3 D: MORPH: Loading MorphMesh: ITRW_BOW_H_04.mmb .... <zMorphMesh.cpp,#376>
[i] 00:21 Info: 2 N: MSB: Loading Model-Script (binary) 'CHESTSMALL_OCCHESTSMALL.MDS' .... <zModelProto.cpp,#4849>
[i] 00:21 Info: 3 D: MDL: Loading Model-Mesh: CHESTSMALL_OCCHESTSMALL.MDM .... <zModelProto.cpp,#5333>
[i] 00:21 Info: 3 B: ---------- 37% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:21 Info: 3 B: ---------- 38% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:21 Info: 3 D: MORPH: Loading MorphMesh: NW_MORPH_FISH_02.mmb .... <zMorphMesh.cpp,#376>
[i] 00:21 Info: 3 B: ---------- 39% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:21 Info: 3 B: ---------- 40% ---------- .... <zViewProgressbar.cpp,#142>
[w] 00:22 Warn: 0 B: MOBCONTAINER: Item-Instance not found: ItFo_Mutton .... <oMobInter.cpp,#2983>
[i] 00:22 Info: 3 B: ---------- 41% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:22 Info: 3 D: MORPH: Loading MorphMesh: ITRW_CROSSBOW_M_01.mmb .... <zMorphMesh.cpp,#376>
[i] 00:22 Info: 3 B: ---------- 42% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:22 Info: 3 B: ---------- 43% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:23 Info: 3 B: ---------- 44% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:23 Info: 2 N: MSB: Loading Model-Script (binary) 'BARBQ_SCAV.MDS' .... <zModelProto.cpp,#4849>
[i] 00:23 Info: 3 D: MDL: Loading Model-Mesh: BARBQ_SCAV.MDM .... <zModelProto.cpp,#5333>
[i] 00:23 Info: 3 B: ---------- 45% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:23 Info: 3 B: ---------- 46% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:24 Info: 3 B: ---------- 47% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:24 Info: 3 B: ---------- 48% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:24 Info: 3 B: ---------- 49% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:24 Info: 3 B: ---------- 50% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:25 Info: 3 B: ---------- 51% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:25 Info: 3 B: ---------- 52% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:25 Info: 3 B: ---------- 53% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:25 Info: 3 B: ---------- 54% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:26 Info: 3 B: ---------- 55% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:26 Info: 3 B: ---------- 56% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:26 Info: 3 B: ---------- 57% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:27 Info: 3 B: ---------- 58% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:27 Info: 3 B: ---------- 70% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:27 Info: 3 U: GAM: Loading startup-data "Newworld\Newworld.ZEN" finished. .... <oGame.cpp,#3131>
[i] 00:27 Info: 3 B: ---------- 71% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:27 Info: 3 U: GAM: Cleaning world... .... <oGame.cpp,#3138>
[i] 00:27 Info: 3 U: GAM: .. finished .... <oGame.cpp,#3140>
[i] 00:27 Info: 3 B: ---------- 73% ---------- .... <zViewProgressbar.cpp,#142>
[i] 00:27 Info: 3 U: GAM: Calling Startup-Script ... .... <oGame.cpp,#862>
[i] 00:27 Info: 3 D: MORPH: Loading MorphMesh: ITRW_BOW_M_03.mmb .... <zMorphMesh.cpp,#376>
[i] 00:27 Info: 3 D: MORPH: Loading MorphMesh: ITRW_MIL_CROSSBOW.mmb .... <zMorphMesh.cpp,#376>
[i] 00:27 Info: 3 D: MORPH: Loading MorphMesh: ITRW_CROSSBOW_M_02.mmb .... <zMorphMesh.cpp,#376>
[i] 00:27 Info: 3 D: MORPH: Loading MorphMesh: ITRW_BOW_H_03.mmb .... <zMorphMesh.cpp,#376>
[i] 00:28 Info: 3 B: VP: Start opening video "\_WORK\DATA\VIDEO\INTRO.BIK" .... <oBinkPlayer.cpp,#146>
[i] 00:28 Info: 4 B: VP: Open Videofile: "INTRO.BIK" .... <zBinkPlayer.cpp,#78>
[i] 00:28 Info: 4 B: VP: Filesize: 3.7e+004 kb .... <zBinkPlayer.cpp,#109>
[i] 00:28 Info: 4 B: VP: Resolution: 640x360 .... <zBinkPlayer.cpp,#110>
[i] 00:28 Info: 4 B: VP: Framecount: 2845 .... <zBinkPlayer.cpp,#111>
[i] 00:28 Info: 4 B: VP: Framerate: 25 fps .... <zBinkPlayer.cpp,#112>
[i] 00:28 Info: 4 B: VP: Trackcount (Sound): 1 .... <zBinkPlayer.cpp,#113>
[i] 00:28 Info: 4 B: VP: Open Videofile finished .... <zBinkPlayer.cpp,#119>
[i] 00:28 ---------------
[i] 00:28 Info: 3 B: VP: Initialize Videoplay: "D:\TESTOWY GOTHIC\JOWOOD - CZYSTY GOTHIC 2\_WORK\DATA\VIDEO\INTRO.BIK" .... <zBinkPlayer.cpp,#143>
[i] 00:28 Info: 4 B: VP: Pixelformat: 3 .... <zBinkPlayer.cpp,#174>
[i] 00:28 Info: 4 B: VP: Scale-Factor: 1 .... <zBinkPlayer.cpp,#225>
[i] 00:28 Info: 4 B: VP: Video-Offset: 640/360 .... <zBinkPlayer.cpp,#226>
[i] 00:28 Info: 3 B: VP: Initialize Videoplay finished .... <zBinkPlayer.cpp,#256>
[i] 00:28 Info: 3 B: VP: Deinitialize Videoplay: "D:\TESTOWY GOTHIC\JOWOOD - CZYSTY GOTHIC 2\_WORK\DATA\VIDEO\INTRO.BIK" .... <zBinkPlayer.cpp,#262>
[i] 00:28 Info: 4 B: VP: Frames played: 18 .... <zBinkPlayer.cpp,#266>
[i] 00:28 Info: 4 B: VP: Skipped blits: 0 .... <zBinkPlayer.cpp,#267>
[i] 00:28 Info: 4 B: VP: Memory used: 1e+003 kb .... <zBinkPlayer.cpp,#271>
[i] 00:28 Info: 4 B: VP: Time open: 0sec. .... <zBinkPlayer.cpp,#272>
[i] 00:28 Info: 4 B: VP: Time blit: 0sec. .... <zBinkPlayer.cpp,#273>
[i] 00:28 Info: 3 B: VP: Deinitialize Videoplay finished .... <zBinkPlayer.cpp,#280>
[i] 00:28 ---------------
[i] 00:28 Info: 4 B: VP: Closing Videofile: "D:\TESTOWY GOTHIC\JOWOOD - CZYSTY GOTHIC 2\_WORK\DATA\VIDEO\INTRO.BIK" .... <zBinkPlayer.cpp,#128>
[i] 00:28 Info: 4 B: VP: Closing Videofile finished .... <zBinkPlayer.cpp,#134>
[i] 00:28 Info: 3 B: VP: Start opening video "\_WORK\DATA\VIDEO\Addon_Title.BIK" .... <oBinkPlayer.cpp,#146>
[i] 00:28 Info: 4 B: VP: Open Videofile: "ADDON_TITLE.BIK" .... <zBinkPlayer.cpp,#78>
[i] 00:28 Info: 4 B: VP: Filesize: 2e+003 kb .... <zBinkPlayer.cpp,#109>
[i] 00:28 Info: 4 B: VP: Resolution: 640x360 .... <zBinkPlayer.cpp,#110>
[i] 00:28 Info: 4 B: VP: Framecount: 234 .... <zBinkPlayer.cpp,#111>
[i] 00:28 Info: 4 B: VP: Framerate: 25 fps .... <zBinkPlayer.cpp,#112>
[i] 00:28 Info: 4 B: VP: Trackcount (Sound): 1 .... <zBinkPlayer.cpp,#113>
[i] 00:28 Info: 4 B: VP: Open Videofile finished .... <zBinkPlayer.cpp,#119>
[i] 00:28 ---------------
[i] 00:28 Info: 3 B: VP: Initialize Videoplay: "D:\TESTOWY GOTHIC\JOWOOD - CZYSTY GOTHIC 2\_WORK\DATA\VIDEO\ADDON_TITLE.BIK" .... <zBinkPlayer.cpp,#143>
[i] 00:28 Info: 4 B: VP: Pixelformat: 3 .... <zBinkPlayer.cpp,#174>
[i] 00:28 Info: 4 B: VP: Scale-Factor: 1 .... <zBinkPlayer.cpp,#225>
[i] 00:28 Info: 4 B: VP: Video-Offset: 640/360 .... <zBinkPlayer.cpp,#226>
[i] 00:28 Info: 3 B: VP: Initialize Videoplay finished .... <zBinkPlayer.cpp,#256>
[i] 00:29 Info: 3 B: VP: Deinitialize Videoplay: "D:\TESTOWY GOTHIC\JOWOOD - CZYSTY GOTHIC 2\_WORK\DATA\VIDEO\ADDON_TITLE.BIK" .... <zBinkPlayer.cpp,#262>
[i] 00:29 Info: 4 B: VP: Frames played: 29 .... <zBinkPlayer.cpp,#266>
[i] 00:29 Info: 4 B: VP: Skipped blits: 0 .... <zBinkPlayer.cpp,#267>
[i] 00:29 Info: 4 B: VP: Memory used: 1e+003 kb .... <zBinkPlayer.cpp,#271>
[i] 00:29 Info: 4 B: VP: Time open: 0sec. .... <zBinkPlayer.cpp,#272>
[i] 00:29 Info: 4 B: VP: Time blit: 0sec. .... <zBinkPlayer.cpp,#273>
[i] 00:29 Info: 3 B: VP: Deinitialize Videoplay finished .... <zBinkPlayer.cpp,#280>
[i] 00:29 ---------------
[i] 00:29 Info: 4 B: VP: Closing Videofile: "D:\TESTOWY GOTHIC\JOWOOD - CZYSTY GOTHIC 2\_WORK\DATA\VIDEO\ADDON_TITLE.BIK" .... <zBinkPlayer.cpp,#128>
[i] 00:29 Info: 4 B: VP: Closing Videofile finished .... <zBinkPlayer.cpp,#134>
[i] 00:29 Info: 3 U: GAM: Startup-Script finished. .... <oGame.cpp,#866>
[i] 00:29 Info: 0 Q: Ikarus log functions now print in colour with prefix 'Q:'.
[i] 00:30 Info: 0 Q: LeGo 2.3.2 wird initialisiert.
[i] 00:30 Info: 0 Q: Locals: Install at CREATE
[i] 00:30 Info: 0 Q: Offset is 11
[w] 00:30 Warn: 0 C: lost focus in fullscreen, setting to windowed mode .... <zWin32.cpp,#1623>
[f] 00:44 Fault: 0 Q: [start of stacktrace]
[f] 00:44 Fault: 0 Q: ASMINT_CALLMYEXTERNAL() + 5 bytes
[f] 00:44 Fault: 0 Q: ASM_RUNONCE() + 77 bytes
[f] 00:44 Fault: 0 Q: CALLINT_MAKECALL(6421056, 0) + 263 bytes
[f] 00:44 Fault: 0 Q: CALL__STDCALL(6421056) + 21 bytes
[f] 00:44 Fault: 0 Q: CALL__THISCALL(0, 6421056) + 73 bytes
[f] 00:44 Fault: 0 Q: _RENDER_INIT() + 62 bytes
[f] 00:44 Fault: 0 Q: LEGO_INITGAMESTART(4194303) + 264 bytes
[f] 00:44 Fault: 0 Q: LEGO_INIT(4194303) + 99 bytes
[f] 00:44 Fault: 0 Q: INIT_GLOBAL() + 20 bytes
[f] 00:44 Fault: 0 Q: [end of stacktrace]
[f] 00:44 Fault: 0 Q: Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.
[w] 00:59 Warn: 0 X: [RND3D-Destructor]: Can't uninitialize D3DX Utility Library ! Error: D3DXERR_D3DXNOTSTARTEDYET .... <zRndD3D.h,#127>
[w] 01:06 Warn: 0 == ===================================== UNHANDLED EXCEPTION OCCURED ====================================================== .... <zError.cpp,#474>
[w] 01:06 Warn: 0 == ============================================ CRASH INFOS: ============================================================== .... <zError.cpp,#474>
[w] 01:06 Warn: 0 Go thic II - 2.6 (fix), Parser Version: 50 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 Us er: M, CPUType: 586, Mem: 1024 MB total, 1024 MB free .... <zError.cpp,#474>
[w] 01:06 Warn: 0 St artup Options: .... <zWin32.cpp,#2976>
[w] 01:06 Warn: 0 -g ame:lhiver_rebalace_ikarus.ini -zlog:4,s .... <zWin32.cpp,#2977>
[w] 01:06 Warn: 0 == ============================================= CALLSTACK : ============================================================== .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00402AF7 (0x03D176EC 0x00000000 0x7EC99FB8 0x00001406) Gothic2.exe, zSTRING::zSTRING()+7 byte(s), ..\\ZenGin\_bert\zstring.h, line 91+7 byte(s) .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:0061FA6A (0x00AB4108 0x00000000 0x00AB40C0 0x00001662) Gothic2.exe, zCWorld::zCWorld()+42 byte(s), P:\dev\g2addon\release\ZenGin\_dieter\zWorld.cpp, line 317+42 byte(s) .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792568 (0x03D176EC 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+3080 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1433 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x00001401 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001615 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001C0A 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001D12 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001D3E 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00018A04 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001A9AE 0x7EAC9C9C 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x00001615 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001C0A 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001D12 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001D3E 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00018A04 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001A9AE 0x7EAC9C9C 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x00001C0A 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001D12 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001D3E 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00018A04 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001A9AE 0x7EAC9C9C 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x00001D12 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00001D3E 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00018A04 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001A9AE 0x7EAC9C9C 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x00001D3E 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x00018A04 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001A9AE 0x7EAC9C9C 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x00018A04 0x00AB4108 0x00000000 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001A9AE 0x7EAC9C9C 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x0001A9AE 0x7EAC9C9C 0x00AB4118 0x00AB40C0) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792504 (0x0001AAB7 0x00009277 0x0082E6F0 0x160C9568) Gothic2.exe, zCParser::DoStack()+2980 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 14150023:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00792CBF (0x00AB40C0 0x00009277 0x0135FAA4 0x0135FAA8) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 15510023:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:006C20BF (0x0135FBDC 0x160C9568 0x0135FBD8 0x0135FB08) Gothic2.exe, oCGame::CallScriptInit()+351 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 886 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:006C9FE0 (0x0135FAA4 0x0135FB74 0xFFFFFFFE 0x0135FB74) Gothic2.exe, oCGame::LoadWorldStartup()+976 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 31500023:00502DFD (0x0135FED0 0x00000000 0x00153A20 0x00000007) Gothic2.exe, WinMain()+141 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1054+17 byte(s) .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:006C92DE (0xFFFFFFFE 0x0135FB08 0x0089078B 0x0135FCA8) Gothic2.exe, oCGame::LoadWorld()+558 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2902 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:006C6696 (0xFFFFFFFE 0x0135FBD8 0x0082E6F0 0x00000000) Gothic2.exe, oCGame::LoadGame()+246 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2147 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00429BF9 (0x00000000 0x00400000 0x00153A20 0x0135FECC) Gothic2.exe, CGameManager::Menu()+2345 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 1474 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00425C35 (0x0082F0EC 0x00000000 0x000710DC 0x160C9568) Gothic2.exe, CGameManager::Run()+1029 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 713 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:0078188B (0x0000002C 0x00030BCA 0x00000001 0x00000000) Gothic2.exe, MainProg()+75 byte(s), P:\dev\g2addon\release\Gothic\_ulf\Phoenix.cpp, line 111 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00503270 (0x00400000 0x00000000 0x00153A20 0x00000007) Gothic2.exe, HandledWinMain()+928 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1169 .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:00502DFD (0x0135FED0 0x00000000 0x00153A20 0x00000007) Gothic2.exe, WinMain()+141 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1054+17 byte(s) .... <zError.cpp,#474>
[w] 01:06 Warn: 0 00 23:007D43F8 (0x00000004 0x0000FFFF 0x000000B8 0x00000000) Gothic2.exe, WinMainCRTStartup()+224 byte(s) .... <zError.cpp,#474>
[w] 01:06 Warn: 0 == ===================================== UNHANDLED EXCEPTION OCCURED ====================================================== .... <zError.cpp,#474>
[w] 01:15 Warn: 0 B: GMAN: gameSession is existing. Call CGameManager::Done() before! .... <oGameManager.cpp,#375>
[i] 01:15 Info: 3 B: VP: zBinkPlayer deinitialized .... <zBinkPlayer.cpp,#62>
[i] 01:15 Info: 2 N: MSB: Loading Model-Script (binary) 'HUMANS.MDS' .... <zModelProto.cpp,#4849>
I have no idea why that crashes, although you can fix it for now if you use
LeGo_Init(Lego_All &~ LeGo_Render);
I'll see if I can reproduce the crash.
Demondays
24.11.2015, 17:13
I have no idea why that crashes, although you can fix it for now if you use
LeGo_Init(Lego_All &~ LeGo_Render);
I'll see if I can reproduce the crash.
Yes, it in fact works now §ice . Are there some important features in that render that are disabled now and I should be aware of?
One more thing about that crash: I didnt mention it before, but Im using GothicSourcer for compiling scripts. To be specific 3.15 version which supports Ikarus&Lego:
http://worldofplayers.ru/threads/38318/
But I hope its not the case, because GS is very userfriendly and really makes whole work with the scripts much easier, especially for noobs like me :D
No, it's just a new (so far undocumented) script, that will at some point allow the rendering of oCItems on the screen. It hasn't been tested thoroughly, so it's not "official" yet.
I guess LeGo_All shouldn't include experimental packets, but so far the crash seems to be exclusive to you.
Ikarus relies on somewhat weird or faulty use of the compiler, so it could well be that GS is fucking something up. Could you try to compile using just Gothic and see if the problem is still there?
Edit: And while youre at it, does the crash occur even if you use just the original scripts (with or without the story content) + Ikarus + LeGo (obviously have to call LeGo_Init(LeGo_All); )?
Demondays
24.11.2015, 18:46
I will try to do that and write here results. Just one more thing, I would want to ask: gamesaves from the scripts with old lego (2.2.1) will not work with updated scripts to 2.3.2? Im asking because Im getting crash upon loading them and I just wanna be sure that its normal.
They should be compatible, but it's nothing we ever checked or would like to guarantuee. Therefore I don't think there's any point in looking into the crash.
Demondays
24.11.2015, 21:13
Ikarus relies on somewhat weird or faulty use of the compiler, so it could well be that GS is fucking something up. Could you try to compile using just Gothic and see if the problem is still there?
Edit: And while youre at it, does the crash occur even if you use just the original scripts (with or without the story content) + Ikarus + LeGo (obviously have to call LeGo_Init(LeGo_All); )?
Checked both scripts (vanilla g2notr and Mine) compiled with the Spacer and they worked fine. So seems its indeed GothicSourcer causing problems:( Thats too bad I really like it, its really handy in use, especially in finding errors in code and general scripts edition. I guess I will still use it, if that disabled render is not so important. Anyway, sorry for the problems and thanks for Your help! :gratz
Can you upload a Gothic.dat that is compiled with GS (including LeGo&Ikarus)? I'll have a quick glance, maybe I can see what causes the problem (so the GS developers can fix it).
Demondays
25.11.2015, 00:39
Can you upload a Gothic.dat that is compiled with GS (including LeGo&Ikarus)? I'll have a quick glance, maybe I can see what causes the problem (so the GS developers can fix it).
Sure. You need gothic.dat which is causing that crash? (with lego_all initialized)? Or the one with disabled render?
The former, the one that is producing the crash.
TheEternal
03.12.2015, 20:51
Habe ein Problem...
Beim Broadcasten kommt ein Stackoverflow bei DoForAll.
http://upload.worldofplayers.de/files10/Stackoverflow.PNG
Die Welt hat weit über 1000 npcs wobei schon 700 humanoide.
Wurde die DoForAll überhaupt schon mit sovielen Npcs getestet?
Ansonsten gibt es irgendwie ne Möglichkeit das Maximum zu erhöhen?
Edit: Die Zählung oben im Bild ist wohl falsch. Ich habe jetzt jeden Call der gebroadcasteten Funktion geprintet und das nach 627 kommts zum Overflow.
Das hat nichts mit LeGo zu tun :p Zeig mal die Funktion, die da gecallt wird. Vermutlich behandelst du irgendeinen Rückgabewert nicht, der dann Stück für Stück den Stack vollmüllt.
TheEternal
03.12.2015, 22:17
Ähmmmm, ja du hattest recht. ich hab zuviele Variablen in der Broadcast funktion neudefiniert.
Danke! §wink
Hallo ich habe ein Problem mit LeGo, zumindest bei meinem Kollegen scheint etwas nicht zu funktionieren.
und zwar macht das AI_Function bei ihm Probleme. Das komische jedoch ist, bei mir klappt alles fehlerfrei und zwar bei jedem testlauf.
Wir benutzten die selben ZENs und selben Skripte...
Hier mal ein Auszug vom Code.
INSTANCE DIA_GRD_203_Bullit_HQ5_Ready (C_INFO)
{
npc = GRD_203_Bullit;
nr = 1;
condition = DIA_GRD_203_Bullit_HQ5_Ready_Condition;
information = DIA_GRD_203_Bullit_HQ5_Ready_Info;
description = "Bereit?";
};
FUNC INT DIA_GRD_203_Bullit_HQ5_Ready_Condition()
{
if ((Npc_KnowsInfo (hero, DIA_GRD_203_Bullit_Hello))
&& (HQ5_BullitGoNorddoor == TRUE)
&& (Npc_GetDistToWP (hero, "NT_BULLIT") <= 2500))
{
return TRUE;
};
};
FUNC VOID DIA_GRD_203_Bullit_HQ5_Ready_Info()
{
AI_Output (other, self, "DIA_GRD_203_Bullit_HQ5_Ready_15_01"); //Bereit?
AI_Output (self, other, "DIA_GRD_203_Bullit_HQ5_Ready_14_02"); //Na klar. Hier übrigens ein Bier. Das ist unser Ritual, bevor wir größere Gruppen aufknöpfen und möglicherweise dabei ins Gras beißen.
Info_ClearChoices (DIA_GRD_203_Bullit_HQ5_Ready);
Info_AddChoice (DIA_GRD_203_Bullit_HQ5_Ready, "Ich freu mich drauf.", DIA_GRD_203_Bullit_HQ5_Ready_B);
Info_AddChoice (DIA_GRD_203_Bullit_HQ5_Ready, "Ich bin mir nicht sicher wegen der Sache.", DIA_GRD_203_Bullit_HQ5_Ready_A);
};
func void HQ5_GoToTempel()
{
AI_Teleport (hero, "TEMPEL_WARTE_05");
...
};
func void _BullitAfterBeer()
{
FF_ApplyOnceExt(BullitAfterBeer, 1500, 1);
};
func void BullitAfterBeer()
{
AI_StopProcessInfos(self);
AI_StopProcessInfos(hero);
var C_NPC bul; bul = Hlp_GetNpc(GRD_203_Bullit);
var C_NPC gar1; gar1 = Hlp_GetNpc(GRD_7808_Gardist);
var C_NPC gar2; gar2 = Hlp_GetNpc(GRD_7809_Gardist);
var C_NPC gar3; gar3 = Hlp_GetNpc(GRD_7810_Gardist);
var C_NPC gar4; gar4 = Hlp_GetNpc(GRD_7811_Gardist);
var C_NPC gar5; gar5 = Hlp_GetNpc(GRD_7812_Gardist);
var C_NPC gar6; gar6 = Hlp_GetNpc(GRD_7813_Gardist);
AI_StandUp (hero);
CreateInvItems(hero, ItFoBeer, 1);
AI_UseItem (hero, ItFoBeer);
AI_StandUp (gar1);
CreateInvItems(gar1, ItFoBeer, 1);
AI_UseItem (gar1, ItFoBeer);
AI_StandUp (gar2);
CreateInvItems(gar2, ItFoBeer, 1);
AI_UseItem (gar2, ItFoBeer);
AI_StandUp (gar3);
CreateInvItems(gar3, ItFoBeer, 1);
AI_UseItem (gar3, ItFoBeer);
AI_StandUp (gar4);
CreateInvItems(gar4, ItFoBeer, 1);
AI_UseItem (gar4, ItFoBeer);
AI_StandUp (gar5);
CreateInvItems(gar5, ItFoBeer, 1);
AI_UseItem (gar5, ItFoBeer);
AI_StandUp (gar6);
CreateInvItems(gar6, ItFoBeer, 1);
AI_UseItem (gar6, ItFoBeer);
AI_StandUp (bul);
CreateInvItems(bul, ItFoBeer, 1);
AI_UseItem (bul, ItFoBeer);
AI_Wait(bul, 1);
AI_Output (bul, hero, "DIA_GRD_203_Bullit_HQ5_Ready_14_03"); //Aus dir kann was werden, Kleiner. War hoffentlich nicht dein letztes Bier. Und jetzt los!
// bis hier wird alles ausgeführt
AI_Function (bul, HQ5_GoToTempel);
};
func void DIA_GRD_203_Bullit_HQ5_Ready_A()
{
...
AI_StopProcessInfos(self);
AI_StartState(self, _BullitAfterBeer, 1, "");
};
Frank-95
11.12.2015, 15:18
Hi!!
Since LeGo provides us te feature to use FF with data, I've decided to write some functions that "complete" this features, even because I needed it :P
They are pretty basics actually, but since noone had thought about it, I did them myself :P
I hope that they may be helpful to someone:
/***********************************\
FRAMEFUNCTIONS EXTERNAL
\***********************************/
//========================================
// Remove FF with the specified data
//========================================
var int _FF_Data;
func int _FF_RemoveLData(var int hndl)
{
if(MEM_ReadInt(getPtr(hndl)) != _FF_Symbol)
{
return continue;
};
var FFItem itm; itm = get(hndl);
if(itm.data != _FF_Data)
{
return continue;
}
else
{
delete(hndl);
return break;
};
};
func void FF_RemoveData(var func function, var int data)
{
_FF_Data = data;
_FF_Symbol = MEM_GetFuncPtr(function);
foreachHndl(FFItem@, _FF_RemoveLData);
};
//=======================================================
// Check whether FF with the specified data is active
//=======================================================
func int _FF_ActiveData(var int hndl)
{
if(MEM_ReadInt(getPtr(hndl)) != _FF_Symbol)
{
return continue;
};
var FFItem itm; itm = get(hndl);
if(itm.data != _FF_Data)
{
return continue;
}
else
{
_FF_Symbol = 0;
return break;
};
};
func int FF_ActiveData(var func function, var int data)
{
_FF_Data = data;
_FF_Symbol = MEM_GetFuncPtr(function);
foreachHndl(FFItem@, _FF_ActiveData);
return !_FF_Symbol;
};
//========================================
// More FFdata functions
//========================================
func void FF_ApplyData(var func function, var int data)
{
FF_ApplyExtData(function, 0, -1, data);
};
func void FF_ApplyOnceExtData(var func function, var int delay, var int cycles, var int data)
{
if(FF_ActiveData(function,data))
{
return;
};
FF_ApplyExtData(function, delay, cycles, data);
};
func void FF_ApplyOnceData(var func function, var int data)
{
FF_ApplyOnceExtData(function, 0, -1, data);
};
Byee
Thank you for the code! I will make sure to add it to a release whenever I get around to it (which may take some time, sadly).
Are you interested in developing more code for LeGo? I could give you write access to the repository - just in case you decide to make some more contributions :)
@Umfi: Die genannte Funktion wird bei ihm gar nicht ausgeführt? Wenn ich den Fehler reproduzieren kann, kann ich mir das mal anschauen, sonst wird das debuggen eher schwierig §kratz Könnte höchstens sein, dass das StandUp() Probleme macht (Wir kodieren die AI_Functions als Animationen), aber dann sollte es eigentlich gar nicht gehen §enton
Nein, leider garnicht. Die trinken alle das Bier und dann passiert nichts mehr.
Ich denke das mit dem debuggen wird wirklich schwer, da man es nicht nachstellen kann.
Wie gesagt hier bei mir funktioniert es problemlos.
ich hab es nun wieder auf die Gothic-Methode mit AI_StartState umgebaut, da schein es hinzuhauen.
Jedoch gibt es andere Stellen im Code, wo ich die AI_Fucntions verwenden und dort scheint auch bei ihm alles zu funktionieren.
Wirklich komisch das ganze... Danke jedenfalls für deine Info.
Ich hab da ein ähnliches Problem mit den AI-Functionen.
Undzwar will ich innerhalb eines Dialoges, dass sich ein Npc einmischt und ein Gespräch führt.
Hier klappt das auch noch:
Func void DIA_Ragnar_Folter_Durchziehen1_Thoerchen()
{
Info_ClearChoices (DIA_Ragnar_Foltern);
AI_Output (other, self, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_hero1"); //Thora, hilf mir!
AI_Wait (AMZ_4400_Thora,3);
AI_Output (AMZ_4400_Thora, other, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_Thora1"); //Nein, Adira. Die Zeiten, in denen ich dich noch beschützt habe, sind vorbei.
AI_WaitTillEnd (hero,AMZ_4400_Thora);
AI_Output (other, self, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_hero2"); //Was soll das?
AI_Output (self, other, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_Ragnar1"); //Du verstehst es wirklich nicht, oder?
AI_Output (self, other, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_Ragnar2"); //(bedrohlich, langsam) Ich will dich TOT sehen.
AI_Output (self, other, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_Ragnar3"); //Dein Leben hing schon die ganze Zeit am seidenen Faden. Thora ist der einzige Grund, weshalb ich ihn noch nicht durchtrennt habe.
AI_Output (self, other, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_Ragnar4"); //Aber jetzt hast du es endgültig übertrieben. Du bist zu weit gegangen.
AI_Output (self, other, "DIA_Ragnar_Folter_Durchziehen1_Thoerchen_Ragnar5"); //(verhöhnend) Na, hast du keinen schlauen Plan? Fällt dir nichts ein, was du tun kannst?
if versuchtloszureissen==1
{
Info_AddChoice (DIA_Ragnar_Foltern ,"(Erneut versuchen loszureissen)", DIA_Ragnar_Folter_Durchziehen1_Losreissen2 );
}else
{
Info_AddChoice (DIA_Ragnar_Foltern ,"(Versuchen loszureissen)", DIA_Ragnar_Folter_Durchziehen1_Losreissen);
};
Info_AddChoice (DIA_Ragnar_Foltern ,"Thora, es tut mir Leid!", DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen);
};
Aber hier nicht mehr:
Func void DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3()
{
Info_ClearChoices (DIA_Ragnar_Foltern);
self = Hlp_GetNpc (AMZ_4443_Ragnar);
AI_Output (hero, self, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_hero1"); //Ich bitte dich! Lass mich nicht hängen!
AI_WaitTillEnd (AMZ_4400_Thora,hero);
AI_Output (AMZ_4400_Thora, other, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Thora1"); //Was meinst du, Ragnar? Hat sie noch eine Chance verdient?
var int RagnarsGnade;
RagnarsGnade = Hlp_Random (2);
if RagnarsGnade==0
{
self = Hlp_GetNpc (AMZ_4443_Ragnar);
AI_WaitTillEnd (self,AMZ_4400_Thora);
AI_Output (self, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Ragnar1"); //Nein. Sie hat eindeutig verspielt.
AI_WaitTillEnd (AMZ_4400_Thora,self);
AI_Output (AMZ_4400_Thora, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Thora2"); //Dann beende es bitte.
AI_WaitTillEnd (self,AMZ_4400_Thora);
AI_Output (self, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Ragnar2"); //(sanft) Du wirst diesen Schritt nicht bereuen, Thora.
AI_Function (self,TodesPrint);
AI_Function (self,Runterlassen);
AI_StopProcessInfos (self);
}else
{
self = Hlp_GetNpc (AMZ_4443_Ragnar);
AI_Output (self, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Ragnar1_B"); //...
AI_WaitTillEnd (AMZ_4400_Thora,self);
AI_Output (AMZ_4400_Thora, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Thora2_B"); //Du zögerst...
AI_Output (AMZ_4400_Thora, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Thora3_B"); //... Ich verstehe.
AI_Output (AMZ_4400_Thora, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Thora4_B"); //Adira?
AI_WaitTillEnd (hero,AMZ_4400_Thora);
AI_Output (hero, self, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_hero2_B"); //Ja?
AI_Output (AMZ_4400_Thora, hero, "DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen3_Thora5_B"); //Bist du wirklich bereit, mir treu zu dienen?
AI_WaitTillEnd (AMZ_4400_Thora,hero);
if versuchtloszureissen==1
{
Info_AddChoice (DIA_Ragnar_Foltern ,"(Erneut versuchen loszureissen)", DIA_Ragnar_Folter_Durchziehen1_Losreissen2 );
}else
{
Info_AddChoice (DIA_Ragnar_Foltern ,"(Versuchen loszureissen)", DIA_Ragnar_Folter_Durchziehen1_Losreissen);
};
Info_AddChoice (DIA_Ragnar_Foltern ,"Ja!", DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen_Ja);
Info_AddChoice (DIA_Ragnar_Foltern ,"Nein!", DIA_Ragnar_Folter_Durchziehen1_SorryThoerchen_Nein);
};
};
func void TodesPrint()
{
Wld_PlayEffect ("SLEEP_BLEND", hero, hero, 0, 0, 0, FALSE);
PrintScreen ("Er schneidet dir die Kehle durch.", -1,-1,FONT_Screen,2);
hero.attribute[ATR_HITPOINTS]=0;
};
func void Runterlassen()
{
Npc_RemoveInvItem (AMZ_4443_Ragnar,ITAR_TrageAdiraLumpen);
Npc_RemoveInvItem (AMZ_4443_Ragnar,ITAR_TrageAdiraVerband);
Npc_RemoveInvItem (AMZ_4443_Ragnar,ITAR_Ragnarpack);
CreateInvItem (AMZ_4443_Ragnar,ITAR_VLK_L);
AI_EquipBestArmor (AMZ_4443_Ragnar);
B_SetNpcVisual (hero, FEMALE, "Hum_Head_Babe4"/*"BAB_HEAD_AMAZONE"*/, Face_N_Adira, /*BodyTexBabe_Nutte*//*BodyTexBabe_F*//*BodyTexBabe_Naked*/BodyTex_Abgerissen, /*ITAR_lumpen*//*NO_ARMOR*/NO_ARMOR);//urspr. 3, davor 2, 4
if HeroWarNackt==0
{
AI_EquipBestArmor (hero);
};
};
Thora redet, Ragnar aber nicht mehr. Trotzdem wartet er noch bis sie "Dann beende es bitte" gesagt hat und schneidet erst dann die Kehle durch.
Bei der Version wo keine AI_Function vorkommt macht er das aber genauso.
Ich habe auch schon versucht, das ganze in Funktionen auszugliedern und Thoras Parts per AI_Function von Ragnar aufzurufen, aber dann labert der Kerl auch nicht mehr. §enton
Hast du die OUs aktualisiert (z.B. mit ADOUSADS)?
Ansonsten kann ich nur empfehlen, richtige Trialoge zu nutzen, die mittlerweile funktionieren - glaube ich. Die machen das allerdings auch nicht großartig anders, denke ich.
Lag an mehreren Outputs hintereinander. Wenn man sie auseinanderpflückt, funktioniert es wieder (warum auch immer...)
Kannst du mir die Funktion zur Manipulation der Kollision von Vobs während der Laufzeit geben? Hauptsache der Spieler kann nicht durchlaufen.
vob.bitfield[0] = vob.bitfield[0] | zCVob_bitfield0_collDetectionDynamic;
Alles nötige steht in der oCNpc.d, das solltest du mittlerweile doch auch selber können ;)
Ach DA ist das Zeug. Das muss einem nur mal gesagt werden.
Besten Dank :gratz
Teron Gorefiend
19.12.2015, 18:51
hello
question 1 solved.
Second question:
I use Lego Bars and are so far quite happy. The loop is repeating quite often per second. Which is good for certains things.
However how can I create a Loop that repeats only once per second. If possible only if the game is running (not while esc break or while in dialogs.)
thanks.
FF_ApplyExt() (http://lego.worldofplayers.de/?FrameFunctions#FF_ApplyExt) has the option to run it every 1 second (1000ms).
You can use Timer_SetPauseInMenu(true); (http://lego.worldofplayers.de/?Timer#Timer_SetPauseInMenu) to make it stop during the menu etc., but not that it can only be disabled for ALL FFs.
Hi, yes it's still me which I *might* have found another bug in lego :p :p (kill me if you want me to stop :D )
Basically I needed to print coloured text lines in a view. So I looked for some functions in view and interface, and I found out there were no specific functions for the purpose (only some in interface). So I wrote them by myself, using your code as base, and just changing some function calls (in red the differences).
I have added your code to the repository, it will be included in an official release soon™.
When specifiying no color, the default color COL_WHITE(FFFFFF) will be used, which probably was the expected behaviour anyway. There's currently no native way to use "color inheritance" (the previously, deemed "buggy", behaviour), but I don't feel that's very useful anyway.
Images printed with View, get the resolution much decreased, both in my lowest resolution (800x600), both in my highest (1280x1024). And I'm not printing them larger than they are (I could make screenshot if you like). Is this normal?
View package let me use virtual coordinates, and this is a good thing because in this way, icons in my menu stay to the right place both in low both in high resolution. This is not applied to text unfortunately, which is pretty big in low resolutions, and very small in high ones. This causes the text to not be centered or aligned anymore in high resolutions. Do I have to give up on this? Because I wouldn't really want to create an image for every text and print it with view :(
The previous two were graphic and minor problems, this is a major and scripting one. Every button I used in the hud has this structure (x, x, x, x, "tex", MenuStatusxxx, MenuStatusDeleteInfo, MenuStatusNullFunc). MenuStatusxx prints, on enter, the name and requirements of the talent on another view (like the previous code), and it is different for EVERY button. MenuStatusDeleteInfo delete any text from the info view, and it is called by every button on leave. MenuStatusNullFunc is just an empty void function. All of this works decently, but there are some bad problems that seems I can't resolve. Basically sometimes strings are not displayed because of timing. Sometimes OnLeave function of a button is called few milliseconds after OnEnter one of the next button causing the text to not be displayed. So, even if it is boooooring, I made something like this:
This would work pretty good, BUT, unfortunately I have Timer_SetPauseInMenu(TRUE); called in the startup, which I cannot set it to FALSE, because it would result in so many more bugs: in fact according to the situation I could have several FF at the same moment, so I wouldn't really call it with FALSE. Any suggestion?? :(
Still thank you for the patience
If you can show me something reproducible (including a screenshot, code and the used textures), maybe I can answer this. Gothic really sucks at resizing textures, so keep that in mind.
I think Gothic uses virtual coordinates for positioning and real coordinates for size. To achieve this, you'll have to do some coordinate arithmetic yourself, though.
I think this one was resolved at another point?
Frank-95
27.12.2015, 11:57
Thank you for the reply :D
As regards coloured view bug, I just solved using View_AddTextColoroued(WHITE) instead of View_AddText. In this way the game it's forced to use that color and no the last used one. It is a pretty clean solution so I think I will leave this as it is :P
I think Gothic uses virtual coordinates for positioning and real coordinates for size. To achieve this, you'll have to do some coordinate arithmetic yourself, though.
I would have prefered not to do that for every resolution, but it seems I will have to :P
EDIT: It was far easier than expected. I used a function I found empirically to keep the center of the texts centered around the points I had set with the lowest resolution:
func int ReturnPosFromRes(var int pos)
{
Print_GetScreenSize();
var int diff; diff = Print_Screen[PS_X] - 800;
return pos + (diff * 70 / 100);
};
I think this one was resolved at another point?
Yea it was :D
If you can show me something reproducible (including a screenshot, code and the used textures), maybe I can answer this. Gothic really sucks at resizing textures, so keep that in mind.
This (http://postimg.org/image/ps5cs6qav/) is a screen using the highest resolution for my monitor 1280x1024. As you can see I used the same images from g3, converting them from ximg to dds to tga (I created some of them though). Tga files surely lost some detail during conversions, but they still look good via an image browser. I post just one image as example: download link (http://www.mediafire.com/download/4ko15kd672zv21v/g3_hud_sneak_learned.tga).
Also, I post the code here but I really don't want to bother you by checking it carefully, since it's very long and repetitive, so I will post a short version too.
Startup.d
const int oCNpc__OpenScreen_Status = 7592320; //0x73D980
const int oCNpc__CloseScreen_Status = 4714092; //0x47EE6C
HookEngineF(oCNpc__OpenScreen_Status, 7, OpenStatusScreen);
HookEngineF(oCNpc__CloseScreen_Status, 6, CloseStatusScreen);
HookEngineF(oCGame__Render, 7, ResetButtonFix); //optional in the short version
Original menu file: pastebin (http://pastebin.com/7DCNawyG).
Short menu script with only one image to check quality:
var int Sneak;
func void MenuStatusNullFunc()
{
return;
};
func void OpenStatusScreen()
{
Sneak = Button_CreateCenter(3600, 2250, 400, 400, "g3_hud_sneak_learned.tga", MenuStatusNullFunc, MenuStatusNullFunc, MenuStatusNullFunc);
Button_Show(Sneak);
};
func void CloseStatusScreen()
{
Button_Delete(Sneak);
};
This is only for showing one image. Anyway the full code is linked in pastebin.
By the way, Button_CreateCenter is inside my collection of Buttons_Ext.d :P
//************************************************
// Lego Button Ext
//************************************************
func int Button_CreateCenter(var int posx, var int posy, var int width, var int height, var string tex, var func on_enter, var func on_leave, var func on_click)
{
if (_Buttons_NextSlot == MAX_BUTTONS) {
return 0;
};
var int button; button = new(_Button@);
var _Button btn; btn = get(button);
btn.posx = posx-(width/2);
btn.posy = posy-(height/2);
btn.posx2 = posx+(width/2);
btn.posy2 = posy+(height/2);
btn.on_enter = MEM_GetFuncID(on_enter);
btn.on_leave = MEM_GetFuncID(on_leave);
btn.on_click = MEM_GetFuncID(on_click);
btn.view = View_CreateCenter(posx, posy, width, height);
btn.state = 0;
View_SetTexture(btn.view, tex);
MEM_WriteStatArr(_Buttons, _Buttons_NextSlot, button);
_Buttons_NextSlot += 1;
return button+0;
};
func int Button_CreateCenterPxl(var int posx, var int posy, var int width, var int height, var string tex, var func on_enter, var func on_leave, var func on_click) {
return Button_CreateCenter(Print_ToVirtual(posx, PS_X), Print_ToVirtual(posy, PS_y), Print_ToVirtual(width, PS_X), Print_ToVirtual(height, PS_Y), tex, on_enter, on_leave, on_click);
};
func void Button_AddText(var int hndl, var int x, var int y, var string text, var string font)
{
var _Button btn; btn = get(hndl);
View_AddText(btn.view, x, y, text, font);
};
func void Button_DeleteText(var int hndl)
{
var _Button btn; btn = get(hndl);
View_DeleteText(btn.view);
};
Teron Gorefiend
04.02.2016, 13:51
Hello I am using Lego and want that I can use an instant melee attack while holding a bow.
if(Npc_IsInFightMode(hero,FMODE_FAR)) //Hero in far mode (draw bow)
&&(Npc_GetTarget(hero)) //Hero has target (victim in focus)
I want that I target an enemy push a button (R) and damage the target with a script. I used Lego ,Bars because I have most of the stuff there (pushing t for an instant potion with cooldown).
The only problem: B_MagicHurtNpc (hero, other, damage); the script does not know which person other is. therefore I have to use something like Var c_npc target; target=???;
Second question (has nothing to do with lego but I ask anyway)
I want the game to become more dependant on values. With "Klaue Beliars" you have a chance to inflict damage, even if you miss or the enemy parry. I opened B_BeliarsWeaponSpecialDamage.d
and added else if (oth.guild == GIL_ORC) { cause damage };
but it does not work. I thing that this only works for humans but B_BeliarsWeaponSpecialDamage.d is also in assessdamage for monster. So I have no idea.
Schreib ruhig auf Deutsch §enton
Nach Npc_GetTarget(hero) sollte das Target eigentlich in other sein, inwiefern funktioniert das nicht? Ansonsten versuchs mal so:
var c_npc oth; var oCNpc her; her = Hlp_GetNpc(Hero);
if (her.focus_vob) {
oth = _^(her.focus_vob);
B_MagicHurtNpc(hero, oth, dmg);
};
Beim zweiten Teil versteh ich dein Problem nicht genau, Orks werden doch von der Klause Beliars getroffen? Und zeig mal deinen Code, nicht nur so Pseudocode :)
Edit: Looks like I beat you to it :p
Abuyin Sharidi
04.02.2016, 14:10
You have to make it like this:
var oCNpc her; her = Hlp_GetNpc(hero);
var C_NPC target; target = _^(her.focus_vob);
And simply use B_MagicHurtNpc (hero, target, damage); :gratz
Teron Gorefiend
04.02.2016, 17:38
funktioniert nun besten dank.
zum zweiten Problem.
Ich möchte dass sämtliche Orcs den Effekt "Klaue Beliars erhalten". Ich will nicht, dass ich Bonusschaden gegen die anrichte sondern das Orcs gegen mich Bonusschaden anrichten.
func void B_BeliarsWeaponSpecialDamage (var C_NPC oth, var C_NPC slf) //other ist angreifer, slf ist victim
{
if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Raven)) //HACK: egal, welche Waffe Raven hat
{
//Ambient Pfx
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE", slf, slf, 0, 0, 0, FALSE );
if (RavenBlitz <= 0)
{
Wld_PlayEffect("spellFX_BELIARSRAGE", oth, oth, 0, 0, 0, FALSE );
B_MagicHurtNpc (slf, oth, 50); //Extraschaden von Raven!
RavenBlitz += 1;
}
else if (RavenBlitz >= 3)
{
var int RavenRandy; RavenRandy = Hlp_Random(3);
if (RavenRandy <= 50)
{
RavenBlitz = 0; //wieder von vorne
};
}
else
{
RavenBlitz += 1;
};
}
else if (oth.guild == GIL_ORC)
{
B_MagicHurtNpc (oth, slf, 1);
print("Bonusschaden ");
}
else if (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(hero))
{
var int DamageRandy;
DamageRandy = Hlp_Random (100);
if (C_ScHasReadiedBeliarsWeapon())
&& (DamageRandy <= BeliarDamageChance)
{
if (slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD) //beim untoten Drachen nimmt der SC Schaden
{
Wld_PlayEffect("spellFX_BELIARSRAGE", oth, oth, 0, 0, 0, FALSE );
B_MagicHurtNpc (slf, oth, 100);
}
else if (slf.flags != NPC_FLAG_IMMORTAL)
{
Wld_PlayEffect("spellFX_BELIARSRAGE", slf, slf, 0, 0, 0, FALSE );
B_MagicHurtNpc (oth, slf, 100);
if (oth.attribute[ATR_MANA] >=2)
{
Npc_ChangeAttribute (oth, ATR_MANA, -2);
}
else
{
B_MagicHurtNpc (slf, oth, 5);
};
};
//Ambient Pfx
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE", hero, hero, 0, 0, 0, FALSE );
};
if (C_ScHasReadiedBeliarsWeapon())
&& (DamageRandy <= 50) // Effekt
{
//Ambient Pfx
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE", hero, hero, 0, 0, 0, FALSE );
};
};
};
Du treibst ja schon wieder Schabernack mit der Einrückung §enton
Ansonsten: Der Held hat üblicherweise keine Schadenswahrnehmung (Ausnahme: LeGo mit Bloodsplats, dann gibts die Funktion _B_HeroDamage() in der Bloodsplats.d), die musst du also selbst erst aktivieren mit diesem Befehl:
Npc_PercEnable(pc_hero, PERC_ASSESSDAMAGE, myFunction);
Da sich die Wahrnehmungen zurück setzen, machst du das am einfachsten in einer FrameFunction.
Afaik kann pro Wahrnehmung nur eine Funktion angemeldet werden, möchtest du also auch die Bloodsplats nutzen, musst du deinen Code wohl oder übel in die _B_HeroDamage() einfügen.
Ich weiß nicht, ob es großartig nützlich ist, aber ich habe eine Möglichkeit gefunden, die Animation, die ausgeführt wird, wenn man Schaden nimmt, zu unterdrücken:
// Init
const int t = 1;
if (t) {
HookEngineF(6774593, 9, DisableDmgAnimation);
t = 0;
};
func void DisableDmgAnimation() {
if (condition) {
EAX = 0; // Jetzt wird die Animation unterdrückt
};
};
Außer einer Nachricht im zSpy (Irgendwas mit Modell nicht gefunden oder so :p) hab ich keine unerwünschten Nebeneffekte gefunden, aber die Benutzung erfolgt auf eigene Gefahr.
Milky-Way
13.02.2016, 19:02
dir fehlt da ein oeffnender code-tag.
Mehr habe ich gerade nicht beizutragen.
dir fehlt da ein oeffnender code-tag.
Mehr habe ich gerade nicht beizutragen.
Und anstatt das Problem diskret zu beheben, stellst du mich hier vor allen bloß? :o
Ohne Kontext wirkt es auch leicht nutzlos. Aber damit müsste man durchgehend zaubern können, auch wenn Horden von Gegnern auf einen einprügeln. Ist in einer Diskussion mit VarusBiker entstanden, weil er Magie ein wenig interessanter machen wollte :)
TheEternal
13.02.2016, 20:42
Ich weiß nicht, ob es großartig nützlich ist, aber ich habe eine Möglichkeit gefunden, die Animation, die ausgeführt wird, wenn man Schaden nimmt, zu unterdrücken:
// Init
const int t = 1;
if (t) {
HookEngineF(6774593, 9, DisableDmgAnimation);
t = 0;
};
func void DisableDmgAnimation() {
if (condition) {
EAX = 0; // Jetzt wird die Animation unterdrückt
};
};
Außer einer Nachricht im zSpy (Irgendwas mit Modell nicht gefunden oder so :p) hab ich keine unerwünschten Nebeneffekte gefunden, aber die Benutzung erfolgt auf eigene Gefahr.
Das ist ja geil.
Wird die ani nur für dieses eine mal, wo die condition passt unterdrückt? Oder ab der ersten erfüllen dann für alle Npcs?
Immer wenn die Bedingung erfüllt ist, wird die Animation unterdrückt. In ECX sollte der NPC stehen, also wäre das z.B. möglich:
var c_npc slf; slf = _^(ECX);
if (Npc_IsPlayer(slf)) { EAX = 0; };
Abuyin Sharidi
14.02.2016, 10:34
I discovered a bug that Frame Functions are not removed via FF_Remove(FuncName) while the function is applied in the function. :gratz
Example:
func blahblah
{
if something
{
FF_Remove(blahblah);
};
};
Frank-95
14.02.2016, 19:12
Well it actually works for me :confused:
Can you show us the code and how you trigger it?
Abuyin Sharidi
14.02.2016, 19:22
Well I am not using anything like this right now. I had a function of showing X/Y/Z positions via using a compass, but then I removed it and left it print all the time.
My code was like this, item (compass) applied a function FF_Apply(ShowCoordinates); and the function ShowCoordinates looked like this:
func void ShowCoordinates ()
{
if (FF_Active(ShowCoordinates))
{
B_PrintScreen (ConcatStrings("X: ", Float32ToString(her._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_X])), 2, 18, "Font_Default.tga", 75);
B_PrintScreen (ConcatStrings("Y: ", Float32ToString(her._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_Y])), 2, 18+2, "Font_Default.tga", 75);
B_PrintScreen (ConcatStrings("Z: ", Float32ToString(her._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_Z])), 2, 18+4, "Font_Default.tga", 75);
}
else
{
FF_Remove(ShowCoordinates);
};
};
Milky-Way
14.02.2016, 19:44
How is that supposed to work?
Once you have your function going,
FF_Active(ShowCoordinates)
will return true, so the else part to take it out again is never reached.
Abuyin Sharidi
14.02.2016, 19:49
Oh, yea... my bad, didn't think about it this way...§enton
Thank you. :gratz
Frank-95
14.02.2016, 19:56
Well I am not using anything like this right now. I had a function of showing X/Y/Z positions via using a compass, but then I removed it and left it print all the time.
My code was like this, item (compass) applied a function FF_Apply(ShowCoordinates); and the function ShowCoordinates looked like this:
func void ShowCoordinates ()
{
if (FF_Active(ShowCoordinates))
{
B_PrintScreen (ConcatStrings("X: ", Float32ToString(her._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_X])), 2, 18, "Font_Default.tga", 75);
B_PrintScreen (ConcatStrings("Y: ", Float32ToString(her._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_Y])), 2, 18+2, "Font_Default.tga", 75);
B_PrintScreen (ConcatStrings("Z: ", Float32ToString(her._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_Z])), 2, 18+4, "Font_Default.tga", 75);
}
else
{
FF_Remove(ShowCoordinates);
};
};
Mmm, how do you expect the function to be removed? If you call ShowCoordinates via FF, then FF_Active(ShowCoordinates), will be always true unless you remove it. But since it will be always true FF_Remove will never be called.
EDIT: sorry didn't see milky way message
Frank-95
15.02.2016, 12:47
Hi all. Since I noted some troubles from G2 to G1 as regards moving and rotating objects (here (http://forum.worldofplayers.de/forum/threads/1456691-Straight-line-AoE-spell/page2?p=24744542&viewfull=1#post24744542)), I searched for functions related to these topics in the forum, and I adapted them for both G1, both G2.
NOTE: functions are all made by gottried and/or lehona! I just found relative G1 addresses. Moreover I couldn't test them. In fact I do not own gothic 1, but I only was sent the executable by Bisasam. I don't think there are any problem though.
From Gottried scripts (link (http://forum.worldofplayers.de/forum/threads/879891-Skriptpaket-Ikarus-2/page12?p=14833017&viewfull=1#post14833017)), I corrected the first functions numbers, and add G1 address for sincos approx:
func void TRF_MoveToY(var zCVob obj, var int y) {
obj.trafoObjToWorld[ 7] = y;
};
func void TRF_MoveToZ(var zCVob obj, var int z) {
obj.trafoObjToWorld[ 11] = z;
};
const int TRFINT_Adr_Sin_G1 = 6092576; //0x5CF720
const int TRFINT_Adr_Sin_G2 = 8599080; //0x833628
func int TRFINT_SIN(var int x) {
x = mulf(x, 1148848204); //* 1000.13
x = addf(x, 1162107260); //+ 1000*PI
x = roundf(x);
var int ptr; ptr = MEM_StackPos.position;
if(x<0) {
x+=6284;
MEM_StackPos.position = ptr;
};
x = x%6284;
return MEM_ReadInt(MEMINT_SwitchG1G2(TRFINT_Adr_Sin_G1,TRFINT_Adr_Sin_G2)+(4*x));
};
From misc.d file in LeGo package:
const int HALFPI = 1070141312; // PI/2 rad
func int atan2f(var int x, var int y) {
const int _atan2f_G1 = 7757480; //0x765EA8
const int _atan2f_G2 = 8123804; //0x7BF59C
const int call = 0;
var int ret;
if (Call_Begin(call)) {
CALL_FloatParam(_@(x));
CALL_FloatParam(_@(y));
CALL_RetValisFloat();
CALL_PutRetValTo(_@(ret));
CALL__cdecl(MEMINT_SwitchG1G2(_atan2f_G1,_atan2f_G2));
call = CALL_End();
};
return +ret;
};
func int distance2Df(var int x1, var int x2, var int y1, var int y2) {
var int dx; dx = subf(x1, x2);
var int dy; dy = subf(y1, y2);
return +(sqrtf(addf(mulf(dx, dx), mulf(dy, dy))));
};
func int distance2D(var int x1, var int x2, var int y1, var int y2) {
return roundf(distance2Df(mkf(x1), mkf(x2), mkf(y1), mkf(y2)));
};
func int sin(var int angle) {
const int _sinf_G1 = 7757586; //0x765F12
const int _sinf_G2 = 8123910; //0x7BF606
const int call = 0;
var int ret;
if (Call_Begin(call)) {
CALL_FloatParam(_@(angle));
CALL_RetValisFloat();
CALL_PutRetValTo(_@(ret));
CALL__cdecl(MEMINT_SwitchG1G2(_sinf_G1,_sinf_G2));
call = CALL_End();
};
return +ret;
};
func int acos(var int cosine) {
const int _acosf_G1 = 7757470; //0x765E9E
const int _acosf_G2 = 8123794; //0x7BF592
const int call = 0;
var int ret;
if (Call_Begin(call)) {
CALL_FloatParam(_@(cosine));
CALL_RetValisFloat();
CALL_PutRetValTo(_@(ret));
CALL__cdecl(MEMINT_SwitchG1G2(_acosf_G1,_acosf_G2));
call = CALL_End();
};
return +ret;
};
func int asin(var int sine) {
return +subf(halfpi, acos(sine));
};
func int cos(var int angle) {
return +sin(subf(halfpi, angle));
};
§wink§wink
I tried to use the code this way:
func int GetNpcDirectionQuarter(var C_NPC slf) //return the caster direction quarter
{
var zCVob zslf; zslf = Hlp_GetNpc(slf);
if(gf(zslf.trafoObjToWorld[0], mkf(0)) && gf(zslf.trafoObjToWorld[8], mkf(0)))
{
return 1;
}
else if(lf(zslf.trafoObjToWorld[0], mkf(0)) && gf(zslf.trafoObjToWorld[8], mkf(0)))
{
return 2;
}
else if(lf(zslf.trafoObjToWorld[0], mkf(0)) && lf(zslf.trafoObjToWorld[8], mkf(0)))
{
return 3;
}
else if(gf(zslf.trafoObjToWorld[0], mkf(0)) && lf(zslf.trafoObjToWorld[8], mkf(0)))
{
return 4;
};
};
//////////////////////////////////////////////////////
func void TRF_MoveToY(var zCVob obj, var int y) {
obj.trafoObjToWorld[ 7] = y;
};
func void TRF_MoveToZ(var zCVob obj, var int z) {
obj.trafoObjToWorld[ 11] = z;
};
const int TRFINT_Adr_Sin_G1 = 6092576; //0x5CF720
const int TRFINT_Adr_Sin_G2 = 8599080; //0x833628
func int TRFINT_SIN(var int x) {
x = mulf(x, 1148848204); //* 1000.13
x = addf(x, 1162107260); //+ 1000*PI
x = roundf(x);
var int ptr; ptr = MEM_StackPos.position;
if(x<0) {
x+=6284;
MEM_StackPos.position = ptr;
};
x = x%6284;
return MEM_ReadInt(MEMINT_SwitchG1G2(TRFINT_Adr_Sin_G1,TRFINT_Adr_Sin_G2)+(4*x));
};
const int HALFPI = 1070141312; // PI/2 rad
func int atan2f(var int x, var int y) {
const int _atan2f_G1 = 7757480; //0x765EA8
const int _atan2f_G2 = 8123804; //0x7BF59C
const int call = 0;
var int ret;
if (Call_Begin(call)) {
CALL_FloatParam(_@(x));
CALL_FloatParam(_@(y));
CALL_RetValisFloat();
CALL_PutRetValTo(_@(ret));
CALL__cdecl(MEMINT_SwitchG1G2(_atan2f_G1,_atan2f_G2));
call = CALL_End();
};
return +ret;
};
func int distance2Df(var int x1, var int x2, var int y1, var int y2) {
var int dx; dx = subf(x1, x2);
var int dy; dy = subf(y1, y2);
return +(sqrtf(addf(mulf(dx, dx), mulf(dy, dy))));
};
func int distance2D(var int x1, var int x2, var int y1, var int y2) {
return roundf(distance2Df(mkf(x1), mkf(x2), mkf(y1), mkf(y2)));
};
func int sin(var int angle) {
const int _sinf_G1 = 7757586; //0x765F12
const int _sinf_G2 = 8123910; //0x7BF606
const int call = 0;
var int ret;
if (Call_Begin(call)) {
CALL_FloatParam(_@(angle));
CALL_RetValisFloat();
CALL_PutRetValTo(_@(ret));
CALL__cdecl(MEMINT_SwitchG1G2(_sinf_G1,_sinf_G2));
call = CALL_End();
};
return +ret;
};
func int acos(var int cosine) {
const int _acosf_G1 = 7757470; //0x765E9E
const int _acosf_G2 = 8123794; //0x7BF592
const int call = 0;
var int ret;
if (Call_Begin(call)) {
CALL_FloatParam(_@(cosine));
CALL_RetValisFloat();
CALL_PutRetValTo(_@(ret));
CALL__cdecl(MEMINT_SwitchG1G2(_acosf_G1,_acosf_G2));
call = CALL_End();
};
return +ret;
};
func int asin(var int sine) {
return +subf(halfpi, acos(sine));
};
func int cos(var int angle) {
return +sin(subf(halfpi, angle));
};
//////////////////////////////////////
func void InBlickrichtungMitDir(var oCNpc Held, var oCNpc GivenNpc,var int angleRot)//angleRot z.B. 90
{
MEM_InitAll();
var zCVob slf; slf = Hlp_GetNpc(Held);
var int dx; var int dy; var int dz;
dy = addf(slf.trafoObjToWorld[zCVob_trafoObjToWorld_Y],mkf(20));
dx = addf(slf.trafoObjToWorld[3], mulf(mkf(50), slf.trafoObjToWorld[2]));
dz = addf(slf.trafoObjToWorld[11], mulf(mkf(50), slf.trafoObjToWorld[10]));
//**************************** Rotation***********************************
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
var int rotx; var int roty; var int angle;
if(GetNpcDirectionQuarter(hero) == 1)
{
angle = addf(asin(slf.trafoObjToWorld[8]), mkf(angleRot));
}
else if(GetNpcDirectionQuarter(hero) == 2)
{
angle = addf(acos(slf.trafoObjToWorld[0]), mkf(angleRot));
}
else if(GetNpcDirectionQuarter(hero) == 3)
{
var int delta; delta = subf(pi, acos(slf.trafoObjToWorld[0]));
angle = addf(pi, delta);
angle = addf(angle, mkf(angleRot));
}
else if(GetNpcDirectionQuarter(hero) == 4)
{
angle = addf(asin(slf.trafoObjToWorld[8]), mkf(angleRot));
};
rotx = cos(angle);
roty = sin(angle);
GivenNpc._zCVob_trafoObjToWorld[0] = rotx;
GivenNpc._zCVob_trafoObjToWorld[8] = roty;
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
GivenNpc._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_X] = dx;
GivenNpc._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_Y] = dy; //höhe
GivenNpc._zCVob_trafoObjToWorld[zCVob_trafoObjToWorld_Z] = dz;
};
//**********************************************
//
//**********************************************
func void Npc_MoveToHero(var oCNpc GivenNpc)
{
var oCNpc her; her = Hlp_GetNpc(hero);
InBlickrichtungMitDir (her,GivenNpc,90);
VobPositionUpdated (_@(GivenNpc));
};
(Every frame)
The result:
https://www.youtube.com/watch?v=imc16Fq_7bM
That doesn't seem to be correct §kratz
Frank-95
15.02.2016, 16:48
I tried to use other indexes in g2 and they seem to have some effects on scale. So just try other index pairs. Instead of 0 and 8, 1 and 9 or 2 and 10. Maybe they are just different from G2 ones. Make some tries I don't have a crystall ball :p
Depending on what exactly you need I made a working version:
const int zCVob__Move_G2 = 6402784; //0x61B2E0
const int zCVob__Move_G1 = 6217184; //0x5EDDE0
func void Vob_Move(var int ptr, var int x, var int y, var int z) {
CALL_FloatParam(x);
CALL_FloatParam(y);
CALL_FloatParam(z);
CALL__thiscall(ptr, MEMINT_SwitchG1G2(zCVob__Move_G1, zCVob__Move_G2));
};
func void zCVob_RotateWorld(var int vobPtr, var int vecPtr, var int scale) {
const int zCVob__RotateWorld_G2 = 6403360; //61B520h
const int zCVob__RotateWorld_G1 = 6217744; //5EE010h
CALL_FloatParam(scale);
CALL_PtrParam(vecPtr);
CALL__thiscall(vobPtr, MEMINT_SwitchG1G2(zCVob__RotateWorld_G1, zCVob__RotateWorld_G2));
};
func void zCVob_Turn(var int vobPtr, var int degreesf) {
var int vec[3];
vec[0] = 0;
vec[1] = FLOATEINS;
vec[2] = 0;
zCVob_RotateWorld(vobPtr, _@(vec), degreesf);
};
func void moveFocusInFrontOfHero(var int vobPtr) {
var zCVob her; her = Hlp_GetNpc(hero);
var zCVob vob; vob = _^(vobPtr);
// trafo kopieren
MEM_CopyBytes(_@(her)+60, vobPtr+60, 64);
// Vob vor den Helden setzen
var int delta; delta = mkf(50);
Vob_Move(vobPtr, mulf(her.trafoObjToWorld[10], delta), mulf(her.trafoObjToWorld[6], delta), mulf(her.trafoObjToWorld[2], delta));
// Vob drehen
zCVob_Turn(vobPtr, mkf(180));
};
Called every Frame it sort of attaches a vob to the front of the hero (facing him). I hate trigonometry so it's doing something rather crude - taking the hero's rotation and turning the vob by 180°. It works, but if you're making turns it rotates the other way (obviously).
The addresses are only tested for G2, but I very much doubt there's any difference.
I tried to use other indexes in g2 and they seem to have some effects on scale. So just try other index pairs. Instead of 0 and 8, 1 and 9 or 2 and 10. Maybe they are just different from G2 ones. Make some tries I don't have a crystall ball :p
No, the indices should be the same.
Neconspictor
15.02.2016, 22:13
Lehona did it the right way.
Just for addition, I wanna try to explain a little bit, why it didn't worked:
The engine has to know for each object its location and its orientation. Location is simply a vector with the global axis components x,y,z. Because we are in 3d, the orientation has to be defined by three vectors, defining the up-direction, the right direction and the look direction.
The up-direction, right-direction and look direction are therefore the local coordination system of the specific object.
For illustration here is the content of trafoObjToWorld:
+ | 0 | 1 | 2 | 3 |
-------+---------------+------------+-------------+---------------+
0 * 4 | RightVector X | UpVector X | OutVector X | Translation X |
-------+---------------+------------+-------------+---------------+
1 * 4 | RightVector Y | UpVector Y | OutVector Y | Translation Y |
-------+---------------+------------+-------------+---------------+
2 * 4 | RightVector Z | UpVector Z | OutVector Z | Translation Z |
-------+---------------+------------+-------------+---------------+
3 * 4 | | | | |
-------+---------------+------------+-------------+---------------+
An example would be:
+ | 0 | 1 | 2 | 3 |
-------+---------------+------------+-------------+---------------+
0 * 4 | 1 | 0 | 0 | 0 |
-------+---------------+------------+-------------+---------------+
1 * 4 | 0 | 1 | 0 | 0 |
-------+---------------+------------+-------------+---------------+
2 * 4 | 0 | 0 | 1 | 0 |
-------+---------------+------------+-------------+---------------+
3 * 4 | | | | |
-------+---------------+------------+-------------+---------------+
So: RightVector (local x axis) is identically to the (world) x axis.
UpVector (local y axis) is identically to (world) y axis. Analogous is OutVector (local z axis) the world z axis.
Also to notice: The object is at the origin (0,0,0).
Now, just say we want to rotate the object about 90° on the local y axis. This is the same, as we would rotate the coordinate system at the y axis. So, if we rotate the x-axis about 90°, it is now equal to the world's z axis and analogous the local z-axis is equal to the world's -x axis. The local y axis is not changing.The final matrix would now look so:
+ | 0 | 1 | 2 | 3 |
-------+---------------+------------+-------------+---------------+
0 * 4 | 0 | 0 | -1 | 0 |
-------+---------------+------------+-------------+---------------+
1 * 4 | 0 | 1 | 0 | 0 |
-------+---------------+------------+-------------+---------------+
2 * 4 | 1 | 0 | 0 | 0 |
-------+---------------+------------+-------------+---------------+
3 * 4 | | | | |
-------+---------------+------------+-------------+---------------+
At this point, it should be clear, that only changing the offsets 0 and 8 does not give you the exact result. This is also the reason, why your npc is scaled, because your vectors aren't orthogonal anymore.
This was just a simple example where we could just guess the right values, but if you want to calculate it for all angles and all possible rotation axis (because the UpVector can be different, too!) it is much more complicated. The idea would be to do matrix multiplication with a rotation matrix and then normalize UpVector, RightVector and OutVector because they have to be unit vectors( otherwise you would accidently scale your object!).
All in all, for your purposes, its the best just to use the functions, Pyranha Bytes created already. But if you are interested in this sort of math, when i would suggest you to look into a 3D Computer Graphics book your search online about Matrix Mulitplication and transformation matrices (especially rotation matrix).
Lehonas Code works perfectly for me. I just have another request.
The height of the Vob should be higher than the one of the hero.
I tried to simply modify trafoobj 7 by that height, but the game crashes.
Also, I don't understand why you use 2, 6 and 10 instead of 3, 7 and 11.
Neconspictor
16.02.2016, 00:49
At first, he sets the npc's orientation and location equal to that of the hero simply by asigning the npc the exact matrix. Hero and npc have so the same location and orientation.
// trafo kopieren
MEM_CopyBytes(_@(her)+60, vobPtr+60, 64);
In order to position the npc in front of the hero, you have to move the npc on the out-vector (the look direction). That's the reason for the indices 2,6 and 10:
// Vob vor den Helden setzen
var int delta; delta = mkf(50);
Vob_Move(vobPtr, mulf(her.trafoObjToWorld[10], delta), mulf(her.trafoObjToWorld[6], delta), mulf(her.trafoObjToWorld[2], delta));
For your second problem i'm clueless, too. It's definitely no math problem.
Maybe you get it work if you use the function Vob_Move instead of directly changing the matrix.
I removed the collision of my vob and there is no crash anymore. It was a matter of worldcollision.
Frank-95
16.02.2016, 09:54
Thanks for the very good explaination Neconspictor!
Neconspictor
28.02.2016, 01:06
Ich hätte hier (vielleicht) einen Bug zu berichten, ich weiß allerdings nicht genau ob es einer ist, oder Absicht.
Wie auch immer:
Ich habe mich gewundert, warum Frame Functions eigtl. nach dem Laden nicht mehr aktiv sind, da sie mit PermMem ja in SCRPTSAVE.d gespeichert werden und über FFItem_Unarchiver auch wieder eingelesen werden.
Nach etwas Nachforschen habe ich herausgefunden, dass die Frame Functions sogar ein Handle zugewiesen bekommen (also in HandlesPointer gespeichert sind). Das einzig seltsame ist, dass foreachHandle() die FrameFunctions nicht findet. Erst nachdem ich sie über _PM_AddToForeachTable() manuell hinzugefügt habe, wurden sie auch von foreachHandle() gefunden.
Der ganze PermMem code ist für mich leider sehr unleserlich und bis jetzt konnte ich noch nicht herausfinden, warum die Frame Functions nicht über _PM_AddToForeachTable() bei foreachTable registriert wurden.
Die Frage, die ich mir nun stelle: Wurde das absichtlich so gemacht und wenn ja, warum?
Hintergrund ist, dass ich einen Trigger erstellen wollte, der genau einmal ausgeführt wird, aber ein langes delay hat (z.B. 5 reale Minuten). Wenn man in der Zwischenzeit speichert und lädt, hat man das Problem, dass die schon verstrichene Zeit verloren geht, wenn ich meinen Trigger wieder hinzufügen würde.
Mit dem folgendem Script konnte ich das Problem (für mich) provisorisch lösen. Zudem veranschaulicht es auch das oben beschriebene Problem. Prinzipiell fände ich es aber besser, wenn LeGo solch eine Funktionalität selbst bereitstellen würde, da ich Interna von LeGo ausnutzen musste, was kein schöner Programmierstil ist...
const int targetId = 666; // any id for comparing
var int found; //used to determine whether the target frame function was found
//Called in another function: FF_ApplyExtData(MyTrigger, 1000*20, targetId);
func void MyTrigger() {
Print("Called MyTrigger()!");
};
func void testTrigger(var int hndl) {
var FFItem itm; itm = get(hndl);
// itm.data should be null if itm is no FFITem
if (!found && itm.data == targetId) {
print("found!");
found = TRUE;
};
};
func void addTriggerHandle(var int key, var int val) {
var FFItem itm; itm = get(key);
// itm.data should be null if itm is no FFITem
if (!found && itm.data == targetId) {
_PM_AddToForeachTable(key);
};
};
//restoreTrigger is called in the startup as frame function with some delay: FF_ApplyOnceExt(restoreTrigger, 5000);
func void restoreTrigger() {
// first try
foreachHndl(FFItem@, testTrigger);
if (!found) {
print("Not found with foreachHndl!");
};
//add handle manually
_HT_ForEach(HandlesPointer, addTriggerHandle);
if (!found) {
print("Not found with _HT_ForEach!");
};
//now try again!
foreachHndl(FFItem@, testTrigger);
// should never happen...
if (!found) {
print("Not found with foreachHndl!");
};
found = FALSE;
};
Frank-95
28.02.2016, 10:09
If I understood you correctly your FFs does not retrigger on loading. Well this happens to me too and I had already talked about it with lehona some time ago; but I couldn't find the reason.
So I'm looking forward a solution too, even though for now I can simply fix it by recalling them in the init_global.
Neconspictor
28.02.2016, 12:15
yes, that's exactly what i wrote. But only calling my trigger in init_global again, is no option for me, because my trigger has a long delay and small amount of cycles (in this case only one cycle). So it is important, that the FFItem.next member variable is restored after loading. With the script i posted above, i could solve my problem but i think its (properly) a bug in LeGo, because the FFs are restored through PermMem but not registered in the foreach table (so it is not called by FrameFunctions()).
Neconspictor
28.02.2016, 13:14
I found the problem, it is indeed a bug in PermMem in _PM_CreateForeachTable():
func void _PM_CreateForeachTable() {
if(_PM_foreachTable) {
MEM_Free(_PM_foreachTable);
};
foreachHndl_ptr = MEM_GetFuncPtr(foreachHndl);
_PM_foreachTable = MEM_Alloc(currSymbolTableLength * 4);
if(HandlesPointer) {
var int i; i = 0;
var int m; m = _HT_GetNumber(HandlesPointer);
repeat(i, m);
_PM_AddToForeachTable(i+1); // 1 bis m
end;
};
};
Handles can be deleted, but their keys won't be reassigned again. So just iterating from 1 to m won't work, because it is likely to miss handles! By calling _HT_ForEach() as follows the issue is gone and FFs will be restored automatically at savegame loading!
func void _PM_AddToForeachTableOnTableCreation(var int key, var int val) {
_PM_AddToForeachTable(key);
};
func void _PM_CreateForeachTable() {
if(_PM_foreachTable) {
MEM_Free(_PM_foreachTable);
};
foreachHndl_ptr = MEM_GetFuncPtr(foreachHndl);
_PM_foreachTable = MEM_Alloc(currSymbolTableLength * 4);
if(HandlesPointer) {
_HT_ForEach(HandlesPointer, _PM_AddToForeachTableOnTableCreation);
};
};
Thanks for debugging, but the problem was fixed in post #107 (http://forum.worldofplayers.de/forum/threads/1408430-Skriptpaket-LeGo-3/page3?p=24569294&viewfull=1#post24569294) already. Sorry for wasting your time, I guess? :p I'll release a new version soon, I simply couldn't find the time till now.
Neconspictor
28.02.2016, 17:46
Yeah, shit happens :D But better fixed twice than not at all :)
Neconspictor
04.03.2016, 18:45
Ich greife mal die indirekte Fragestellung von hier (http://forum.worldofplayers.de/forum/threads/1459468-var-C_Npc-und-var-string-dauerhaft-speichern?p=24773494&viewfull=1#post24773494)auf:
Wenn man einen ganz bestimmten Npc töten will, ruft man am besten diese Funktion auf:
//.text:006C2D00 public: class oCSpawnManager * __thiscall oCGame::GetSpawnManager(void) proc near
func int oCGameGetSpawnManager(var int gamePtr) {
const int oCGameGetSpawnManagerAddress = 7089408;//006C2D00
var int ret;
CALL_PutRetValTo(_@(ret));
CALL__thiscall(gamePtr, oCGameGetSpawnManagerAddress );
return +ret;
};
//.text:00779690 public: void __thiscall oCSpawnManager::DeleteNpc(class oCNpc *) proc near
func void DeleteNpc(var int npcPtr) {
const int oCSpawnManagerDeleteNpcAddress = 7837328;//00779690
var int spawnManager; spawnManager = oCGameGetSpawnManager(_@(MEM_Game));
CALL_IntParam(npcPtr);
CALL__thiscall(spawnManager, oCSpawnManagerDeleteNpcAddress );
};
WLD_InsertNpc() zu hooken ist komplizierter. Da die Parameter nicht direkt auf dem Stack liegen. Am Einfachsten ist es, die Funktion
.text:00778B20 public: class oCNpc * __thiscall oCSpawnManager::SpawnNpc(int, class zSTRING const &, float) proc near
an ihrem Ende zu hooken, denn da liegt der Rückgabewert(also der Npc) im ESI Register. Die Adresse lautet
0x00778B90 und der Offset ist 7 Bytes. Anzumerken ist hierbei noch, dass WLD_InsertNpc() meistens ja in
der Startup der jeweiligen Welt aufgerufen wird. Ikarus und LeGo aber erst in der init_global().
Deshalb muss man Ikarus und LeGo zusätzlich auch in der Startup_global() initialisieren und darauf achten,
dass in der init_global() kein zweites Mal initialisiert wird. Dieser Fall tritt allerdings nur ein, wenn
ein neues Spiel gestartet wird (Denn da wird startup_global() aufgerufen).
Die Hook-Funktion würde dann so aussehen:
//HookEngineF(7834512, 7, SpawnNpcHook);// 00778B90
func void SpawnNpcHook() {
if (!ESI) {
MEM_Warn("Npc is null!");
return;
};
var c_npc npc; npc = _^(ESI);
//Tue was immer du willst, aber lösche den npc nicht!
};
Vielleicht hilft das nicht nur TheEternal weiter §wink
Hi, mir ist beim testen aufgefallen, das View_AddText Probleme macht.
Folgende Situation mann startet ein Spiel, alles funktioniert problemlos. Wenn man dann aber einen Speicherstand läd oder ein Neues Spiel beginnt, stürzt Gothic ab.
Man bekommt folgende Fehler:
http://upload.worldofplayers.de/files10/lego_error.JPG
....
EDIT: View_AddText war doch nicht das Problem sonder die LeGo Buttons. Ich bin dem Problem aber nicht weiter nachgegangen und hab sie durch die Views ersetzt. Da ich im Grunde eh nur Views brauche, damit haut alles hin.
Hi gibts ne Möglichkeit View_AddText() an die Auflösung anzupassen.
Also das man wie bei den Views eine x und y Koordinate angibt und dann eine länge und breite?
Wenn ich mich nicht irre (ist länger her, dass ich mich damit beschäftigt hatte) geht das nicht ohne weiteres, weil Gothic diese Möglichkeit nicht direkt anbietet, da Schriften nicht wirklich skaliert werden (s. den "Große-Schrift-Patch", den irgendjemand erstellt hat, der einfach größere Fonts beinhaltet).
Verändert sich dein Text oder könntest du auch einfach deinen Text als .tga abspeichern?
Edit: Außerem solltest du nicht vergessen, dass es unterschiedliche Bildformate gibt und was auf einem 4:3 Monitor gut aussieht, wird auf 16:9 völlig verzerrt sein.
Milky-Way
09.04.2016, 19:48
Waere es nicht toll, wenn LeGo eigene Schriftarten in "normalen" Formaten verwenden koennte? :p
Waere es nicht toll, wenn LeGo eigene Schriftarten in "normalen" Formaten verwenden koennte? :p
Es wäre vermutlich leichter, irgendwas zu schreiben, was diese "normalen" Formate passend konvertiert. Und würde das Problem höchstens verschieben, aber nicht wirklich lösen, oder?
Milky-Way
09.04.2016, 23:39
Es wäre vermutlich leichter, irgendwas zu schreiben, was diese "normalen" Formate passend konvertiert. Und würde das Problem höchstens verschieben, aber nicht wirklich lösen, oder?
Es gibt schon ein kleines Programm, um Schriftarten ins fuer Gothic notwendige Format zu konvertieren. Damit muesste man aber immernoch fuer jede Schriftgroesse eine eigene Textur erstellen...
Oder gibt es in LeGo ohnehin schon eine Moeglichkeit, Text zu skalieren?
Nein, eben nicht. Texturen zu skalieren wiederum ist kein Problem, aber: Die sind dann natürlich verzerrt, je nach Seitenverhältnis. Daher nutzt man Fonts, die oftmals Vektorgrafiken sind.
Aber Vektorgrafiken zeichnen zu lassen... :scared: Ich weiß nicht genug darüber, um sowas selber zu implementieren.
LeGo 2.3.3 ist jetzt im Startpost verlinkt.
Es wurden einige subtile Bugs in PermMem gefixt
Die Hashtables jetzt den Befehl "HT_Has()".
Es gibt einige weitere Funktionen für den Umgang mit FFs, die zusätzlich ein Datum haben (Frank-95).
Hey, es gibt noch einen kleinen Fehler bei den Trialogen in der Funktion _TRIA_UPdateVisual.
Dort wird die body tex nr nicht berücksichtigt, da hatte die folge, das der npc bei mir ein rotes Gesicht bekommen hat.
Hier der Fix.
func void _TRIA_UpdateVisual(var c_npc slf, var int armor) {
var oCNpc npc; npc = Hlp_GetNpc(slf);
Mdl_SetVisualBody(slf, npc.body_visualName, (npc.bitfield[0]&oCNpc_bitfield0_body_TexVarNr)>>14, npc.bitfield[1]&oCNpc_bitfield1_body_TexColorNr, npc.head_visualName, (npc.bitfield[1]&oCNpc_bitfield1_head_TexVarNr)>>16, 0, armor);
};
I have problem with double prints in one line. One print name is crossing with another. Normally (without Lego) second Print func will cover the first Print on the screen.
http://ifotos.pl/zobacz/printscre_ssqawqh.jpg
one of polish modders told me it might problem with Anim8.
(http://ifotos.pl/zobacz/printscre_ssqawqh.jpg)
Hello §wink I have a one problem. So... i try to create a new message information system text moving good, but black box can't move :/ I use Anim8 and Anim8q, but box was'nt react...
(When i apply box mover this teleport PC_Hero to coordinate)
My script looks like this:
/*********************************************\
HLP Functions
\*********************************************/
class UIMsg {
var int TextMove; // Anim8(h) move msg
var int MsgView;// Open View
var int Text; // Print(h) Create Text
/***************************************\
When text have 31 >= charsInline
\***************************************/
var int FirstLine;//Print
var int SecondLine;//Print
/***************************************\
When text have 31 >= charsInline
\***************************************/
};
instance UIMsg@(UIMsg);
var int UIMsg_Act;
var int UIMsg_COff;
func void UIMsg_Delete(var UIMsg this) {
Anim8_Delete(this.TextMove);
Print_DeleteText(this.Text);
};
func void UIMsg_Position(var int hndl, var int value) {
var UIMsg ptr; ptr = get(hndl);
var zCViewText text; text = get(ptr.Text);
text.posY = value;
if(text.PosY==3700)
{
Print_DeleteText(ptr.Text);
};
};
func void UIMsg_Box(var int hndl , var int value)
{
var UIMsg ptr; ptr = get(hndl);
var zCView Box; Box = get(ptr.MsgView);// so... this use this var to set box texture :O
Box.vPoSy=value;
if(box.vPosy==3700)
{
Print("Ender");
};
};
//========================================
// Softprint
//========================================
func void Msger(var string txt, var int color, var int time) {
/*******************************/
var int hndl; hndl = new(UIMsg@);
var UIMsg ptr; ptr = get(hndl);
/******************************************/
var int Box; Box =View_CreateCenter(700,2870,1150,450);
//View_CreateCenter(700,2870,1150,450);
View_SetTexture(Box,"UI_MSG_BG.TGA");
var int Mover_Box;
Mover_Box = Anim8_NewExt(2870, UIMsg_Box, hndl, false);
Anim8 (Mover_Box, 3300, time*15, A8_SlowStart);//50
Anim8q (Mover_Box, 3300, time*120, A8_Wait);
Anim8q(Mover_Box,3700,time*15,A8_SlowStart);
View_Open(Box);
/***************Delete Box*****************/
Anim8_RemoveIfEmpty (Mover_Box, true);
Anim8_RemoveDataIfEmpty(Mover_Box, true);
/******************************************/
var int Mover;
Anim8_RemoveIfEmpty (Mover, true);
Anim8_RemoveDataIfEmpty(Mover, true);
ptr.Text = Print_Ext(150, 2870, txt, PF_Font, color, -1);
/******************************************/
Mover = Anim8_NewExt(2870, UIMsg_Position, hndl, false);
Anim8 (Mover, 3300, time*15, A8_SlowStart);//50
Anim8q (Mover, 3300, time*120, A8_Wait);
Anim8q(Mover,3700,time*15,A8_SlowStart);
ptr.TextMove = Mover;
ptr.MsgView=Box;
};
func void PutMsg(var string msg,var string font,var int zCCol,var int dur,var string wav)
{
//MsgManager_Push(Msg_Create(msg,font,zCCol,dur,wav));
};
Thanks for every help :)
I don't understand neither your problem, nor your intended behaviour nor your code (which doesn't seem to be complete). You'll have to explain it again - maybe add a screenshot, too? The language barrier can sometimes be a bitch :)
I have problem with double prints in one line. One print name is crossing with another. Normally (without Lego) second Print func will cover the first Print on the screen.
http://ifotos.pl/zobacz/printscre_ssqawqh.jpg
one of polish modders told me it might problem with Anim8.
(http://ifotos.pl/zobacz/printscre_ssqawqh.jpg)
No, that's a side effect of our reimplementation of PrintScreen. Formerly, text created with PrintScreen() used the last color that was used. Not a problem normally because there was no way to make differently colored prints in the first place. However, when using something like Print_Ext(), you were able to specify a different color, resulting in wrongly colored text.
We simply redirected all calls to PrintScreen() to our own implementation (basically it's just Print_Ext() with a white color) to fix this. What I didn't think of at that time: PrintScreen() replaces text if it's printed directly above another.
I'm not quite sure if a) I will ever fix that and b) if I even want to fix that.
Ok. So... i try to create new information system. System have 3 tra: First- Black box and text falling down. 2- Text and box wait in position. 3- Text and box falling down (when text&& box y.Pos == X destroy text and box).I can't describe this in english, but i recorded a movie:
https://youtu.be/oD6hGYL8sfU
My english is bad :(
I don't understand neither your problem, nor your intended behaviour nor your code (which doesn't seem to be complete). You'll have to explain it again - maybe add a screenshot, too? The language barrier can sometimes be a bitch :)
No, that's a side effect of our reimplementation of PrintScreen. Formerly, text created with PrintScreen() used the last color that was used. Not a problem normally because there was no way to make differently colored prints in the first place. However, when using something like Print_Ext(), you were able to specify a different color, resulting in wrongly colored text.
We simply redirected all calls to PrintScreen() to our own implementation (basically it's just Print_Ext() with a white color) to fix this. What I didn't think of at that time: PrintScreen() replaces text if it's printed directly above another.
I'm not quite sure if a) I will ever fix that and b) if I even want to fix that.
Lehona, if so I will be glad u will advice me other function from Lego which I can easily avoid that effect (unfortunately printed screen must fully cover previous text). I bet u know what I mean.
both AI_PrintScreen and PrintScreen_Ext have the same bug. somewhere in that code should be add delete_text,but I am not so advanced to modify ur code.
It must to exist a posssibility which simply deleting a text or change mask alpha of the font.
LeGo 2.3.4 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_4.7z)
Hashtables speichern jetzt tatsächlich ihre Daten
Lehona, if so I will be glad u will advice me other function from Lego which I can easily avoid that effect (unfortunately printed screen must fully cover previous text). I bet u know what I mean.
both AI_PrintScreen and PrintScreen_Ext have the same bug. somewhere in that code should be add delete_text,but I am not so advanced to modify ur code.
It must to exist a posssibility which simply deleting a text or change mask alpha of the font.
This (http://forum.worldofplayers.de/forum/threads/1467161-How-to-properly-delete-a-Print?p=24912556&viewfull=1#post24912556) should probably do what you want. You can probably just call Perf_Print() instead of Print_Ext() in PrintScreen_Ext(). Unfortunately that means you'll have to edit LeGo-files and thus it will break every update, but that's still the easiest fix I think.
LeGo 2.3.4 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_4.7z)
Hashtables speichern jetzt tatsächlich ihre Daten
Das stimmt(e) gar nicht! $§p4
Danke an mud-freak, der mich darauf hingewiesen hab. Hab's jetzt korrigiert.
I renew my question. How i can move box (View Package) without View_Move func (with Anim8 Package)? All Call's ending crashes :( My moving script:
func void UIMsg_Box(var int hndl , var int value)
{
var int x; x = CalcPixelPosX(MsgBox_SizeX);
var UIMsg ptr; ptr = get(hndl);
var zCView box; box=View_Get(ptr.MsgView);
box.vposy = value;
};
Thanks for any help :)
Sorry for doublepost :( but i have a new problem. So... How can I change the priority of the text.(above box) I can't use from View_AddText function, because i wrote new.
My print function:
func void UIMsg_FormatAndPrintText(var string text,var int color, var int Time, var int maxCharsInline)
{
var int hndl; hndl = new(UIMsg@);
var UIMsg ptr; ptr = get(hndl);
/*Zmienne i Stałe */
//var int secondLine;
const int xStartOfWindow = 5;
var int yStartOf1Line; yStartOf1Line = 1584 - CalcPixelPosY(8)/2;
var int yStartOf2Line; yStartOf2Line = 3850 - CalcPixelPosY(8)/2;
var int yStartOfOneLine; yStartOfOneLine = 2600 - CalcPixelPosY(8)/2;//4096 = 100%
//const int maxCharsInline =20;
var int splitPos;
var int SecondLine;
var string Line1;var string Line2;
var int label;
secondLine = false;
Line1 = ""; Line2 = "";
/*Zmienne i Stałe */
var string test;//zmienna .-.
test = ConcatStrings(text,"");//odniesienie do tekstu, trza zrobić aby podpinało się pod hndl
var int newLineCharPos; newLineCharPos = STR_Search(text,"\n");//Wyszukiwanie \n czyli dzielenia na pół,
//wszystkie text zamienić trzeba na podpinanie hndl, lub do klasy
//if(newLineCharPos!=-1)//sprawdza czy jest /n
//{
//secondLine = true;//aktywuje drugą linie
//splitPos = newLineCharPos;//podmienia inta na chars
//Line1 = STR_SubStr (text,0,splitPos);//dzieli tekst
//Line2 = STR_SubStr (text,splitPos+2,Str_Len(text)); //także tylko że z pominieciem "\n"
//}
if(Str_Len(text)>=maxCharsInline)//jezeli jest więcej niż x znaków
{
//split string
secondLine = true;//tak samo aktywuje drugą linie
//find first space at left
splitPos = maxCharsInline; //sprawdza inta z 20, maxCharsInline=20
//loop
MEM_InitLabels ();
label = MEM_StackPos.position;
if(Hlp_StrCmp(STR_SubStr(text,splitPos,1)," "))
{
}
else if(splitPos>0)//jeżeli charsów jest >0, zawraca tu
{
splitPos-=1;//zżera o -1
MEM_StackPos.position = label;
};
//end loop
if(splitPos==0)//if no space fouded, divide at last char
{
splitPos=maxCharsInline;//porównuje int'a
};
Line1 = STR_SubStr (text,0,splitPos);//dzieli tekst
Line2 = STR_SubStr (text,splitPos+1,Str_Len(text));//dzieli tekst
};
//One Line:
if(!secondLine)
{
DebuggView=false;
ptr.text=Print_Ext(415,yStartOfOneLine,text,PF_Font,Color,-1);// do poprawki
//If !SecondLine
/****************/
var int OneLineMover;
Anim8_RemoveIfEmpty (OneLineMover, true);
Anim8_RemoveDataIfEmpty(OneLineMover, true);
/******************************************/
OneLineMover = Anim8_NewExt(yStartOfOneLine+40, UIMsg_OneLine_Position, hndl, false);
Anim8 (OneLineMover, 3064+20, 8*15, A8_SlowStart);//50
Anim8q (OneLineMover, 3064+20, time*120, A8_Wait);
Anim8q(OneLineMover,3564+20,8*15,A8_SlowStart);
//xlenght=CalcPixelPosX(250);
}
else//Zamiast create text, add line?
{
DebuggView=true;
ptr.FirstLine=Print_Ext(415,yStartOfOneLine-80,Line1,PF_Font,Color,-1);
ptr.SecondLine=Print_Ext(415,yStartOf1Line+170/*PF_Font height*/,Line2,PF_Font,Color,-1);
/**************************************/
var int SecondLineMover_First;
Anim8_RemoveIfEmpty (SecondLineMover_First, true);
Anim8_RemoveDataIfEmpty(SecondLineMover_First, true);
/******************************************/
SecondLineMover_First = Anim8_NewExt(yStartOfOneLine-85, UiMsg_SecondLine_1Text, hndl, false);
Anim8 (SecondLineMover_First, 3064-70, 8*15, A8_SlowStart);//50
Anim8q (SecondLineMover_First, 3064-70, time*120, A8_Wait);
Anim8q(SecondLineMover_First,3564-85,8*15,A8_SlowStart);
/**************************************/
/***Second Text***/
var int SecondLineMover_Second;
Anim8_RemoveIfEmpty (SecondLineMover_Second, true);
Anim8_RemoveDataIfEmpty(SecondLineMover_Second, true);
/******************************************/
SecondLineMover_Second = Anim8_NewExt(yStartOfOneLine+170, UiMsg_SecondLine_2Text, hndl, false);
Anim8 (SecondLineMover_Second, 3159, 8*15, A8_SlowStart);//50
Anim8q (SecondLineMover_Second,3159/*2974+170*/, time*120, A8_Wait);
Anim8q(SecondLineMover_Second,3659,8*15,A8_SlowStart);
};
};
And my class:
func int GetScreenSizeX() { Print_GetScreenSize(); return Print_Screen[PS_X]; };
func int GetScreenSizeY() { Print_GetScreenSize(); return Print_Screen[PS_Y]; };
func int CalcPixelPosX(var int x)
{
var int pos; pos = fracf(8196,GetScreenSizeX());
//printdebug_s_i("># px =",truncf(pos));
pos = mulf(pos,mkf(x));
//printdebug_s_i("># vsizex =",truncf(pos));
return truncf(pos);
};
func int CalcPixelPosY(var int y)//OrcWarrior Scirpt
{
var int pos; pos = fracf(8196,GetScreenSizeY()); pos = mulf(pos,mkf(y));
return truncf(pos);
};
/*********************************************\
HLP Functions
\*********************************************/
class UIMsg {
var int TextMove; // Anim8(h) move msg
var int MsgView;// Open View zCView
var int Text; // Print(h) Create Text
/***************************************\
When text have 31 >= charsInline
\***************************************/
var int FirstLine;//Print Str_Len
var int SecondLine;//Print Str_Len
/***************************************\
When text have 31 >= charsInline
\***************************************/
};
Thanks for help ;)
Sorry, I don't have a lot of time right now, but have you looked at the View_Top() (http://lego.worldofplayers.de/?View#View_Top)-function? It pushes a view to the front.
Edit: Oh, you aren't using a special view to hold the text. Try this:
ViewPtr_Top(MEM_Game.array_view[0]);
The ViewPtr_*-functions aren't documented right now, but they simply expect a pointer instead of a handle (most, if not all, View_*-functions simply unwrap the handle and call ViewPtr_*).
Thanks :)
All is working good .
I have one small question . How can write and manager to this system ?
(Which the package can help me? )
This system must have manager, because messages will overlap.
Neconspictor
24.07.2016, 15:33
Hey,
I implemented a small logging functionality and it works great...at least most of the time.
Issue: During level change somehow frame functions are deleted/removed automatically. I believe that bug arises by my new function 'BW_AppendTo', properly it interferes the Binary Machine module in some way.
BW_AppendTo is designed to append to an existing file rather than overwriting it each time the function is called.
Is there any way of solution?
const int FILE_APPEND_DATA = 4;
const int OPEN_ALWAYS = 4;
const string LOGFILE_PATH = "System/LoA/loa-log.txt";
const int LOG_INFOS = TRUE;
const int LOG_WARNINGS = TRUE;
const int LOG_ERRORS = TRUE;
func int BW_AppendTo(var string file) {
_bin_prefix = "BW_NewFile";
if(!_BIN_nRunning()) { return 0; };
_bin_open = WIN_CreateFile(file, FILE_APPEND_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(_bin_open==-1) {
_bin_open = 0;
var string err; err = ConcatStrings(file, " - Datei konnte nicht erstellt werden. Fehlercode ");
_BIN_Err(ConcatStrings(err, IntToString(WIN_GetLastError())));
return 0;
};
if(!_bin_ccnt) {
_bin_clen = _BIN_BufferLength;
_bin_ccnt = MEM_Alloc(_bin_clen);
};
_bin_mode = 0;
_bin_crsr = 0;
return 1;
};
func void logInfo(var string msg) {
if (!LOG_INFOS) {
return;
};
if (!BW_AppendTo(LOGFILE_PATH))
{
return;
};
BW_Text("[Info] ");
BW_Text(msg);
BW_NextLine();
BW_Close();
};
func void logWarn(var string msg) {
if (!LOG_WARNINGS) {
return;
};
if (!BW_AppendTo(LOGFILE_PATH))
{
return;
};
BW_Text("[Warn] ");
BW_Text(msg);
BW_NextLine();
BW_Close();
};
func void logError(var string msg) {
if (!LOG_ERRORS) {
return;
};
if (!BW_AppendTo(LOGFILE_PATH))
{
return;
};
BW_Text("[Error] ");
BW_Text(msg);
BW_NextLine();
BW_Close();
};
Neconspictor
30.07.2016, 17:22
Hi,
I recognised after a long bug search, that the function _BR_GetSelectedSlot() from Saves. d does not work as properly as expected. By now the function looks like that:
//========================================
// [intern] Speicherslot herausfinden
//========================================
func int _BR_GetSelectedSlot() {
var CGameManager man; man = _^(MEM_ReadInt(MEMINT_gameMan_Pointer_address));
return MEM_ReadInt(man.menu_load_savegame + 3276);
};
And is used here:
//========================================
// [intern] Ruft BR_Savegame auf
//========================================
func void _BR_LoadGame() {
var int slot; slot = _BR_GetSelectedSlot();
//Won't happen ever!
if(slot == -1) {
if(_LeGo_Flags & LeGo_Gamestate) {
_Gamestate_Init(Gamestate_WorldChange);
};
return;
};
if(BR_OpenFile(_BIN_GetSavefilePath(slot))) {
if(_LeGo_Flags & LeGo_PermMem) {
_PM_UnArchive();
};
BR_Savegame();
BR_Close();
};
if(_LeGo_Flags & LeGo_Gamestate) {
_Gamestate_Init(Gamestate_Loaded);
};
};
The issue: As I see it, MEMINT_gameMan_Pointer_address stores the last accessed savegame slot (properly the one chosen by user), but not the real current savegame slot. For most of the time, this is no problem, but during level change it is! The slot number won't ever be -1 (current savegame slot), but will be the last accessed savegame slot. If a user saved the game e.g. at slot 2, the slot number will be also 2 during level change!
This results into undetermined behaviour, e.g. a stored handle from PermMem is deleted after level change.
Also the Gamestate module isn't updated to Gamestate_WorldChange.
I fixed the problem by hooking oCGame::ChangeLevel(zSTRING const &, zSTRING const &) at the beginning (0x006C7290) and at the end (0x006C7ACB). So it is possible to check if the level is currently changing.
I provide my changed LeGo.d, EngineAdr.d and Saves.d and i would be glad, if the changes could be adapted for the next LeGo version (or you find a better solution) :)
Here are the updated files (marked additions with green and deletions with red):
EngineAdr.d
/***********************************\
ADRESSEN DER ENGINECALLS
\***********************************/
//========================================
// Alle (?) genutzen Engineadressen
//========================================
const int CGameManager__ApplySomeSettings = 4355760; //0x4276B0
const int CGameManager__Read_Savegame = 4366438; //0x42A066
const int CloseHandle = 8079190; //0x7B4756
const int CreateFileA = 8079286; //0x7B47B6
const int Cursor_Ptr = 9246300; //0x8D165C
const int Cursor_sX = 9019720; //0x89A148
const int Cursor_sY = 9019724; //0x89A14C
const int GetFileSize = 8079310; //0x7B47CE
const int GetLastError = 8079394; //0x7B4822
const int oCGame__changeLevel = 7107216; //0x6C7290 Hook: Saves
const int oCGame__changeLevelEnd = 7109323; //0x6C7ACB Hook: Saves
const int oCGame__Render = 7112352; //0x6C86A0 Hook: FrameFunctions
const int oCGame__RenderX = 7112704; //0x6C8800 Hook: Quickslots
const int oCGame__UpdateStatus = 7093113; //0x6C3B79 Hook: Focusnames
const int oCItem__Render = 7420608; //0x713AC0
const int oCNpc__CloseInventory = 7742483; //0x762413 Hook: Quickslots
const int oCNpc__DropUnconscious = 7560880; //0x735EB0 Hook: Shields
const int oCNpc__Equip = 7576720; //0x739C90
const int oCNpc__EquipItem = 7545792; //0x7323C0 Hook: Shields
const int oCNpc__EquipWeapon = 7577648; //0x73A030
const int oCNpc__EV_DrawWeapon = 7654416; //0x74CC10 Hook: Shields
const int oCNpc__EV_DrawWeapon1 = 7656160; //0x74D2E0 Hook: Shields
const int oCNpc__EV_PlayAni = 7699121; //0x757AB1 Hook: AI_Function
const int oCNpc__EV_RemoveWeapon = 7658272; //0x74DB20 Hook: Shields
const int oCNpc__EV_RemoveWeapon1 = 7660720; //0x74E4B0 Hook: Shields
const int oCNpc__OpenInventory = 7742032; //0x762250 Hook: Quickslots
const int oCNpc__PutInSlot = 7642288; //0x749CB0
const int oCNpc__RemoveFromSlot = 7643760; //0x74A270
const int oCNpc__UnequipItem = 7546560; //0x7326C0 Hook: Shields
const int oCNpc__UseItem = 7584784; //0x73BC10
const int oCSavegameManager__SetAndWriteSavegame = 4428037; //0x439105 Hook: Saves
const int parser =11223232; //0xAB40C0
const int ReadFile = 8272388; //0x7E3A04
const int screen =11232360; //0xAB6468
const int sysGetTimePtr = 5264000; //0x505280
const int WriteFile = 8079292; //0x7B47BC
const int zCAICamera_StartDialogCam = 4923632; //0x4B20F0
const int zCAICamera__current = 9235128; //0x8CEAB8
const int zCAICamera__StartDialogCam = 4923632; //0x4B20F0
const int zCFontMan__GetFont = 7898288; //0x7884B0
const int zCFontMan__Load = 7897808; //0x7882D0
const int zCFont__GetFontName = 7902368; //0x7894A0
const int zCFont__GetFontX = 7902448; //0x7894F0
const int zCFont__GetFontY = 7902432; //0x7894E0
const int zCInput_Win32__GetMouseButtonPressedLeft = 5068688; //0x4D5790
const int zCInput_Win32__GetMouseButtonPressedMid = 5068704; //0x4D57A0
const int zCInput_Win32__GetMouseButtonPressedRight = 5068720; //0x4D57B0
const int zCInput_Win32__GetMousePos = 5068592; //0x4D5730
const int zCParser__CreateInstance = 7942048; //0x792FA0
const int zCParser__CreatePrototype = 7942288; //0x793090
const int zCParser__DoStack = 7936352; //0x791960
const int zCRenderer__DrawTile = 6110448; //0x5D3CF0
const int zCTexture__Load = 6239904; //0x5F36A0
const int zCView__@zCView = 8017856; //0x7A57C0
const int zCView__Close = 8023600; //0x7A6E30
const int zCView__InsertBack = 8020272; //0x7A6130
const int zCView__Move = 8025824; //0x7A76E0
const int zCView__Open = 8023040; //0x7A6C00
const int zCView__Render = 8045072; //0x7AC210
const int zCView__SetFontColor = 8034576; //0x7A9910
const int zCView__SetSize = 8026016; //0x7A77A0
const int zCView__zCView = 8017664; //0x7A5700
const int zCWorld__zCWorld = 6421056; //0x61FA40
const int zFontMan =11221460; //0xAB39D4
const int zParser__CallFunc = 7940592; //0x7929F0
const int zrenderer_adr = 9973512; //0x982F08
const int zRND_D3D__DrawLine = 6609120; //0x64D8E0
const int zRND_D3D__DrawPolySimple = 6597680; //0x64AC30
const int zRND_D3D__EndFrame = 6610720; //0X64DF20 Hook: Sprite
const int zRND_D3D__SetAlphaBlendFunc = 6628880; //0x652610
const int zSinCosApprox = 6269632; //0x5FAAC0
//========================================
// Globale Flagvariable
//========================================
const int _LeGo_Flags = 0;
//========================================
// Namen einer Textur holen
//========================================
func string zCTexture_GetName(var int ptr) { // Eigentlich gar kein Engine-Call
if(!ptr) { return ""; };
var zCObject obj; obj = MEM_PtrToInst(ptr);
return obj.objectName;
};
//========================================
// Pointer auf eine Textur holen
//========================================
func int zCTexture_Load(var string texture) {
CALL_IntParam(1);
CALL_zStringPtrParam(texture);
CALL__cdecl(zCTexture__Load);
return CALL_RetValAsInt();
};
//========================================
// FontManager holen
//========================================
func int zCFontMan_Load(var string font) {
CALL_zStringPtrParam(font);
CALL__Thiscall(MEM_ReadInt(zFontMan), zCFontMan__Load);
return CALL_RetValAsInt();
};
//========================================
// Pointer auf eine Font holen
//========================================
func int Print_GetFontPtr(var string font) {
var int i; i = zCFontMan_Load(font);
CALL_IntParam(i);
CALL__Thiscall(MEM_ReadInt(zFontMan), zCFontMan__GetFont);
return CALL_RetValAsInt();
};
//========================================
// Namen einer Font holen
//========================================
func string Print_GetFontName(var int fontPtr) {
CALL_RetValIszString();
CALL__Thiscall(fontPtr, zCFont__GetFontName);
return CALL_RetValAszString();
};
//========================================
// Breite eines Strings holen
//========================================
func int Print_GetStringWidthPtr(var string s, var int font) {
CALL_zStringPtrParam(s);
CALL__Thiscall(font, zCFont__GetFontX);
return CALL_RetValAsInt();
};
func int Print_GetStringWidth(var string s, var string font) {
return Print_GetStringWidthPtr(s, Print_GetFontPtr(font));
};
//========================================
// Höhe einer Font holen
//========================================
func int Print_GetFontHeight(var string font) {
var int adr; adr = Print_GetFontPtr(font);
CALL__thiscall(adr, zCFont__GetFontY);
return CALL_RetValAsInt();
};
//========================================
// Beliebigen Waypoint holen
//========================================
func int MEM_GetAnyWPPtr() {
var zCWaynet wayNet; wayNet = MEM_PtrToInst(MEM_World.wayNet);
return MEM_ReadInt(wayNet.wplist_next+4);
};
func string MEM_GetAnyWP() {
var zCWaypoint wp; wp = _^(MEM_GetAnyWPPtr());
return wp.name;
};
//========================================
// Item an Koordinaten einfügen
//========================================
func void MEM_InsertItem(var c_item itm, var int fX, var int fY, var int fZ) {
var zCWaynet wayNet; wayNet = MEM_PtrToInst(MEM_World.wayNet);
var zCWaypoint wp; wp = MEM_PtrToInst(MEM_ReadInt(wayNet.wplist_next+4));
var int x; x = wp.pos[0];
var int y; y = wp.pos[1];
var int z; z = wp.pos[2];
wp.pos[0] = fX;
wp.pos[1] = fY;
wp.pos[2] = fZ;
Wld_InsertItem(Hlp_GetInstanceID(itm), wp.name);
wp.pos[0] = x;
wp.pos[1] = y;
wp.pos[2] = z;
};
//========================================
// Vob an Npc hängen
//========================================
func int oCNpc_PutInSlot(var c_npc slf, var string SlotName, var int oCVobPtr, var int SlotID) {
CALL_IntParam(SlotID);
CALL_PtrParam(oCVobPtr);
CALL_zStringPtrParam(SlotName);
CALL__thiscall(MEM_InstToPtr(slf), oCNpc__PutInSlot);
return CALL_RetValAsInt();
};
//========================================
// Vob von Npc entfernen
//========================================
func void oCNpc_RemoveFromSlot(var c_npc slf, var string SlotName, var int retVal, var int SlotID) {
CALL_IntParam(SlotID);
CALL_IntParam(retVal);
CALL_zStringPtrParam(SlotName);
CALL__thiscall(MEM_InstToPtr(slf), oCNpc__RemoveFromSlot);
};
//========================================
// Item ablegen
//========================================
func void oCNpc_UnequipItem(var c_npc slf, var int oCItemPtr) {
CALL_PtrParam(oCItemPtr);
CALL__thiscall(MEM_InstToPtr(slf), oCNpc__UnequipItem);
};
//========================================
// Ein Item auf einem View rendern
//========================================
func void oCItem_Render(var int itm, var int wld, var int view, var int rot) {
var zCView v; v = _^(view);
if(v.vposy < 0||(v.vposy+v.vsizey) > 8192) { return; };
if(v.vposy < 0||(v.vposy+v.vsizey) > 8192) { return; };
CALL_FloatParam(rot);
CALL_PtrParam(view);
CALL_PtrParam(wld);
CALL__thiscall(itm, oCItem__Render);
};
//========================================
// <funktioniert nicht?>
//========================================
func void zCRenderer_DrawTile(var int this,
var int tex,
var int vec0x, var int vec0y,
var int vec1x, var int vec1y,
var int flt,
var int vec2x, var int vec2y,
var int vec3x, var int vec3y,
var int color) {
const int vec = 0;
if(!vec) {
vec = MEM_Alloc(8);
};
CALL_IntParam(color);
CALL_PtrParam(vec);
CALL_PtrParam(vec);
CALL_FloatParam(flt);
CALL_PtrParam(vec);
MEM_WriteInt(vec+0, vec0x);
MEM_WriteInt(vec+4, vec0y);
CALL_PtrParam(vec);
CALL_PtrParam(tex);
CALL__thiscall(this, zCRenderer__DrawTile);
};
//========================================
// Beliebiges Item anlegen
//========================================
func void oCNpc_Equip(var int npcPtr, var int itmPtr) {
CALL_PtrParam(itmPtr);
CALL__thiscall(npcPtr, oCNpc__Equip);
};
//========================================
// Aktuelle Instanz bearbeiten
//========================================
func void MEM_SetUseInstance(var int inst) {
var int ptr; ptr = MEM_ReadIntArray (currSymbolTableAddress, inst);
MemoryProtectionOverride(11232304, 10);
MEM_WriteInt(11232304, ptr);
MEM_WriteInt(11232308, MEM_ReadInt(ptr+28));
};
func int MEM_GetUseInstance() {
return MEM_ReadInt(11232304);
};
Lego.d
/*************************************************************************\
|* *|
|* $$\ $$$$$$\ $$$$$$\ *|
|* $$ | $$ __$$\ $$ __$$\ *|
|* $$ | $$$$$$\ $$ / \__| $$$$$$\ \__/ $$ | *|
|* $$ | $$ __$$\ $$ |$$$$\ $$ __$$\ $$$$$$ | *|
|* $$ | $$$$$$$$ |$$ |\_$$ |$$ / $$ | $$ ____/ *|
|* $$ | $$ ____|$$ | $$ |$$ | $$ | $$ | *|
|* $$$$$$$$\\$$$$$$$\ \$$$$$$ |\$$$$$$ | $$$$$$$$\ *|
|* \________|\_______| \______/ \______/ \________| *|
|* *|
|* Erweitertes Scriptpaket, aufbauend *|
|* auf Ikarus *|
|* *|
\*************************************************************************/
const string LeGo_Version = "LeGo 2.3.4";
const int LeGo_PrintS = 1<<0; // Interface.d
const int LeGo_HookEngine = 1<<1; // HookEngine.d
const int LeGo_AI_Function = 1<<2; // AI_Function.d
const int LeGo_Trialoge = 1<<3; // Trialoge.d
const int LeGo_Dialoggestures = 1<<4; // Dialoggestures.d
const int LeGo_FrameFunctions = 1<<5; // FrameFunctions.d
const int LeGo_Cursor = 1<<6; // Cursor.d
const int LeGo_Focusnames = 1<<7; // Focusnames.d
const int LeGo_Random = 1<<8; // Random.d
const int LeGo_Bloodsplats = 1<<9; // Bloodsplats.d
const int LeGo_Saves = 1<<10; // Saves.d
const int LeGo_PermMem = 1<<11; // PermMemory.d
const int LeGo_Anim8 = 1<<12; // Anim8.d
const int LeGo_View = 1<<13; // View.d
const int LeGo_Interface = 1<<14; // Interface.d
const int LeGo_Bars = 1<<15; // Bars.d
const int LeGo_Buttons = 1<<16; // Buttons.d
const int LeGo_Timer = 1<<17; // Timer.d
const int LeGo_EventHandler = 1<<18; // EventHandler.d
const int LeGo_Gamestate = 1<<19; // Gamestate.d
const int LeGo_Sprite = 1<<20; // Sprite.d
const int LeGo_Render = 1<<21; // Render.d
const int LeGo_All = (1<<22)-1; // Sämtliche Bibliotheken
//========================================
// [intern] Variablen
//========================================
const int _LeGo_Init = 0;
var int _LeGo_Loaded;
//========================================
// [intern] Abhängigkeiten bestimmen
//========================================
func void LeGo_InitFlags(var int f) {
if(f & LeGo_Bloodsplats) { f = f | LeGo_FrameFunctions | LeGo_HookEngine | LeGo_Random | LeGo_Anim8; };
if(f & LeGo_Gamestate) { f = f | LeGo_EventHandler | LeGo_Saves; };
if(f & LeGo_Cursor) { f = f | LeGo_Interface | LeGo_View; };
if(f & LeGo_PrintS) { f = f | LeGo_AI_Function | LeGo_Anim8 | LeGo_Interface; };
if(f & LeGo_Anim8) { f = f | LeGo_PermMem | LeGo_FrameFunctions | LeGo_Timer; };
if(f & LeGo_Buttons) { f = f | LeGo_PermMem | LeGo_View | LeGo_FrameFunctions; };
if(f & LeGo_FrameFunctions) { f = f | LeGo_PermMem | LeGo_HookEngine | LeGo_Timer; };
if(f & LeGo_Bars) { f = f | LeGo_PermMem | LeGo_View; };
if(f & LeGo_EventHandler) { f = f | LeGo_PermMem; };
if(f & LeGo_View) { f = f | LeGo_PermMem; };
if(f & LeGo_Interface) { f = f | LeGo_PermMem; };
if(f & LeGo_Sprite) { f = f | LeGo_PermMem; };
if(f & LeGo_PermMem) { f = f | LeGo_Saves; };
if(f & LeGo_Saves) { f = f | LeGo_HookEngine; };
_LeGo_Flags = f;
};
//========================================
// [intern] Immer
//========================================
func void LeGo_InitAlways(var int f) {
if (f & LeGo_Saves) {
if(_LeGo_IsLevelChange()) {
// During level change, LeGo_InitAlways is called twice!
_LeGo_LevelChangeCounter += 1;
// update gamestate status after the last call of _LeGo_IsLevelChange
// for avoiding duplicate user function calls (e.g. in startup)
if(_LeGo_Flags & LeGo_Gamestate && (_LeGo_LevelChangeCounter == 2)) {
_Gamestate_Init(Gamestate_WorldChange);
};
};
};
if(f & LeGo_PermMem) {
if((_LeGo_Init)&&(!_LeGo_Loaded)) { // Aus einem Spiel heraus -> Neues Spiel
_PM_Reset();
};
};
if(f & LeGo_Timer) {
_Timer_Init();
};
if(_LeGo_Loaded && !_LeGo_IsLevelChange()) {
// Wenn ein Spielstand geladen wird
if(f & LeGo_Saves) {
_BR_LoadGame();
};
};
if(!_LeGo_Loaded) {
// Nur beim ersten Spielstart
if(f & LeGo_Gamestate) {
_Gamestate_Init(Gamestate_NewGame);
};
if(f & LeGo_Buttons) {
FF_Apply(Buttons_Do);
};
if(f & LeGo_Bloodsplats) {
FF_Apply(_Bloodsplats_Loop);
};
if(f & LeGo_Anim8) {
FF_Apply(_Anim8_FFLoop);
};
if(f & LeGo_Cursor) {
Cursor_Event = Event_Create();
};
if (f & LeGo_Render) {
_render_list = new(zCList@);
};
};
if (f & LeGo_Render) {
_Render_RestorePointer();
GameState_AddListener(_Render_RestorePointer_Listener);
};
if(f & LeGo_Interface) {
// TODO: Check whether this is working!
// TODO: Check whether log entries are invisible sometimes
Print_fixPS();
};
};
//========================================
// [intern] Nur bei Spielstart
//========================================
func void LeGo_InitGamestart(var int f) {
if(f & LeGo_Cursor) {
HookEngineF(5062907, 5, _CURSOR_GETVAL);
};
if(f & LeGo_Random) {
r_DefaultInit();
};
if(f & LeGo_Focusnames) {
HookEngineF(oCGame__UpdateStatus, 8, _Focusnames);
};
if(f & LeGo_AI_Function) {
HookEngineF(oCNPC__EV_PlayAni, 5, _AI_FUNCTION_EVENT);
};
if(f & LeGo_FrameFunctions) {
HookEngineF(oCGame__Render, 7, _FF_HOOK);
};
if(f & LeGo_Saves) {
HookEngineF(oCGame__changeLevel, 7, _LeGo_ChangeLevelHookBegin);
HookEngineF(oCGame__changeLevelEnd, 7, _LeGo_ChangeLevelHookEnd);
HookEngineF(oCSavegameManager__SetAndWriteSavegame, 5, _BW_SAVEGAME);
};
if(f & LeGo_Sprite) {
HookEngineF(zRND_D3D__EndFrame, 6, _Sprite_DoRender);
};
if (f & LeGo_Render) {
_Render_Init();
};
};
//========================================
// LeGo initialisieren
//========================================
func void LeGo_Init(var int flags) {
if(!MEM_CheckVersion(1,2,0)) {
MEM_Error("LeGo benötigt mindestens Ikarus 1.2!");
return;
};
MEM_InitAll();
MEM_Info(ConcatStrings(LeGo_Version, " wird initialisiert."));
LeGo_InitFlags(flags);
if(!_LeGo_Init) {
LeGo_InitGamestart(_LeGo_Flags);
};
LeGo_InitAlways(_LeGo_Flags);
_LeGo_Init = 1;
_LeGo_Loaded = 1;
MEM_Info(ConcatStrings(LeGo_Version, " wurde erfolgreich initialisiert."));
};
Saves.d
/***********************************\
SAVES
\***********************************/
var int _LeGo_LevelChangeIsExecuted;
var int _LeGo_LevelChangeCounter;
func void BW_Savegame() {
};
func void BR_Savegame() {
};
func void _LeGo_ChangeLevelHookBegin() {
_LeGo_LevelChangeIsExecuted = TRUE;
};
func void _LeGo_ChangeLevelHookEnd() {
_LeGo_LevelChangeIsExecuted = FALSE;
_LeGo_LevelChangeCounter = 0;
};
func int _LeGo_IsLevelChange() {
return _LeGo_LevelChangeIsExecuted;
};
//========================================
// [intern] Gibt Pfad zur Speicherdatei zurück
//========================================
func string _BIN_GetSavefilePath(var int slot) {
var string path;
var string cmd; cmd = MEM_GetCommandLine();
var string _BIN_ini;
if(!STR_len(_BIN_ini)) {
_BIN_ini = STR_SubStr(cmd, STR_IndexOf(cmd, "-GAME:")+6, 1024);
_BIN_ini = STR_Split(_BIN_ini, ".", 0);
};
if(Hlp_StrCmp(_BIN_ini, "GOTHICGAME") || (Hlp_StrCmp(_BIN_ini, ""))) {
path = "saves";
}
else {
path = ConcatStrings("saves_", _BIN_ini);
};
if(slot) {
path = ConcatStrings(path, "/savegame");
path = ConcatStrings(path, IntToString(slot));
}
else {
path = ConcatStrings(path, "/quicksave");
};
path = ConcatStrings(path, "/SCRPTSAVE.SAV");
return path;
};
//========================================
// [intern] Speicherslot herausfinden
//========================================
func int _BR_GetSelectedSlot() {
var CGameManager man; man = _^(MEM_ReadInt(MEMINT_gameMan_Pointer_address));
return MEM_ReadInt(man.menu_load_savegame + 3276);
};
//========================================
// [intern] Ruft BW_Savegame auf
//========================================
func void _BW_SaveGame() {
var int ext; ext = MEM_ReadInt(EBP+60);
if(_LeGo_Flags & LeGo_Gamestate) {
_Gamestate_Init(Gamestate_Saving);
};
if(BW_NewFile(_BIN_GetSavefilePath(ext))) {
if(_LeGo_Flags & LeGo_PermMem) {
_PM_Archive();
};
BW_Savegame();
BW_Close();
};
};
//========================================
// [intern] Ruft BR_Savegame auf
//========================================
func void _BR_LoadGame() {
var int slot; slot = _BR_GetSelectedSlot();
if(slot == -1) {
if(_LeGo_Flags & LeGo_Gamestate) {
_Gamestate_Init(Gamestate_WorldChange);
};
return;
};
if(BR_OpenFile(_BIN_GetSavefilePath(slot))) {
if(_LeGo_Flags & LeGo_PermMem) {
_PM_UnArchive();
};
BR_Savegame();
BR_Close();
};
if(_LeGo_Flags & LeGo_Gamestate) {
_Gamestate_Init(Gamestate_Loaded);
};
};
Frank-95
31.07.2016, 14:25
Nice debug Neconspictor!
Mich würden mal drei Dinge interessieren:
1. Gibt es irgendwo einen Changelog für die neueren LeGo-Releases? (Startpos und Wiki nicht oder ich hab's übersehen)
2. Ist die aktuelle Version stabil und soweit bugfrei? Musste in XR auf Version 2.2.1 zurückgehen, weil die neuere Version (2.2.3) einfach zu viele Fehler verursacht hatte.
3. Welche LeGo-Version nutzen so die anderen Modder und welche Features davon?
MyGamingHD
02.08.2016, 10:15
Mich würden mal drei Dinge interessieren:
1. Gibt es irgendwo einen Changelog für die neueren LeGo-Releases? (Startpos und Wiki nicht oder ich hab's übersehen)
2. Ist die aktuelle Version stabil und soweit bugfrei? Musste in XR auf Version 2.2.1 zurückgehen, weil die neuere Version (2.2.3) einfach zu viele Fehler verursacht hatte.
3. Welche LeGo-Version nutzen so die anderen Modder und welche Features davon?
2. Bei mir läuft alle ab LeGo 2.2.3 stabil, möglicherweise sind deine Scripte durch Änderungen an LeGo Funktionen nicht mehr ganz kompatibel? Ich kann natürlich jetzt nur eine Theorie aufstellen.
3.Ich nutze Aktuell die 2.3.3.7 und die läuft bei mir fehlerfrei. Ich nutze Aktuell alle Funktionen.
Thanks for finding the bug, Neconspictor! This might be the source of the rather many level changing bugs we've had in the past. I'll make sure to fix it soon.
Mich würden mal drei Dinge interessieren:
1. Gibt es irgendwo einen Changelog für die neueren LeGo-Releases? (Startpos und Wiki nicht oder ich hab's übersehen)
2. Ist die aktuelle Version stabil und soweit bugfrei? Musste in XR auf Version 2.2.1 zurückgehen, weil die neuere Version (2.2.3) einfach zu viele Fehler verursacht hatte.
3. Welche LeGo-Version nutzen so die anderen Modder und welche Features davon?
1. Die sind leider hier in diesem Thread verteilt, soweit es sie gibt (hab mich erst in den letzten Patches wirklich am Riemen gerissen und 'n Changelog erstellt...). Habe momentan alle Hände voll zu tun (Prüfungen fangen heute an), aber wenn ich mal 'ne kleine Pause mache, kann ich die mal zusammensuchen und ins Wiki stellen, wo sie ja eigentlich hingehören ;)
2. In 2.3.2 wurde ein ziemlich kritischer Bug gefixt, der PermMem extrem unverlässlich gemacht hatte (Für jedes delete(h); landete ein gültiges Handle nicht im Savegame... *hust*). Ich selber finde eigentlich keine Bugs mehr, aber das wäre vermutlich anders, wenn ich Unit-Tests hätte :p Im Zweifelsfall testen, ich glaube, die 2.3.x Versionen sind rückwärtskompatibel. Ansonsten: Gib mir deine Scripte, damit ich deine Bugs reproduzieren kann, dann sorg ich dafür, dass sie irgendwann verschwinden :p
3. PermMem is love, PermMem is life §herz
Dieser Punkt interessiert mich natürlich auch.
@MyGamingHD: 2.3.3.7? So viele Unterversionen haben wir nicht §enton
2. Bei mir läuft alle ab LeGo 2.2.3 stabil, möglicherweise sind deine Scripte durch Änderungen an LeGo Funktionen nicht mehr ganz kompatibel? Ich kann natürlich jetzt nur eine Theorie aufstellen.
3.Ich nutze Aktuell die 2.3.3.7 und die läuft bei mir fehlerfrei. Ich nutze Aktuell alle Funktionen.
Thanks for finding the bug, Neconspictor! This might be the source of the rather many level changing bugs we've had in the past. I'll make sure to fix it soon.
1. Die sind leider hier in diesem Thread verteilt, soweit es sie gibt (hab mich erst in den letzten Patches wirklich am Riemen gerissen und 'n Changelog erstellt...). Habe momentan alle Hände voll zu tun (Prüfungen fangen heute an), aber wenn ich mal 'ne kleine Pause mache, kann ich die mal zusammensuchen und ins Wiki stellen, wo sie ja eigentlich hingehören ;)
2. In 2.3.2 wurde ein ziemlich kritischer Bug gefixt, der PermMem extrem unverlässlich gemacht hatte (Für jedes delete(h); landete ein gültiges Handle nicht im Savegame... *hust*). Ich selber finde eigentlich keine Bugs mehr, aber das wäre vermutlich anders, wenn ich Unit-Tests hätte :p Im Zweifelsfall testen, ich glaube, die 2.3.x Versionen sind rückwärtskompatibel. Ansonsten: Gib mir deine Scripte, damit ich deine Bugs reproduzieren kann, dann sorg ich dafür, dass sie irgendwann verschwinden :p
3. PermMem is love, PermMem is life §herz
Dieser Punkt interessiert mich natürlich auch.
@MyGamingHD: 2.3.3.7? So viele Unterversionen haben wir nicht §enton
Klingt ja nicht so schlecht. Werd wohl die neueste Version mal ausprobieren.
@Lehona: Machst du in absehbarer Zeit ein Update mit dem Fix von Neonspictor? Vllt. löst das die vielen Levelchange-Crashes in XR. Ansonsten zieh ich mir den Fix selbst rein nach dem Update auf die aktuelle Version ;)
mud-freak
06.08.2016, 00:30
Weiss jemand von einer geeigneten Möglichkeit die X-/Y-Bewegung der Maus im Spiel zu einzuschränken und wieder freizugeben? Damit meine ich, dass der Spieler z.B. nur noch nach oben und unten schauen, aber den SC nicht mehr drehen kann (ähnlich wie wenn man beim Bogenschiessen die Maustaste gedrückt hält).
Da es in LeGo ja das Cursor-Paket gibt, dachte ich, dass die Manipulation der Maus-Steuerung vielleicht weit genug bekannt ist. Hat da jemand eine Idee (bspw. welche Funktion ich hooken könnte, o.ä.)?
EDIT: Gelöst, siehe http://forum.worldofplayers.de/forum/threads/1473223-Kamerarotation-freigeben?p=25036285&viewfull=1#post25036285
I think you need to use MemoryProtectionOveride . But I do not know how to get addresses .
At TheModders I heard that you have to fumble in the engine. (Change of flight shots arrows )
I have a question to Damage-System. So... How i can assign my NPC to this script ?
This (http://forum.worldofplayers.de/forum/threads/1149697-Script-Eigene-Schadensberechnung?p=19002341&viewfull=1#post19002341)
? My npc = hero_voblistarray= _npc.
What do you mean, assign your npc to it? The given function is called every time damage is dealt (no matter who did it).
I have to ask. When is this (http://lego.worldofplayers.de/?Buffs) going to be "shipped" ? :gratz
Looks very promising.
Also that SAVE_GetFuncID(func f) caught my eye. I tried to use function IDs in same way (I had some instance "blueprints") but MEM_GetFuncID inside instance always caused Acces Violation.. §cry Is this some workaround ?
http://lego.worldofplayers.de/?Buffs
var c_npc oth; oth = _^(victimPtr);
How i can assign to more than one NPC ?
victimPtr=EBP.
I do not know how I can explain this :/
My Version Hero>Collect npc from hero voblist > Set damage :)
If I understand you want to do damage to everybody on hero voblist ?
Fucntion is for something entirely different...
I have to ask. When is this (http://lego.worldofplayers.de/?Buffs) going to be "shipped" ? :gratz
Looks very promising.
Also that SAVE_GetFuncID(func f) caught my eye. I tried to use function IDs in same way (I had some instance "blueprints") but MEM_GetFuncID inside instance always caused Acces Violation.. §cry Is this some workaround ?
http://lego.worldofplayers.de/?Buffs
Soon, I guess. I have exams currently, but maybe I can squeeze in an update. There's a couple of other scripts that will have to go along with it, mostly some convenience stuff, but maybe someone will find it helpful.
Yes, that function is meant exactly to avoid errors in instances :p
Daedalus works like this: Whenever there is something like instance.attribute (e.g. instance.attribute = 0), at first the "current instance" is set and then the class.member-offset is added to the address of that instance.
Within instances (i.e. the "constructors"), you can leave out the "instance.", because the instance was set when the constructor was called. Accessing attributes of a different object will override the "current instance" and screw up everything! If you look at the implementation of SAVE_GetFuncID() it's rather easy and can be done for any function (it simply saves the current instance, does the call and restores it afterwards).
To manually circumvent this, just explicitly state the instance once after a call, e.g.
instance inst (class) {
MEM_GetFuncID(f);
inst.name = "";
// Continue as normal
}
var c_npc oth; oth = _^(victimPtr);
How i can assign to more than one NPC ?
victimPtr=EBP.
I do not know how I can explain this :/
My Version Hero>Collect npc from hero voblist > Set damage :)
As Mark56 said, that's not what that script is for. Instead it's useful to make your own damage calculations whenever a character is damaged "normally" (e.g. spells, melee hits, ...).
Edit: Apparently I'm an idiot, because the Buffs-Script hasn't even been uploaded to the SVN yet, it's still only on my laptop. Well, I guess you'll have to look at it whenever I get around to a release :p
:(
Just make a small commit. :D I have few weeks until semester starts again, and would like to finish some scripts.
:(
Just make a small commit. :D I have few weeks until semester starts again, and would like to finish some scripts.
Done. Talents.d and Buffs.d are nowhere near final, though, so don't be angry when something changes :p I'll try to keep the interface, but I can't guarantee anything.
If I understand you want to do damage to everybody on hero voblist ?
Fucntion is for something entirely different...
Thanks :) I wrote a new function. Result is satisfactory(for me)
It is possible change vfx to zCVob ? In "Czas Zaplaty" collision is made from vfx (changed to zCVob ? )
By this function:
func int I_zCTreeSearchVFX(var int ptr)
{
if(ptr==0)
{
printdebug("ERROR!!!");
};
var string name;
name = "R_SWORDDAMAGE VOB";
var int label; var int val; var int first_ptr; var int previous;
first_ptr = ptr;
val = MEM_ReadInt(ptr+16);//data zCVobVFX?
if(val)
{
if(MEM_ReadInt(val)==8585884)&&(Hlp_StrCmp(MEM_ReadString(val+16),name))
{
return val;
};
};
MEM_InitLabels();
label = MEM_StackPos.position;
if(previous)
{
ptr = MEM_ReadInt(ptr+12);//next
}
else
{
ptr = MEM_ReadInt(ptr+8);//next
};
if(ptr==0)
{
previous=true;
ptr=first_ptr;
MEM_StackPos.position = label;
};
val = MEM_ReadInt(ptr+16);//data zCVobVFX?
if(val)
{
if(MEM_ReadInt(val)==8585884)&&(Hlp_StrCmp(MEM_ReadString(val+16),name))
{
return val;
}
else if (first_ptr!=ptr)
{
MEM_StackPos.position = label;
};
}
else
{
return 0;
};
};
And my question : How change vfx to zCVob (i have an idea for Steaths, but i don't know how i can change vfx to zCVob :/)
mud-freak
08.08.2016, 07:44
Thanks :) I wrote a new function. Result is satisfactory(for me)
It is possible change vfx to zCVob ? In "Czas Zaplaty" collision is made from vfx (changed to zCVob ? )
By this function:
func int I_zCTreeSearchVFX(var int ptr)
{
if(ptr==0)
{
printdebug("ERROR!!!");
};
var string name;
name = "R_SWORDDAMAGE VOB";
var int label; var int val; var int first_ptr; var int previous;
first_ptr = ptr;
val = MEM_ReadInt(ptr+16);//data zCVobVFX?
if(val)
{
if(MEM_ReadInt(val)==8585884)&&(Hlp_StrCmp(MEM_ReadString(val+16),name))
{
return val;
};
};
MEM_InitLabels();
label = MEM_StackPos.position;
if(previous)
{
ptr = MEM_ReadInt(ptr+12);//next
}
else
{
ptr = MEM_ReadInt(ptr+8);//next
};
if(ptr==0)
{
previous=true;
ptr=first_ptr;
MEM_StackPos.position = label;
};
val = MEM_ReadInt(ptr+16);//data zCVobVFX?
if(val)
{
if(MEM_ReadInt(val)==8585884)&&(Hlp_StrCmp(MEM_ReadString(val+16),name))
{
return val;
}
else if (first_ptr!=ptr)
{
MEM_StackPos.position = label;
};
}
else
{
return 0;
};
};
And my question : How change vfx to zCVob (i have an idea for Steaths, but i don't know how i can change vfx to zCVob :/)
You actually don't need a zCVob to detect collision. In fact, you don't even need Ikarus for that. All you need to do is add collision detection to your VFX, like so:
INSTANCE yourVFX (CFx_Base_Proto)
{
// ...
emActionCollDyn_S = "CREATEONCE COLLIDE"; // Effect is removed when it collides ("CREATE COLLIDE" will keep it alive)
emFXCollDyn_S = "impactFX; // VFX instance for a visual effect on collision (optional)
emFXCollDynPerc_S = "triggerPerception"; // VFX instance to send perception
emFXCollDynAlign_S = "COLLISIONNORMAL";
emCheckCollision = 1; // If this is a spell, set this to 2, then it won't automatically deal damage
}
INSTANCE triggerPerception (CFx_Base_Proto)
{
sendAssessMagic = 1; // This will call B_AssessMagic in which you can ask for the circumstances of the call and call other functions
};
You can add the respective CollStat options to also collide with static objects.
If that does not work for you check out this engine function:
0x4968E0: virtual void __thiscall oCVisualFX::ReportCollision(zCCollisionReport const &)
I find your script interesting. I take it, it is for finding a VFX instance? My question is, what pointer do I need to pass to the function. Is there a gloabal vfxTree pointer of the world like a zCVobTree for oCVisualFx?
@mud-freak I guess siemekk is mostly rewriting someone elses scripts.
@Lehona Big thanks, there is little poroble though. I use LeGo on G1 which has most of the adressses ported. Most of them :D
Do you remeber what this "9298296" magic nuber is, or where in the IDA should I look for it ? I get AV on ReadIntArray... I hope its only bad adress
//========================================
// Aktuelle Instanz bearbeiten
//========================================
func void MEM_SetUseInstance(var int inst) {
var int ptr; ptr = MEM_ReadIntArray (currSymbolTableAddress, inst);
MemoryProtectionOverride(9298296, 10);
MEM_WriteInt(9298296, ptr);
MEM_WriteInt(9298296, MEM_ReadInt(ptr+28));
};
func int MEM_GetUseInstance() {
return MEM_ReadInt(9298296);
};
Edit: Sorry, just checked and its already ported adress. My bad.
Edit2: I looked into IDA and adresses seems to be correct. hmm any ideas ?
Edit3: Okay. I made little workaround. Since I was not able to fix it. :rolleyes:
Here is code, if anybody with Gothic 1 has the same problem. (Based on ikarus function)
func int MEM_StringToFuncID(var string fnc) {
if (Hlp_StrCmp (fnc, "")) {
MEM_Error ("MEM_CallByString: fnc may not be an empty string!");
return -1;
};
/* Mikrooptimierung: Wird zweimal hintereinander die selbe Funktion
* mit CallByString aufgerufen, nicht nochmal neu suchen. */
var int symbID;
var string cacheFunc; var int cacheSymbID;
if (Hlp_StrCmp (cacheFunc, fnc)) {
symbID = cacheSymbID;
} else {
symbID = MEM_FindParserSymbol (fnc);
if (symbID == -1) {
MEM_Error (ConcatStrings ("MEM_CallByString: Undefined symbol: ", fnc));
return -1;
};
cacheFunc = fnc; cacheSymbID = symbID;
};
return symbID;
};
usable in instances like this
instance inst_name(...) {
a = 2l;//
on_click = MEM_StringToFuncID("fooo");
}
[...]
That's because your version of MEM_SetUseInstance() is old. Use this one:
func void MEM_SetUseInstance(var int ptr) {
MemoryProtectionOverride(9298296, 10);
MEM_WriteInt(9298296, ptr);
MEM_WriteInt(9298296, MEM_ReadInt(ptr+28));
};
The address can stay the same, it's just expecting a zCPar_Symbol* instead of a symbol ID now (makes more sense, because MEM_GetUseInstance() returns a zCPar_Symbol*).
LeGo 2.3.5 (https://subversion.assembla.com/svn/lego2/Release/LeGo_2_3_5.7z)
Fixed a bug that happened when the player changed worlds (thanks to Neconspictor: http://forum.worldofplayers.de/forum/threads/1408430-Skriptpaket-LeGo-3?p=25023012&viewfull=1#post25023012)
Added Talents.d
Added ItemHelper.d
updated Names.d to use Talents
Talents.d
Das Script wurde schonmal im Forum gepostet, es erlaubt einem zwei Dinge zu tun:
Jeder NPC kann durch eine eindeutige, dauerhafte ID identifiziert (und gefunden) werden
Man kann eine beliebige Menge an Daten für jeden NPC speichern
ItemHelper.d
Dieses Script ist relativ langweilig, es erlaubt einem für eine beliebige C_Item (oder oCItem) Instanz einen gültigen Pointer zu bekommen.
Die Dokumentation im Wiki erfolgt in den nächsten Tagen.
English:
Talents.d
This script has been posted in this forum before, it enables you to do two things:
Get a unique, persistent identifier for any Npc and "find" the associated Npc for a given ID
Easily save an unlimited amount of data per NPC
ItemHelper.d
This script is rather mundane, you get a valid pointer for any given instance of C_Item (or oCItem). Probably only useful in fringe cases (e.g. rendering items on the screen).
I will update the wiki in the next few days.
Did you check this version? Variable Talent_Names isn't declared and nowhere is used, expect line 194 in LeGo.d.
I did, but apparently an old file snuck into the release? It seems to be just a typo (Talent_Name would've been right), which was literally the last fix/change I made before I (succesfully) started testing.
I'll have a deeper look into it tomorrow, so there'll be no other surprises.
Milky-Way
19.08.2016, 19:40
In Version 2.3.5 gibt es, glaube ich, noch einen kleinen Fehler.
LeGo.d Zeile 194:
Talent_Names = TAL_CreateTalent();
Names.d Zeile 4:
var int Talent_Name;
Talent_Names scheint es bei mir sonst nicht zu geben. Also einfach das s in Zeile 194 entfernen, oder habe ich was falsch gemacht?
Das ist genau, worauf Rayzer sich in Post #230 bezieht.
Ich habe noch keine neue Version hochgeladen, weil ich sichergehen wollte, dass sich nicht noch irgendwo anders alte Dateien eingeschlichen haben und weil ich mich (immernoch! :() in meinen Prüfungsvorbereitungen verloren habe.
Milky-Way
19.08.2016, 22:17
Das ist genau, worauf Rayzer sich in Post #230 bezieht.
Ich habe noch keine neue Version hochgeladen, weil ich sichergehen wollte, dass sich nicht noch irgendwo anders alte Dateien eingeschlichen haben und weil ich mich (immernoch! :() in meinen Prüfungsvorbereitungen verloren habe.
Stimmt, da war ich etwas blind. Es ist ja zum Glück ein Fehler, den wohl jeder auch selbst beheben kann.
Hello another time§wink
I use Cursor && Buttons to my new Menu. But when i'm in the city, cursor was very slow. How I can change DPI in game ? Because this is not good effect :(
mud-freak
21.08.2016, 13:51
Hello another time§wink
I use Cursor && Buttons to my new Menu. But when i'm in the city, cursor was very slow. How I can change DPI in game ? Because this is not good effect :(
I actually had the same problem designing free aiming. There is no frame-lock on the cursor.
Here is what I did. (mouseDeltaX and mouseSensX are pointers to x movement and x sensitivity, respectively)
var int deltaX; deltaX = mulf(mkf(MEM_ReadInt(mouseDeltaX)), MEM_ReadInt(mouseSensX)); // Get mouse change in x
var int frameAdj; frameAdj = mulf(MEM_Timer.frameTimeFloat, fracf(16, 1000)); // Frame "lock"
deltaX = mulf(deltaX, frameAdj);
The 0.016 is approximate. I went through a long process of testing the mouse movement with different fps. 0.016 is the slope of the linear(!) regression line of the recorded mouse movements. Since gothic is not a serious shooter, I was satisfied with the level of consistency achieved by that multiplier. For a cursor this approximate solution should be even less of a problem.
Something like this should fix the problem (not tested) and could be implemented in the next LeGo update:
Cursor.d
func void _Cursor_GetVal() {
var _Cursor c; c = _^(Cursor_Ptr);
Cursor_RelX = c.relX;
Cursor_RelY = c.relY;
Cursor_fX = addf(mulf(mkf(Cursor_RelX), mulf(MEM_ReadInt(Cursor_sX), mkf(2))), Cursor_fX);
Cursor_fY = addf(mulf(mkf(Cursor_RelY), mulf(MEM_ReadInt(Cursor_sY), mkf(2))), Cursor_fY);
var int deltaX; deltaX = mulf(mkf(Cursor_RelX), mulf(MEM_ReadInt(Cursor_sX), mkf(2)));
var int deltaY; deltaY = mulf(mkf(Cursor_RelY), mulf(MEM_ReadInt(Cursor_sY), mkf(2)));
var int frameAdj; frameAdj = mulf(MEM_Timer.frameTimeFloat, fracf(16, 1000)); // Frame lock
Cursor_fX = addf(mulf(deltaX, frameAdj), Cursor_fX);
Cursor_fY = addf(mulf(deltaY, frameAdj), Cursor_fY);
Cursor_X = roundf(Cursor_fX);
Cursor_Y = roundf(Cursor_fY);
Cursor_Wheel = c.wheel;
//...
};
So... The cursor moving only when is hidden.
mud-freak
21.08.2016, 14:05
So... The cursor moving only when is hidden.
I don't understand. Is that a question, or is that happening in your mod? Could you explain what exactly you mean?
Cursor was not moving : / When I hide cursor and renew the show , then cursor is in a new position .
Can you show us your code?
Also, did you make sure the mouse is enabled? You can do it from the scripts via
SetMouseEnabled(true)
/***********************************\
CURSOR
\***********************************/
//========================================
// Uservariablen
//========================================
var int Cursor_X;
var int Cursor_Y;
var int Cursor_RelX; // float
var int Cursor_RelY; // float
var int Cursor_Wheel;
var int Cursor_Left;
var int Cursor_Mid;
var int Cursor_Right;
var int Cursor_NoEngine;
var int Cursor_Event; // gCEvent(h)
//========================================
// [intern] Variablen
//========================================
var int Cursor_fX;
var int Cursor_fY;
//========================================
// Cursor verstecken
//========================================
var int Cursor_Hndl;
func void Cursor_Hide() {
if(!Hlp_IsValidHandle(Cursor_Hndl)) { return; };
View_Close(Cursor_Hndl);
};
//========================================
// Cursor anzeigen
//========================================
func void Cursor_Show() {
if(Hlp_IsValidHandle(Cursor_Hndl)) { View_Open(Cursor_Hndl); return; };
Print_GetScreenSize();
Cursor_X = Print_Screen[PS_X] / 2;
Cursor_Y = Print_Screen[PS_Y] / 2;
Cursor_fX = mkf(Cursor_X);
Cursor_fY = mkf(Cursor_Y);
Cursor_Hndl = View_CreatePxl(Cursor_X, Cursor_Y, Cursor_X+64, Cursor_Y+64);
View_SetTexture(Cursor_Hndl, Cursor_Texture);
View_Open(Cursor_Hndl);
};
//========================================
// Maussteuerung An-/Ausschalten
//========================================
func void SetMouseEnabled(var int bEnabled) {
CALL_IntParam(!!bEnabled /*Nur zur Sicherheit*/);
CALL_IntParam(2);
CALL__thiscall(MEM_ReadInt(9246288/* zCInput * zInput */), 5067008);
};
//========================================
// [intern] Klasse (von Engine genutzt)
//========================================
class _Cursor {
var int relX;
var int relY;
var int wheel;
var int keyLeft;
var int keyMid;
var int keyRight;
};
//========================================
// [intern] Tasten
//========================================
func void Cursor_KeyState(var int ptr, var int pressed) {
var int keyState; keyState = MEM_ReadInt(ptr);
// Kopiert aus der Ikarus.d
if (keyState == KEY_UP) {
if (pressed) {
keyState = KEY_PRESSED;
};
} else if (keyState == KEY_PRESSED) {
if (pressed) {
keyState = KEY_HOLD;
} else {
keyState = KEY_RELEASED;
};
} else if (keyState == KEY_HOLD) {
if (!pressed) {
keyState = KEY_RELEASED;
};
} else {
if (pressed) {
keyState = KEY_PRESSED;
} else {
keyState = KEY_UP;
};
};
MEM_WriteInt(ptr, keyState);
return;
};
//========================================
// [intern] Enginehook
//========================================
func void Cursor_Update() {
View_Top(Cursor_Hndl);
};
func void _Cursor_GetVal() {
var _Cursor c; c = _^(Cursor_Ptr);
Cursor_RelX = c.relX;
Cursor_RelY = c.relY;
var int deltaX; deltaX = mulf(mkf(Cursor_RelX), mulf(MEM_ReadInt(Cursor_sX), mkf(2)));
var int deltaY; deltaY = mulf(mkf(Cursor_RelY), mulf(MEM_ReadInt(Cursor_sY), mkf(2)));
var int frameAdj; frameAdj = mulf(MEM_Timer.frameTimeFloat, fracf(16, 1000)); // Frame lock
Cursor_fX = addf(mulf(deltaX, frameAdj), Cursor_fX);
Cursor_fY = addf(mulf(deltaY, frameAdj), Cursor_fY);
Cursor_X = roundf(Cursor_fX);
Cursor_Y = roundf(Cursor_fY);
Cursor_Wheel = c.wheel;
Cursor_KeyState(_@(Cursor_Left), c.keyLeft);
Cursor_KeyState(_@(Cursor_Right), c.keyRight);
Cursor_KeyState(_@(Cursor_Mid), c.keyMid);
if(Cursor_Left == KEY_PRESSED) {
Event_Execute(Cursor_Event, CUR_LeftClick);
};
if(Cursor_Right == KEY_PRESSED) {
Event_Execute(Cursor_Event, CUR_RightClick);
};
if(Cursor_Mid == KEY_PRESSED) {
Event_Execute(Cursor_Event, CUR_MidClick);
};
if(Cursor_Wheel != 0) {
if(Cursor_Wheel > 0) {
Event_Execute(Cursor_Event, CUR_WheelUp);
}
else {
Event_Execute(Cursor_Event, CUR_WheelDown);
};
};
Print_GetScreenSize();
if(Cursor_X > Print_Screen[PS_X]) {
Cursor_X = Print_Screen[PS_X];
Cursor_fX = mkf(Cursor_X);
}
else if(Cursor_X < 0) {
Cursor_X = 0;
Cursor_fX = mkf(Cursor_X);
};
if(Cursor_Y > Print_Screen[PS_Y]) {
Cursor_Y = Print_Screen[PS_Y];
Cursor_fY = mkf(Cursor_Y);
}
else if(Cursor_Y < 0) {
Cursor_Y = 0;
Cursor_fY = mkf(Cursor_Y);
};
if(Cursor_NoEngine) {
c.relX = 0;
c.relY = 0;
c.keyLeft = 0;
c.keyMid = 0;
c.keyRight = 0;
c.wheel = 0;
};
if(!Hlp_IsValidHandle(Cursor_Hndl)) { return; };
View_MoveToPxl(Cursor_Hndl, Cursor_X, Cursor_Y);
Cursor_Update();
};
This is "my" cursor.d :D
mud-freak
23.08.2016, 06:56
Cursor was not moving : / When I hide cursor and renew the show , then cursor is in a new position .
I forgot, that the cursor has to move much faster than the model rotation to notice an effect. My scalar of 0.016 is too small for the cursor movement. It will practically set every movement you do with the mouse to (close to) zero. That's why the cursor is not moving.
You have to tune the scalar (0.016) to an appropriate value.
Sorry for the faulty code I provided. I didn't test it for the cursor, only for my model rotatation.
EDIT: Here a more thorough explanation:
MEM_Timer.frameTimeFloat is usually between 3 and let's say 30. It is the interframe-interval in milliseconds (the time since the last frame). You need to scale the cursor movement by this value in order to have mouse movement independent of the frames-per-second ("frame locked") so that it always moves at the same speed.
So you want to scale the mouse input by a number which is smaller for small IFI (interframe-intervals) and higher for longer IFI: The cursor should move faster when the last frame (= last cursor update) was long ago (low frame-rate) and slower if the last frame has just passed (high frame-rate).
You have to image this: y = b + a * x where x is the mouse input, a is the scaling factor, b is a bias and y is the final cursor movement. The bias b should always be set to zero, because otherwise the cursor will move even when there is no mouse input. That's why there is no bias in the code I provided. So let's change the equation to: y = a * x
The scalar (or slope) a (in the code it's called frameAdj) is made up of the IFI and a multiplier. (In the code I provided that multiplier is 0.016. This is, however, way to small for cursor movement.) The equation should look like this now: y = multipilier * IFI * x.
We need to find an appropriate multiplier.
The engine should do this exactly like this. Maybe you can find the engine function where it scales the mouse input when turning the player model for example (I am not talking about the mouse sensitivity! This is something completely different).
You cannot set the multiplier to any value. It needs to be tuned, so that for all IFI (or frames per second) the cursor movement ends up at the same speed.
Maybe there is an easier way to find out an appropriate multiplier, but you could do the following:
1. Remove the line: var int frameAdj; frameAdj = mulf(MEM_Timer.frameTimeFloat, fracf(16, 1000)); // Frame lock
2. Make frameAdj (this is our a from the equation above) a global variable (float) and write a script which lets you change (increase/decrease) that variable by button presses.
3. Write a script that displays frameAdj and the IFI (MEM_Timer.frameTimeFloat) (this is a float!) at every frame to the screen (not to the zSpy, this slows down the game and falsifies the testing).
Then start the game and do the following:
Write down the IFI (e.g. 5.0), then change frameAdj by button presses until the cursor movement is of correct speed, once you found the correct value, write down that number next to the IFI (e.g. 5.0 -> 0.7). Then repeat these steps at various locations in the world where the IFI is different. In the end you have a list of different IFI and frameAdj pairs to which you can fit a line. The slope of the line is your multiplier which you can put into the script instead of fracf(16, 1000).
Sorry, I edited this post a million times, because I made some mistakes (early in the morning).
GiftGrün
25.08.2016, 19:53
Hi, habe kürzlich von LeGo 2.2.1 auf LeGo 2.3.5 geupdatet und bekomme jetzt beim Starten eines neuen Spiels Abstürze. Wenn ich den LeGo-Ordner gegen den alten 2.2.1-Ordner austausche, klappt alles problemlos. Wenn ich LeGo_Init(LeGo_FrameFunctions); auskommentiere, ebenfalls kein Crash. Vor dem Crash kommt dieselbe Nachricht, die Ikarus auch in den zSpy schreibt:
Q: Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.
Hat LeGo 2.3.5 noch andere Voraussetzungen als die Dateien im Download und Ikarus 1.2?
Der Absturz erfolgt direkt nach dem Auslesen aus der Gothic.ini und dem Anwenden der ausgelesenen Werte:
-4- 00:28 Info: 3 B: OPT: Applying settings ... .... <oGameManager.cpp,#1178>
-4- 00:28 Info: 3 B: OPT: Lookaround inverse = 0 .... <oGameManager.cpp,#1221>
-4- 00:28 Info: 3 B: OPT: Music-Volume: Value=0 .... <oGameManager.cpp,#1233>
-4- 00:28 Info: 3 B: OPT: Sound-Volume: Value=1 .... <oGameManager.cpp,#1234>
-4- 00:28 Info: 3 B: OPT: Mouse-Enabled = 1 .... <oGameManager.cpp,#1240>
-4- 00:28 Info: 3 B: OPT: Mouse-Sensitivity = 0.800000012 .... <oGameManager.cpp,#1241>
-4- 00:28 Info: 3 B: OPT: Level-Sight: Value=300, resulting factor=3 .... <oGameManager.cpp,#1251>
-4- 00:28 Info: 3 B: OPT: Vob-Sight: Value=14 .... <oGameManager.cpp,#1254>
-4- 00:28 Info: 3 B: OPT: Sky: Value=1 .... <oGameManager.cpp,#1271>
-4- 00:28 Info: 3 B: OPT: Model-Details: Value=0.800000012 .... <oGameManager.cpp,#1294>
-4- 00:28 Info: 3 B: OPT: Blood-Details: Value=2 .... <oGameManager.cpp,#1302>
-4- 00:28 Info: 3 B: GMAN: Leaving Menu-Section .... <oGameManager.cpp,#1537>
-4- 00:28 Info: 4 B: GMAN: Close InitScreen .... <oGameManager.cpp,#849>
-2- 00:28 Fault: 0 Q: [start of stacktrace]
-2- 00:28 Fault: 0 Q: [UNKNOWN] +-445145120 bytes
-2- 00:28 Fault: 0 Q: [end of stacktrace]
-2- 00:28 Fault: 0 Q: Exception handler was invoked. Ikarus tried to print a Daedalus-Stacktrace to zSpy. Gothic will now crash and probably give you a stacktrace of its own.
Hier die Access Violation. Grund war "attempt to read from address 0".
-3- 00:32 Warn: 0 ======================================= UNHANDLED EXCEPTION OCCURED ====================================================== .... <zError.cpp,#474>
-3- 00:32 Warn: 0 ============================================== CRASH INFOS: ============================================================== .... <zError.cpp,#474>
-3- 00:32 Warn: 0 Gothic II - 2.6 (fix), Parser Version: 50 .... <zError.cpp,#474>
-3- 00:32 Warn: 0 User: Admin, CPUType: 586, Mem: 2048 MB total, 2048 MB free .... <zError.cpp,#474>
-3- 00:32 Warn: 0 Startup Options: .... <zWin32.cpp,#2976>
-3- 00:32 Warn: 0 -game:1ou.ini -zreparse -zlog:5,s -zmaxframerate:60 .... <zWin32.cpp,#2977>
-3- 00:32 Warn: 0 =============================================== CALLSTACK : ============================================================== .... <zError.cpp,#474>
-3- 00:32 Warn: 0 0023:007A4C23 (0x1666B6B8 0x00AB4118 0x00AB40C0 0x0082E6F0) Gothic2.exe, zCPar_Stack::PopByte()+3 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser_Symbol.cpp, line 1389+3 byte(s) .... <zError.cpp,#474>
-3- 00:32 Warn: 0 0023:00791AA2 (0x00000BC8 0x0FD7A480 0x00000000 0x0135FCA0) Gothic2.exe, zCParser::DoStack()+322 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1348+10 byte(s) .... <zError.cpp,#474>
-3- 00:32 Warn: 0 0023:00792CBF (0x00400000 0x014F3E25 0x0135FEC4 0x002F4000) Gothic2.exe, zCParser::CallFunc()+719 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zParser.cpp, line 1551 .... <zError.cpp,#474>
-3- 00:32 Warn: 0 0023:00425E6E (0x00000000 0x00503270 0x0000002C 0x006AAE28) Gothic2.exe, CGameManager::Run()+1598 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 767+47 byte(s) .... <zError.cpp,#474>
-3- 00:32 Warn: 0 0023:0082933B (0x00000000 0x00000000 0x00000000 0x00000000) Gothic2.exe, SetFileAttributesA()+284535 byte(s) .... <zError.cpp,#474>
-3- 00:32 Warn: 0 ======================================= UNHANDLED EXCEPTION OCCURED ====================================================== .... <zError.cpp,#474>
-3- 00:55 Warn: 0 B: GMAN: gameSession is existing. Call CGameManager::Done() before! .... <oGameManager.cpp,#375>
Habe auch das Systempack installiert, obwohl die ersten Crashes schon vor dessen Installation aufgetreten sind (hatte die Hoffnung, dass es irgendwas ist, was das Systempack beheben kann).
EDIT: Die einzige Änderung, die ich gemacht habe, war an LeGo.d Talent_Names in Talent_Name zu ändern. Die richtige Kodierung ist ANSI, oder? Weil bei manchen .d-Dateien scheint Notepad++ zu glauben, es sei ANSI und bei manchen UTF-8 ohne BOM.
EDIT2: Wenn ich stattdessen ein älteres Spiel lade, kommt diese Fehlermeldung:
-4- 00:40 Info: 0 Q: Ikarus log functions now print in colour with prefix 'Q:'.
-4- 00:40 Info: 0 Q: LeGo 2.3.5 wird initialisiert.
-2- 00:40 Fault: 0 Q: [start of stacktrace]
-2- 00:40 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'STR_SubStr: The end of the desired substring exceeds the end of the string.') + 62 bytes
-2- 00:40 Fault: 0 Q: MEM_WARN('STR_SubStr: The end of the desired substring exceeds the end of the string.') + 21 bytes
-2- 00:40 Fault: 0 Q: STR_SUBSTR(' ', 0, 8) + 227 bytes
-2- 00:40 Fault: 0 Q: _BIN_GETSAVEFILEPATH(20) + 69 bytes
-2- 00:40 Fault: 0 Q: _BR_LOADGAME() + 65 bytes
-2- 00:40 Fault: 0 Q: LEGO_INITALWAYS(134178) + 178 bytes
-2- 00:40 Fault: 0 Q: LEGO_INIT(32) + 109 bytes
-2- 00:40 Fault: 0 Q: INIT_GLOBAL() + 20 bytes
-2- 00:40 Fault: 0 Q: [end of stacktrace]
-3- 00:40 Warn: 0 Q: STR_SubStr: The end of the desired substring exceeds the end of the string.
-2- 00:40 Fault: 0 Q: [start of stacktrace]
-2- 00:40 Fault: 0 Q: MEMINT_HANDLEERROR(2, 'MEM_Free: ptr is 0. Ignoring request.') + 62 bytes
-2- 00:40 Fault: 0 Q: MEM_WARN('MEM_Free: ptr is 0. Ignoring request.') + 21 bytes
-2- 00:40 Fault: 0 Q: MEM_FREE_(0) + 27 bytes
-2- 00:40 Fault: 0 Q: BR_OPENFILE('saves_1OU/savegame20/SCRPTSAVE.SAV') + 219 bytes
-2- 00:40 Fault: 0 Q: _BR_LOADGAME() + 70 bytes
-2- 00:40 Fault: 0 Q: LEGO_INITALWAYS(134178) + 178 bytes
-2- 00:40 Fault: 0 Q: LEGO_INIT(32) + 109 bytes
-2- 00:40 Fault: 0 Q: INIT_GLOBAL() + 20 bytes
-2- 00:40 Fault: 0 Q: [end of stacktrace]
-3- 00:40 Warn: 0 Q: MEM_Free: ptr is 0. Ignoring request.
-4- 00:40 Info: 0 Q: === PermMem::UnArchive ===
-4- 00:40 Info: 0 Q: Reset ALL the handles!
-4- 00:40 Info: 0 Q: Resetting done.
-4- 00:40 Info: 0 Q: Locals: Install at CREATE
-4- 00:40 Info: 0 Q: Offset is 11
-4- 00:41 Info: 0 Q: Locals: Install at _PM_SAVESTRUCT_DELETEARR
-4- 00:41 Info: 0 Q: Offset is 11
-4- 00:41 Info: 0 Q: buffer used: 0
-4- 00:41 Info: 0 Q: buffer cleaned: 0
-4- 00:41 Info: 0 Q: objects created: 0
-4- 00:41 Info: 0 Q: objects cleaned: 0
-4- 00:41 Info: 0 Q: ellapsed time: 56
-4- 00:41 Info: 0 Q: === Done ===
-4- 00:41 Info: 0 Q: LeGo 2.3.5 wurde erfolgreich initialisiert.
Das scheint an den FrameFunctions zu liegen (laut AccessViolation), aber ich kann den Absturz nicht reproduzieren §gnah
Kannst du mal alle deine FrameFunctions zeigen? Zumindest die, die bei Spielstart schon aktiv sind.
Und: Hast du das Systempack installiert, nachdem du mit dem Update auf 2.3.5 Crashes hattest? Oder meinst du andere Crashes?
GiftGrün
26.08.2016, 12:51
Ja, das Systempack war etwas dumm von mir: Die Crashes von 2.3.5 waren der Grund, wieso ich es installiert habe, weil ich irgendwie nicht an LeGo als mögliche Ursache gedacht habe. Dann ist es eine Weile nicht mehr aufgetreten (weil ich in der Startup.d alles bis Ikarus auskommentiert hatte und vergessen hatte, zu testen). Jetzt tritt es 100% jedes Mal auf, wenn ich mit den neuen Skripten starten will.
Meinst du mit "aktiv" in der Queue? Also die schon mit FF_Apply() gestartet wurden? Gar keine, es sei denn, LeGo startet automatisch welche. Habe nur zwei, die beide zu diesem Zeitpunkt nicht aktiv sein können:
FUNC VOID Equip () //gleiche wie Unequip
{
var C_NPC her; her = Hlp_GetNPC(PC_Hero);
if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
{ FF_ApplyExt(DelayedEquip,10,1); };
};
ist eine Funktion, die Equip_[Waffenname] und Unequip_[Waffenname] ersetzt und wegen der if-Abfrage und der Tatsache, dass der Held mit leerem Inventar startet, dürfte die Funktion beim Spielstart nie aufgerufen werden.
func void hookMagicMode() {
var int activeSpell; activeSpell = Npc_GetActiveSpell(hero);
if (activeSpell >= 7) // erster Teleportspruch
&& (activeSpell <= 17) // letzter Teleportspruch
&& (hero.attribute[ATR_MANA] < 1) {
hero.attribute[ATR_MANA_MAX] += 20000;
hero.attribute[ATR_MANA] = 1;
FF_ApplyExt(NullMana,50,1);
};
};
Ein Hook der Funktion oCAIHuman::MagicInvestSpell für Zaubern bei null Mana. Mal abgesehen davon, dass ich hier "hero" verwende, wo es nix zu suchen hat, sollte auch niemand einen Teleportzauber verwenden, also schließt auch diese if-Abfrage ungewolltes Ausführen aus.
EDIT: Achso, die Funktionen selber, ja:
func void NullMana(){
hero.attribute[ATR_MANA] = 0;
hero.attribute[ATR_MANA_MAX] -= 20000;
}; // Manabar anpassen, damit nicht ein Teil des Balkens blau wird
FUNC VOID DelayedEquip () // Reset des Talentwertes + temporaere Boni
{
var C_ITEM melweap; melweap = Npc_GetEquippedMeleeWeapon(self);
var C_ITEM rngweap; rngweap = Npc_GetEquippedRangedWeapon(self);
self.HitChance[NPC_TALENT_1H] = self.aivar[REAL_TALENT_1H];
if (Hlp_IsItem(melweap,ItMW_Addon_Hacker_1h_02))
{self.HitChance[NPC_TALENT_1H] += Waffenbonus_02;}
else if (Hlp_IsItem(melweap,ItMW_Addon_Knife01)) || (Hlp_IsItem(melweap,ItMW_Addon_Hacker_1h_01))
{self.HitChance[NPC_TALENT_1H] += Waffenbonus_03;}
else if (Hlp_IsItem(melweap,ItMw_FrancisDagger_Mis)) || (Hlp_IsItem(melweap,ItMw_Schwert4)) || (Hlp_IsItem(melweap,ItMw_Schwert1)) || (Hlp_IsItem(melweap,ItMw_1H_Common_01)) || (Hlp_IsItem(melweap,ItMw_1h_Vlk_Sword))
{self.HitChance[NPC_TALENT_1H] += Waffenbonus_05;}
else if (Hlp_IsItem(melweap,ItMw_Rubinklinge))
{self.HitChance[NPC_TALENT_1H] += Waffenbonus_07;}
else if (Hlp_IsItem(melweap,ItMw_Rapier)) || (Hlp_IsItem(melweap,ItMw_ElBastardo))
{self.HitChance[NPC_TALENT_1H] += Waffenbonus_08;}
else if (Hlp_IsItem(melweap,ItMw_AlriksSword_Mis)) || (Hlp_IsItem(melweap,ItMw_Meisterdegen)) || (Hlp_IsItem(melweap,ItMw_1H_Special_01)) || (Hlp_IsItem(melweap,ItMw_1H_Special_02)) || (Hlp_IsItem(melweap,ItMw_1H_Special_03)) || (Hlp_IsItem(melweap,ItMw_1H_Special_04))
{self.HitChance[NPC_TALENT_1H] += Waffenbonus_10;}
else if (Hlp_IsItem(melweap,ItMW_Addon_Keule_1h_01)) {
if (self.HitChance[NPC_TALENT_1H] >= 10) { self.HitChance[NPC_TALENT_1H] -= Waffenbonus_10; }
else { self.HitChance[NPC_TALENT_1H] = 0; };
};
if (Wears_Morgans_Ring = 1)
{self.HitChance[NPC_TALENT_1H] += Waffenbonus_10;};
//////////////////////////////////////
self.HitChance[NPC_TALENT_2H] = self.aivar[REAL_TALENT_2H];
if (Hlp_IsItem(melweap,ItMW_Addon_Hacker_2h_02))
{self.HitChance[NPC_TALENT_2H] += Waffenbonus_02;}
else if (Hlp_IsItem(melweap,ItMW_Addon_Stab01)) || (Hlp_IsItem(melweap,ItMW_Addon_Hacker_2h_01))
{self.HitChance[NPC_TALENT_2H] += Waffenbonus_03;}
else if (Hlp_IsItem(melweap,ItMW_Addon_Stab03)) || (Hlp_IsItem(melweap,ItMw_Harad2H_01)) || (Hlp_IsItem(melweap,ItMW_Addon_Stab04))
{self.HitChance[NPC_TALENT_2H] += Waffenbonus_04;}
else if (Hlp_IsItem(melweap,ItMW_Addon_Stab05))
{self.HitChance[NPC_TALENT_2H] += Waffenbonus_05;}
else if (Hlp_IsItem(melweap,ItMw_Harad2H_02))
{self.HitChance[NPC_TALENT_2H] += Waffenbonus_06;}
else if (Hlp_IsItem(melweap,ItMw_Harad2H_03))
{self.HitChance[NPC_TALENT_2H] += Waffenbonus_08;}
else if (Hlp_IsItem(melweap,ItMw_2H_Special_01)) || (Hlp_IsItem(melweap,ItMw_Harad2H_04)) || (Hlp_IsItem(melweap,ItMw_2H_Special_02)) || (Hlp_IsItem(melweap,ItMw_2H_Special_03)) || (Hlp_IsItem(melweap,ItMw_2H_Special_04))
{self.HitChance[NPC_TALENT_2H] += Waffenbonus_10;}
else if (Hlp_IsItem(melweap,ItMW_Addon_Keule_2h_01)) {
if (self.HitChance[NPC_TALENT_1H] >= 10) { self.HitChance[NPC_TALENT_1H] -= Waffenbonus_10; }
else { self.HitChance[NPC_TALENT_1H] = 0; };
};
//////////////////////////////////////
self.HitChance[NPC_TALENT_BOW] = self.aivar[REAL_TALENT_BOW];
if (Hlp_IsItem(rngweap,ItRw_Addon_MagicBow)) || (Hlp_IsItem(rngweap,ItRw_Addon_FireBow))
{self.HitChance[NPC_TALENT_BOW] += Waffenbonus_Fern;};
//////////////////////////////////////
self.HitChance[NPC_TALENT_CROSSBOW] = self.aivar[REAL_TALENT_CROSSBOW];
if (Hlp_IsItem(rngweap,ItRw_Addon_MagicCrossbow))
{self.HitChance[NPC_TALENT_CROSSBOW] += Waffenbonus_Fern2;};
};
EDIT2: Und es sind definitiv die Framefunctions selber, die Abhängigkeiten PermMem, Saves und Timer zu initialisieren führt nicht zum Absturz.
Na, ich muss schon den Inhalt der Funktionen sehen, nicht nur den Teil, wo sie registriert/erzeugt werden ;) Vielleicht findet sich da ja eine Ursache.
FFs werden erst ausgeführt, wenn es auch einen Helden gibt, ich wüsste aber nicht, wo das hier zu Problemen führen sollte...
Anscheinend ist irgendwie der Pointer auf den Stack kaputt...
Kommentier den Inhalt von Equip(), Unequip() und hookMagicMode() mal komplett aus. Du sagst zwar, es hat vorher funktioniert, aber irgendwie müssen wir es ja eingrenzen - an den Framefunctions hat sich seit Ewigkeiten nichts geändert, bis auf ein paar zusätzliche Funktionen für den Nutzer (die du offensichtlich nicht benutzt).
Edit: Da sind sie ja schon. Es gibt keine Garantie, dass "self" in DelayedEquip() wirklich das ist, was du denkst (oder überhaupt irgendwas sinnvolles). Da du die Funktion sowieso nur für den Helden aufrufst, kannst du das ja auch gleich mit "hero" ersetzen, das sollte immer gültig sein. Wer weiß, ob das den Fehler hervorgerufen hat.
GiftGrün
26.08.2016, 13:56
Leider nicht. Alle selfs durch heros ersetzt und immer noch Absturz. Auskommentieren des Inhalts der beiden Funktionen Equip und HookMagicMode hilft auch nichts.
Wie genau funktionieren FrameFunctions eigentlich? Benutzen sie einen Hook auf eine Funktion, die jeden Frame aufgerufen wird?
Ja, sie hooken an
const int oCGame__Render = 7112352; //0x6C86A0 Hook: FrameFunctions
Ehrlich gesagt, bin ich mit meinem Latein am Ende. Der Stacktrace weißt nur auf einen merkwürdigen Fehler hin (Daedalus-Stackpointer weg?), Daedalus Stacktrace gibt es keinen und in deinem Code sehe ich nichts, was etwas so verheerendes auslösen könnte.
Würdest du dich bei mir per IM melden (Skype s. Profil oder Steam: lehona__), dann kann man das sicherlich besser betrachten, evtl. kannst du mir ja mal deine kompletten Scripte geben, dann kann ich selber debuggen.
GiftGrün
26.08.2016, 14:04
Hab den Fehler gefunden: Ich habe anscheinend eine Abhängigkeit zu LeGo_Cursor, das in LeGo 2.2.1 noch zusammen mit LeGo_FrameFunctions auf 1 << 3 lag, jetzt aber auf 1 << 6 ist, während FF auf 1 << 5 ist. Obwohl ich keine Ahnung habe, weswegen genau diese Abhängigkeit von Cursor da ist... LeGo_Init(LeGo_FrameFunctions | LeGo_Cursor); behebt den Crash jedenfalls.
Hab den Fehler gefunden: Ich habe anscheinend eine Abhängigkeit zu LeGo_Cursor, das in LeGo 2.2.1 noch zusammen mit LeGo_FrameFunctions auf 1 << 3 lag, jetzt aber auf 1 << 6 ist, während FF auf 1 << 5 ist. Obwohl ich keine Ahnung habe, weswegen genau diese Abhängigkeit von Cursor da ist... LeGo_Init(LeGo_FrameFunctions | LeGo_Cursor); behebt den Crash jedenfalls.
Da hätte ich dich wohl ruhig direkt mal bitten sollen, das mit LeGo_All zu versuchen (und dann Stück für Stück den Schuldigen zu finden) - hab ich irgendwie unterschlagen.
Die Abhängigkeit wirst du wohl selber finden müssen :p
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.