Zitat von
yukoz
As I understand it, there is a limit to adding Nav_Zone and Nav_Path in Gothic 3.
When I try to add more Nav_Zone and Nav_Path to Gothic 3, the game freezes and crashes.
Is there a way to avoid this restriction?
NavigationMap.xnav
You are correct, there is such a restriction/bug in the game. But you are lucky, because I fixed that bug a long time ago, during my work for the Community Story Project.
Here is my post from the internal CSP forum which describes the cause of the error:
Ja ihr habt richtig gehört, ich habe den Bug gefunden und ihn auch beseitigen können.
Der Fehler war nicht im NavigationMap Code, sondern auf viel abstrakterer Ebene.
Es ist eine eigentlich ganz triviale Sache, es wurde an der falschen Stelle gespart, und zwar bei der Verweis-Zählvariable der Stringklasse. Diese wird intern zur Resourcenverwaltung verwendet, d.h. wenn ein neue Instanz dieses Strings erstellt wird, wird sie um eins erhöht, wenn eine Instanz zerstört wird, wird sie um eins erniedrigt. Wenn sie auf 0 fällt, wird der Basisstring freigegeben, und der von ihm belegte Speicher kann nun wieder für andere Sachen verwendet werden.
Sie ist vom Typ unsigned short, welcher Zahlen im Bereich von 0 bis 65535 speichern kann.
Beim Einlesen der NavigationMap wurden soviele Strings mit dem Inhalt gCNavZone_PS erstellt, dass der Verweiszähler den Maximalwert seines Wertebereichs überschritten hat. D.h. wenn der Verweiszähler auf 65535 steht und um eins erhöht wird, steht er anschließend wieder auf 0.
Nach dem Einlesen wurde einige der gCNavZone_PS String Instanzen wieder zerstört, aber nicht alle. Aufgrund des Bereichsüberlaufs, erreichte der Zähler trotzdem den Wert 0, was dafür sorgte, dass der Basisstring freigegeben wurde.
Instanzen eines Strings sind auf den Basisstring angewiesen, und funktionieren ohne diesen nicht richtig. Ich denke ihr könnt euch vorstellen, dass es nicht gut für die Stabilität des Systems ist, wenn die Instanzen eines Strings auf ihren Basisstring zugreifen, aber die Stelle im Speicher, an der er sich befinden sollte, inzwischen für etwas ganz anderes verwendet wird.
In diesem Fall sorgte es dafür, dass der NavigationMap Code nicht mehr korrekt auf die NavZonen zugreifen konnte, und infolge dessen einen Guru verursachte.
Nun zur Lösung des Problems...
Naheliegend ist es den Typ des Verweiszählers auf unsigned int (Wertebereich von 0 bis 4294967295) zu ändern.
Problem ist nur, dass der Verweiszähler an vielen Stellen im Code manipuliert/abgefragt wird, das zu ändern ist ein Riesenaufwand.
Da ich keine andere Möglichkeit gesehen habe, habe ich mich trotzdem dran gemacht, und war dann letztendlich auch erfolgreich...
Since there now seems to be a demand for this fix outside of the CSP, I'll make the effort to extract it from my CSP specific changes and release it separately.
I should be able to get to this the next few days.