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

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

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

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