Показать сообщение отдельно
Старый 05.05.2005, 16:31   #160
Vam

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

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

// **********************
// Стоять скрестив руки
// **********************

// Функция инициализации состояния
func void ZS_Stand_ArmsCrossed()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK); * * *
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Stand_ArmsCrossed_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// встать
* * * *AI_StandUp(self);
* * * *// стоять скрестив руки (режим охраны)
* * * *AI_PlayAni(self,"T_STAND_2_LGUARD");
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// если прошло > 5 сек и НПС находится в режиме охраны
* *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *var int random;
* * * *random = Hlp_Random(7);
* * * *// случайная анимация движений
* * * *if(random == 0)
* * * *{
* * * * * *AI_PlayAni(self,"T_LGUARD_SCRATCH");
* * * *}
* * * *else if(random == 1)
* * * *{
* * * * * *AI_PlayAni(self,"T_LGUARD_STRETCH");
* * * *}
* * * *else if(random == 2)
* * * *{
* * * * * *AI_PlayAni(self,"T_LGUARD_CHANGELEG");
* * * *};
* * * *var int Eventrandy;
* * * *Eventrandy = Hlp_Random(200);
* * * *// с вероятностью 0.005 и если НПС в Яркендаре и Равен не убит и НПС не пират
* * * *if(Eventrandy == 1) && (CurrentLevel == ADDONWORLD_ZEN) && (RavenIsDead == FALSE) && (self.guild != GIL_PIR)
* * * *{
* * * * * *// проиграть эффект "Дрожь земли"
* * * * * *B_EVENT_PORTAL_EARTHQUAKE();
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_ArmsCrossed_end()
{
* *// выйти из режима охраны
* *AI_PlayAni(self,"T_LGUARD_2_STAND"); * *
};

... ещё файл

// *****************************************
// Состояние ожидания Черных магов (Ищущие)
// *****************************************

// Функция инициализации состояния
func void ZS_Stand_Dementor()
{
* *// разрешить НПС все чувства
* *self.senses * * * * = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL; * *
* *// установить дальность чувств = макс. чувствительности монстров
* *self.senses_range * = PERC_DIST_MONSTER_ACTIVE_MAX; * * * *
* *
* *// если НПС имеет важную информацию
* *if(Npc_KnowsInfo(self,1))
* *{
* * * *// установить время реакции на восприятия 0.3 сек
* * * *Npc_SetPercTime(self,0.3);
* *}
* *else
* *{
* * * *// установить время реакции на восприятия 1 сек
* * * *Npc_SetPercTime(self,1);
* *};
* *// разрешить восприятие НПС на ГГ
* *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessPla yer);
* *// разрешить восприятие врага
* *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);
* *// разрешить восприятие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c);
* *// разрешить восприятие повреждений
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// если НПС особенный "Черный маг"
* *if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(DMT_1299_OberDementor_DI))
* *{
* * * *// разрешить восприятие звуков сражения
* * * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFightSound);
* *};
* *// разрешить восприятие предупреждения
* *Npc_PercEnable(self,PERC_ASSESSWARN,B_AssessWarn) ;
* *// разрешить восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *// разрешить восприятие перемещения МОВа
* *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Stand_Dementor_loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// встать
* * * *AI_StandUp(self);
* * * *// анимация состояния охраны
* * * *AI_PlayAni(self,"T_STAND_2_LGUARD");
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_Dementor_end()
{
* *// анимация прекращения действия
* *AI_PlayAni(self,"T_LGUARD_2_STAND"); * *
};

... ещё файл

// **********************
// Пить самогон стоя
// **********************

