|
Re: Уроки скриптологии
// **************************************** // Использование наковальни (ковка оружия) // ****************************************
// Функция инициализации состояния func void ZS_Smith_Anvil() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Smith_Anvil_Loop() { * *// если действие с МОВом не прерываемо и наковальня имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSANVIL")) * *{ * * * *// ковка оружия * * * *AI_UseMob(self,"BSANVIL",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Smith_Anvil_End() { * *// прекратить ковку * *AI_UseMob(self,"BSANVIL",-1); };
... ещё файл
// **************************** // Закалка заготовки оружия // ****************************
// Функция инициализации состояния func void ZS_Smith_Cool() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Smith_Cool_Loop() { * *// если действие с МОВом не прерываемо и ванна с водой имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSCOOL")) * *{ * * * *// закалка заготовки * * * *AI_UseMob(self,"BSCOOL",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Smith_Cool_End() { * *// прекратить закалку * *AI_UseMob(self,"BSCOOL",-1); };
... ещё файл
// ********************************** // Разогрев заготовки оружия в горне // **********************************
// Функция инициализации состояния func void ZS_Smith_Fire() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Smith_Fire_Loop() { * *// если действие с МОВом не прерываемо и горн имеется * *if(!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"BSFIRE")) * *{ * * * *// разогрев заготовки * * * *AI_UseMob(self,"BSFIRE",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Smith_Fire_End() { * *// прекратить разогрев * *AI_UseMob(self,"BSFIRE",-1); };
... ещё файл
// ***************** // Заточка оружия // *****************
// Функция инициализации состояния func void ZS_Smith_Sharp() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Smith_Sharp_Loop() { * *// если действие с МОВом не прерываемо и точило имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BSSHARP")) * *{ * * * *// заточка * * * *AI_UseMob(self,"BSSHARP",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Smith_Sharp_End() { * *// прекратить заточку * *AI_UseMob(self,"BSSHARP",-1); };
... ещё файл
// ******************** // Курение болотника // ********************
// Функция инициализации состояния func void ZS_Smoke_Joint() { * *// установить нормальный набор восприятий * *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_Joint) == 0) * *{ * * * *// создать в инвентаре НПС болотник * * * *CreateInvItem(self,ItMi_Joint); * *}; * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Функция цикла состояния func int ZS_Smoke_Joint_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_JOINT,0); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * * * * * * *// если прошло > 5 сек и НПС находится в режиме курения * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) * *{ * * * *// анимация курения (дым) * * * *AI_PlayAniBS(self,"T_JOINT_RANDOM_1",BS_ITEMINTER ACT); * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Smoke_Joint_end() { * *// прекратить курить * *AI_UseItemToState(self,ItMi_Joint,-1); };
... ещё файл
// ******************* // Курение кальяна // *******************
// Функция инициализации состояния func void ZS_Smoke_Waterpipe() { * *// установить нормальный набор восприятий * *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_Smoke_Waterpipe_Loop() { * *// если действие с МОВом не прерываемо и кальян имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"SMOKE")) * *{ * * * *// курим кальян * * * *AI_UseMob(self,"SMOKE",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Smoke_Waterpipe_End() { * *// прекратить курение * *AI_UseMob(self,"SMOKE",-1); };
... ещё файл
// **************** // Игра с факелами // ****************
// Функция инициализации состояния func void ZS_Spit_Fire() { * *// установить нормальный набор восприятий * *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,ItLsTorchFirespit) == 0) * *{ * * * *// создать в инвентаре НПС горящий факел * * * *CreateInvItem(self,ItLsTorchFirespit); * *}; };
// Функция цикла состояния func int ZS_Spit_Fire_Loop() { * *// если фрипоинт существует и свободен * *if(Wld_IsFPAvailable(self,"STAND")) * *{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// идти на фрипоинт * * * *AI_GotoFP(self,"STAND"); * * * *// выравняться * * * *AI_ALignToFP(self); * *} * *else // фрипоинт занят * *{ * * * *// выравняться на вайпоинте * * * *AI_AlignToWP(self); * *}; * *// если прошло > 10 сек * *if(Npc_GetStateTime(self) > 10) * *{ * * * *// использовать факел (5 фаза) * * * *AI_UseItemToState(self,ItLsTorchFirespit,5); * * * *// использовать факел (0 фаза) * * * *AI_UseItemToState(self,ItLsTorchFirespit,0); * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Spit_Fire_end() { * *// оставить факел * *AI_UseItemToState(self,ItLsTorchFirespit,-1); };
|