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

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

По умолчанию Re: Уроки скриптологии

// ******************************************
// Функция реакции монстров на мертвое тело
// ------------------------------------------
// Вызывается ядром системы в качестве реакции на пассивное восприятие PERC_ASSESSBODY
// ******************************************

func void B_MM_AssessBody()
{
* *// self - монстр, other - труп
* *// если монстр принадлежит к оркам
* *if(self.guild > GIL_SEPERATOR_ORC)
* *{
* * * *return;
* *};
* *// если расстояние по высоте между монстром и трупом > расстояния реакции по высоте
* *if(Npc_GetHeightToNpc(self,other) > PERC_DIST_HEIGHT)
* *{
* * * *return;
* *};
* *// если приоритетом монстра является нападение
* *if(self.aivar[AIV_MM_PRIORITY] == PRIO_ATTACK)
* *{
* * * *return;
* *};
* *// если труп не нравится монстру
* *if(!C_WantToEat(self,other)) * * * * * * * * * *
* *{
* * * *return;
* *};
* *// если монстр находится в состоянии атаки
* *if(Npc_IsInState(self,ZS_MM_Attack))
* *{
* * * *var C_NPC stoerenfried;
* * * *// последний атакованный НПС
* * * *stoerenfried = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);
* * * *// если расстояние между атакованным НПС и трупом <= дистанции атаки монстров
* * * *if(Npc_GetDistToNpc(stoerenfried,other) <= FIGHT_DIST_MONSTER_ATTACKRANGE)
* * * *{
* * * * * *return;
* * * *};
* *};
* *// очистка очереди AI состояний монстра
* *Npc_ClearAIQueue(self);
* *// очистка восприятий монстра
* *B_ClearPerceptions(self);
* *// переход в состояние пожирания трупа
* *AI_StartState(self,ZS_MM_EatBody,0,"");
* *return;
};


... и еще одна функция

// ************************************************** ******
// Функция реакции монстра на повреждение
// --------------------------------------------------------
// Вызывается ядром системы в качестве реакции на пассивное восприятие PERC_ASSESSDAMAGE
// ************************************************** ******

func void B_MM_AssessDamage()
{
* *// self - монстр жертва, other - НПС агрессор
* *// установить монстру приоритет на атаку
* *self.aivar[AIV_MM_PRIORITY] = PRIO_ATTACK;
* *// вызов функции реакции на повреждение "Когтем Белиара"
* *B_BeliarsWeaponSpecialDamage(other,self);
* *// если агрессор имеет "Святой молот"
* *if(Npc_HasItems(other,Holy_Hammer_MIS) > 0)
* *{
* * * *var C_NPC MagGol;
* * * *// Магический голем
* * * *MagGol = Hlp_GetNpc(MagicGolem);
* * * *// проинициализировать глобальную переменную item "Святым молотом"
* * * *Npc_GetInvItem(other,Holy_Hammer_MIS);
* * * *var C_ITEM OthWeap;
* * * *// оружие, которое агрессор держит в руке
* * * *OthWeap = Npc_GetReadiedWeapon(other);
* * * *// если жертва Магический голем и оружие у агрессора в руке "Святой молот"
* * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(MagGol)) && (Hlp_GetInstanceID(OthWeap) == Hlp_GetInstanceID(item))
* * * *{
* * * * * *// Жизнь Магического голема -= 1000 LP
* * * * * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-1000);
* * * * * *return;
* * * *};
* *}; * * *
* *// если жертва Каменный сторож и у него нет врагов
* *if(self.guild == GIL_STONEGUARDIAN) && (self.aivar[AIV_EnemyOverride] == TRUE)
* *{
* * * *// пробуждение Каменного сторожа
* * * *B_AWAKE_STONEGUARDIAN(self);
* *}; *
* *// если агрессора устраивает добыча в виде жертвы
* *if(C_PredatorFoundPrey(other,self))
* *{
* * * *// очистка очереди AI состояний жертвы
* * * *Npc_ClearAIQueue(self);
* * * *// установка цели для жертвы
* * * *Npc_SetTarget(self,other);
* * * *// очистка восприятий жертвы
* * * *B_ClearPerceptions(self);
* * * *// жертва убегает от агрессора
* * * *AI_StartState(self,ZS_MM_Flee,0,""); * *
* * * *return;
* *};
* *// если жертва находится в состоянии атаки
* *if(Npc_IsInState(self,ZS_MM_Attack))
* *{
* * * *// если агрессор ГГ и жертва член партии
* * * *if(Npc_IsPlayer(other)) && (self.aivar[AIV_PARTYMEMBER] == TRUE)
* * * *{
* * * * * *return;
* * * *};
* * * *// если жертва скелет и агрессор маг скелетов
* * * *if(self.aivar[AIV_MM_REAL_ID] == ID_SKELETON) && (other.aivar[AIV_MM_REAL_ID] == ID_SKELETON_MAGE)
* * * *{
* * * * * *return;
* * * *};
* * * *// если агрессор не является НПС, атакованным жертвой
* * * *if(Hlp_GetInstanceID(other) != self.aivar[AIV_LASTTARGET])
* * * *{
* * * * * *// если удар жертве нанесен агрессором не первый раз
* * * * * *if(self.aivar[AIV_HitByOtherNpc] == Hlp_GetInstanceID(other))
* * * * * *{
* * * * * * * *// смена цели (жертва будет атаковать агрессора)
* * * * * * * *Npc_SetTarget(self,other);
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// при первом ударе жертве записывается ID агрессора
* * * * * * * *self.aivar[AIV_HitByOtherNpc] = Hlp_GetInstanceID(other);
* * * * * *};
* * * *};
* * * *return;
* *};
* *// очистка очереди AI состояний жертвы
* *Npc_ClearAIQueue(self);
* *// установка цели для жертвы
* *Npc_SetTarget(self,other);
* *// очистка восприятий жертвы
* *B_ClearPerceptions(self);
* *// жертва атакует агрессора
* *AI_StartState(self,ZS_MM_Attack,0,"");
* *return;
};

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