|
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; };
|