|
Re: Уроки скриптологии
// ********************** // Стоять скрестив руки // **********************
// Функция инициализации состояния func void ZS_Stand_ArmsCrossed() { * *// установить нормальный набор восприятий * *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_ArmsCrossed_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_StandUp(self); * * * *// стоять скрестив руки (режим охраны) * * * *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(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"); * * * *}; * * * *var int Eventrandy; * * * *Eventrandy = Hlp_Random(200); * * * *// с вероятностью 0.005 и если НПС в Яркендаре и Равен не убит и НПС не пират * * * *if(Eventrandy == 1) && (CurrentLevel == ADDONWORLD_ZEN) && (RavenIsDead == FALSE) && (self.guild != GIL_PIR) * * * *{ * * * * * *// проиграть эффект "Дрожь земли" * * * * * *B_EVENT_PORTAL_EARTHQUAKE(); * * * *}; * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Stand_ArmsCrossed_end() { * *// выйти из режима охраны * *AI_PlayAni(self,"T_LGUARD_2_STAND"); * * };
... ещё файл
// ***************************************** // Состояние ожидания Черных магов (Ищущие) // *****************************************
// Функция инициализации состояния func void ZS_Stand_Dementor() { * *// разрешить НПС все чувства * *self.senses * * * * = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL; * * * *// установить дальность чувств = макс. чувствительности монстров * *self.senses_range * = PERC_DIST_MONSTER_ACTIVE_MAX; * * * * * * * *// если НПС имеет важную информацию * *if(Npc_KnowsInfo(self,1)) * *{ * * * *// установить время реакции на восприятия 0.3 сек * * * *Npc_SetPercTime(self,0.3); * *} * *else * *{ * * * *// установить время реакции на восприятия 1 сек * * * *Npc_SetPercTime(self,1); * *}; * *// разрешить восприятие НПС на ГГ * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessPla yer); * *// разрешить восприятие врага * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y); * *// разрешить восприятие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// разрешить восприятие повреждений * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age); * *// если НПС особенный "Черный маг" * *if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(DMT_1299_OberDementor_DI)) * *{ * * * *// разрешить восприятие звуков сражения * * * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFightSound); * *}; * *// разрешить восприятие предупреждения * *Npc_PercEnable(self,PERC_ASSESSWARN,B_AssessWarn) ; * *// разрешить восприятие разговора * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *// разрешить восприятие перемещения МОВа * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob); * *// перевод НПС в исходное состояние * *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_Dementor_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_StandUp(self); * * * *// анимация состояния охраны * * * *AI_PlayAni(self,"T_STAND_2_LGUARD"); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Stand_Dementor_end() { * *// анимация прекращения действия * *AI_PlayAni(self,"T_LGUARD_2_STAND"); * * };
... ещё файл
// ********************** // Пить самогон стоя // ********************** // Функция инициализации состояния func void ZS_Stand_Drinking() { * *// установить нормальный набор восприятий * *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,ItFo_Booze) == 0) * *{ * * * *// создать в инвентаре НПС бутылку самогона * * * *CreateInvItem(self,ItFo_Booze); * *}; * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; }; // Функция цикла состояния func int ZS_Stand_Drinking_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,ItFo_Booze,0); * * * *// установить флаг выполнения нужной функции * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *// если прошло > 7 сек и НПС пьет самогон * *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) * *{ * * * *var int random; * * * *random = Hlp_Random(10); * * * *// случайная анимация движений * * * *if (random == 0) * * * *{ * * * * * *// осмотреть бутылку * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_3",BS_ITEMINTE RACT); * * * * * *// пить * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT); * * * *} * * * *else if (random == 1) * * * *{ * * * * * *// пить * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT); * * * * * *// утереть рот * * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT); * * * *} * * * *else * * * *{ * * * * * *// пить * * * * * *AI_PlayAniBS (self,"T_POTION_RANDOM_1",BS_ITEMINTERACT); //trinken * * * *}; * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; }; // Функция завершения состояния func void ZS_Stand_Drinking_end () { * *// прекратить пьянство * *AI_UseItemToState(self,ItFo_Booze,-1); };
... ещё файл
// ********************** // Употреблять пищу стоя // **********************
// Функция инициализации состояния func void ZS_Stand_Eating() { * *// установить нормальный набор восприятий * *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; * *var int random; * *random = Hlp_Random(4); * *// случайным образом создать в инвентаре один из предметов, если его нет * * * *if(random == 0) * *{ * * * *// Яблоко * * * *if(Npc_HasItems (self,ItFo_Apple) == 0) * * * *{ * * * * * *CreateInvItem(self,ItFo_Apple); * * * *}; * * * *self.aivar[AIV_Food] = FOOD_Apple; * *} * *else if(random == 1) * *{ * * * *// Сыр * * * *if(Npc_HasItems(self,ItFo_Cheese) == 0) * * * *{ * * * * * *CreateInvItem(self,ItFo_Cheese); * * * * * *}; * * * *self.aivar[AIV_Food] = FOOD_Cheese; * *} * *else if(random == 2) * *{ * * * *// Бекон * * * *if(Npc_HasItems(self,ItFo_Bacon) == 0) * * * *{ * * * * * *CreateInvItem(self,ItFo_Bacon); * * * *}; * * * * *self.aivar[AIV_Food] = FOOD_Bacon; * *} * *else if(random == 3) * * * *{ * * * *// Жареное мясо * * * *if(Npc_HasItems(self,ItFoMutton) == 0) * * * *{ * * * * * *CreateInvItem(self,ItFoMutton); * * * *}; * * * * *self.aivar[AIV_Food] = FOOD_Bread; * *}; * };
// Функция цикла состояния func int ZS_Stand_Eating_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) * *{ * * * *// если употребляем Яблоко * * * *if(self.aivar[AIV_Food] == FOOD_Apple) * * * * *{ * * * * * *// жевать Яблоко * * * * * *AI_UseItemToState(self,ItFo_Apple,0); * * * * * *// анимация * * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_2",BS_ITEMINTERA CT); * * * * * *// установить флаг выполнения нужной функции * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * *} * * * *// если употребляем Сыр * * * *if(self.aivar[AIV_Food] == FOOD_Cheese) * * * * * *{ * * * * * *// жевать Сыр * * * * * *AI_UseItemToState(self,ItFo_Cheese,0); * * * * * *// установить флаг выполнения нужной функции * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * * *} * * * *// если употребляем Бекон * * * *if(self.aivar[AIV_Food] == FOOD_Bacon) * * * *{ * * * * * * *// жевать Бекон * * * * * *AI_UseItemToState(self,ItFo_Bacon,0); * * * * * *// установить флаг выполнения нужной функции * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * * *} * * * *// если употребляем Жареное мясо * * * *if(self.aivar[AIV_Food] == FOOD_Bread) * * * *{ * * * * * * *// жевать Яблоко * * * * * *AI_UseItemToState(self,ItFoMutton,0); * * * * * *// установить флаг выполнения нужной функции * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * * *}; * *}; * * * * *// если прошло > 5 сек и НПС жует * *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS)) * *{ * * * *// анимация жевания разной пищи * * * *if(self.aivar[AIV_Food] == FOOD_Apple) * * * *{ * * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_1",BS_ITEMINTERA CT); * * * *} * * * *else if(self.aivar[AIV_Food] == FOOD_Bacon) ¦¦ (self.aivar[AIV_Food] == FOOD_Bread) * * * *{ * * * * * *AI_PlayAniBS (self,"T_MEAT_RANDOM_1",BS_ITEMINTERACT); * * * *} * * * *else * * * *{ * * * * * *AI_PlayAniBS (self,"T_FOODHUGE_RANDOM_1",BS_ITEMINTERACT); * * * *}; * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Stand_Eating_End () { * *// прекратить анимацию * *AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT); * *// прекратить жевать пищу * *if(self.aivar[AIV_Food] == FOOD_Apple) *{ AI_UseItemToState(self,ItFo_Apple,-1); }; * *if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFo_Cheese,-1);}; * *if(self.aivar[AIV_Food] == FOOD_Bacon) *{ AI_UseItemToState(self,ItFo_Bacon,-1); }; * *if(self.aivar[AIV_Food] == FOOD_Bread) *{ AI_UseItemToState(self,ItFoMutton,-1); }; };
ЗЫ: Не забывайте про "прослойки", иногда чтобы выдать инфу приходиться ждать окончания суток.
|