Inhaltsverzeichnis

Spawnen eines NPCs

Hier konntet ihr lernen, wie man einen NPC erstellt. Ganz unten stand auch, wie man ihn anschließen durch Cheaten einfügen kann, was natürlich auf die Dauer keine Lösung ist. Dafür ist nun dieses Kapitel gedacht.

Jeder normale NPC wird beim Betreten der Welt in die Welt eingefügt. Das geschieht über eine Datei namens Startup.d. Diese findet man in [Gothic II-Verzeichnis]\_work\Data\Scripts\Content\Story.

Bevor wird uns einen Teil der Startup.d ansehen und ich den erkläre, noch ein bisschen zur Theorie: Die orginalen Gothic-Welten bestehen alle aus mehreren Teilen, weil sie zu groß sind, als dass man sie alleine laden könnte, das wird von dem Spacer nicht unterstützt. Also teilt man sie in mehrere, kleinere Teile und fügt diese nachher, über Macros, wieder zusammen. Das Ärgernis für den Skripter ist hierbei, dass man herausfinden muss, in welchem Teil der Welten ein Waypoint steht. Denn alle NPCs werden an Way- oder Freepoints gespawnt.

So, nun mal einen Ausschnitt aus der Startup.d :

func void STARTUP_ADDON_PART_GOLDMINE_01 ()
{
	Wld_InsertNpc 	(STRF_1118_Addon_Patrick, 	"ADDON_GOLDMINE");
	Wld_InsertNpc 	(STRF_1119_Addon_Monty, 	"ADDON_GOLDMINE");
	Wld_InsertNpc 	(STRF_1120_Addon_Tonak, 	"ADDON_GOLDMINE");
	Wld_InsertNpc 	(STRF_1121_Addon_Telbor, 	"ADDON_GOLDMINE");
	Wld_InsertNpc 	(STRF_1122_Addon_Pardos, 	"ADDON_GOLDMINE");
 
	[...]
 
};
 
func void INIT_SUB_ADDON_PART_GOLDMINE_01 ()
{
 
};
 
func void INIT_ADDON_PART_GOLDMINE_01 ()
{
	B_InitMonsterAttitudes ();
	B_InitGuildAttitudes();
	B_InitNpcGlobals ();
 
	INIT_SUB_ADDON_PART_GOLDMINE_01();
};

func void STARTUP_ADDON_PART_GOLDMINE_01 ()

func void und () müssen hier, wie eigentlich überall anders auch stehen. STARTUP_ADDON_PART_GOLDMINE_01 ist ein Name, der nicht willkürlich geändert werden kann… Alle Startup-Funktionen müssen, damit sie auch wirklich ausgeführt werden, mit STARTUP_ anfangen und danach den Namen des Weltenteils tragen. Dieser ist in diesem Falle ADDON_PART_GOLDMINE_01.
Diese Startup-Funktion wird also nur aufgerufen, wenn eine Welt mit dem Namen ADDON_PART_GOLDMINE_01 geladen wird!


Wld_InsertNpc 	(STRF_1118_Addon_Patrick, 	"ADDON_GOLDMINE");
Wld_InsertNpc 	(STRF_1119_Addon_Monty, 	"ADDON_GOLDMINE");
Wld_InsertNpc 	(STRF_1120_Addon_Tonak, 	"ADDON_GOLDMINE");
Wld_InsertNpc 	(STRF_1121_Addon_Telbor, 	"ADDON_GOLDMINE");
Wld_InsertNpc 	(STRF_1122_Addon_Pardos, 	"ADDON_GOLDMINE");

Hier befindet sich nur ein neuer Befehl. Dieser lautet Wld_InsertNpc. Dieser Befehl zeigt dem Spiel nachher, dass ein NPC (übrigens sind auch Monster NPCs) eingefügt werden soll. Der Befehl fordert noch zwei weitere Informationen. Im ersten Teil der Klammer, die nach Wld_InsertNpc kommen muss, steht die Instanz des NPCs, der eingefügt werden soll. Hier ist es z.B. STRF_1118_Addon_Patrick, in unserem ersten Tutorial war das PAL_555_Reiner. Nach dieser Instanz kommt ein Komma und danach wird in Anführungszeichen ein Way- oder Freepoint eingetragen, an dem nachher der NPC eingefügt werden soll. Dieser MUSS sich im Teil der Welt befinden (hier ist dieser Teil ADDON_PART_GOLDMINE_01).


func void INIT_SUB_ADDON_PART_GOLDMINE_01 ()
{
 
};
 
func void INIT_ADDON_PART_GOLDMINE_01 ()
{
	B_InitMonsterAttitudes ();
	B_InitGuildAttitudes();
	B_InitNpcGlobals ();
 
	INIT_SUB_ADDON_PART_GOLDMINE_01();
};

Immer, wenn eine Funktion, mit dem Namen STARTUP_WELTTEILNAME ausgeführt wird, sucht Gothic direkt danach, nach einer Funktion, die den Namen INIT_WELTTEILNAME hat. In dieser stehen meist nur vier Befehle. Die ersten drei (B_InitMonsterAttitudes();, B_InitGuildAttitudes();, B_InitNpcGlobals();) müsst ihr nicht wirklich verstehen, sie sorgen nur dafür, dass z.B. Monster den Spieler nicht erst angreifen, wenn der Spieler sie angegriffen hat. Außerdem ruft sie eine Funktion namens INIT_SUB_WELTTEILNAME auf, die hier vor INIT_WELTTEILNAME steht. In diese INIT_SUB_WELTTEILNAME kommen meist Portalzuweisungen, die einen Anfänger erstmal gar nicht interessieren.

Und das wars eigentlich schon! Mit diesem Wissen solltet die gesamte Startup.d verstehen (bis auf die INIT_SUB_WELTTEILNAME).

Ihr könnt übrigens herausfinden, welcher Waypoint in welchem Weltenteil liegt, indem ihr mit dem Spacer die einzelnen Weltenteile durchkämt. Das hat allerdings schon wieder weniger mit Skripten zu tun, weshalb ich nicht weiter darauf eingehe.

In dem Sinne, an die Arbeit. ;)