|
Re: Уроки скриптологии
// ************************************************** ******* // НПС бродит по PICK фрипоинтам (что-то ищет или собирает) // ************************************************** *******
// Функция инициализации состояния func void ZS_Pick_FP() { * * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; };
// Функция цикла состояния func int ZS_Pick_FP_Loop() { * *// если время состояния >= 7сек и с вероятностью 0.5 * *if((Npc_GetStateTime(self) >= 7) && (Hlp_Random(2))) * * *{ * * * *// если НПС на фрипоинте и есть еще фрипоинт * * * *if((Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK"))) * * * *{ * * * * * *// НПС идет на следующий фрипоинт * * * * * *AI_GotoNextFP(self,"PICK"); * * * * * *// анимация поиска * * * * * *AI_PlayAni(self,"T_PLUNDER"); * * * * * *// сброс времени цикла * * * * * *Npc_SetStateTime(self,0); * * * *} * * * *// если НПС на фрипоинте * * * *else if(Npc_IsOnFP(self,"PICK")) * * * *{ * * * * * *// анимация поиска * * * * * *AI_PlayAni(self,"T_PLUNDER"); * * * * * *// сброс времени цикла * * * * * *Npc_SetStateTime(self,0); * * * *}; * * * *// установить режим передвижения шагом * * * *AI_SetWalkmode(self,NPC_WALK); * * * * *} * *// если время состояния >= 7сек * *else if(Npc_GetStateTime(self) >= 7) * *{ * * * *// если НПС на фрипоинте * * * *if(Npc_IsOnFP(self,"PICK")) * * * *{ * * * * * * * * *// анимация поиска * * * * * *AI_PlayAni(self,"T_PLUNDER"); * * * * *}; * * * *// установить режим передвижения шагом * * * *AI_SetWalkmode (self,NPC_WALK); * * * *}; * *// если НПС не на фрипоинте и есть еще фрипоинт * *if((!Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK"))) * *{ * * * *// НПС идет на фрипоинт * * * *AI_GotoFP(self,"PICK"); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Pick_FP_End() { };
... ещё файл
// ********************* // НПС добывает руду // *********************
// Функция инициализации состояния func void ZS_Pick_Ore() { * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * * * * *// если НПС расположен не на своем вайпоинте * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; * *// если НПС не имеет кирки * *if(Npc_HasItems(self,ItMw_2H_Axe_L_01) == 0) * *{ * * * *// создать в инвентаре НПС кирку * * * *CreateInvItem(self,ItMw_2H_Axe_L_01); * * * * * * * * *}; * *// взять в руки кирку * *EquipItem(self,ItMw_2H_Axe_L_01); };
// Функция цикла состояния func int ZS_Pick_Ore_Loop() { * *// если действие с МОВом не прерываемо и залежи руды имеются * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"ORE")) * *{ * * * *// добыча руды * * * *AI_UseMob(self,"ORE",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Pick_Ore_End() { * *// прекратить добычу руды * *AI_UseMob(self,"ORE",-1); };
... ещё файл
// ***************** // Игра на лютне // *****************
func void ZS_Play_Lute() { * * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; * *// если НПС не имеет лютни * *if(Npc_HasItems(self,ItMi_Lute) == 0) * *{ * * * *// создать в инвентаре НПС лютню * * * *CreateInvItem(self,ItMi_Lute); * *}; * * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; }; * * // Функция цикла состояния func int ZS_Play_Lute_Loop() { * *// если НПС на нужном фрипоинте * *if(Npc_IsOnFP(self,"STAND")) * *{ * * * * *// выравнивание * * * *AI_AlignToFP(self); * * * *// если НПС шел на фрипоинт * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) * * * *{ * * * * * *// сброс флага * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *}; * * *} * * *// если фрипоинт существует и свободен * *else if(Wld_IsFPAvailable(self,"STAND")) * *{ * * * *// идти на фрипоинт * * * *AI_GotoFP(self,"STAND"); * * * *// встать * * * *AI_StandUp(self); * * * *// выровняться * * * *AI_AlignToFP(self); * * * *// установить флаг перемещения * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK; * *} * *else // фрипоинт занят * *{ * * * *// выровняться на вайпоинте * * * *AI_AlignToWP(self); * * * *// если НПС шел в точку * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) * * * *{ * * * * * *// сброс флага * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *}; * *}; * *// если флаг сброшен * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// играть на лютне * * * *AI_UseItemToState(self,ItMi_Lute,1); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Play_Lute_End() { * *// прекратить игру на лютне * *AI_UseItemToState(self,ItMi_Lute,-1); };
... ещё файл
// ************************************ // Приготовление алхимических напитков // ************************************
// Функция инициализации состояния func void ZS_Potion_Alchemy() { * * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// если НПС расположен не на своем вайпоинте * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; * *// если НПС не имеет Лабораторной колбы * *if(Npc_HasItems(self,ItMi_Flask) == 0) * *{ * * * *// создать в инвентаре НПС Лабораторную колбу * * * *CreateInvItem(self,ItMi_Flask); * * * * * * * *}; };
// Функция цикла состояния func int ZS_Potion_Alchemy_Loop() { * *// если действие с МОВом не прерываемо и лабораторный стол имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"LAB")) * *{ * * * *// изготовление напитка * * * *AI_UseMob(self,"LAB",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Potion_Alchemy_End() { * *// прекратить алхимию * *AI_UseMob(self,"LAB",-1); };
... ещё файл
// ***************************** // Тренировка магии // *****************************
// Функция инициализации состояния func void ZS_Practice_Magic() { * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; };
// Функция цикла состояния func int ZS_Practice_Magic_Loop() { * *// если НПС на нужном фрипоинте * *if(Npc_IsOnFP(self,"STAND")) * *{ * * * *// выравнивание * * * *AI_AlignToFP(self); * * * *// если НПС шел на фрипоинт * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) * * * *{ * * * * * *// сброс флага * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *}; * *} * *// если фрипоинт существует и свободен * *else if(Wld_IsFPAvailable(self,"STAND")) * *{ * * * *// идти на фрипоинт * * * *AI_GotoFP(self,"STAND"); * * * *// встать * * * *AI_StandUp(self); * * * *// выровняться * * * *AI_AlignToFP(self); * * * *// установить флаг перемещения * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK; * *} * *else // фрипоинт занят * *{ * * * *// выровняться на вайпоинте * * * *AI_AlignToWP(self); * * * *// если НПС шел в точку * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK ) * * * *{ * * * * * *// сброс флага * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *}; * * *}; * *// если время состояния > 7сек и флаг сброшен * *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == NOTINPOS)) * *{ * * * *var int zufall; * * * *zufall = Hlp_Random(100); * * * *// с разной вероятностью выполнять магические упражнения * * * *if(zufall <= 25) * * * *{ * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC"); * * * *} * * * *else if(zufall <= 50) * * * *{ * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC2"); * * * *} * * * *else if(zufall <= 70) * * * *{ * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC3"); * * * *} * * * *else if(zufall <= 90) * * * *{ * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC4"); * * * *} * * * *else * * * *{ * * * * * *AI_PlayAni(self,"R_SCRATCHHEAD"); * * * *}; * * * *// сброс времени состояния * * * *Npc_SetStateTime(self,0); * *}; * * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Practice_Magic_End() { };
... ещё файл
// ********************** // Упражнения с мечом // **********************
// Функция инициализации состояния func void ZS_Practice_Sword() { * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * * * *// выравнивание * * * *AI_AlignToWP(self); * *}; * *// взять в руки лучшее оружие ближнего радиуса поражения * *AI_EquipBestMeleeWeapon(self); * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Функция цикла состояния func int ZS_Practice_Sword_Loop() { * * *// если флаг сброшен * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// если НПС не имеет оружия ближнего радиуса поражения * * * *if(!Npc_HasEquippedMeleeWeapon(self)) * * * *{ * * * * * *// создать в инвентаре НПС Тяжелую палку * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1); * * * * * *// взять её в руки * * * * * *AI_EquipBestMeleeWeapon(self); * * * *}; * * * *// подготовиться * * * *AI_ReadyMeleeWeapon(self); * * * *// установка флага готовности * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *// анимация упражнений * *AI_PlayAni(self,"T_1HSFREE"); * *// движение на свой вайпоинт * *AI_GotoWP(self,self.wp); * *// выравняться * *AI_AlignToWP(self); * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Practice_Sword_End() { * *// встать * *AI_StandUp(self); * *// убрать оружие * *AI_RemoveWeapon(self); };
|