|
Re: Уроки скриптологии
// ************************************************** ************** // Функция реакции монстра на убийство и на повреждение других НПС // ---------------------------------------------------------------- // Вызывается в качестве реакции на пассивные восприятия PERC_ASSESSOTHERSDAMAGE и PERC_ASSESSMURDER // ************************************************** **************
func void B_MM_AssessOthersDamage() { * *// self - монстр наблюдатель, other - агрессор, victim - жертва (труп) * *// если расстояния между (наблюдателем и жертвой) и (наблюдателем и агрессором) > макс. дальности действия восприятия * *if(Npc_GetDistToNpc(self,victim) > PERC_DIST_INTERMEDIAT) && (Npc_GetDistToNpc(self,other) > PERC_DIST_INTERMEDIAT) * *{ * * * *return; * *}; * *// если наблюдатель не видит жертву * *if(!Npc_CanSeeNpcFreeLOS(self,victim)) * *{ * * * *return; * *}; * *// если наблюдатель член партии * *if(self.aivar[AIV_PARTYMEMBER] == TRUE) * *{ * * * *// если жертва ГГ * * * *if(Npc_IsPlayer(victim)) * * * *{ * * * * * *// очистка очереди AI состояний наблюдателя * * * * * *Npc_ClearAIQueue(self); * * * * * *// очистка восприятий наблюдателя * * * * * *B_ClearPerceptions(self); * * * * * *// установка в качестве цели агрессора * * * * * *Npc_SetTarget(self,other); * * * * * *// монстр наблюдатель атакует агрессора * * * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * * * *return; * * * *}; * * * *// если агрессор ГГ и жертва жива * * * *if(Npc_IsPlayer(other)) && (!Npc_IsDead(victim)) * * * *{ * * * * * *// очистка очереди AI состояний наблюдателя * * * * * *Npc_ClearAIQueue(self); * * * * * *// очистка восприятий наблюдателя * * * * * *B_ClearPerceptions(self); * * * * * *// установка в качестве цели жертвы * * * * * *Npc_SetTarget(self,victim); * * * * * *// монстр наблюдатель атакует жертву * * * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * * * *return; * * * *}; * *}; * *// если наблюдатель волк * *if(self.guild == GIL_WOLF) * *{ * * * *// если жертва волк и агрессор волк и волк агрессор есть ГГ и жертва убита * * * *if(victim.guild == GIL_WOLF) && (other.guild == GIL_WOLF) && Npc_IsPlayer(other) && Npc_IsDead(victim) * * * *{ * * * * * *Npc_ClearAIQueue(self); * * * * * *B_ClearPerceptions(self); * * * * * *// перевод наблюдателя в состояние вызванного монстра * * * * * *self.start_aistate = ZS_MM_Rtn_Summoned; * * * * * *AI_StartState(self,ZS_MM_Rtn_Summoned,0,""); * * * * * *return; * * * *}; * *}; * *// если наблюдатель каменный страж и жертва каменный страж и у наблюдателя нет врагов * *if(self.guild == GIL_STONEGUARDIAN) && (victim.guild == GIL_STONEGUARDIAN) && (self.aivar[AIV_EnemyOverride] == TRUE) * *{ * * * *// пробуждение каменного стража наблюдателя * * * *B_AWAKE_STONEGUARDIAN(self); * *}; * * *// если гильдии наблюдателя и жертвы дружественны и гильдии наблюдателя и агрессора не дружественные * *if(Wld_GetGuildAttitude(self.guild,victim.guild) == ATT_FRIENDLY) && (Wld_GetGuildAttitude(self.guild,other.guild) != ATT_FRIENDLY) * *{ * * * *Npc_ClearAIQueue(self); * * * *B_ClearPerceptions(self); * * * *Npc_SetTarget(self,other); * * * *// наблюдатель атакует агрессора * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * *return; * *}; * *// если гильдии наблюдателя и агрессора дружественны и гильдии наблюдателя и жертвы не дружественные * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY) && (Wld_GetGuildAttitude(self.guild,victim.guild) != ATT_FRIENDLY) * *// и жертва не мертва * *&& (!Npc_IsDead(victim)) * *{ * * * *Npc_ClearAIQueue(self); * * * *B_ClearPerceptions(self); * * * *Npc_SetTarget(self,victim); * * * *// наблюдатель атакует жертву * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * *return; * *}; };
|