|
Re: Уроки скриптологии
// ******************* // Охрана территории // *******************
// Функция инициализации состояния func void ZS_Stand_Guarding() { * * *// установить нормальный набор восприятий * *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); * *}; * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Функция цикла состояния func int ZS_Stand_Guarding_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_PlayAni(self,"T_STAND_2_HGUARD"); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * * * * * * *// если прошло > к сек и НПС охраняет территорию * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) * *{ * * * *var int random; * * * *random = Hlp_Random(10); * * * *// с вероятностью 0.1 * * * *if(random == 0) * * * *{ * * * * * *// осмотреть окрестности * * * * * * AI_PlayAni(self,"T_HGUARD_LOOKAROUND"); * * * *}; * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Stand_Guarding_end() { * *// анимация перехода из состояния охраны в стоячее * *AI_PlayAni(self,"T_HGUARD_2_STAND"); }; *
... ещё файл
// ********************* // Встреча с ренджером // ********************* // Примечание: В скриптах не используется, может быть удалена c корректировкой файла ТА.d
func void ZS_Stand_RangerMeeting() { * *Perception_Set_Minimal(); * *B_ResetAll(self); * *self.senses = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL; * *self.senses_range = 500; * *Npc_SetPercTime(self,1); * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessGui dePlayer); * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y); * *if((Hlp_GetInstanceID(self)) == (Hlp_GetInstanceID(Lares))) * *¦¦ ((Hlp_GetInstanceID(self)) == (Hlp_GetInstanceID(Erol))) * *¦¦ ((Hlp_GetInstanceID(self)) == (Hlp_GetInstanceID(Greg_NW))) * *{ * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *}; * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob); * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sGuideFightSound); * *if((Hlp_GetInstanceID(self)) == (Hlp_GetInstanceID(Lares))) * *¦¦ ((Hlp_GetInstanceID(self)) == (Hlp_GetInstanceID(Greg_NW))) * *{ * * * *AI_SetWalkmode(self,NPC_RUN); * * * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * * * *{ * * * * * *AI_GotoWP(self,self.wp); * * * *}; * * * *AI_AlignToWP(self); * * * *AI_PlayAni(self,"T_STAND_2_HGUARD"); * *} * *else * *{ * * * *AI_SetWalkmode(self,NPC_WALK); * * * * * * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * * * *{ * * * * * *AI_GotoWP(self,self.wp); * * * *}; * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * *}; };
func int ZS_Stand_RangerMeeting_loop() { * *var int random; * *if((Hlp_GetInstanceID(self)) == (Hlp_GetInstanceID(Lares))) * *{ * * * *if(Npc_GetStateTime(self) > 5) * * * *{ * * * * * *random = Hlp_Random(2); * * * * * *if(random == 0) * * * * * *{ * * * * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND"); * * * * * *}; * * * * * *Npc_SetStateTime(self,0); * * * *}; * *} * *else * *{ * * * *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_StandUp(self); * * * * * *AI_PlayAni(self,"T_STAND_2_LGUARD"); * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * *}; * * * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) * * * *{ * * * * * *random = Hlp_Random(7); * * * * * *if(random == 0) * * * * * *{ * * * * * * * *AI_PlayAni(self,"T_LGUARD_SCRATCH"); * * * * * *} * * * * * *else if(random == 1) * * * * * *{ * * * * * * * *AI_PlayAni(self,"T_LGUARD_STRETCH"); * * * * * *} * * * * * *else if(random == 2) * * * * * *{ * * * * * * * *AI_PlayAni(self,"T_LGUARD_CHANGELEG"); * * * * * *}; * * * * * *Npc_SetStateTime(self,0); * * * *}; * *}; * *return LOOP_CONTINUE; };
func void ZS_Stand_RangerMeeting_end() { * *if((Hlp_GetInstanceID(self)) == (Hlp_GetInstanceID(Lares))) * *{ * *} * *else * *{ * * * *AI_PlayAni(self,"T_LGUARD_2_STAND"); * * * *}; };
... ещё файл
// ******************* // Уборка территории // *******************
// Функция инициализации состояния func void ZS_Stand_Sweeping() { * * *// установить нормальный набор восприятий * *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_Broom) == 0) * *{ * * * *// создать в инвентаре Метлу * * * *CreateInvItem(self,ItMi_Broom); * *}; * * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; }; * * // Функция цикла состояния func int ZS_Stand_Sweeping_Loop() { * *// если НПС на нужном фрипоинте * *if(Npc_IsOnFP(self,"SWEEP")) * *{ * * * * *// выравнивание * * * *AI_AlignToFP(self); * * * *// если НПС шел на фрипоинт * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) * * * *{ * * * * * *// сброс флага * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *}; * * *} * * *// если фрипоинт существует и свободен * *else if(Wld_IsFPAvailable(self,"SWEEP")) * *{ * * * *// идти на фрипоинт * * * *AI_GotoFP(self,"SWEEP"); * * * *// встать * * * *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_Broom,1); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Stand_Sweeping_End () { * *// прекратить уборку * *AI_UseItemToState(self,ItMi_Broom,-1); };
... ещё файл
// ********************* // Стоять на вайпоинте // *********************
// Функция инициализации состояния func void ZS_Stand_WP() { * * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * * * * *// движение на свой вайпоинт * *AI_GotoWP(self,self.wp); * *// выравнивание * *AI_AlignToWP(self); * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Функция цикла состояния func int ZS_Stand_WP_loop() { * *// если флаг сброшен * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// стоять на вайпоинте * * * *AI_PlayAni(self,"T_STAND_2_LGUARD"); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * * * * * * *// если прошло > 5 сек и НПС стоит на вайпоинте * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) * *{ * * * *var int random; * * * *random = Hlp_Random(10); * * * *// случайная анимация движений * * * *if(random == 0) * * * *{ * * * * * *AI_PlayAni(self,"T_LGUARD_SCRATCH"); * * * *} * * * *else if(random == 1) * * * *{ * * * * * *AI_PlayAni(self,"T_LGUARD_STRETCH"); * * * *} * * * *else if(random == 2) * * * *{ * * * * * *AI_PlayAni(self,"T_LGUARD_CHANGELEG"); * * * *}; * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Stand_WP_end() { * *// выйти из режима * *AI_PlayAni(self,"T_LGUARD_2_STAND"); }; *
... ещё файл
// *************** // Толочь траву // ***************
// Функция инициализации состояния func void ZS_Stomp_Herb() { * *// установить нормальный набор восприятий * *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_Stomp_Herb_Loop() { * *// если действие с МОВом не прерываемо и трава имеется * *if(!C_BodyStateContains(self, BS_MOBINTERACT_INTERRUPT)) && (Wld_IsMobAvailable(self,"HERB")) * *{ * * * *// толочь траву * * * *AI_UseMob(self,"HERB",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Stomp_Herb_End() { * *// прекратить действие * *AI_UseMob(self,"HERB",-1); };
... ещё файл
// ************************************************** ******* // Заниматься науками (передача листа бумаги (записки) ГГ) // ************************************************** *******
// Функция инициализации состояния func void ZS_Study_WP() { * * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * * * * *// движение на свой вайпоинт * *AI_GotoWP(self,self.wp); * *// выравнивание * *AI_AlignToWP(self); * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Функция цикла состояния func int ZS_Study_WP_loop() { * *var int randy; * *var int eventrandy; * *var int randystatetime; * *// произвольное время цикла (Примечание: следующие две строки необходимо поменять местами, randy используется без присвоения) * *randystatetime = randy + 25; * *// вероятность анимации * *randy = Hlp_Random(10); * *// вероятность события "Дрожь земли" * *eventrandy = Hlp_Random(100); * *var int wait; * *var float waittime; * *// вероятность ожидания * *wait = randy + 5; * *// задержка в мс * *waittime = IntToFloat(wait); * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; * *// выравнивание * *AI_AlignToWP(self); * *// если прошло какое-то время * *if(Npc_GetStateTime(self) >= randystatetime) * *{ * * * *// если НПС сидит * * * *if(C_BodystateContains(self,BS_SIT)) * * * *{ * * * * * *// встать * * * * * *AI_StandUp(self); * * * * * *// повернуться к ГГ * * * * * *B_TurnToNpc(self,hero); * * * *}; * * * *// спрятать оружие * * * *AI_RemoveWeapon(self); * * * *// анимация движений * * * *if(randy <= 3) * * * *{ * * * * * *if(randy == 0) * * * * * *{ * * * * * * * *AI_PlayAni(self,"T_LGUARD_SCRATCH"); * * * * * *} * * * * * *else if(randy == 1) * * * * * *{ * * * * * * * *AI_PlayAni(self,"T_LGUARD_STRETCH"); * * * * * *} * * * * * *else if(randy == 2) * * * * * *{ * * * * * * * *AI_PlayAni(self,"T_LGUARD_CHANGELEG"); * * * * * *}; * * * *} * * * *else * * * *{ * * * * * *// стоим * * * * * *AI_PlayAni(self,"T_LGUARD_2_STAND"); * * * * * *// сброс флага * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * * * *// если НПС не имеет Листа бумаги * * * * * *if(Npc_HasItems(self,Fakescroll_Addon) == FALSE) * * * * * *{ * * * * * * * *// создать в инвентаре Лист бумаги * * * * * * * *CreateInvItem * (self, *Fakescroll_Addon); * * * * * *}; * * * * * *// перестать смотреть на ГГ * * * * * *B_StopLookAt(self); * * * * * *// читать бумагу * * * * * *AI_UseItemToState(self,Fakescroll_Addon,1); * * * * * *// задержка * * * * * *AI_Wait(self,waittime); * * * * * *// перестать читать * * * * * *AI_UseItemToState(self,Fakescroll_Addon,-1); * * * * * *// сброс времени цикла * * * * * *Npc_SetStateTime(self,0); * * * * * *// если (событию быть и Хоринис) или (событию быть и Яркендар) и НПС маг огня и Равен жив * * * * * *if(((eventrandy < 5) && (CurrentLevel == NEWWORLD_ZEN)) * * * * * *¦¦ ((eventrandy == 1) && (CurrentLevel == ADDONWORLD_ZEN))) * * * * * *&& (self.guild == GIL_KDW) && (RavenIsDead == FALSE) * * * * * *{ * * * * * * * *// проиграть эффект "Дрожь земли" * * * * * * * *B_EVENT_PORTAL_EARTHQUAKE(); * * * * * *}; * * * *}; * *} * *// если флаг сброшен * *if (self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// стоять в режиме охраны * * * *AI_PlayAni(self,"T_STAND_2_LGUARD"); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Study_WP_end() { * *// НПС передает лист бумаги ГГ (other) (Примечание: правильнее other заменить на hero) * *Npc_RemoveInvItems(self,Fakescroll_Addon,Npc_HasI tems(other,Fakescroll_Add on)); }; *
... ещё файл
// **************** // Работа щеткой // ****************
// Функция инициализации состояния func void ZS_Sweep_FP() { * * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// если НПС расположен не на своем вайпоинте * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == 0) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self, self.wp); * *}; * *// если НПС не имеет Щетки * *if(Npc_HasItems(self,ItMi_Brush) == 0) * *{ * * * *// создать в инвентаре НПС Щетку * * * *CreateInvItem(self,ItMi_Brush); * *}; * }; * * // Функция цикла состояния func int ZS_Sweep_FP_Loop() { * *// если фрипоинт существует и свободен * *if(Npc_IsOnFP(self,"SWEEP")) * *{ * * * * *// выравняться * * * *AI_AlignToFP(self); * * * *// если НПС шел на фрипоинт * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) * * * *{ * * * * * *// сброс флага * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *}; * *} * * *// если фрипоинт существует и свободен * *else if(Wld_IsFPAvailable(self,"SWEEP")) * *{ * * * *// идти на фрипоинт * * * *AI_GotoFP(self,"SWEEP"); * * * *// встать * * * *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_Brush,1); * * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Sweep_FP_End() { * *// прекратить работа * *AI_UseItemToState(self,ItMi_Brush,-1); };
... ещё файл
// ************ // Умываться // ************ // Примечание: В скриптах не используется, может быть удалена c корректировкой файла ТА.d
func void ZS_Wash_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); * *}; * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
func int ZS_Wash_FP_Loop() { * *if(Npc_IsOnFP(self,"WASH")) * *{ * * * *AI_AlignToFP(self); * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK) * * * *{ * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *}; * *} * *else if(Wld_IsFPAvailable(self,"WASH")) * *{ * * * *AI_GotoFP(self,"WASH"); * * * *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) && (Npc_IsOnFP(self,"WASH"))) * *{ * * * *AI_AlignToFP(self); * * * *AI_StandUp(self); * * * *AI_PlayAni(self,"T_STAND_2_WASH"); * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *return LOOP_CONTINUE; }; *
func void ZS_Wash_FP_End() { * *AI_PlayAni(self,"T_WASH_2_STAND"); };
|