|
Re: Уроки скриптологии
// ***************************************** // Обработчик состояния разговора между НПС // ----------------------------------------- // self - НПС источник информации, other - слушатель (всегда ГГ) // *****************************************
var int zsTalkBugfix; * // флаг выхода из разговора
// Инициализация состояния разговора func void ZS_Talk() { * *// если ГГ уже с кем-то разговаривает * *if(other.aivar[AIV_INVINCIBLE] == TRUE) * *{ * * * *return; * * * * * * * *}; * *// установка флагов начала разговора (для обоих участников) * *self.aivar[AIV_INVINCIBLE] = TRUE; * *other.aivar[AIV_INVINCIBLE] = TRUE; * *// если НПС человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * * * * *// если НПС сидит * * * *if(C_BodyStateContains(self,BS_SIT)) * * * *{ * * * * * *var C_NPC target; * * * * * *// инициализация глобальной переменной target ссылкой на НПС, на которого смотрит источник информации * * * * * *target = Npc_GetLookAtTarget(self); * * * * * *// если target не существует * * * * * *if(!Hlp_IsValidNpc(target)) * * * * * *{ * * * * * * * *// НПС смотрит на ГГ * * * * * * * *AI_LookAtNpc(self,other); * * * * * *}; * * * *} * * * *else // иначе * * * *{ * * * * * *// НПС смотрит на ГГ * * * * * *B_LookAtNpc(self,other); * * * *}; * * * *// НПС прячет оружие * * * *AI_RemoveWeapon(self); * *}; * *// если НПС не сидит * *if(!C_BodystateContains(self,BS_SIT)) * *{ * * * * *// НПС поворачивается к ГГ * * * *B_TurnToNpc(self,other); * *}; * *// если ГГ не сидит * *if(!C_BodystateContains(other,BS_SIT)) * *{ * * * * *// ГГ поворачивается к НПС * * * *B_TurnToNpc(other,self); * * * *// если расстояние между ГГ и НПС < 80 см * * * *if(Npc_GetDistToNpc(other,self) < 80) * * * *{ * * * * * *// ГГ отспупает назад * * * * * *AI_Dodge(other); * * * *}; * *}; * *// если НПС человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * * *// если НПС сердит на ГГ или НПС враг ГГ * * * *if(Npc_GetAttitude(self,other) == ATT_ANGRY) ¦¦ (Npc_GetAttitude(self,other) == ATT_HOSTILE) * * * *{ * * * * * *// если ГГ не переодет в бандита или НПС не бандит * * * * * *if(!C_PlayerIsFakeBandit(self,other)) ¦¦ (self.guild != GIL_BDT) * * * * * *{ * * * * * * * *// включить "злую" анимацию лица НПС * * * * * * * *Mdl_StartFaceAni(self,"S_ANGRY",1,-1); * * * * * *}; * * * *}; * * * *// если НПС принадлежит к окружающему народу * * * *if(self.npctype == NPCTYPE_AMBIENT) * * * * // общему * * * *¦¦ (self.npctype == NPCTYPE_OCAMBIENT) * * *// или из Миненталя * * * *¦¦ (self.npctype == NPCTYPE_BL_AMBIENT) * * // или из Лагеря бандитов * * * *¦¦ (self.npctype == NPCTYPE_TAL_AMBIENT) * *// или из Долины бандитов * * * *{ * * * * * *// инициализация диалога НПС об окружающей информации (сплетни) * * * * * *B_AssignAmbientInfos(self); * * * * * *// если НПС принадлежит городу * * * * * *if(C_NpcBelongsToCity(self)) * * * * * *{ * * * * * * * *// инициализация диалога НПС о городской жизни * * * * * * * *B_AssignCityGuide(self); * * * * * *}; * * * *}; * * * *// если НПС является членом партии ГГ и * * * *if(self.aivar[AIV_PARTYMEMBER] == TRUE) * * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff)) * * * * // НПС не Бифф * * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff_NW)) * * *// и НПС не Бифф в Новом мире * * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Biff_DI)) * * *// и НПС не Бифф на Острове драконов * * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Pardos)) * * * // и НПС не Пардос * * * *&& (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Pardos_NW)) * *// и НПС не Пардос в Новом мире * * * *{ * * * * * *// ГГ дает НПС напиток лечения * * * * * *B_Addon_GivePotion(self); * * * *}; * * * *// если НПС имеет дело с "крутым парнем" и НПС не имеет новостей о "крутом парне" * * * *if(C_NpcIsToughGuy(self)) && (self.aivar[AIV_ToughGuyNewsOverride] == FALSE) * * * *{ * * * * * *// инициализация диалога НПС о "крутом парне" * * * * * *B_AssignToughGuyNEWS(self); * * * *}; * * * *// если НПС имеет новости об окружающей жизни * * * *if(C_NpcHasAmbientNews(self)) * * * *{ * * * * * *// инициализация диалога НПС об окружающих новостях * * * * * *B_AssignAmbientNEWS(self); * * * *}; * *}; * * * * *// если НПС дракон * *if (self.guild == GIL_DRAGON) * *{ * * * *// проиграть анимацию дракона T_STAND_2_TALK * * * *AI_PlayAni(self,"T_STAND_2_TALK"); * *}; * *// начать выбранный диалог * *AI_ProcessInfos(self); * *// сброс флага выхода из разговора * *zsTalkBugfix = FALSE; };
// Цикл состояния разговора func INT ZS_Talk_Loop () { * *// если диалог закончен и флаг выхода установлен * *if(InfoManager_HasFinished()) && (zsTalkBugfix == TRUE) * *{ * * * *// сброс флагов разговора для обоих участников * * * *self.aivar[AIV_INVINCIBLE] = FALSE; * * * *other.aivar[AIV_INVINCIBLE] = FALSE; * * * *// сброс флага важной информации * * * *self.aivar[AIV_NpcStartedTalk] = FALSE; * * * *// установка флага, что НПС говорил с ГГ * * * *self.aivar[AIV_TalkedToPlayer] = TRUE; * * * *// если НПС человек * * * *if(self.guild < GIL_SEPERATOR_HUM) * * * *{ * * * * * *// НПС перестает смотреть на ГГ * * * * * *B_StopLookAt(self); * * * * * *// сменить выражение лица НПС на обычное * * * * * *Mdl_StartFaceAni(self,"S_NEUTRAL",1,-1); * * * *}; * * * * *// если НПС дракон * * * *if(self.guild == GIL_DRAGON) * * * *{ * * * * * *// запустить обычную анимацию стоящего дракона * * * * * *AI_PlayAni(self,"T_TALK_2_STAND"); * * * *}; * * * *return LOOP_END; * *} * *else // иначе * *{ * * * *// установить флаг выхода из разговора (нельзя завершить цикл разговора при первом вхождении) * * * *zsTalkBugfix = TRUE; * * * *return LOOP_CONTINUE; * *}; };
// Окончание состояния разговора func void ZS_Talk_End() { * *// отказ ГГ от других диалогов на 20 сек * *Npc_SetRefuseTalk(other,20); * *// когда НПС находится в своем помещении или (помещение публично и НПС не друг ГГ * *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ ((Wld_GetPlayerPortalGuild() == GIL_PUBLIC) && (Npc_GetAttitude(self,other) != ATT_FRIENDLY)) * *{ * * * *// НПС переходит в состояние наблюдения за ГГ * * * *AI_StartState(self,ZS_ObservePlayer,0,""); * *} * *else * *// [лишнее, можно удалить] * *{
* *}; };
|