|
Re: Уроки скриптологии
// ************************************************** ***** // Состояние защиты своего помещения // ************************************************** ***** // Здесь: self - НПС хозяин помещения, other - "незванный гость" (ГГ) // ************************************************** *****
// Функция обработки восприятия разговора (вызывается когда ГГ обращается к НПС хозяину) func void B_ClearRoomTalk() { * *// если НПС хочет напасть на "гостя" * *if(C_WantToAttackRoomIntruder(self)) * *{ * * * *// НПС предупреждает "гостя" (SVM фраза "Пошел вон!") * * * *B_Say(self,other,"$GETOUTOFHERE"); * *} * *else * *{ * * * *// НПС спрашивает "гостя" (SVM фраза "Что ты тут ищешь!?") * * * *B_Say(self,other,"$WHYAREYOUINHERE"); * *}; };
// Функция обработки восприятия выхода ГГ из помещения // Возвращает TRUE если ГГ покинул помещение, иначе - FALSE func int B_ExitIfRoomLeft() { * *var int portalguild; * *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит) * *portalguild = Wld_GetPlayerPortalGuild(); * *// если ГГ покинул помещение или помещение публичное * *if(!C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (portalguild == GIL_PUBLIC) * *{ * * * *// очистка очереди AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// НПС встает * * * *AI_StandUp(self); * * * *// НПС перестает смотреть на ГГ * * * *B_StopLookAt(self); * * * *// если НПС хочет напасть на "гостя" * * * *if(C_WantToAttackRoomIntruder(self)) * * * *{ * * * * * *// НПС говорит "гостю" (SVM фраза "Да, иди прочь!") * * * * * *B_Say(self,other,"$YESGOOUTOFHERE"); * * * *} * * * *else * * * *{ * * * * * *// НПС говорит "гостю" (SVM фраза "Умный малый!") * * * * * *B_Say(self,other,"$WISEMOVE"); * * * *}; * * * *// НПС продолжает выполнение распорядка дня * * * *AI_ContinueRoutine(self); * * * *return TRUE; * *}; * *return FALSE; };
// Инициализация состояния защиты помещения func void ZS_ClearRoom() { * * *// установить минимальный набор восприятий НПС * *Perception_Set_Minimal(); * *// заменить восприятие входа в помещение на восприятие выхода "гостя" из помещения * *Npc_PercEnable(self,PERC_ASSESSENTERROOM,B_ExitIf RoomLeft); * *// включить восприятие на перемещение МОВа * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob); * *// заменить восприятие разговора НПС * *Npc_PercEnable(self,PERC_ASSESSTALK,B_ClearRoomTa lk); * *// НПС встает * *AI_StandUp(self); * *// НПС смотрит на "гостя" * *B_LookAtNpc(self,other); * *// НПС бежит к "гостю" * *AI_SetWalkmode(self,NPC_RUN); * *// если НПС находится вне помещения * *if(!Npc_IsInPlayersRoom(self)) * * *{ * * * *// НПС бежит в точку, ближайшую к ГГ * * * *AI_GotoWP(self,Npc_GetNearestWP(other)); * *}; * *// установка признака входа в цикл * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Функция цикла защиты помещения func int ZS_ClearRoom_Loop() { * *// если осуществен первый вход в цикл * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// НПС поворачивается к "гостю" * * * *B_TurnToNpc(self,other); * * * *// если НПС хочет напасть на "гостя" * * * *if(C_WantToAttackRoomIntruder(self)) * * * *{ * * * * * *// НПС выбирает соответствующее "гостю" оружие * * * * * *B_SelectWeapon(self,other); * * * * * *// НПС предупреждает "гостя" (SVM фраза "Пошел вон!") * * * * * *B_Say(self,other,"$GETOUTOFHERE"); * * * *} * * * *else * * * *{ * * * * * *// если НПС не является другом "гостя" * * * * * *if(Npc_GetAttitude(other,self) != ATT_FRIENDLY) * * * * * *{ * * * * * * * *// НПС спрашивает "гостя" (SVM фраза "Что ты тут ищешь!?") * * * * * * * *B_Say(self,other,"$WHYAREYOUINHERE"); * * * * * *}; * * * *}; * * * *// сброс времени нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self, 0); * * * *// закрытие первого входа в цикл * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *// если ГГ покинул помещение * *if(B_ExitIfRoomLeft()) * *{ * * * *return LOOP_END; * *}; * *// если НПС хочет напасть на "гостя" * *if(C_WantToAttackRoomIntruder(self)) * *{ * * * *// если с момента входа в помещение прошло > 5 сек * * * *if(Npc_GetStateTime(self) > 5) * * * *{ * * * * * *// НПС атакует "гостя" * * * * * *B_Attack(self,other,AR_ClearRoom,0); * * * * * *return LOOP_END; * * * *}; * *} * *else // НПС не хочет нападать (повторяется каждые две секунды) * *{ * * * *// если с момента входа в помещение прошло >= 2 сек * * * *if(Npc_GetStateTime(self) >= 2) * * * *{ * * * * * *// если НПС не видит "гостя" по прямой * * * * * *if(!Npc_CanSeeNpcFreeLOS(self,other)) * * * * * * *{ * * * * * * * *// НПС бежит в точку, ближайшую к ГГ * * * * * * * *AI_GotoWP(self,Npc_GetNearestWP(other)); * * * * * * * *// НПС поворачивается к "гостю" * * * * * * * *B_TurnToNpc(self,other); * * * * * *} * * * * * *// иначе, если НПС вообще не видит "гостя" * * * * * *else if(!Npc_CanSeeNpc(self,other)) * * * * * *{ * * * * * * * * *// НПС поворачивается в направлении "гостя" * * * * * * * *B_TurnToNpc(self,other); * * * * * *}; * * * * * *// сброс времени состояния * * * * * *Npc_SetStateTime(self,0); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция выхода из состояния защиты помещения func void ZS_ClearRoom_End() { * *// НПС перестает смотреть на "гостя" * *B_StopLookAt (self); };
|