|
-
[Skriptpaket] Ikarus #3
---
Edit durch die Moderation: dieses Thema ist alt!
Hier geht es zum nächsten:
[Skriptpaket] Ikarus #4
---
[Skriptpaket] Ikarus #1
[Skriptpaket] Ikarus #2
Inhalt dieses Posts
- Einleitung
- Download inklusive Dokumentation
- Auf Ikarus aufbauende Skripte / Anregungen
- Changelog
Einleitung
Dieses Paket macht viele für Modder interessante Engineklassen in Daedalus verfügbar und bietet grundlegende Funktionalität zum Arbeiten mit Engineobjekten, sowie die Möglichkeit, Engine Funktionen aufzurufen.
Desweiteren sind nebem diesem allgemeinen Rahmenwerk auch einige sehr spezielle und unmittelbar nützliche Funktionen Teil dieses Pakets.
Ich möchte hier zunächst eine kurze, unvollständige Übersicht darüber geben, was mit dem Paket möglich ist. Für eine umfassendere Einschätzung möchte ich auf die Doku verweisen.
- Grundfunktionalität
- Lesen und schreiben von Integern und Strings an beliebigen Speicherstellen.
- aus Speicheradresse (int) einen Objektzeiger (instance) gewinnen
- aus einem Objektzeiger (instance) seine Speicheradresse (int) gewinnen
- Enginefunktionen aufrufen
- Unmittelbar nützlich (nur Beispiele!):
- Marvinmodus an und ausschalten
- Spiel pausieren
- Regen kontrollieren
- Truhen oder Türen auf oder abschließen
- Menüelemente bearbeiten (zum Beispiel "Speichern"-Menüpunkt deaktivieren)
- SpawnManager Konstanten bearbeiten
- Informationsbeschaffung:
- Das vom Spieler fokussierte Objekt finden
- Vobs anhand ihres Namens finden
- Position der Kamera ermitteln
- Waynet analysieren
- herausfinden ob eine Taste gedrückt ist
- Kommandozeilenparameter auslesen
- Vollständig neue Möglichkeiten:
- Gothic.ini lesen und schreiben, .ini Datei der Mod lesen
- Daedaluscode zur Laufzeit bearbeiten
- Speicher allozieren und freigeben (flüchtig bzgl. Laden und Speichern!)
- Sonstiges / "Nice to have":
- Suchen von Parsersymbolen anhand ihres Namens
- Funktionen anhand ihres Namens oder Symbolindex aufrufen
- Im Code Labels initialisieren und zu ihnen springen (für elegantere Schleifen)
- Stringfunktionen: Zugriff auf einzelne Zeichen, Länge, Vergleich von Strings, String -> Integer Konvertierung
Nicht für jedes der oben genannte Dinge, gibt es eine für sich stehende vorgefertigte Funktion. Was genau und mit welchen Parametern zur Verfügung steht, ist der Doku zu entnehmen. Grundsätzlich gilt: Dieses Paket ist eher als Türöffner zu verstehen, der das nötige Wissen über den Grundaufbau der Objekte und nur grundlegende Funktionen zur Verfügung stellt. Spezielle Anwendungen müssen selbst daraus abgeleitet werden.
Ich biete zum Beispiel keine Funktionen an, die direkt den Marvin Modus abschaltet. Aber durch dieses Paket ist das Abschalten mit nur zwei Zeilen Code möglich, wenn man weiß wie es geht (in MEM_Game die Eigenschaft game_testmode überschreiben).
Es sind weit mehr als die genannten Dinge möglich. Wenn man sich etwas einarbeitet, kann man mit diesem Paket eine große Menge an neuen Features implementieren. Was dieses Skriptpaket aber ausdrücklich nicht kann, ist Enginefunktionalität zu ersetzen. Als Faustregel gilt: Alle Features, die nur darauf angewiesen sind, Lese- und/oder Schreibzugriff auf die richtigen Daten zu haben oder vorhandene Enginefunktionalität an geeigneter Stelle aufzurufen, sind umsetzbar. Features, die ein vollständig neues Verhalten der Engine benötigen, sind dagegen mit großer Wahrscheinlichkeit nicht umsetzbar.
Es ist aber nicht immer offensichtlich, ob ein konkretes Vorhaben mit Ikarus umgesetzt werden kann oder nicht. Im Zweifelsfall: Fragen! Einschätzungen, ob bestimmte, hier nicht genante Features, möglich sind und wenn ja, welche Klassen, Klasseneigenschaften und Enginefunktionen nützlich sein könnten, können hier im Forum gegeben werden.
Ansonsten hilft das Stöbern in der Dokumentation von Ikarus und den dokumentierten Klassen vielleicht, eine Idee davon zu bekommen, wo man rankommt und wo man vermutlich nicht so einfach rankommt.
Damit die Skripte laufen, muss eine Gothic 2 Reportversion oder Gothic 1 in der Version 1.08k_mod zur Verfügung stehen, auch bei den Spielern! Mit anderen Versionen ist dieses Paket inkompatibel, die Offsets stimmen nicht und Klassen sind möglicherweise verschieden.
Wer sich dafür interessiert mehr aus Gothic herauszuholen wird sich vermutlich auch für G2Ext interessieren. Dieses Projekt soll an dieser Stelle nicht unerwähnt bleiben. Für manche Dinge ist G2Ext sicher besser geeignet als Ikarus. Umgekehrt gibt es auch Dinge, die mit Ikarus bequemer sind. Und es spricht auch nichts dagegen beides auf einmal zu benutzen.
Download inklusive Dokumentation
Ein paar Worte zur Dokumentation vorweg: Wer weiß, was Klassen und Zeiger sind, den wird Abschnitt III langweilen, indem ein paar Grundbegriffe geklärt werden. Abschnitt IV verliert ein paar Worte zu allen Klassen, die in diesem Paket herausgeschrieben sind, Abschnitt V eine Übersicht über die zur Verfügung stehenden Funktionen.
Man beachte auch Abschnitt VII; die Beispiele helfen vielleicht zu verstehen, worum es hier geht.
Download Version 1.2
Leider gibt es noch keine Dokumentation für Version 1.2 und ein Changelog fehlt ebenfalls.
Eine veraltete Version mit Doku und Changelog ist hier verfügbar:
Download Version 1.1.4
Ich empfehle dringend Version 1.2 zu verwenden.
Ein paar komplexere Anwendungen sind im folgenden Abschnitt gelistet.
Einige auf Ikarus aufbauende Skripte / Anregungen
Ein Umfangreiches auf Ikarus aufbauenes Paket mit einigen schönen Anwendungen ist LeGo.
Eine kleine Mod in der Ikarus intensiv zum Einsatz kommt und deren Quelltext frei verfügbar ist, ist Irrwichtel
Kleinere Anwendungen und einzelne Skripte:
- Technisches
- Ideen / Anregungen / Beispiele
- Unmittelbar nützliches
Changelog
Edit: 23.03.10, 18 Uhr: Neue Version, die IntToString benutzt anstatt mein Kürzel i2s. 
Edit: 23.03.10, 19:30 Uhr: Fix in STR_GetCharAt. Die Funktion hat nicht funktioniert. Außerdem Umwandlung von Tabs in Leerzeichen (für Leute mit anderer Tabsize).
Edit: 02.05.10, 22 Uhr: Diverse Fixes am Code und Verbesserungen an der Dokumentation.
Edit: 24.05.10, 17 Uhr: MEM_Realloc und Sprünge ergänzt sowie ein Bugfix und Dokuupdate.
Edit: 13.06.10, 23 Uhr: - CallByString und CallByID Funktionalität ergänzt durch Funktionen, die Parameter pushen und Rückgabewerte popen. Beispiel 5 in der Dokumentation beschäftigt sich damit.
- Alte CallByString und CallByID Derivate herausgenommen (ich hoffe die hat noch keiner benutzt).
- In zCParser.d ein paar genauere Kommentare zu den Parsertokens eingefügt.
- oCMag_Book Klasse hinzugefügt in Misc.d
Edit: 20.06.10, 1 Uhr: - zCOption dokumentiert und Zugriffsmöglichkeit auf die .ini Dateien geschaffen.
- MEM_ArrayInsert hinzugefügt (Nebenprodukt des .ini Zugriffs)
- Möglichkeit die Kommandozeilenparameter auszulesen
- entsprechendes Dokuupdate, rewrite dieses Posts
Edit: 25.06.10, 16 Uhr: Konstanten in zCTrigger.d korrigiert.
Edit: 27.06.10, 11 Uhr: Die Funktion MEM_KeyState hinzugefügt.
Edit: 04.08.10, 17 Uhr:- Reimplementierung des Ikarus Kerns und vieler Funktionen (auf elegantere Weise, dadurch auch kompakter)
- Auslagerung aller Konstanten (vorwiegend Adressen) in zugehörige Klassendateien bzw. in eine neue Datei Ikarus_Const.d.
Ikarus.d selbst sollte damit unabhängig von der Gothic-Version sein und um Ikarus Gothic 1 tauglich zu machen müssen nur Ikarus_Const.d und evtl. die Klassendateien angepasst werden. - diverse Bugfixes
- Konstanten für virtuelle Tastencodes in großem Umfang hinzugefügt (zu finden in Ikarus_Const.d).
- Einige zCArray Funktionen (zum Beispiel um in Dingen wie der activeVobList herumzuschmieren oder als temporärer, skriptinterner Speicher).
- Neu: MEM_InsertKeyEvent zum fingieren von Tastendrücken (funktioniert nur begrenzt)
- Neu: MEM_CopyBytes / MEM_CopyWords zum Kopieren einer vorgegebenen Datenmenge von einer Quelle zu einem Ziel.
- Neu: MEM_SearchAllVobsByName: Baut ein zCArray mit Zeigern auf sämtliche Vobs mit bestimmten Namen und liefert Zeiger auf das zCArray zurück.
- Neu: STR_SubStr und STR_Prefix zum Abgreifen von Teilstrings.
Version 1.0, 21.09.10: - Versionsnummer eingeführt.
- Teilweise Unterstützung von G1.
- Es gibt nun die Funktionen MEM_PtrToInst, MEM_InstToPtr, MEM_GetClassDef, MEM_GetClassName, MEM_ReadStatArr, MEM_WriteStatArr, MEM_InitStatArrs, MEM_InitAll, MEM_TriggerVob, MEM_UntriggerVob, MEM_RenameVob, MEM_ReadByte, MEM_WriteByte.
- VORSICHT ÄNDERUNG: MEM_GetMenuByString und MEM_GetMenuItemByString geben nun 0 zurück, wenn sie keinen Erfolg haben anstatt -1.
- Einige Ausbesserungen und Ergänzungen in zCMenu.d
Version 1.1, 31.12.10:- "ASM_" Funktionen um Maschinencode zu diktieren und auszuführen.
- Darauf aufbauend "CALL_" Funktionen, die es erleichtern Engine Funktionen auszuführen.
- MEM_MessageBox und MEM_InfoBox hinzugefügt.
- MEM_InsertVob hinzugefügt (danke an Gottfried!).
- Konstante GOTHIC_BASE_VERSION eingeführt. Sie ist 1 in Ikarus_Const_G1.d und 2 in Ikarus_Const_G2.d. Dies erleichtert es Code zu schreiben, der auf beiden Plattformen läuft.
Version 1.1.1, 03.01.11: - Die Funktionen LoadLibrary, GetProcAddress und FindKernelDllFunction hinzugefügt.
- Die Funktion MemoryProtectionOverride hinzugefügt.
- Die Funktion CALL__cdecl hinzugefügt.
Version 1.1.2, 25.06.11: - Die Funktionen STR_Split, STR_SplitCount, STR_GetAddress, MEM_SwapBytes, MEM_SwapWords und MEM_PopInstResult hinzugefügt (siehe Doku).
- MEM_CallByString / MEM_CallByID funktionieren nun auch mit Externals.
- MEM_NullToInst erwartet nun sinnvollerweise keinen Parameter mehr.
- Bitmasken oCNpc.d korrigiert (zum Beispiel die für Kopf und Körpertexturnummern waren fehlerhaft)
- Diverses.
Version 1.1.2a, 25.06.11: - Die Funktionen STR_IndexOf, MEM_CompareBytes, MEM_CompareWords hinzugefügt.
- Bugfix in der Funktion STR_GetAddressInit.
Version 1.1.3, 16.08.11: - Subtiles Problem in MEM_ArrayInsert gelöst, wenn es auf Engine-Arrays angewendet wird. Dies behebt auch Probleme in MEM_RenameVob, MEM_TriggerVob, MEM_UntriggerVob, MEM_InsertKeyEvent und MEM_SetGothOpt.
- Internes Problem bzgl. Gothic 1 und ExitSession (Ikarus konnte nicht geparst werden).
- MEM_GetKey und MEM_GetSecondaryKey zum Abfragen von Tastenbelegungen.
- MEM_GetFuncID und MEM_Call hinzugefügt (geringe Relevanz, siehe Doku).
- Floatpaket dem Download beigelegt.
Version 1.1.4, 12.11.11:
- Performanz
- Die CALL_ Funktionen sind nun etwa 10 mal so schnell wie zuvor.
- MEM_ReadInt und MEM_WriteInt sind etwa dreimal so schnell wie zuvor.
- neue Funktionen
- MEM_GetSystemTime
- MEM_BenchmarkMS, MEM_BenchmarkPC, MEM_BenchmarkMS_N, MEM_BenchmarkPC_N
- STR_Upper
- MEM_GetIntAddress, MEM_GetFloatAddress, MEM_GetStringAddress
- MEM_GetFuncPtr, MEM_GetFuncOffset
- Korrekturen / Verbesserungen
- Bugfix: STR_Split. Fehlerhafte Rückgabe, falls zweimal hintereinander der selbe String gesplitet werden soll, aber mit einem abweichenden Separator (vermeintlicher Cache-Hit)
- Verbesserung: MEM_Call und MEM_GetFuncID sind nun wesentlich allgemeiner anwendbar.
Last edited by Milky-Way; 16.10.2013 at 02:15.
-
In der Constants.d steht:
//
// INVENTORY CAPACITIES // --- werden vom Programm ignoriert - INV ist unendlich groß! ---
//
CONST INT INV_MAX_WEAPONS = 6 ;
CONST INT INV_MAX_ARMORS = 2 ;
CONST INT INV_MAX_RUNES = 1000 ; // virtually infinite
CONST INT INV_MAX_FOOD = 15 ;
CONST INT INV_MAX_DOCS = 1000 ; // virtually infinite
CONST INT INV_MAX_POTIONS = 1000 ; // virtually infinite
CONST INT INV_MAX_MAGIC = 1000 ; // virtually infinite
CONST INT INV_MAX_MISC = 1000 ;
Lässt sich das irgendwie wieder "aktivieren"?
-
Da braucht man gar kein Ikarus für.. Geh einfach alle Items durch (Npc_GetInvItemsBySlot oder so ähnlich..), zähle sie und wirf wenns zu viele sind einfach überschüssige weg 
MfG Gottfried
-
 Originally Posted by Gottfried
