Daedalus- und Ikarus-Neuling hier. Ich versuche gerade, in einem Dialog zwischen PC und NPC ein VOB verschwinden zu lassen. Anwendungsfall ist, das nach einer bestimmten Dialogzeile als Teil der Quest eine Location aufgeräumt wird und bspw. Spinnweben verschwinden. Zum Testen wollte ich heute erstmal mit einem VOB, das einen eindeutigen Namen hat (nennen wir es einfallsreicherweise "VOBNAME"), anfangen. Dazu habe ich, wie hier beschrieben, das VOB mittels
Code:
MEM_DeleteVob(MEM_SearchVobByName("VOBNAME"));
versucht zu löschen.
Das Spiel startet und lädt auch den Spielstand, aber sobald ich den betreffenden Dialog triggere, bekomme ich immer folgende Access Violation:
Du könntest auch mal prüfen ob MEM_SearchVobByName da überhaupt einen brauchbaren pointer liefert.
Also irgendwie so:
Code:
var int vobPtr;
vobPtr = MEM_SearchVobByName(vobName);
if (!vobPtr) {
MEM_Error("ungültiger pointer!");
return;
};
var zCVob vob; vob = _^(vobPtr);
// hier vielleicht ein paar Eigenschaften des vobs ausgeben lassen (visual?), um zu schauen ob das richtige vob gefunden wurde
MEM_DeleteVob(vobPtr);
Falls da ein brauchbarer pointer auf das richtige Objekt zurückgegeben wird, dann wäre wahrscheinlich interessant was genau du da löschst.
Ist das vob Teil eines vobtrees (also: hat es ein parent vob)?
Danke für deine schnelle und ausführliche Rückmeldung!
Über deinen Tipp habe ich gelernt, wie man mit Ikarus debuggt. Das hat mir geholfen, den Fehler zu finden, der aber letztlich ein anderer (und gar nicht mal so undummer) war: Ich hatte vergessen, vor dem Code "MEM_InitAll" aufzurufen.
Wo sollte ich das eigentlich geschickterweise tun? Ich weiß es für Gothic 2 (in der INIT_GLOBAL der Startup.d), modde aber Gothic 1.
Wo sollte ich das eigentlich geschickterweise tun? Ich weiß es für Gothic 2 (in der INIT_GLOBAL der Startup.d), modde aber Gothic 1.
Diese Erklärung ist für LeGo, lässt sich aber 1:1 auf Ikarus übertragen. Bedenke auch, dass man MEM_InitAll() so häufig aufrufen kann wie man möchte (also lieber zu viel als zu wenig).
Diese Erklärung ist für LeGo, lässt sich aber 1:1 auf Ikarus übertragen. Bedenke auch, dass man MEM_InitAll() so häufig aufrufen kann wie man möchte (also lieber zu viel als zu wenig).
Danke, Lehona! Das muss ich übersehen haben. Und auch das mit den mehrmaligen Aufrufen ist gut zu wissen.