|
Re: Уроки скриптологии
Реакция НПС людей на врага.
// ************************************************** ****************************** // Функция реакции НПС (людей) на врага (обработка активного восприятия PERC_ASSESSENEMY). // враг должен быть в поле зрения НПС (люди не имеют чувства обоняния) // Макс. дистанция реакции на врага - PERC_DIST_ACTIVE_MAX. // ************************************************** ****************************** // Возвращает TRUE, если реакция НПС на врага закончилась сражением // ************************************************** ******************************
func int B_AssessEnemy() { * *// other в функции - враг, self - НПС * *// Тестовый режим: Игнорирование Инспектора уровня * *var C_NPC PCL; * *PCL = Hlp_GetNpc(PC_Levelinspektor); * *// Если враг является Инспектором уровня * *if(Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL)) * *{ * * * *return FALSE; * *}; * *// Аддон * *// Если (враг не ГГ и враг человек * *if((Hlp_GetInstanceID(other) != Hlp_GetInstanceID(hero)) && (other.guild < GIL_SEPERATOR_HUM) * *// и (НПС не может атаковать или враг не может атаковать)) * * * *&& ((self.aivar[AIV_NoFightParker] == TRUE) ¦¦ (other.aivar[AIV_NoFightParker] == TRUE))) * *// или (враг монстр и враг не может атаковать) * * * *¦¦ ((other.guild > GIL_SEPERATOR_HUM) && (other.aivar[AIV_NoFightParker] == TRUE)) * *{ * * * *return FALSE; * *}; * * *// Аддон * *// Если (враг плывет или враг ныряет) и НПС не хочет лезть в воду * *if(C_BodyStateContains(other,BS_SWIM) ¦¦ C_BodyStateContains(other,BS_DIVE)) && (self.aivar[AIV_MM_FollowInWater] == FALSE) * *{ * * * *return FALSE; * *}; * *// Если расстояние по высоте между НПС и врагом > дистанции реагирования по высоте * *if(Npc_GetHeightToNpc(self,other) > PERC_DIST_HEIGHT) * *{ * * * *return FALSE; * *}; * *// Если НПС член партии * *if(self.aivar[AIV_PARTYMEMBER] == TRUE) * *{ * * * *// если дистанция между НПС и врагом > 1.5 метра * * * *if(Npc_GetDistToNpc(self,other) > 1500) * * * *{ * * * * * *return FALSE; * * * *}; * * * *// если НПС не видит врага * * * *if(!Npc_CanSeeNpc(self, other)) * * * *{ * * * * * * *return FALSE; * * * *}; * *}; * *// Если враг является переодетым бандитом и НПС бандит * *if(C_PlayerisFakeBandit(self,other)) && (self.guild == GIL_BDT) * *{ * * * *return FALSE; * *}; * *// Магический Голем * *var C_NPC MGO; MGO = Hlp_GetNpc(MagicGolem); * *// Ларес * *var C_NPC LAR; LAR = Hlp_GetNpc(VLK_449_Lares); * *// Если НПС есть Ларес и враг есть Магический Голем * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(LAR)) && (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(MGO)) * *{ * * * *return FALSE; * *}; * *// Если (врагов у НПС нет или врагов у врага нет) и враг человек * *if((self.aivar[AIV_EnemyOverride] == TRUE) ¦¦ (other.aivar[AIV_EnemyOverride] == TRUE)) && (other.guild < GIL_SEPERATOR_HUM) * *{ * * * *return FALSE; * *}; * *// Если отношения между НПС и врагом не вражеские * *if(Npc_GetAttitude(self,other) != ATT_HOSTILE) * *{ * * * *return FALSE; * *}; * *// Если НПС охраняет ворота * *if(C_NpcIsGateGuard(self)) * *{ * * * *return FALSE; * *}; * * * *// Если враг есть ГГ и НПС ему друг * *if(Npc_IsPlayer(other) && (self.npctype == NPCTYPE_FRIEND)) * *{ * * * *return FALSE; * *}; * *// Если гильдии НПС и врага не враждуют между собой * *if(Wld_GetGuildAttitude(self.guild,other.guild) != ATT_HOSTILE) * *{ * * * *// Если НПС враждебен к врагу [Примечание, далее врагом может быть только ГГ, т.к. прочие НПС не имеют temp_att к другим НПС] * * * *if(Npc_GetAttitude(self,other) == ATT_HOSTILE) * * * *// и (НПС находится в текущем состоянии > 2 секунд или НПС наблюдает за ГГ) * * * *&& ((Npc_GetStateTime(self) > 2) ¦¦ Npc_IsInState(self,ZS_ObservePlayer)) * * * *// и дистанция между НПС и ГГ <= дальности действия пассивного восприятия * * * *&& (Npc_GetDistToNpc(self,other) <= PERC_DIST_INTERMEDIAT) * * * *{ * * * * * *// вызов функции сражения * * * * * *B_Attack(self, other, self.aivar[AIV_LastPlayerAR], 0); * * * * * *return TRUE; * * * *} * * * *else * * * *{ * * * * * *return FALSE; * * * *}; * *}; * *// В любом другом случае вызов функции сражения * *B_Attack(self,other,AR_GuildEnemy,0); * *return TRUE; };
|