Da braucht man gar kein Ikarus für.. Geh einfach alle Items durch (Npc_GetInvItemsBySlot oder so ähnlich..), zähle sie und wirf wenns zu viele sind einfach überschüssige weg
Ich dachte, dass man das mit Ikarus eventuell mit weniger Script lösen kann.
-
 Originally Posted by LordEdhor
Ich dachte, dass man das mit Ikarus eventuell mit weniger Script lösen kann. 
Das Problem ist nicht die Funktionalität, sondern die Spielmechanik.
Die entscheidende Frage, die es bei einem limitierten Inventar zu beantworten gilt, ist: Welche Gegenstände sind wichtiger als andere?
(in einem Dialog wird ein Gegenstand übergeben, welcher für die Fortsetzung des Spiels dringend benötigt wird - welcher Gegenstand soll entfernt werden wenn das Inventar gerade voll ist?!)
"Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
 Originally Posted by NicoDE
Das Problem ist nicht die Funktionalität, sondern die Spielmechanik.
Die entscheidende Frage, die es bei einem limitierten Inventar zu beantworten gilt, ist: Welche Gegenstände sind wichtiger als andere?
(in einem Dialog wird ein Gegenstand übergeben, welcher für die Fortsetzung des Spiels dringend benötigt wird - welcher Gegenstand soll entfernt werden wenn das Inventar gerade voll ist?!)
Ich wollte die Limitierung lediglich für Waffen einführen. Da man in meiner Mod keine Waffen über Dialoge erhalten wird, sollte so ein Problem eigentlich nicht auftreten.
-
 Originally Posted by LordEdhor
