wstawię tu skrypty, jak chcesz z małym opisem, to co wiem-odnośnie zwierzaka ; zrobiłem npca, zagaduje się do niego, żeby z nami szedł-ok-ale nie mogę go "przystopować"-nie pojawia mi się czemuś dialog, z opcją zaczekaj tutaj
ok zwierzak (na podstawie owcy Betsy z G2 NK):
-pliki:
Story\B_Content\B_Come_Wolf.d - utworzyć
Story\B_AssignAmbientInfos\B_Burek.d - utworzyć
AI\Monster\RTN_Monster\ZS_MM_Rtn_Friend_Wolf.d -utworzyć
Story\NPC\Monster\MST_Wolf.d - zmodyfikować
Story\Npc_Globals.d - zmodyfikować
Story\Startup.d - zmodyfikować
B_Come_Wolf.d:
func void B_Come_Wolf()
{
AI_Output(self,other,"DIA_Wolf_15_00"); //Haaau! <--ogólnie funkcja i to co odpowiada Burek, gdy zagadujemy do niego
};
B_Burek.d (nasz dialog z Burkiem):
instance DIA_Burek_EXIT(C_Info)
{
npc = Friend_Wolf; <-- instance utworzony w pliku MST_Wolf.d
nr = 999;
condition = DIA_Burek_EXIT_Condition;
information = DIA_Burek_EXIT_Info;
permanent = TRUE; <--powoduje, że zawsze można zagadać do Burka
description = Dialog_Ende;
};
func int DIA_Burek_EXIT_Condition()
{
return TRUE;
};
func void DIA_Burek_EXIT_Info()
{
AI_StopProcessInfos(self);
};
instance DIA_Burek_Hallo(C_Info)
{
npc = Friend_Wolf;
nr = 1; <--numer dialogu(w naszym skrypcie wszędzie mamy 1, bo za każdym razem, gdy zagadujemy, Burek robi co innego); gdyby były inne numery w dialogach poniżej(kolejno np. 2,3 itd.), to wszystkie opcje rozmowy byłyby dostępne od razu;
condition = DIA_Burek_Hallo_Condition;
information = DIA_Burek_Hallo_Info;
permanent = FALSE; <--false-dialog pokazuje się tylko raz(gdy 1wszy raz zagadamy do Burka)
description = "Cześć...";
};
func int DIA_Burek_Hallo_Condition()
{
return TRUE;
};
func void DIA_Burek_Hallo_Info()
{
AI_Output(other,self,"DIA_Burek_Hallo_15_00"); //Cześć piesku.
B_Come_Wolf(); <--to, co mówi Burek z pliku B_Come_Wolf.d
};
instance DIA_Burek_KommMit(C_Info)
{
npc = Friend_Wolf;
nr = 1;
condition = DIA_Burek_KommMit_Condition;
information = DIA_Burek_KommMit_Info;
permanent = TRUE; <--true-powoduje, że ten dialog pokazuje się zawsze, po uprzednim wykonaniu dialogu DIA_Burek_WarteHier ("Zaczekaj tutaj") lub gdy zagadamy 1wszym razem
description = "Chodź ze mną.";
};
func int DIA_Burek_KommMit_Condition()
{
if((self.aivar[AIV_PARTYMEMBER] == FALSE) && Npc_KnowsInfo(other,DIA_Burek_Hallo) && (self.aivar[AIV_TAPOSITION] == FALSE)) <--w wolnym tłumaczeniu: jeśli Burek nie jest z nami w "drużynie" i zagadaliśmy wcześniej do niego, to może zostać wykonana kolejna funkcja (i dialog) poniżej
{
return TRUE;
};
};
func void DIA_Burek_KommMit_Info()
{
AI_Output(other,self,"DIA_Burek_KommMit_15_00"); //Burek do nogi. Idziemy. <--nasza gadka
B_Come_Wolf(); <-- gadka Burka
self.aivar[AIV_PARTYMEMBER] = TRUE; <--zagadując do Burka, dołącza on do naszej "drużyny"i za nami wszędzie łazi
AI_StopProcessInfos(self); <--kończy dialog
};
instance DIA_Burek_WarteHier(C_Info)
{
npc = Friend_Wolf;
nr = 1;
condition = DIA_Burek_WarteHier_Condition;
information = DIA_Burek_WarteHier_Info;
permanent = TRUE;
description = "Zaczekaj tutaj!";
};
func int DIA_Burek_WarteHier_Condition()
{
if((self.aivar[AIV_PARTYMEMBER] == TRUE) && Npc_KnowsInfo(other,DIA_Burek_Hallo) && (self.aivar[AIV_TAPOSITION] == FALSE)) <-- jeśli Burek jest w naszej drużynie, zagadaliśmy do niego wcześniej, wykonana zostaje poniższa funkcja (i dialog)
{
return TRUE;
};
};
func void DIA_Burek_WarteHier_Info()
{
AI_Output(other,self,"DIA_Burek_WarteHier_15_00"); //Zaczekaj tutaj! <-nasza gadka
B_Come_Wolf(); <- gadka Burka
self.aivar[AIV_PARTYMEMBER] = FALSE; <-wykonanie funkcji powoduje, że Burek tymczasowo odłącza się od naszej drużyny(przestaje za nami łazić)
AI_StopProcessInfos(self);
};
ZS_MM_Rtn_Friend_Wolf.d -plk z rutyną przygotowany specjalnie dla naszego Burka:
func void ZS_MM_Rtn_Friend_Wolf()
{
Npc_SetPercTime(self,1);
Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_AssessPlayer);
Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk);
Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagic); <--wszystko ogólnie powoduje, że można gadać do Burka i że on może z nami gadać itp.
};
func int ZS_MM_Rtn_Friend_Wolf_Loop() <--pętla naszej rutynki
{
var int randomMove;
if(self.aivar[AIV_PARTYMEMBER] == TRUE)
{
if(Npc_GetDistToNpc(self,hero) > 500)
{
if(!C_BodyStateContains(self,BS_SWIM))
{
AI_SetWalkMode(self,NPC_RUN);
};
AI_GotoNpc(self,hero);
}
else
{
AI_TurnToNPC(self,hero);
self.wp = Npc_GetNearestWP(self);
};
}
else
{
randomMove = Hlp_Random(3);
if(randomMove == 0)
{
AI_PlayAni(self,"R_ROAM1");
};
if(randomMove == 1)
{
AI_PlayAni(self,"R_ROAM2");
};
if(randomMove == 2)
{
AI_PlayAni(self,"R_ROAM3");
};
};
return LOOP_CONTINUE;
};
func void ZS_MM_Rtn_Friend_Wolf_End()
{
};
cała rutyna chodzenia lub niechodzenia Burka za naszym bohaterem (nie potrafię tu wyjaśnić o co po kolei chodzi-bo nie testowałem różnych wartości itp, żeby sprawdzić, za co która odpowiada mniej więcej-zali skrypter ze mnie mierny :roll: -ale tak to ma wyglądać)
MST_Wolf.d (wklejasz w dowolnie który plik mst, oczywiście odpowiednio należy zmienić nazwę poszczególnych plików później-można nawet do ścierwojada wkleić ;] , ale ja wkleiłem do MST_Wolf.d):
<kawałek, który wstawiamy na koniec skryptu>
instance Friend_Wolf(Mst_Default_Wolf) <--po instance nazwa zwierzaka(można później przywołać zwierzę w grze za pomocą konsoli, insert friend_wolf w tym przypadku; Mst_Default_Wolf-korzysta z prototypu Wilka ustalonego na początku tego skryptu
{
name = "Burek"; <-- imię zwierzaka
guild = gil_sheep; <--ustalenie gildii (i to, co poniżej)
aivar[AIV_MM_REAL_ID] = id_sheep; <--id zwierzaka, jak się ustawi na inne zwierzę np. id_wolf, to ludzie będą atakować naszego kompana bez ostrzeżenia; najlepiej ustawiać takie same id i guild np. guild = gil_wolf i aivar[AIV_MM_REAL_ID] = id_wolf;
level = 0; <--poziom zwierzaka
//attribute[ATR_STRENGTH] = 50;
//attribute[ATR_DEXTERITY] = 50;
//attribute[ATR_HITPOINTS_MAX] = 100;
//attribute[ATR_HITPOINTS] = 100;
//protection[PROT_BLUNT] = 75;
//protection[PROT_EDGE] = 75;
//protection[PROT_POINT] = 25;
//protection[PROT_FIRE] = 75;
//protection[PROT_FLY] = 75; <-- atrybuty, wiadomo
B_SetAttitude(self,ATT_FRIENDLY); <--nastawiony przyjacielsko do nas(i do innych istot, nawet jakbyśmy mu ustawili guild i real id na wolf)
aivar[AIV_ToughGuy] = TRUE; <-- zwierzak nie reaguje na morderstwo itp.;p
B_SetVisuals_Wolf(); <--wygląd wilka (określony w prototype na początku skryptu)
Npc_SetToFistMode(self);
aivar[AIV_MM_RoamStart] = OnlyRoutine; <--sposób poruszania się zwykłego wilka
start_aistate = ZS_MM_Rtn_Friend_Wolf; <--początkowa rutyna-nasz rutynka (func void ZS_MM_Rtn_Friend_Wolf() ) z tegoż pliku-łażenie i niełażenie za nami
CreateInvItems(self,ItFoMuttonRaw,1); <--to, co ma w sobie Burek, gdy zginie, to można wyciągnąć(tutaj mięsko)
};
Npc_Globals.d:
var C_Npc Liesel;
var C_NPC Burek; <--nasz Burek
var C_Npc Igaraz;
Liesel = Hlp_GetNpc(Follow_Sheep);
Burek = Hlp_GetNpc(Friend_Wolf); <---nasz Burek
Igaraz = Hlp_GetNpc(NOV_601_Igaraz);
zmienną var C_Npc i odniesienie do niej w Hlp_GetNpc najlepiej wstawiać w tym samym miejscu (u mnie pomiędzy Betsy a Igarazem)
Startup.d
func void STARTUP_NewWorld_Part_Xardas_01()
{
Wld_InsertItem(ItBe_Addon_STR_5,"FP_SPAWN_X_GUERTEL");
Wld_InsertNpc(NONE_100_Xardas,"NW_XARDAS_START");
Wld_InsertNpc(Friend_Wolf,"NW_XARDAS_START");
wstawiamy dowolnie, ale musi być zgodność waypointów ze światem-u mnie w newworld_part_xardas tu ustawiłem Burka na początku gry w wieży tam, gdzie gadamy na początku z Xardasem (przykładowo)
tyle...odnośnie aivarów(jak to nazywam) w rutynach, to jeszcze nie skumałem co do czego, ale tak to ma wyglądać, jak to przedstawiłem (przykładowo

)