Показать сообщение отдельно
Старый 15.02.2005, 09:48   #102
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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;
* *};
};

Ответить с цитированием