|
Re: Уроки скриптологии
// ************************************************** **** // Функция реакции монстров на предупреждение // ------------------------------------------------------ // Предупреждение посылается только скриптами (вызов функции Npc_SendPassivePerc), ядром не испоьзуется // ************************************************** ****
func void B_MM_AssessWarn() { * *// self - наблюдатель, other - агрессор, victim - жертва * *// если наблюдатель орк * *if(self.guild > GIL_SEPERATOR_ORC) * *{ * * * *// если наблюдатель находится в состоянии атаки * * * *if(Npc_IsInState(self,ZS_MM_Attack)) * * * *{ * * * * * *return; * * * *}; * * * *// если гильдия наблюдателя дружественна гильдии агрессора * * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY) * * * *{ * * * * * *// очистка очереди AI команд наблюдателя * * * * * *Npc_ClearAIQueue(self); * * * * * *// установка жертвы в качестве цели наблюдателю * * * * * *Npc_SetTarget(self,victim); * * * * * *// очистка восприятий наблюдателя * * * * * *B_ClearPerceptions(self); * * * * * *// наблюдатель атакует жертву * * * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * * * *return; * * * *}; * * * *return; * *}; * *// если агрессор человек * *if(other.guild < GIL_SEPERATOR_HUM) * *{ * * * *return; * *}; * *// если расстояние по высоте между наблюдателем и агрессором > дистанции реагирования по высоте * *if(Npc_GetHeightToNpc(self,other) > PERC_DIST_HEIGHT) * *{ * * * *return; * *}; * *// если наблюдатель находится в состоянии атаки * *if(Npc_IsInState(self,ZS_MM_Attack)) * *{ * * * *// если наблюдателя устраивает добыча в виде агрессора и приоритет наблюдателя "пожирание падали" * * * *if(C_PredatorFoundPrey(self,other)) && (self.aivar[AIV_MM_PRIORITY] == PRIO_EAT) * * * *{ * * * * * *// очистка очереди AI команд наблюдателя * * * * * *Npc_ClearAIQueue(self); * * * * * *// установка агрессора в качестве цели наблюдателю * * * * * *Npc_SetTarget(self,other); * * * *} * * * *else // иначе цель не меняется * * * *{ * * * * * *// возврат цели для наблюдателя (последняя бывшая цель) * * * * * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]); * * * *}; * * * *return; * *}; * *// если гильдии наблюдателя и агрессора одинаковы и наблюдатель охотится стаей * *if(self.guild == other.guild) && (self.aivar[AIV_MM_Packhunter] == TRUE) * *{ * * * *// если наблюдатель волк и жертва волк и жертва ГГ (превращенный в волка) * * * *if(self.guild == GIL_WOLF) && (victim.guild == GIL_WOLF) && Npc_IsPlayer(victim) * * * *{ * * * * * *return; * * * *}; * * * *// если агрессор находится в состоянии атаки * * * *if(Npc_IsInState(other,ZS_MM_Attack)) * * * *{ * * * * * *Npc_ClearAIQueue(self); * * * * * *Npc_SetTarget(self,victim); * * * * * *B_ClearPerceptions(self); * * * * * *// наблюдатель атакует жертву * * * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * * * * *return; * * * *}; * * * *// если агрессор находится в состоянии угрозы врагу * * * *if(Npc_IsInState(other,ZS_MM_ThreatenEnemy)) * * * *{ * * * * * *// агрессор бежит * * * * * *AI_SetWalkmode(self,NPC_RUN); * * * * * *// к жертве * * * * * *AI_GotoNpc(self,victim); * * * * * *return; * * * *}; * *}; * *return; };
... и еще одна функция
// ************************************************** ****** // Функция реакции монстров на ГГ // -------------------------------------------------------- // Вызывается ядром системы в качестве реакции на активное восприятие PERC_ASSESSPLAYER // Используется только конкретными монстрами // ************************************************** ******
func void B_MM_AssessPlayer() { * *// other - ГГ, self - монстр * *// если ГГ в состоянии диалога * *if(other.aivar[AIV_INVINCIBLE] == TRUE) * *{ * * * *return; * *}; * *// если ГГ мертв, безсознания и т.д. (обездвижен) * *if(C_NpcIsDown(other)) * *{ * * * *return; * *}; * *// подготовка разговора ГГ с драконами * *B_AssignDragonTalk(self); * *// если расстояние между ГГ и монстром < 7м и монстр имеет важную информацию * *if(Npc_GetDistToNpc(self,other) <= 700) && (Npc_CheckInfo(self,1)) * *{ * * * *// если монстр дракон или (монстр не дракон и расстояние между монстром и ГГ <= дистанции начала диалога) * * * *if(self.guild == GIL_DRAGON) ¦¦ ((self.guild != GIL_DRAGON) && (Npc_GetDistToNpc(self,other) <= PERC_DIST_DIALOG)) * * * *{ * * * * * *// если ГГ не падает и не плывет и не ныряет * * * * * *if(!C_BodyStateContains(other,BS_FALL)) && (!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE)) * * * * * *{ * * * * * * * *// у монстра устанавливается флаг начала разговора * * * * * * * *self.aivar[AIV_NpcStartedTalk] = TRUE; * * * * * * * *// реакция ГГ на предлагаемый разговор * * * * * * * *B_AssessTalk(); * * * * * * * *return; * * * * * *}; * * * *}; * *}; * *// если монстр член партии ГГ * *if(self.aivar[AIV_PARTYMEMBER] == TRUE) * *{ * * * *// если расстояние между ГГ и монстром < 5м и монстр не стоит * * * *if(Npc_GetDistToNpc(self,hero) < 500) && (!C_BodyStateContains(self,BS_STAND)) * * * *{ * * * * * *// очистка очереди AI состояний монстра * * * * * *Npc_ClearAIQueue(self); * * * * * *// монстр останавливается * * * * * *AI_StandUp(self); * * * * * *// и поворачивается к ГГ * * * * * *AI_TurnToNpc(self,hero); * * * *}; * *}; };
Все файлы активных и пассивных восприятий монстров находятся в директории ..\AI\Monster\B_Monster\ и имеют имена эквивалентные функциям восприятий.
|