// Функция инициализации состояния
func void ZS_Stand_Drinking()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// если НПС не имеет самогона
* *if(Npc_HasItems(self,ItFo_Booze) == 0)
* *{
* * * *// создать в инвентаре НПС бутылку самогона
* * * *CreateInvItem(self,ItFo_Booze);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Stand_Drinking_loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *}; *
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// пить самогон
* * * *AI_UseItemToState(self,ItFo_Booze,0);
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// если прошло > 7 сек и НПС пьет самогон
* *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *var int random;
* * * *random = Hlp_Random(10);
* * * *// случайная анимация движений
* * * *if (random == 0)
* * * *{
* * * * * *// осмотреть бутылку
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_3",BS_ITEMINTE RACT);
* * * * * *// пить
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT);
* * * *}
* * * *else if (random == 1)
* * * *{
* * * * * *// пить
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_1",BS_ITEMINTE RACT);
* * * * * *// утереть рот
* * * * * *AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT);
* * * *}
* * * *else
* * * *{
* * * * * *// пить
* * * * * *AI_PlayAniBS (self,"T_POTION_RANDOM_1",BS_ITEMINTERACT); //trinken
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_Drinking_end ()
{
* *// прекратить пьянство
* *AI_UseItemToState(self,ItFo_Booze,-1);
};

... ещё файл

// **********************
// Употреблять пищу стоя
// **********************

// Функция инициализации состояния
func void ZS_Stand_Eating()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* *var int random;
* *random = Hlp_Random(4);
* *// случайным образом создать в инвентаре один из предметов, если его нет * *
* *if(random == 0)
* *{
* * * *// Яблоко
* * * *if(Npc_HasItems (self,ItFo_Apple) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFo_Apple);
* * * *};
* * * *self.aivar[AIV_Food] = FOOD_Apple;
* *}
* *else if(random == 1)
* *{
* * * *// Сыр
* * * *if(Npc_HasItems(self,ItFo_Cheese) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFo_Cheese); * *
* * * *};
* * * *self.aivar[AIV_Food] = FOOD_Cheese;
* *}
* *else if(random == 2)
* *{
* * * *// Бекон
* * * *if(Npc_HasItems(self,ItFo_Bacon) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFo_Bacon);
* * * *}; *
* * * *self.aivar[AIV_Food] = FOOD_Bacon;
* *}
* *else if(random == 3) * *
* *{
* * * *// Жареное мясо
* * * *if(Npc_HasItems(self,ItFoMutton) == 0)
* * * *{
* * * * * *CreateInvItem(self,ItFoMutton);
* * * *}; *
* * * *self.aivar[AIV_Food] = FOOD_Bread;
* *}; *
};

// Функция цикла состояния
func int ZS_Stand_Eating_Loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *} *
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выравняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выравняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}; *
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// если употребляем Яблоко
* * * *if(self.aivar[AIV_Food] == FOOD_Apple) *
* * * *{
* * * * * *// жевать Яблоко
* * * * * *AI_UseItemToState(self,ItFo_Apple,0);
* * * * * *// анимация
* * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_2",BS_ITEMINTERA CT);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* * * *}
* * * *// если употребляем Сыр
* * * *if(self.aivar[AIV_Food] == FOOD_Cheese) * *
* * * *{
* * * * * *// жевать Сыр
* * * * * *AI_UseItemToState(self,ItFo_Cheese,0);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; *
* * * *}
* * * *// если употребляем Бекон
* * * *if(self.aivar[AIV_Food] == FOOD_Bacon)
* * * *{ *
* * * * * *// жевать Бекон
* * * * * *AI_UseItemToState(self,ItFo_Bacon,0);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; *
* * * *}
* * * *// если употребляем Жареное мясо
* * * *if(self.aivar[AIV_Food] == FOOD_Bread)
* * * *{ *
* * * * * *// жевать Яблоко
* * * * * *AI_UseItemToState(self,ItFoMutton,0);
* * * * * *// установить флаг выполнения нужной функции
* * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; *
* * * *};
* *}; * * *
* *// если прошло > 5 сек и НПС жует
* *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *// анимация жевания разной пищи
* * * *if(self.aivar[AIV_Food] == FOOD_Apple)
* * * *{
* * * * * *AI_PlayAniBS(self,"T_FOOD_RANDOM_1",BS_ITEMINTERA CT);
* * * *}
* * * *else if(self.aivar[AIV_Food] == FOOD_Bacon) ¦¦ (self.aivar[AIV_Food] == FOOD_Bread)
* * * *{
* * * * * *AI_PlayAniBS (self,"T_MEAT_RANDOM_1",BS_ITEMINTERACT);
* * * *}
* * * *else
* * * *{
* * * * * *AI_PlayAniBS (self,"T_FOODHUGE_RANDOM_1",BS_ITEMINTERACT);
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Stand_Eating_End ()
{
* *// прекратить анимацию
* *AI_PlayAniBS(self,"T_POTION_RANDOM_2",BS_ITEMINTE RACT);
* *// прекратить жевать пищу
* *if(self.aivar[AIV_Food] == FOOD_Apple) *{ AI_UseItemToState(self,ItFo_Apple,-1); };
* *if(self.aivar[AIV_Food] == FOOD_Cheese) { AI_UseItemToState(self,ItFo_Cheese,-1);};
* *if(self.aivar[AIV_Food] == FOOD_Bacon) *{ AI_UseItemToState(self,ItFo_Bacon,-1); };
* *if(self.aivar[AIV_Food] == FOOD_Bread) *{ AI_UseItemToState(self,ItFoMutton,-1); };
};


ЗЫ: Не забывайте про "прослойки", иногда чтобы выдать инфу приходиться ждать окончания суток.
Ответить с цитированием