|
Re: Уроки скриптологии
// ************************************************** ****************************** // Функция реакции людей на вход НПС в помещение // ---------------------------------------- // Возвращает TRUE при реакции на вошедшего или FALSE, когда на вошедшего не реагируют // ************************************************** ******************************
func int B_AssessEnterRoom() { * *// other - вошедший, self - свидетель * *var int portalguild; * *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит) * *portalguild = Wld_GetPlayerPortalGuild(); * *// если вошедший ГГ и комментарий входа уже был и помещение принадлежит какой-либо гильдии и помещение не публичное * *if(Npc_IsPlayer(other)) && (Player_LeftRoomComment == TRUE) && (portalguild > GIL_NONE) && (portalguild != GIL_PUBLIC) * *{ * * * *// сброс комментария входа * * * *Player_LeftRoomComment = FALSE; * *}; * *// если расстояние между вошедшим и свидетелем > 10м * *if(Npc_GetDistToNpc(self,other) > 1000) * *{ * * * *return FALSE; * *}; * *// если свидетель и вошедший (ГГ) находятся не в одном помещении и свидетель находится не снаружи помещения * *if(!Npc_IsInPlayersRoom(self)) && (!(Npc_GetPortalGuild(self) < GIL_NONE)) * *{ * * * *return FALSE; * *}; * *// если свидетель находится в состоянии атаки * *if(Npc_IsInState(self,ZS_Attack)) * *{ * * * *return FALSE; * *}; * *// если свидетель является охранником ворот * *if(C_NpcIsGateGuard(self)) * *{ * * * *return FALSE; * *}; * *// если вошедший не ГГ * *if(!Npc_IsPlayer(other)) * *{ * * * *return FALSE; * *}; * *// если свидетель друг ГГ * *if(self.npctype == NPCTYPE_FRIEND) * *{ * * * *return FALSE; * *}; * *// если отношения между свидетелем и ГГ дружеские * *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY) * *{ * * * *return FALSE; * *}; * *// если ГГ крадется или ГГ стоит * *if(C_BodyStateContains(other,BS_SNEAK)) ¦¦ (C_BodyStateContains(other,BS_STAND)) * *{ * * * *// если свидетель не видит ГГ и свидетель не наблюдает за ГГ * * * *if(!Npc_CanSeeNpc(self,other)) && (!Npc_IsInState(self,ZS_ObservePlayer)) * * * *{ * * * * * *return FALSE; * * * *}; * *}; * *// если свидетель не принадлежит к гильдии * *if(self.guild == GIL_NONE) * *{ * * * *return FALSE; * *}; * *// если свидетель и ГГ находятся не в одном помещениии и свидетель спит * *if(!Npc_IsInPlayersRoom(self)) && (Npc_IsInState(self,ZS_Sleep)) * *{ * * * *return FALSE; * *}; * *// если помещение публично и свидетель находится в одном помещении с ГГ * *if(portalguild == GIL_PUBLIC) && (Npc_IsInPlayersRoom(self)) * *{ * * * *// если свидетель наблюдает за ГГ * * * *if(Npc_IsInState(self,ZS_ObservePlayer)) * * * *{ * * * * * *return FALSE; * * * *}; * * * *// если свидетель лежит * * * *if(C_BodyStateContains(self,BS_LIE)) * * * *{ * * * * * *// свидетель встает (Примечание: мне непонятно как он это делает) * * * * * *B_MM_DeSynchronize(); * * * *}; * * * *// если свидетель * * * *if(Npc_IsInState(self,ZS_Potion_Alchemy)) * * * // занимается алхимией * * * *¦¦ (Npc_IsInState(self,ZS_Read_Bookstand)) * * *// или читает книгу * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Bench)) * * * * * // или сидит на скамье * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Campfire)) * * * *// или сидит у костра * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Chair)) * * * * * // или сидит на стуле * * * *¦¦ (Npc_IsInState(self,ZS_Sit_Throne)) * * * * *// или сидит на троне * * * *¦¦ (Npc_IsInState(self,ZS_Sleep)) * * * * * * * // или спит * * * *¦¦ (Npc_IsInState(self,ZS_Smalltalk)) * * * * * // или ведет светскую беседу * * * *¦¦ (Npc_IsInState(self,ZS_Smoke_Joint)) * * * * // или курит * * * *¦¦ (Npc_IsInState(self,ZS_Stand_ArmsCrossed)) * // или стоит со скрещенными руками * * * *¦¦ (Npc_IsInState(self,ZS_Stand_Drinking)) * * *// или пьет * * * *¦¦ (Npc_IsInState(self,ZS_Stand_Eating)) * * * *// или ест * * * *¦¦ (Npc_IsInState(self,ZS_Stand_Guarding)) * * *// или охраняет * * * *¦¦ (Npc_IsInState(self,ZS_Stand_WP)) * * * * * *// или стоит на вайпоинте * * * *{ * * * * * *// очистка очереди состояний свидетеля * * * * * *Npc_ClearAIQueue(self); * * * * * *// очистка восприятий свидетеля * * * * * *B_ClearPerceptions(self); * * * * * *// если свидетель сидит * * * * * *if(C_BodyStateContains(self,BS_SIT)) * * * * * *{ * * * * * * * *// перевод свидетеля в состояние наблюдения за ГГ * * * * * * * *AI_StartState(self,ZS_ObservePlayer,0,""); * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *// перевод свидетеля в состояние наблюдения за ГГ (выполняется только функция конца состояния) * * * * * * * *AI_StartState(self,ZS_ObservePlayer,1,""); * * * * * *}; * * * * * *return TRUE; * * * *} * * * *else * * * *{ * * * * * *return FALSE; * * * *}; * *}; * *// если ГГ находится в частном помещении * *if(C_NpcIsBotheredByPlayerRoomGuild(self)) * *{ * * * *Npc_ClearAIQueue(self); * * * *B_ClearPerceptions(self); * * * *// перевод свидетеля в состояние "защиты помещения" * * * *AI_StartState(self,ZS_ClearRoom,1,""); * * * *return TRUE; * *}; * *return FALSE; };
// ************************************************** *********** // Функция реакции людей на вход НПС в помещение // ------------------------------------------------ // Вызывается как реакция на пассивное восприятие PERC_ASSESSENTERROOM // ************************************************** ***********
func void B_AssessPortalCollision() { * *// other - вошедший, self - свидетель * *var int formerportalguild; * *// получить номер гильдии, которой принадлежит помещение в котором прежде находился ГГ (-1 помещение никому не принадлежит) * *formerportalguild = Wld_GetFormerPlayerPortalGuild(); * *// если есть реакция на вошедшего в помещение * *if(B_AssessEnterRoom()) * *{ * * * *return; * *}; * *// если свидетель не видит вошедшего и (вошедший крадется или вошедший стоит) * *if(!Npc_CanSeeNpc(self,other)) && (C_BodyStateContains(other,BS_SNEAK) ¦¦ C_BodyStateContains(other,BS_STAND)) * *{ * * * *return; * *}; * *// свидетелю разрешено воспринимать все объекты в зоне действия восприятия * *Npc_PerceiveAll(self); * *// если свидетель находит другого НПС в состоянии "защиты помещения" * *if(Wld_DetectNpcEx(self,-1,ZS_ClearRoom,-1,FALSE)) * *{ * * * *return; * *}; * *// если покинутое ГГ помещение принадлежит гильдии свидетеля или свидетель друг гильдии, которой принадлежит помещение * *if(self.guild == formerportalguild) ¦¦ (Wld_GetGuildAttitude(self.guild,formerportalguild ) == ATT_FRIENDLY) * *{ * * * *// если отношения между гильдиями ГГ и свидетеля дружеские или (вошедший ГГ и друг свидетеля) * * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY) ¦¦ (Npc_IsPlayer(other) && (self.npctype == NPCTYPE_FRIEND)) * * * *{ * * * * * *return; * * * *}; * * * *// если свидетель не принадлежит к гильдии * * * *if(self.guild == GIL_NONE) * * * *{ * * * * * *return; * * * *}; * * * *// если (помещение принадлежит милиции или ополчению) и свидетель является другом этих гильдии * * * *if((formerportalguild == GIL_MIL) ¦¦ (formerportalguild == GIL_SLD)) && (Wld_GetGuildAttitude(self.guild,formerportalguild ) == ATT_FRIENDLY) * * * *{ * * * * * *// свидетель атакует ГГ * * * * * *B_Attack(self,other,AR_LeftPortalRoom,0); * * * * * *return; * * * *} * * * *else // иначе * * * *{ * * * * * *// свидетель наблюдает за помещением * * * * * *self.aivar[AIV_SeenLeftRoom] = TRUE; * * * * * *// очистка очереди состояний свидетеля * * * * * *Npc_ClearAIQueue(self); * * * * * *// очистка восприятий свидетеля * * * * * *B_ClearPerceptions(self); * * * * * *// перевод свидетеля в состояние наблюдения за ГГ * * * * * *AI_StartState(self,ZS_ObservePlayer,0,""); * * * * * *return; * * * *}; * *}; };
|