|
Re: Уроки скриптологии
// ********************************* // Обработчик следования НПС за ГГ // *********************************
// Функция локального восприятия НПС на ГГ func void B_AssessFollowPlayer() { * *// если НПС Диего в Минентале * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW)) * *{ * * * * *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен (НПС движется) * * * *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE) * * * *{ * * * * * *// очистить очередь AI состояний НПС * * * * * *Npc_ClearAIQueue(self); * * * * * *// НПС встает (ждет действий ГГ) * * * * * *AI_StandUp(self); * * * * * *// установить флаг (НПС остановился) * * * * * *self.aivar[AIV_TAPOSITION] = TRUE; * * * *} * * * *// если Диего слишком далеко и флаг сброшен * * * *else if(C_DiegoTooFar(0)) && (self.aivar[AIV_TAPOSITION] == FALSE) * * * *{ * * * * * *// очистить очередь AI состояний Диего * * * * * *Npc_ClearAIQueue(self); * * * * * *// Диего встает (ждет действий ГГ) * * * * * *AI_StandUp(self); * * * * * *// установить флаг * * * * * *self.aivar[AIV_TAPOSITION] = TRUE; * * * * * *// если расстояние между Диего и ГГ > дистанции начала разговора * * * * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG) * * * * * *{ * * * * * * * *// Диего говорит ГГ (SVM фраза) "Подожди!" (Примечание: правильней other заменить на hero) * * * * * * * *B_Say(self,other,"$SC_HEYWAITASECOND"); * * * * * *}; * * * *} * * * *else // иначе * * * *{ * * * * * * *// обычная реакция НПС на ГГ * * * * * *B_AssessPlayer(); * * * *}; * * * *return; * *}; * *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен * *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE) * *{ * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// НПС встает (ждет действий ГГ) * * * *AI_StandUp(self); * * * *// установить флаг * * * *self.aivar[AIV_TAPOSITION] = TRUE; * *} * *else * *{ * * * * *// обычная реакция НПС на ГГ * * * *B_AssessPlayer(); * *}; };
// Функция локального восприятия НПС на звук сражения func void B_AssessFollowFightSound() { * *// если other (нападающий) есть ГГ или victim (жертва) есть ГГ или * *if(Npc_IsPlayer(other)) ¦¦ (Npc_IsPlayer(victim)) * *¦¦ (other.aivar[AIV_PARTYMEMBER] == TRUE) * * * * * // other - член партии ГГ * *¦¦ (victim.aivar[AIV_PARTYMEMBER] == TRUE) * * * * *// или victim - член партии ГГ * *{ * * * *// обычная реакция НПС на звук сражения * * * *B_AssessFightSound(); * *}; };
// Данная функция не используется и может быть удалена. func void B_MoveFollowNpc() { };
// Функция инициализации состояния func void ZS_Follow_Player() { * *// разрешить НПС все чувства * *self.senses = SENSE_SEE|SENSE_HEAR|SENSE_SMELL; * *// установить дальность чувств 20 метров * *self.senses_range = 2000; * * * * *// установить время реакции на восприятия 0.3 сек * *Npc_SetPercTime(self,0.3); * *// разрешить минимальный набор восприятий * *Perception_Set_Minimal(); * *// установить локальное восприятие НПС на ГГ * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessFol lowPlayer); * *// разрешить восприятие врага * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y); * *// разрешить восприятие разговора * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *// разрешить восприятие перемещения МОВа * *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob); * *// установить локальное восприятие звуков сражения * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFollowFightSound); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// НПС встает * *AI_StandUp(self); * *// установить режим передвижения бегом * *AI_SetWalkmode(self,NPC_RUN); * *// если дистанция между НПС не задана * *if(self.aivar[AIV_FollowDist] == 0) * *{ * * * *// задать дистанцию 5м * * * *self.aivar[AIV_FollowDist] = 500; * *}; };
// Функция цикла состояния func int ZS_Follow_Player_Loop() { * *// расстояние между НПС и ГГ > дистанции следования * *if(Npc_GetDistToNpc(self,hero) > self.aivar[AIV_FollowDist]) * *{ * * * *// если НПС Диего в Минентале * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW)) * * * *{ * * * * * *// если Диего слишком далеко * * * * * *if(C_DiegoTooFar(0)) * * * * * *{ * * * * * * * *// если прошло > 1 сек * * * * * * * *if(Npc_GetStateTime(self) > 1) * * * * * * * *{ * * * * * * * * * *// Диего поворачивается к ГГ * * * * * * * * * *B_TurnToNpc(self,hero); * * * * * * * * * *// сброс времени цикла * * * * * * * * * *Npc_SetStateTime(self,0); * * * * * * * *}; * * * * * * * *return LOOP_CONTINUE; * * * * * *}; * * * *}; * * * *// если НПС не плывет * * * *if(!C_BodyStateContains(self,BS_SWIM)) * * * *{ * * * * * * *// установить режим передвижения бегом * * * * * *AI_SetWalkmode(self,NPC_RUN); * * * *}; * * * *// НПС движется к ГГ * * * *AI_GotoNpc(self,hero); * * * *// сброс флага (НПС в движении) * * * *self.aivar[AIV_TAPOSITION] = FALSE; * *} * *else // расстояние < дистанции следования * *{ * * * *// если прошло > 1 сек * * * *if(Npc_GetStateTime(self) > 1) * * * *{ * * * * * *// НПС поворачивается к ГГ * * * * * *B_TurnToNpc(self,hero); * * * * * *// сброс времени цикла * * * * * *Npc_SetStateTime(self,0); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Follow_Player_End() { };
... ещё файл
// ********************************** // Обработчик поведения призраков // **********************************
// Функция инициализации состояния func void ZS_Ghost() { * *var C_NPC Quarho; * *// получить ссылку на Куарходрона * *Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron); * *// если НПС Куарходрон * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho)) * *{ * * * *// если информация о "Камерах Аданоса" не известна * * * *if(Ghost_SCKnowsHow2GetInAdanosTempel == FALSE) * * * *{ * * * * * * *// разрешить восприятие разговора * * * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * * * *}; * * *} * *else * *{ * * * *// разрешить восприятие разговора * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *}; * * *// разрешить восприятие повреждения * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить время реакции на восприятия 0.1 сек * *Npc_SetPercTime(self,0.1); * *// НПС встает * *AI_StandUp(self); * * * * * * * * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// движение на свой вайпоинт * *AI_GotoWP(self, self.wp); * *// выравнивание * *AI_AlignToWP(self); };
// Функция цикла состояния func int ZS_Ghost_Loop() { * *// если прошло >= 5 сек * *if(Npc_GetStateTime(self) >= 5) * *{ * * * *// если расстояние между НПС и ГГ > дистанции начала диалога * * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG) * * * *{ * * * * * *// выравнивание * * * * * *AI_AlignToWP(self); * * * * * *// сброс времени состояния * * * * * *Npc_SetStateTime(self,0); * * * *}; * * * *// удалить призрака * * * *B_RemoveGhost(); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Ghost_End() { };
// ****************************** // Обработчик поведения Радемеса // ******************************
// Функция инициализации состояния func void ZS_GhostWusel() { * *// разрешить восприятие разговора * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *// разрешить восприятие повреждения * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// НПС встает * *AI_StandUp(self); * * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// если НПС расположен не на своем вайпоинте * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.WP); * *}; * *// движение на свободный фрипоинт * *AI_GotoFP(self,"FP_ROAM"); };
// Функция цикла состояния (Радемес бродит по фрипоинтам) func int ZS_GhostWusel_Loop() { * *// если прошло >= 3 сек * *if(Npc_GetStateTime(self) >= 3) * *{ * * * *// если Радемес находится на фрипоинте * * * *if(Npc_IsOnFP(self,"FP_ROAM")) * * * *{ * * * * * *// если есть свободный следующий фрипоинт * * * * * *if(Wld_IsNextFPAvailable(self,"FP_ROAM")) * * * * * *{ * * * * * * * *// очистка очереди AI ссостояний НПС * * * * * * * *Npc_ClearAIQueue(self); * * * * * * * *// переход на следующий фрипоинт * * * * * * * *AI_GotoNextFP(self,"FP_ROAM"); * * * * * *}; * * * *} * * * *else // не на фрипоинте * * * *{ * * * * * *// если НПС не передвигается * * * * * *if(!C_BodyStateContains(self,BS_WALK)) && (!C_BodyStateContains(self,BS_RUN)) * * * * * *{ * * * * * * * *// перейти на фрипоинт * * * * * * * *AI_GotoFP(self,"FP_ROAM"); * * * * * *}; * * * *}; * * * *// сброс времени состояния * * * *Npc_SetStateTime(self,0); * *}; * * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_GhostWusel_End() { };
|