===== Ein neuer NPC erwacht zum Leben =====
Wichtig: Dieser Script ist für Gothic 2, unten steht der für Gothic 1!
Zuerst einmal : Alles was hinter %%//%% steht, wird nicht mitgeparst. Dort könnte also auch "Gothic ist toll" stehen, und es hätte keinerlei Bedeutung.
Zuerst poste ich einen kompletten von mir erstellten NPC - Script, und dann werde ich ihn erklären.
----
INSTANCE PAL_555_Reiner (Npc_Default)
{
// NSC
name = "Reiner";
guild = GIL_PAL;
id = 555;
level=50;
flags=0;
voice = 4;
npctype = NPCTYPE_MAIN;
// Attribute
attribute[ATR_STRENGTH] =200;
attribute[ATR_DEXTERITY] =200;
attribute[ATR_MANA_MAX] =100;
attribute[ATR_MANA] =100;
attribute[ATR_HITPOINTS_MAX]=300;
attribute[ATR_HITPOINTS]=300;
// NSC relevante Talente vergeben
B_GiveNpcTalents (self);
// Kampf-Taktik
fight_tactic = FAI_HUMAN_MASTER;
// Equippte Waffen
EquipItem (self, ItMw_Drachenschneide);
// Inventory
B_CreateAmbientInv (self);
// visuals
B_SetNpcVisual (self, MALE, "Hum_Head_FatBald", Face_P_Gilbert, BodyTex_P, ITAR_VLK_M);
Mdl_SetModelFatness (self, 0);
Mdl_ApplyOverlayMds (self, "Humans_Militia.mds");
// Kampf-Talente
B_SetFightSkills (self, 100);
//TA
daily_routine= Rtn_Start_555;
};
FUNC VOID Rtn_Start_555()
{
TA_Stand_WP(18,00,09,00,"NW_FARM1_PATH_CITY_SHEEP_09");
TA_Stand_WP(09,00,18,00,"NW_FARM1_PATH_CITY_SHEEP_09");
};
----
Um zu skripten, wird ein Texteditor benötigt, für den Anfang reicht erst mal der Standard Windows - Editor (bitte kein Word benutzen!).
Wir erstellen also ein neues Dokument, nun kann es also losgehen.
INSTANCE PAL_555_Reiner (Npc_Default)
{
Zunächst definiert man die sogenannte Instanz des Npcs. Als Instanz bezeichnet man eine abgeschlossene Einheit mit einer bestimmten Funktion, stellt es euch einfach als Npc-Objekt vor. Deswegen das INSTANCE.
Das was nun folgt, ist der eindeutige Name der Instanz. Im Prinzip kann man jeden beliebigen Namen nehmen, dieser muss aber eindeutig sein und darf nur einmal bei allen NPCs vorkommen. Piranha Bytes hat die Namensgebung wie folgt geregelt: Zuerst die Gilde ("PAL" - für Paladin in diesem Fall) dann die ID (eine eindeutige Nummer, aber dazu später) und nun der Name des NPCs .
Das (Npc_Default) kommt hinter den Instanznamen eines jeden NPCs.
In die { kommt nun was die Instanz beinhaltet.
----
// NSC
name = "Reiner";
guild = GIL_PAL;
id = 555;
level=50;
flags=0;
voice = 4;
npctype = NPCTYPE_MAIN;
Sieht schwer aus, ist es aber gar nicht.
Bei ''name=...'' kommt der Name hin, der im Fokus angezeigt wird.
Das nächste bestimmt die Gilde, in diesem Fall Paladin. Es gibt verschiedene Gilden und anfangs solltet ihr, falls der NPC später eine andere Gilde haben soll, in den anderen Skripten gucken, wie die Kürzel der anderen Gilden ist.
Was nun kommt ist die ID. Sie ist eine eindeutige Nummer zur Identifizierung eines NPCs. Nur 1 NPC darf diese Nummer innehaben.
Das Level des Npcs bestimmt dessen Stufe und soll seiner Kampfstärke entsprechen. Das Level entscheidet, wieviel Erfahrung der Spieler bekommt, wenn er diesen Npc besiegt.
''Flags ='' Da gibt es nur zwei Typen, nämlich ''FLAG_IMMORTAL'' (unsterblich) bzw. ''FLAG_GHOST'', für uns nicht relevant. Weil unser NPC vorerst ganz normal ist, kommt dort eine 0 hin.
''Voice='' es gibt 17 verschiedene Stimmen, für die Sachen die NPC´s nebenbei sagen, z.B. bei Smalltalk und wenn sie ein Monster gekillt haben. Hier kann man sie angeben. Stimme 16 und 17 sind weibliche Stimmen, Stimme 15 gehört dem Spielercharakter.
''Npctype='' Es gibt verschiedene Npc-Typen. So kann man hier beispielsweise auch ''NPC_AMBIENT'' einfügen, damit der Charakter die Standard-Ambientdialoge von sich gibt (z.B. wie man sich in Khorinis zurechtfinden kann). ''NPC_MAIN'' ist eigentlich immer eine gute Wahl. :) Ein ''NPC_AMBIENT'' erhält z.B. vorgefertigte Standard-Antworten die man von Standard-Npcs in Khorinis kennt.
----
// Attribute
attribute[ATR_STRENGTH] =200;
attribute[ATR_DEXTERITY] =200;
attribute[ATR_MANA_MAX] =100;
attribute[ATR_MANA] =100;
attribute[ATR_HITPOINTS_MAX]=300;
attribute[ATR_HITPOINTS]=300;
Hier die Attribute des NPCs, bedarf eigentlich keiner Erklärung.
Strength ist Stärke, Dexterity Geschicklichkeit, Mana ist Mana und Hitpoints ist die Lebensenergie.
Wenn ein MAX angehängt ist, ist es das was der NPC maximal haben kann. Also nur für angeschlagene NPC´s etc. interessant.
----
Hier kann man auch einfach
''B_SetAttributesToChapter (self, x);''
hinschreiben. Das x steht für eine Zahl 1 bis 6, also von Kapitel 1 bis Kapitel 6.
Damit muss man nicht jedes Attribut einzeln aufschreiben.
Die Attribute für die einzelnen Zahlen sind in ''_work/data/Scripts/Content/Story/NPC_Scripts'' definiert.
----
// NSC relevante Talente vergeben
B_GiveNpcTalents (self);
// Kampftaktik
fight_tactic = FAI_HUMAN_MASTER;
// Equippte Waffen
EquipItem (self, ItMw_Drachenschneide);
// Inventory
B_CreateAmbientInv (self);
''B_GiveNpcTalents (self);'' gibt einem NPC die relevanten Talente. Die relevanten Talente sind Schleichen, Schlösserknacken etc. Macht man bei jedem NPC.
Es gibt 3 Kampftaktiken: ''FAI_HUMAN_COWARD'', ''FAI_HUMAN_STRONG'' und ''FAI_HUMAN_MASTER''.
Das erste ist die schlechteste Kampftaktik, die letzte die Beste. Hier kann man also angeben, wie gut der NPC kämpft. (allerdings nicht von den Waffenwerten her, nur vom Verhalten!)
''EquipItem (self, ItMw_Drachenschneide);'' ist der Befehl zum Drachenschneide equippen. Also ''EquipItem (self,und der hier der Instanzname der equippten Waffe);''
Das Ambient Inventory sollte bei jedem NPC equipped werden, damit der Spieler auch den NPC ausbeuten kann, wer er ihn mal niedergeschlagen hat.
----
// visuals
B_SetNpcVisual (self, MALE, "Hum_Head_FatBald", Face_P_Gilbert, BodyTex_P, ITAR_VLK_M);
Mdl_SetModelFatness (self, 0);
Mdl_ApplyOverlayMds (self, "Humans_Militia.mds");
Das ist nun das Aussehen: ''Hum_Head_FatBald'' ist die Kopfform, ''Face_P_Gilbert'' ist die Gesichtstextur, ''BodyTex_P'' ist die Körpertextur (mehr davon findet ihr in der ''AI_Constants.d'') und ''ITAR_VLK_M'' ist die Rüstung.
''Mdl_SetModelFatness (self, 0);'' ist auf gut Deutsch das Fett des NPCs. Hier kann man statt der 0 "-3" bis "2" eintragen.
Und das letzte, ''Humans_Militia.mds'' ist die Bewegungsanimation (bei ''Humans_Militia.mds'' bewegt sich der NPC wie ein Milizsoldat).
Grundsätzlich gilt: Um herauszufinden welche Rüstungen wie heißen, wie die Bewegngsanimation heißt etc.
Immer in einem NPC Script nachschauen von dem man sicher weiß, dass er die Rüstung hat/sich so bewegt.
----
//Kampf-Talente
B_SetFightSkills (self, 100);
Das sind alle Kampftalente (Einhänder, Zweihänder, Bogen, Armbrust), je nach dem, wie gut der NPC sein soll. Hier bekommt der Npc maximales Talent für jeden Kampfstil.
----
//TA
daily_routine= Rtn_Start_555;
};
FUNC VOID Rtn_Start_555()
{
TA_Stand_WP(18,00,09,00,"NW_FARM1_PATH_CITY_SHEEP_09");
TA_Stand_WP(09,00,18,00,"NW_FARM1_PATH_CITY_SHEEP_09");
};
Das gehört zum Tagesablauf, der im nächsten Kapitel erklärt wird.
Bei ''FUNC VOID Rtn_Start_555()'' in die geschweiften Klammern (''{'' und ''};'') gehört, was der NPC in seinem Tagesablauf tut. Wird gleich erklärt.
Wer gut aufgepasst hat, wird bemerkt haben, dass die 555 schon die ID unseres NPCs ist. Diese muss hier dementsprechend mitgeändert werden.
----
==== Der Tagesablauf ====
Der Tagesablauf, kurz TA, gibt an, was die NPC´s den lieben langen tag so machen. Deswegen schauen wir uns jetzt einmal den Tagesablauf meines oben gescripteten Reiners an.
--------
FUNC VOID Rtn_Start_555()
{
TA_Stand_WP(18,00,09,00,"NW_FARM1_PATH_CITY_SHEEP_09");
TA_Stand_WP(09,00,18,00,"NW_FARM1_PATH_CITY_SHEEP_09");
};
--------
Zuerst sehr verwirrend, aber beim nächsten hinschauen recht simpel. TA_Stand ist eine Animation, kurz Ani. Sie wird am Anfang angegeben. Dann die Uhrzeit, von wann bis wann. In diesem Fall von 18:00 Uhr Abends bis 09:00 Uhr morgens.
Nun kommt der Waypoint (nicht Freepoint!) an dem der NPC etwas machen soll. Dazu muss man sich die Namen der Waypointe im Spacer am besten anschauen und aufschreiben. Alternativ kann man, während man Gothic spielt, den Marvin-Mode öffnen (drücke b marvin b), drück dann auf F2 und gib "toggle waynet" ein. Oder man kopiert sie aus bereits vorhandenen Scripten.
Allerdings muss ein NPC immer mindestens 2 TAs haben.
Mein NPC macht zwar momentan noch nicht viel, momentan steht er nur den ganzen Tag an einem Waypoint, aber über die verschiedenen Animationen in den Gothic Scripten und ein bisschen nachforschen hat man den Bogen schnell raus. Beispielsweise könnte das zweite TA_Stand auch TA_Stand_Drinking heißen, dann würde der NPC von 9:00 Uhr bis 18:00 Uhr etwas trinken.
==== Den NPC im Spiel benutzen ====
Um den NPC auch während des Spieles benutzen zu können, müsst ihr ihn als Skriptdatei abspeichern. Dazu ist zuerst einmal die Installation des Modkits (insbesondere der Skripte) vorrausgesetzt. Ihr habt anfangs den NPC ja in euren Editor eingegeben. Nun müsst ihr "Speichern unter..." machen und geht in folgenden Ordner: ''[Gothic II-Verzeichnis]\_work\Data\Scripts\Content\Story\NPC''. Normalerweise ist das Gothic II-Verzeichnis ''C:\Programme\Jowood\Gothic II''. Nun musst ihr noch den Dateinamen eingeben (die Instanz ''PAL_555_Reiner'' eignet sich dafür sehr gut) und dahinter ein .d (also ''PAL_555_Reiner.d''). Falls ihr den Standardeditor von Windows benutzt, müsst ihr noch den Dateityp (unter Dateiname) von ''Textdateien (*.txt)'' zu ''Alle Dateien'' umändern. Dann könnt ihr den NPC endlich speichern.
Um den NPC dann auch wirklich in Gothic sehen zu können, müsst ihr nun (per Arbeitsplatz) zu folgendem Ordner gehen: ''[Gothic II-Verzeichnis]\System''. Dort gibt es eine Datei, die den Namen GothicStarter_mod(.exe) trägt. Da ihr das für jede Skriptänderung braucht, solltet ihr einen Rechtsklick auf die Datei machen, auf "Senden an ->" gehen und dann "Desktop (Verknüpfung erstellen)" auswählen. Dann könnt ihr immer direkt diesen besonderen GothicStarter öffnen. Auf jeden Fall startet ihr diesen erstmal durch Doppelklick.
Wenn ihr schon einmal Gothic II-Mods gespielt habt, ist euch die Auswahlliste wahrscheinlich vertraut, bis auf die Schriftzüge rechts. Für uns ist erstmal nur "Skripte parsen" und "Spiel starten" wichtig. Vor "Skripte parsen" müsst ihr nämlich ein Häckchen machen und dann auf "Spiel starten" klicken. Wenn beim Starten des Spieles eine Fehlermeldung auftritt, ist das nicht der Weltuntergang! Wirklich jedem Programmierer passieren Fehler, gute Programmierer erkennen nur direkt, wo sie sind und wie man sie beheben kann, Neulinge haben damit meist ein Problem. Hier kann man beruhigt im [[http://forum.worldofplayers.de/forum/forumdisplay.php?f=104|Editing-Forum]] vorbeischauen und euer Problem schildern, dort wird sich sicherlich jemand kümmern. Damit man euch übrigens am besten helfen kann, solltet ihr euer gesamtes Skript posten!
Nun wird Gothic II gestartet und ihr solltet ein neues Spiel beginnen (mit Laden könnt ihr euren NPC nicht einfügen!). Nachdem ihr euch durch das Gespräch mit Xardas geklickt habt, solltet ihr am besten zu Maleth bei Lobarts Hof gehen (weil dort der Waypoint für unseren NPC ist). Dort könnt ihr den Marvin-Mode öffnen (tippe blind "b marvin b"), dann drückt ihr F2 und tippt Insert PAL_555_Reiner. Dann noch Enter und wenn alles richtig geklappt hat, sollte nun Reiner erscheinen.
Somit ist das erste Kapitel abgeschlossen.
Ich hoffe ihr kamt damit zurecht.
Ich gebe euch noch mit auf den Weg - Fragen kostet nichts. Außer Zeit. Und die braucht ihr für erfolgreiches Modding.
==== NPC Script für Gothic 1 ====
Der oben genannte Script funktioniert nur in Gothic 2, deshalb schreibe ich hier einmal einen Script für Gothic 1 auf. Der wesentliche Unterschied zwischen den beiden Scripten ist die Visual Zeile:
Mdl_SetVisualBody (self,"hum_body_Naked0", 0, 3, "Hum_Head_FatBald", 2, 1, GRD_ARMOR_L);
''self,'' bedeutet dass das Aussehen dem NPC selbst zugeordnet wird.
''"hum_body_Naked0",'' ist der Körper, also menschlicher_körper_nackt0 auf Deutsch. D.h. der Körper ohne Rüstung
''0, 3,'' ist die Version der Textur (0) und die Hautfarbe (3), also heißt die Textur für den Körperabschnitt "hum_body_Naked0", 0, 3, Hum_Body_Naked_V0-C3 (V=Version und C=Skinton)
''"Hum_Head_FatBald",'' ist die Form des Kopfes (auch Mesh genannt)
''2, 1,'' bedeuten die Textur des Kopfes (Die Hautfarbe wurde ja schon vorher erwähnt) und die Zahntextur (Sieht man im Spiel so gut wie nicht...). Hier wäre also die Kopftextur Hum_Head_V2-C3. Wer aufpast dem fällt auf das das FatBald nicht in der Textur steht. Muss es auch nicht, da die selbe Textur auf die verschiedenen Kopfformen gelegt werden kann.
''Grd_Armor_M'' ist die Rüstung die die Person anhat. ''Grd'' ist das Kürzel von Gardisten, ''Armor'' bedeutet Rüstung und ''M'' bedeutet Mittel.
----
Und hier mal der Vollständige Script für G1:
instance GRD_1900_Gardist (Npc_Default)
{
//Erste Infos
name = NAME_Gardist;
npctype = NPCTYPE_GUARD;
guild = GIL_GRD;
level = 10;
voice = 13;
id = 1900;
//Attribute
attribute[ATR_STRENGTH] = 35;
attribute[ATR_DEXTERITY] = 35;
attribute[ATR_MANA_MAX] = 0;
attribute[ATR_MANA] = 0;
attribute[ATR_HITPOINTS_MAX]= 160;
attribute[ATR_HITPOINTS] = 160;
//Aussehen
Mdl_SetVisual (self,"HUMANS.MDS");
Mdl_ApplyOverlayMds (self,"Humans_Militia.mds");
Mdl_SetVisualBody (self,"hum_body_Naked0", 0, 3,"Hum_Head_FatBald", 2, 1, GRD_ARMOR_L);
B_Scale (self);
Mdl_SetModelFatness(self,0);
fight_tactic = FAI_HUMAN_STRONG;
//Talente
Npc_SetTalentSkill (self, NPC_TALENT_1H,1);
Npc_SetTalentSkill (self, NPC_TALENT_1H,1);
//Inventar
EquipItem (self, ItMw_1H_Sword_01);
CreateInvItem (self, ItFoApple);
CreateInvItems (self, ItMiNugget, 10);
//Tagesablauf
daily_routine = Rtn_start_1900;
};
FUNC VOID Rtn_start_1900 ()
{
TA_Guard (21,00,06,00,"WP_INTRO_WI06");
TA_Guard (06,00,21,00,"WP_INTRO_WI06");
};