Poradnik Skryptów
by Alistair
Tak więc użyjcie tego szablonu do stworzenia prawdziwego charactera w Gothic`u. Będzie się nazywał Gunther - nie będzie członkiem żadnej gildii i będzie 'ambient NPC'. Jest trochę "Bruiser"
Poziom : 17
siła : 100
HP : 200
Bez many.
Będzie głuchy, a inne jego zmysły będą sięgać do 20 m. Będzie miał również 2 poziom walki bronią jednoręczną. Będziemy dodawać stosowną broń do jego inwentarzu. A więc jedziemy. Będziesz musiał wyprodukować ten tekst w jakimś edytorze testów.
instance None_999_Gunther (Npc_Default) // Gunther będzie członkiem klasy Npc_Default. Możemy także użyć C_Npc samodzielnie.
{
//-------- Pierwotne dane --------
name = "Gunther";
guild = GIL_NONE;
npctype = NPCTYPE_AMBIENT;
level = 17;
voice = 8;
id = 999;
// ----- attributes --------
attribute[ATR_STRENGTH] = 100;
attribute[ATR_DEXTERITY] = 100;
attribute[ATR_MANA_MAX] = 0;
attribute[ATR_MANA] = 0;
attribute[ATR_HITPOINTS_MAX]= 200;
attribute[ATR_HITPOINTS] = 200;
//-------- widoczny --------
Mdl_SetVisual (self, "humans.mds"); // podstawowy plik animacji; ten plik jest używany do wszystkich ludzi. Mdl_ApplyOverlayMds (self, "humans_militia.mds"); //plik powłoki animacji, dający militarny typ ruchu.
Mdl_SetVisualBody
(self, "hum_body_naked0", // wygląd ciała
0, // wariant tekstury ciała
1, // kolor skóry
"hum_head_fighter", // wygląd głowy
51, // wariant wyglądu głowy
2, // wariant wyglądu zębów
GRD_ARMOR_M); // instancja zbroi
B_Scale (self); // szerokość ciała (zgodnie z siłą postaci)
Mdl_SetModelFatness (self, 0); // limb fatness(grubość?)
//-------- talenty --------
Npc_SetTalentSkill (self, NPC_TALENT_1H,2); // 2-gi poziom walki bronią jednoręczną.
//-------- inventory --------
EquipItem (self, ItMw_1H_Mace_War_03); // rozpoczyna z Pałką (mace)
CreateInvItems (self, ITFO_Potion_Health_01, 10); // 10 mikstur uzdrawiających na wszelki wypadek
//--------zmysły-------------
senses = SENSE_SEE | SENSE_SMELL;
senses_range = 2000; // centymetrów!
//------------- ai -------------
fight_tactic = FAI_HUMAN_STRONG; // zachowanie podczas walki
Musimy także ustawić codzienne zajęcia (daily routine.)
daily_routine = Rtn_start_999;
};
// Tych rzeczy potrzebujemy żeby to działało
func void Rtn_Start_999 ()
{
};
zapisz teraz to w /_work/data/scripts/content/story/Npc Nazwij na przykład Gunther.d. Rozszerzenie .d. oznacza, że ten skrypt będzie rozpoznany, kiedy gothic będzie robił analizę składniową skryptów.
Teraz potrzebujemy, aby Gothic rozpoznawał egzystencję nowego wypadku klasy NPC. Robimy to albo przez rozpoczęcie < Spacer> i wybranie World/Reparse pliki skryptu (Scriptfiles) albo przez wybranie Replace all Scripts, kiedy startujemy gothic`a przez Gothic starter`a. (Musisz to zrobić tylko raz) Znalazłem używając Spacer`a Wytrzymały, chociaż powolniejszy
Kiedy to zostanie skończone Gunther może być wprowadzony w świat poprzez konsole poprzez komendę Insert None_999_Gunther. Jeszcze nie wiele robi. To się teraz zmieni.. jeśli nie możecie wprowadzić Gunthera z konsoli coś musiało pójść źle. Powinniście powtórzyć czynności na górze jeszcze raz) zanim przejdziemy dalej.
3. Gunther's daily routine
Aby NPC wiedział, co ma robić, podczas gdy na ciebie czeka powinien mieć ustawioną rutynę < Daily Routine> albo start stanu <start state> Codzienny ład Gunthera będzie polegał na staniu w poszczególnym miejscu i czasami gadaniu ("inni nie powinni wiedzieć" lub "Nie chciał bym być teraz w jego skórze") Ten prosty NPC ma reagować tylko na przyjście bohatera. Nie będzie mieć szczególnie mądrych reakcji na inne rzeczy jak np. atak itp.
Oto kod:
func void ZS_GuntherWait ()
{
PrintDebugNpc (PD_TA_FRAME, "ZS_GuntherWait"); //.Debug Produkcji(<output>) który jest podejmowany przez aplikacje Zspy
_PercEnable(self, PERC_ASSESSPLAYER, B_AssessSC); //wśród innych rzeczy sprawdza czy NPC ma reagować gdy gracz podejdzie.
Npc_PercEnable(self, PERC_ASSESSTALK, B_AssessTalk); // Oznacza że możesz mówić do NPC`a na przykład by zakończyć quest.
AI_StandUp (self);
AI_SetWalkmode (self, NPC_WALK);
AI_GotoWP (self, self.wp); // idzie do waypointu, który wskazuje na obecnę rutynę <daily routine>
AI_AlignToWP (self); // Twarz zwrócona do w stronę pokazywaną przez strzałkę waypointa
};
func void ZS_GuntherWait_Loop ()
{
PrintDebugNpc (PD_TA_LOOP, "ZS_GuntherWait_Loop"); // Więcej debug output
AI_GotoWP (self, self.wp); // idzie do Daily Routine start point.
AI_Wait (self, 100); // czeka 100 sekund tutaj
AI_GotoWP (self, Npc_GetNearestWP (Self)); // szuka następnego bliskiego waypointu
AI_PlayAni(self, "T_PEE");
AI_Wait (self, 100); // czeka następne 100 sekund kiedy loop się skończy
};
func void ZS_GuntherWait_End ()
{
PrintDebugNpc (PD_TA_FRAME,"ZS_GuntherWait_End");
};
Tak więc prawie gotowy. Musimy teraz te jego zadanka dzienne włączyć do listy tych zadanek. Żeby to zrobić otwórz : work/data/skripts/content/story/ZS/TA.d I włóż tam te linijki :
func void TA_GuntherWait (var int start_h,var int start_m,var int stop_h,var int stop_m,var sznurek waypointu)
{
TA_Min (self, start_h,start_m, stop_h, stop_m, ZS_GuntherWait, waypoint);
};
Potem zapisz TA.d. Teraz te linie:
func void Rtn_Start_999 ()
{
TA_GuntherWait (0,00,13,00, "OC1");
TA_GuntherWait (13,00,0,00, "OC1");
};
Te liniej robią trick że Gunther będzie stał przed Starym Obozem calutki dzień. Rutyna < wymaga co najmniej dwóch okresów czasu, jak wyżej.>, inaczej silnik szaleje. Zapisują się z niektórymi nazwami plików w /_work/data/skripts/content/story/ZS z .d. rozszerzeniem.
Końcowy krok, Gunther jest w grze. Otwórz :
/_work/data/skripts/content/story/Startup.d I włóż to
Wld_InsertNpc(None_999_Gunther,"OC1");
W bloku który kieruje do starego obozu. Zastąp skrypt tak jak wcześniej i Gunther jest w grze.