|
Re: Уроки скриптологии
// ************************************************** *** // Обработчик состояния когда НПС находится безсознания // Примечание: НПС в это состояние переводит ядро системы, когда у НПС кончается жизнь, а не скрипты! // ----------------------------------------------------- // self - НПС безсознания, other - агрессор // ************************************************** ***
// Инициализация состояния func void ZS_Unconscious() { * * *// разрешить НПС воспринимать магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// если НПС плыл или нырял * *if(C_BodyStateContains(self,BS_SWIM)) ¦¦ (C_BodyStateContains(self,BS_DIVE)) * *{ * * * *// очистка очереди AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// очистка всех восприятий * * * *B_ClearPerceptions(self); * * * *// переход НПС в состояние трупа (смерть) * * * *AI_StartState(self,ZS_Dead,0,""); * * * *return; * *}; * *// сброс статуса предупреждения охраной * *self.aivar[AIV_Guardpassage_Status] = GP_NONE; * *// сброс счетчика отказа от диалога * *Npc_SetRefuseTalk(self,0); * *// сброс временного отношения НПС к ГГ (устанавливается равным постоянному отношению) * *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero)); * *// НПС перестает смотреть на кого-либо * *B_StopLookAt(self); * *// НПС прекращает на что-либо указывать * *AI_StopPointAt(self); * *// если НПС человек и агрессор ГГ * *if(self.guild < GIL_SEPERATOR_HUM) && (Npc_IsPlayer(other)) * * * * * * * * * * * * * * * *{ * * * *// установить флаг, что НПС побежден ГГ * * * *self.aivar[AIV_DefeatedByPlayer] = TRUE; * * * *// установить, что НПС проиграл сражение с ГГ * * * *self.aivar[AIV_LastFightAgainstPlayer] = FIGHT_LOST; * * * *// если причины у НПС нападать на ГГ не было и ГГ этого НПС из наемников еще не бил и НПС наемник * * * *if(self.aivar[AIV_LastPlayerAR] == AR_NONE) && (self.aivar[AIV_DuelLost] == FALSE) && (self.guild == GIL_SLD) * * * *{ * * * * * *// увеличить счетчик для задания Торлофа (побить > 3 наемников) * * * * * *Sld_Duelle_gewonnen = Sld_Duelle_gewonnen + 1; * * * * * *// установить флаг, что наемник побит ГГ * * * * * *self.aivar[AIV_DuelLost] = TRUE; * * * *}; * * * *// *если НПС сражался на арене с Альриком * * * *if(self.aivar[AIV_ArenaFight] == AF_RUNNING) * * * *{ * * * * * *// запись следующей фазы сражения на арене НПС * * * * * *self.aivar[AIV_ArenaFight] = AF_AFTER; * * * *}; * *}; * *// если НПС безсознания ГГ * *if(Npc_IsPlayer(self)) * *{ * * * *// установить, что агрессор выиграл сражение с ГГ * * * *other.aivar[AIV_LastFightAgainstPlayer] = FIGHT_WON; * * * *// если ГГ сражался на арене с Альриком * * * *if(other.aivar[AIV_ArenaFight] == AF_RUNNING) * * * *{ * * * * * *// запись следующей фазы сражения на арене Альрику * * * * * *other.aivar[AIV_ArenaFight] = AF_AFTER; * * * *}; * *}; * *// удаление продаваемых предметов у торговцев * *B_GiveTradeInv(self); * *// удаление рун у НПС * *B_ClearRuneInv(self); * *// если (агрессор ГГ или агрессор член партии ГГ) и начисления экспы ГГ за победу над НПС не было * *if(Npc_IsPlayer(other) ¦¦ (other.aivar[AIV_PARTYMEMBER] == TRUE)) && (self.aivar[AIV_VictoryXPGiven] == FALSE) * *{ * * * *// начисление ГГ экспы (уровень НПС * 10) * * * *B_GivePlayerXP(self.level * XP_PER_VICTORY); * * * *// установить НПС флаг начисления экспы * * * *self.aivar[AIV_VictoryXPGiven] = TRUE; * *}; * *// убрать оружие экипированное НПС * *AI_UnequipWeapons(self); * *// если НПС "Дар" и агрессор "Сайфер" * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Dar)) && (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Cipher)) * *{ * * * *// установка флага для квеста с пакетом болотника * * * *Dar_LostAgainstCipher = TRUE; * *}; }; * * // Цикл состояния func int ZS_Unconscious_Loop() { * *// если время цикла < времени нахождения в бессознательном состоянии * *if(Npc_GetStateTime(self) < HAI_TIME_UNCONSCIOUS) * *{ * * * *return LOOP_CONTINUE; * *} * *else // иначе * *{ * * * *return LOOP_END; * *}; };
// Завершение состояния func void ZS_Unconscious_End() { * * *// сброс флага, что тело обыскивалось * *self.aivar[AIV_RANSACKED] = FALSE; * *// НПС встает * *AI_StandUp(self); * *// если НПС ГГ * *if(Npc_IsPlayer(self)) * *{ * * * *return; * *}; * *// если НПС "Равен" * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Raven)) * *{ * * * *// установка флага, что НПС всегда использует магию * * * *self.aivar[AIV_MagicUser] = MAGIC_ALWAYS; * * * *// Равен атакует ГГ * * * *B_Attack(self,hero,AR_GuildEnemy,0); * * * *return; * *}; * *// если НПС видит агрессора по прямой и расстояние между НПС и агрессором < дистанции действия восприятия * *if(Npc_CanSeeNpcFreeLOS(self,other)) && (Npc_GetDistToNpc(self,other) < PERC_DIST_INTERMEDIAT) * *{ * * * *// НПС поворачивается к агрессору * * * *B_TurnToNpc (self,other); * * * *// если НПС имел дело с "крутым парнем" и НПС не враг агрессору и НПС не друг ГГ * * * *if(C_NpcIsToughGuy(self)) && (Npc_GetPermAttitude(self,other) != ATT_HOSTILE) && (self.npctype != NPCTYPE_FRIEND) * * * *{ * * * * * *// НПС говорит ГГ (SVM фраза "В следующий раз мы это увидим...") * * * * * *B_Say(self,other,"$NEXTTIMEYOUREINFORIT"); * * * *} * * * *else // иначе * * * *{ * * * * * *// НПС говорит ГГ (SVM фраза "О, мой череп...") * * * * * *B_Say(self,other,"$OHMYHEAD"); * * * *}; * *}; * *// разрешить НПС воспринимать все объекты в зоне действия восприятия * *Npc_PerceiveAll(self); * *// если НПС находит оружие ближнего или дальнего радиуса поражения * *if(Wld_DetectItem(self,ITEM_KAT_NF)) ¦¦ (Wld_DetectItem(self,ITEM_KAT_FF)) * *{ * * * *// если ссылка на предмет item существует * * * *if(Hlp_IsValidItem(item)) * * * *{ * * * * * *// если расстояние от НПС до предмета < 5 метров * * * * * *if(Npc_GetDistToItem(self,item) <= 500) * * * * * *{ * * * * * * * *// НПС берет предмет * * * * * * * *AI_TakeItem(self,item); * * * * * *}; * * * *}; * *}; * *// экипировка лучшим оружием * *AI_EquipBestMeleeWeapon(self); * *AI_EquipBestRangedWeapon(self); * *// переход НПС в состояние самолечения * *AI_StartState(self,ZS_HealSelf,0,""); * *return; };
|