Ich wollte die Limitierung lediglich für Waffen einführen.
Denk auch daran, dass die Waffen normalerweise stapelbar sind
"Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
Last edited by MyFreshP; 21.03.2011 at 20:27.
-
 Originally Posted by LordEdhor
Edit: Ist es nun möglich mit Ikarus die Limitierung des Inventars wieder zu "aktivieren" oder muss ich da eine Menge Code schreiben und jeden Slot des Inventars durchgehen?
Es würde mich sehr überraschen, wenn von dem System noch irgendetwas in der Engine übrig ist, was auch nur ansatzweise brauchbar ist.
Du müsstest das selbst coden.
-
 Originally Posted by Sektenspinner
Es würde mich sehr überraschen, wenn von dem System noch irgendetwas in der Engine übrig ist, was auch nur ansatzweise brauchbar ist.
Du müsstest das selbst coden.
Schade! Naja, dann halt über die andere Möglichkeit.
-
Ich würde vorschlagen dem Spieler die Möglichkeit zu lassen sich zu überladen. Allerdings darf er dann nur noch gehen (nicht mehr laufen oder sprinten) und sich auch nicht mehr teleportieren. Das sollte Anreiz genug sein nicht überladen rumzurennen. Andererseits brauchst du nur das Inventar auszuzählen, und die Beschränkungen sollten mit Ikarus kein Problem sein.
-
Ein oCNpc hat (u.a.) die Eigenschaften:
Code:
var int bloodEnabled; // 0x0444 int
var int bloodDistance; // 0x0448 int
var int bloodAmount; // 0x044C int
var int bloodFlow; // 0x0450 int
var string bloodEmitter; // 0x0454 zSTRING
var string bloodTexture; // 0x0468 zSTRING
Aber was bewirken die? Ich hatte die Integer auf 0 und die Strings auf "" gesetzt, aber es hat sich nichts verändert.
Mein Ziel ist es, dass ein Npc beim Erstechen nicht blutet. Da ich nicht herausfinden konnte, wieso er überhaupt blutet (nichts in der HumanS.mds gefunden), hatte ich an Ikarus gedacht.
Es gibt ja auch noch die Blut-Details in der .ini - würde es zum Ziel führen die (immer nur für kurze Zeit) herunterzustellen?
-
Die ersten vier Eigenschaften beziehen sich auf das Blut während dem Kampf.
Die letzte Eigenschaft bezieht sich in der Tat unter anderem auf das Blut beim Abstechen. Offenbar wird aber die Textur des Mörders auf dem Boden erzeugt, nicht die des Opfers.
Mit anderen Worten, nach folgendem Code:
Code:
var oCNpc ocKlara;
ocKlara = Hlp_GetNpc(Klara);
ocKlara.bloodTexture = "";
Als ich Klara getötet habe war alles normal. Als ich dann mit Klara den Spieler getötet habe, enstand ein großes graues Quadrat unter dem Spieler. 
Der Bug ist wohl bisher noch niemandem aufgefallen (wie auch?).
-
Perfekt, so klappt es wunderbar, danke.
Ist dir das zufällig aufgefallen oder konntest du irgendwo sehen, dass die Textur des Helden verwendet wird (und hätte ich das auch irgendwo sehen können)?
-
 Originally Posted by Milky-Way
