Proces tworzenia rutyn jest bardzo prosty. Wszystkie działania wykonujemy w folderze AI\Human\TA_Human.
Tworzenie rutyny zaczynamy od utworzenia nowego pliku - ZS_nazwarutyny.d
W środku tworzymy sobie 3 funkcje: ZS_nazwarutyny, ZS_nazwarutyny_loop, ZS_nazwarutyny_end.
func void ZS_nazwarutyny(){ /* Tutaj umieszczamy polecenia, które mają się wykonać w momencie, gdy postać zaczyna rutynę. Najczęściej będzie to moment, w którym silnik przywoła tą postać, zatem jest duże prawdopodobieństwo, że nie zauważymy owych działań. ////// Zazwyczaj zawartość funkcji inicjalizującej rutynę ogranicza się do dodania percepctionów, ustawienia chodu czy sprowadzenie NPC'a dokładnie do jego waypointa. */ Perception_Set_Normal(); // Ustawia perce naszego NPC'a. Bez tego postać nie będzie reagować na żadne bodźce. B_ResetAll (self); // NPC chowa broń i przestaje patrzeć się na to, na co patrzył się wcześniej, np. na naszego NPC'a AI_SetWalkmode (self, NPC_WALK); //zmienia bieg na chód };
func int ZS_nazwarutyny_loop(){ //WAŻNE! Loop musi być typu całkowitoliczbowego, ponieważ zwracanie wartości przez tą funkcję jest warunkiem tego, żeby ta funkcja się powtarzała /* Loop - czyli pętla. Do pseudopętli rutyny wrzucamy polecenia, które mają się wykonywać w trakcie wykonywania tejże rutyny. To co tu wsadzimy zależy już od naszej kreatywności. Może być to po prostu ciągle jedzenie/picie piwa, albo przywoływanie mobów czy wywoływanie triggerów, funkcji i efektów graficznych. Pozwolę sobie rzucić jedną z rutyn, które dodałem na potrzeby mojego moda */ var int rand; rand = Hlp_Random(1000); //Tworzymy zmienną, której przypisujemy losową wartość if (rand >= 700){ AI_PlayAni (self,"T_PLUNDER"); } else if (rand >=500){ AI_PlayAni (self,"R_SCRATCHHEAD"); } else if (rand >=300){ AI_PlayAni (self,"T_LGUARD_2_STAND"); AI_PlayAni (self,"T_STAND_2_LGUARD"); }; //zwykłe warunki, w zależności od których postać wykonywać będzie inne czynności Ai_Wait (self,1.0); // nakazuje czekać NPC'owi przez sekundę, ma to zabezpieczyć przed zbytnim nakładaniem się animacji, bowiem funkcja jest zaprogramowana tak, że odtwarzają się one dość często return LOOP_CONTINUE; //Daje informację o tym, że po zakończeniu tej funkcji loop ma zostać wywołany jeszcze raz, zatem otrzymujemy pseudopętlę. Bez tego prawdopodobnie postać po jednym przejściu loop'a zatnie się. };
func void ZS_nazwarutyny_end(){ /* W endzie zawieramy to co ma się wykonać po zakończeniu rutyny. Zazwyczaj ta część jest pusta, ale nic nie stoi na przeszkodzie, żeby coś tam wsadzić. */ Wld_PlayEffect("spellFX_Teleport_RING", self, self, 0, 0, 0, FALSE ); //całkowicie niepotrzebny bajer :P };
Pewnie teraz chcesz sparsować skrypty, dodać do NPC'a i zobaczyć efekt swojej pracy w grze. Hehe, nie tak szybko. Została jeszcze jedna rzecz do zrobienia.
Wychodzimy z folderu TA_Human. Znajdujemy się w folderze Human, gdzie znajduje się plik TA.d. Otwieramy go.
Znajdują się tu deklaracje (albo rejestracji, nie jestem pewien co do nazewnictwa) wszystkich rutyn z gothica. Jeśli nie umieścimy tutaj deklaracji własnej rutyny, wówczas Gothic będzie krzyczał, że nie zna naszej rutyny.
Zatem jedziemy. Po prostu na samym końcu wrzucamy jedną linijkę:
func void TA_nazwarutyny (var int start_h, var int start_m, var int stop_h, var int stop_m, VAR string waypoint) {TA_Min (self, start_h,start_m, stop_h, stop_m, ZS_nazwarutyny, waypoint);};
Jak widać, można pójść na łatwiznę i zwyczajnie skopiować jedną z istniejących linijek, po czym zamienić nazwę na początku i w środku.
Teraz wszystko powinno działać.
Co do Gothica 1, prawdopodobnie odbywa się to w ten sam sposób, ale głowy nie dam.
Offline
Leci props Świetna robota!
Offline
Jak będę miał więcej czasu to użyję tego do zrobienia pewnego bajeru.
Offline