Показать сообщение отдельно
Старый 24.02.2005, 09:52   #113
Vam

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

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

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