Показать сообщение отдельно
Старый 01.02.2005, 11:54   #90
Vam

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

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

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