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

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

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

// ************************************************** *******
// НПС бродит по PICK фрипоинтам (что-то ищет или собирает)
// ************************************************** *******

// Функция инициализации состояния
func void ZS_Pick_FP()
{ *
* *// установить нормальный набор восприятий
* *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);
* *};
};

// Функция цикла состояния
func int ZS_Pick_FP_Loop()
{
* *// если время состояния >= 7сек и с вероятностью 0.5
* *if((Npc_GetStateTime(self) >= 7) && (Hlp_Random(2))) *
* *{
* * * *// если НПС на фрипоинте и есть еще фрипоинт
* * * *if((Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK")))
* * * *{
* * * * * *// НПС идет на следующий фрипоинт
* * * * * *AI_GotoNextFP(self,"PICK");
* * * * * *// анимация поиска
* * * * * *AI_PlayAni(self,"T_PLUNDER");
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * *}
* * * *// если НПС на фрипоинте
* * * *else if(Npc_IsOnFP(self,"PICK"))
* * * *{
* * * * * *// анимация поиска
* * * * * *AI_PlayAni(self,"T_PLUNDER");
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* * * *// установить режим передвижения шагом
* * * *AI_SetWalkmode(self,NPC_WALK); * * *
* *}
* *// если время состояния >= 7сек
* *else if(Npc_GetStateTime(self) >= 7)
* *{
* * * *// если НПС на фрипоинте
* * * *if(Npc_IsOnFP(self,"PICK"))
* * * *{ * * *
* * * * * *// анимация поиска
* * * * * *AI_PlayAni(self,"T_PLUNDER"); *
* * * *};
* * * *// установить режим передвижения шагом
* * * *AI_SetWalkmode (self,NPC_WALK); * *
* *};
* *// если НПС не на фрипоинте и есть еще фрипоинт
* *if((!Npc_IsOnFP(self,"PICK")) && (Wld_IsFPAvailable(self,"PICK")))
* *{
* * * *// НПС идет на фрипоинт
* * * *AI_GotoFP(self,"PICK");
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pick_FP_End()
{
};

... ещё файл

// *********************
// НПС добывает руду
// *********************

// Функция инициализации состояния
func void ZS_Pick_Ore()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK); * * *
* *// если НПС расположен не на своем вайпоинте
* *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// если НПС не имеет кирки
* *if(Npc_HasItems(self,ItMw_2H_Axe_L_01) == 0)
* *{
* * * *// создать в инвентаре НПС кирку
* * * *CreateInvItem(self,ItMw_2H_Axe_L_01); * * * * * * *
* *};
* *// взять в руки кирку
* *EquipItem(self,ItMw_2H_Axe_L_01);
};

// Функция цикла состояния
func int ZS_Pick_Ore_Loop()
{
* *// если действие с МОВом не прерываемо и залежи руды имеются
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"ORE"))
* *{
* * * *// добыча руды
* * * *AI_UseMob(self,"ORE",1);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pick_Ore_End()
{
* *// прекратить добычу руды
* *AI_UseMob(self,"ORE",-1);
};

... ещё файл

// *****************
// Игра на лютне
// *****************

func void ZS_Play_Lute()
{ *
* *// установить нормальный набор восприятий
* *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,ItMi_Lute) == 0)
* *{
* * * *// создать в инвентаре НПС лютню
* * * *CreateInvItem(self,ItMi_Lute);
* *}; *
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};
* *
// Функция цикла состояния
func int ZS_Play_Lute_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,ItMi_Lute,1);
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *return LOOP_CONTINUE;
};

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

... ещё файл

// ************************************
// Приготовление алхимических напитков
// ************************************

// Функция инициализации состояния
func void ZS_Potion_Alchemy()
{ *
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если НПС расположен не на своем вайпоинте
* *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// если НПС не имеет Лабораторной колбы
* *if(Npc_HasItems(self,ItMi_Flask) == 0)
* *{
* * * *// создать в инвентаре НПС Лабораторную колбу
* * * *CreateInvItem(self,ItMi_Flask); * * * * * *
* *};
};

// Функция цикла состояния
func int ZS_Potion_Alchemy_Loop()
{
* *// если действие с МОВом не прерываемо и лабораторный стол имеется
* *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"LAB"))
* *{
* * * *// изготовление напитка
* * * *AI_UseMob(self,"LAB",1);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Potion_Alchemy_End()
{
* *// прекратить алхимию
* *AI_UseMob(self,"LAB",-1);
};

... ещё файл

// *****************************
// Тренировка магии
// *****************************

// Функция инициализации состояния
func void ZS_Practice_Magic()
{
* *// установить нормальный набор восприятий
* *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);
* *};
};

// Функция цикла состояния
func int ZS_Practice_Magic_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;
* * * *}; *
* *};
* *// если время состояния > 7сек и флаг сброшен
* *if((Npc_GetStateTime(self) > 7) && (self.aivar[AIV_TAPOSITION] == NOTINPOS))
* *{
* * * *var int zufall;
* * * *zufall = Hlp_Random(100);
* * * *// с разной вероятностью выполнять магические упражнения
* * * *if(zufall <= 25)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC");
* * * *}
* * * *else if(zufall <= 50)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC2");
* * * *}
* * * *else if(zufall <= 70)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC3");
* * * *}
* * * *else if(zufall <= 90)
* * * *{
* * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC4");
* * * *}
* * * *else
* * * *{
* * * * * *AI_PlayAni(self,"R_SCRATCHHEAD");
* * * *};
* * * *// сброс времени состояния
* * * *Npc_SetStateTime(self,0);
* *}; *
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Practice_Magic_End()
{
};

... ещё файл

// **********************
// Упражнения с мечом
// **********************

// Функция инициализации состояния
func void ZS_Practice_Sword()
{
* *// установить нормальный набор восприятий
* *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);
* * * *// выравнивание
* * * *AI_AlignToWP(self);
* *};
* *// взять в руки лучшее оружие ближнего радиуса поражения
* *AI_EquipBestMeleeWeapon(self);
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Practice_Sword_Loop()
{ *
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// если НПС не имеет оружия ближнего радиуса поражения
* * * *if(!Npc_HasEquippedMeleeWeapon(self))
* * * *{
* * * * * *// создать в инвентаре НПС Тяжелую палку
* * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1);
* * * * * *// взять её в руки
* * * * * *AI_EquipBestMeleeWeapon(self);
* * * *};
* * * *// подготовиться
* * * *AI_ReadyMeleeWeapon(self);
* * * *// установка флага готовности
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// анимация упражнений
* *AI_PlayAni(self,"T_1HSFREE");
* *// движение на свой вайпоинт
* *AI_GotoWP(self,self.wp);
* *// выравняться
* *AI_AlignToWP(self);
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Practice_Sword_End()
{
* *// встать
* *AI_StandUp(self);
* *// убрать оружие
* *AI_RemoveWeapon(self);
};

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