|
Re: Уроки скриптологии
6. Функции обработки восприятий монстров.
// ************************************************** // Функция реакции монстров на врага. // -------------------------------------------------- // Вызывается ядром системы в качестве реакции на активное восприятие PERC_ASSESSENEMY. // **************************************************
func void B_MM_AssessEnemy() { * *// self - НПС монстр, other - враг * *// если монстр дракон и ГГ имеет "Заряженный глаз Инноса" * *if(self.guild == GIL_DRAGON) && (Npc_HasItems(hero,ItMi_InnosEye_Mis) >= 1) * *{ * * * *return; * *}; * *// если монстр или враг не могут атаковать * *if((self.aivar[AIV_NoFightParker] == TRUE) ¦¦ (other.aivar[AIV_NoFightParker] == TRUE)) * *{ * * * *return; * *}; * *// если личных врагов у монстра нет и враг человек * *if(self.aivar[AIV_EnemyOverride] == TRUE) && (other.guild < GIL_SEPERATOR_HUM) * *{ * * * *return; * *}; * *// ------- TESTMODE: Levelinspektor wird ignoriert ------ * *var C_NPC PCL; * *// "Инспектор уровня" * *PCL = Hlp_GetNpc(PC_Levelinspektor); * *// если враг "Инспектор уровня" * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL)) * *{ * * * *return; * *}; * *var C_NPC MGO; * *// Магический голем * *MGO = Hlp_GetNpc(MagicGolem); * *var C_NPC LAR; * *// Ларес * *LAR = Hlp_GetNpc(VLK_449_Lares); * *// если враг Ларес и монстр Магический голем * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(LAR)) && (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(MGO)) * *{ * * * *return; * *}; * *// если монстр находится не далее 5м от точки "OC_RAMP_07" * *if(Npc_GetDistToWP(self,"OC_RAMP_07") <= 500) * *{ * * * *return; * *}; * *// если враг находится в режиме диалога * *if(other.aivar[AIV_INVINCIBLE] == TRUE) * *{ * * * *return; * *}; * *// если враг (плывет или ныряет) и монстр не полезет в воду * *if(C_BodyStateContains(other,BS_SWIM) ¦¦ C_BodyStateContains(other,BS_DIVE)) && (self.aivar[AIV_MM_FollowInWater] == FALSE) * *{ * * * *return; * *}; * *// если расстояние по высоте между монстром и врагом > расстояния реакции по высоте * *if(Npc_GetHeightToNpc(self,other) > PERC_DIST_HEIGHT) * *{ * * * *return; * *}; * *// если ГГ враг и он превращен в монстра * *if(Npc_IsPlayer(other)) && (other.guild > GIL_SEPERATOR_HUM) * *{ * * * *// если гильдии монстра и превращенного ГГ не враждебны * * * *if(Wld_GetGuildAttitude(self.guild,other.guild) != ATT_HOSTILE) * * * *{ * * * * * *return; * * * *}; * *}; * *// если дальность обоняния монстра > макс. дальности действия активного восприятия монстров * *if(self.senses_range > PERC_DIST_MONSTER_ACTIVE_MAX) * *{ * * * *// если расстояние между монстром и врагом > макс. дальности действия активного восприятия монстров * * * *if(Npc_GetDistToNpc(self,other) > PERC_DIST_MONSTER_ACTIVE_MAX) * * * *{ * * * * * *// если монстр не видит врага * * * * * *if(!Npc_CanSeeNpc(self,other)) * * * * * *{ * * * * * * * *return; * * * * * *}; * * * *}; * *}; * *// если монстр орк или дружественный орк * *if(self.guild == GIL_ORC) ¦¦ (self.guild == GIL_FRIENDLY_ORC) * *{ * * * *// если враг подкрадавается или стоит * * * *if(C_BodyStateContains(other,BS_SNEAK)) ¦¦ (C_BodyStateContains(other,BS_STAND)) * * * *{ * * * * * *// если монстр не видит врага * * * * * *if(!Npc_CanSeeNpc(self,other)) * * * * * *{ * * * * * * * *return; * * * * * *}; * * * *}; * *}; * *// если монстр не видит врага по прямой (например, враг за стеной) * *if(!Npc_CanSeeNpcFreeLOS(self,other)) * *{ * * * *return; * *}; * *// если монстр является членом партии (вызванный) * *if(self.aivar[AIV_PARTYMEMBER] == TRUE) * *{ * * * *// если враг монстра является другом НПС * * * *if(other.npctype == NPCTYPE_FRIEND) * * * *{ * * * * * *return; * * * *}; * * * *// очистка очереди AI состояний монстра * * * *Npc_ClearAIQueue(self); * * * *// монстр выбирает цель * * * *Npc_SetTarget(self,other); * * * *// очистка восприятий монстра * * * *B_ClearPerceptions(self); * * * *// переход монстра в состояние атаки * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * *return; * *}; * *// если монстр не угрожает перед атакой (атакует сразу) * *if(self.aivar[AIV_MM_ThreatenBeforeAttack] == FALSE) * *{ * * * *Npc_ClearAIQueue(self); * * * *Npc_SetTarget(self,other); * * * *B_ClearPerceptions(self); * * * *// переход монстра в состояние атаки * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * *return; * *}; * *// если монстр находится в состоянии "пожирания падали" * *if(Npc_IsInState(self,ZS_MM_EatBody)) * *{ * * * *// если расстояние между монстром и врагом <= дистанции атаки монстров * * * *if(Npc_GetDistToNpc(self,other) <= FIGHT_DIST_MONSTER_ATTACKRANGE) * * * *{ * * * * * *Npc_ClearAIQueue(self); * * * * * *Npc_SetTarget(self,other); * * * * * *B_ClearPerceptions(self); * * * * * *// переход монстра в состояние атаки * * * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * * * *return; * * * *}; * * * *return; * * * *}; * *// если монстр находится в соостоянии охоты * *if(Npc_IsInState(self,ZS_MM_Hunt)) * *{ * * * *// если расстояние между монстром и врагом <= дистанции атаки монстров * * * *if(Npc_GetDistToNpc(self,other) <= FIGHT_DIST_MONSTER_ATTACKRANGE) * * * *{ * * * * * *Npc_ClearAIQueue(self); * * * * * *Npc_SetTarget(self,other); * * * * * *B_ClearPerceptions(self); * * * * * *// переход монстра в состояние атаки * * * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * * * *return; * * * *} * * * *else * * * *{ * * * * * *return; * * * *}; * *}; * *// если монстра устраивает добыча в виде врага * *if(C_PredatorFoundPrey(self,other)) * * * *{ * * * *Npc_ClearAIQueue(self); * * * *Npc_SetTarget(self,other); * * * *B_ClearPerceptions(self); * * * *// переход монстра в состояние охоты на врага * * * *AI_StartState(self,ZS_MM_Hunt,0,""); * * * *return; * *}; * *// если врага устраивает добыча в виде монстра * *if(C_PredatorFoundPrey(other,self)) * *{ * * * *// если враг находится в соостоянии охоты и если расстояние между монстром и врагом <= дистанции преследования * * * *if(!Npc_IsInState(other,ZS_MM_Hunt)) && (Npc_GetDistToNpc(self,other) <= FIGHT_DIST_MONSTER_FLEE) * * * *{ * * * * * *Npc_ClearAIQueue(self); * * * * * *Npc_SetTarget(self,other); * * * * * *B_ClearPerceptions(self); * * * * * *// переход монстра в состояние преследования * * * * * *AI_StartState(self,ZS_MM_Flee,0,""); * * * * * *return; * * * *} * * * *else * * * *{ * * * * * *return; * * * *}; * *}; * *// очистка очереди AI состояний монстра * *Npc_ClearAIQueue(self); * *// очистка восприятий монстра * *B_ClearPerceptions(self); * *// переход монстра в состояние угрозы * *AI_StartState(self,ZS_MM_ThreatenEnemy,0,""); * *return; };
|