und hätte ich das auch irgendwo sehen können?
Nö wüsste nicht wo du da gezielt hättest suchen können. Wenn du nicht gerade eine Glaskugel hast, hilft nur zufälliges drüberstolpern.
-
Wäre es vielleicht möglich an die Klasse 'zCTexture' zu kommen? Ich bräuchte sie für einige Testzwecke 
Danke schonmal 
MfG Gottfried
-
Ich habe ein neues, mir unerklärliches, Problem:
Ich habe einen Trigger, der jeden Frame feuert. Das funktioniert eigentlich auch mit meiner Welt.ZEN
Jetzt habe ich die Welt.ZEN genommen, neu kompiliert (wg. Meshänderungen, Portale) FP und WP hinzugefügt und gespeichert. Resultat:
Das Spiel bleibt beim Starten eines neuen Spiels bei 3/4 des Ladebalkens erstmal eine Weile hängen und beendet sich dann ohne Fehlermeldung.
zSpy:
Code:
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 2 U: PAR: Adressing an empty Instance : OCNPC.FOCUS_VOB .... <zParser_Symbol.cpp,#365>
00:53 Warn: 0 C: SCRIPT: Npc_IsInState(): illegal param: "HERO_APPLYKILLOVERLAY.FOCUS_NPC" is NULL. .... <oGameExternal.cpp,#252>
00:53 Warn: 0 C: SCRIPT: last parser func-name: SCRIPT_PER_FRAME .... <oGameExternal.cpp,#262>
00:53 Info: 8 B: TRIGGER: oCTriggerScript TRIGGER_FRAME triggered -> SCRIPT_PER_FRAME .... <oTrigger.cpp,#157>
00:53 Info: 5 C: Shutting down MSS .... <zSndMss.cpp,#629>
00:53 Info: 10 C: done .... <zSndMss.cpp,#652>
00:53 Info: 5 X: EmergencyExit: Releasing all DirectX-Objects ... .... <zRndD3D_Render.cpp,#283>
00:53 Info: 5 X: EmergencyExit: D3DXUninitialize done .... <zRndD3D_Render.cpp,#301>
00:53 Warn: 0 X: [RND3D-Destructor]: Can't uninitialize D3DX Utility Library ! Error: D3DXERR_D3DXNOTSTARTEDYET .... <zRndD3D.h,#127>
00:53 Info: 5 X: [RND3D-Destructor]: D3DXUninitialize done .... <zRndD3D_Render.cpp,#309>
Problem muss definitiv die Triggerschleife sein. Nehme ich das Wld_SendTrigger aus dem Schleifenskript, kann ich das Spiel starten. Der Trigger wird auch aus der Startup aufgerufen, ruft das Skript auf (u.a. mit einem Print), ohne Wld_SendTrigger geht es aber natürlich nicht weiter.
Also, irgendjemand eine Idee, woran es liegen könnte?
Warum klappt es mit der ersten .zen normal und stürzt bei der erweiterten ab?
-
Dass du im Skript den Fokus des Helden abfragst, bevor der Held existiert ist zwar nicht wahnsinnig sauber, sollte aber nicht das Problem sein.
Das ganze sieht so ein bisschen nach Endlosschleife aus, prüfe mal ob du im oCTriggerScript wirklich einen positiven Firedelay eingestellt hast und ob Wld_SendTrigger zurückkehrt (indem du z.B. eine PrintDebug Meldung nach dem Wld_SendTrigger einbaust; vorher MEM_SetShowDebug(1) benutzen).
Könnte aber sein, dass es gar keine Endlosschleife ist (falls das was du an Spy Log gepostet hast wirklich alles ist und es nicht weiter oben im Log noch sehr lange so weiter geht ist es keine), dann stürzt vielleicht einfach deine Schleifenfunktion ab. Auch hier hilft es mit Debugmeldungen einzugrenzen, ob sie korrekt betreten und korrekt verlassen wird (und falls das ein Problem andeutet, bis wohin sie denn fehlerfrei ausgeführt wird).
@Gottfried: zCTexture ist relativ umfangreich, aber ich glaube das hatte sich ja ohnehin geklärt.
-
Problem hat sich geklärt, fireDelay war 0. Fragt mich nicht, wie es dazu kam.
-
Muss ich eig noch was an sektis Frametrigger machen damit er funktioniert?
ich hab da nämlich ne printfunktion aufrufen wollen (die ist korrekt keine sorge hat sekti schon getestet) und sie erschien nicht.
Damit das niemand extra nochmal aufrufen muss hier sein skript:
Code:
func void meineSchleifenFunktion() {
//Es wird gleich MEM_Timer genutzt, der muss initialisiert sein
MEM_InitGlobalInst();
//Triggernachricht senden
Wld_SendTrigger ("MEIN_SCHLEIFEN_TRIGGER"); //ruft meineSchleifenFunktion auf
//Triggerscript holen:
var oCTriggerScript Mein_Schleifen_Trigger;
Mein_Schleifen_Trigger = MEM_PtrToInst (MEM_SearchVobByName ("MEIN_SCHLEIFEN_TRIGGER"));
Mein_Schleifen_Trigger._zCVob_nextOnTimer = MEM_Timer.totalTimeFloat; //wäre eigentlich jetzt schon wieder dran, wird aber erst im nächsten Frame bemerkt
};
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
|
|