|
Re: Уроки скриптологии
2Нифариус:
Подскажите, как с помощью скрипта создать эффект одержимости (расплывающийся красный экран во время разговора).
|
Вызвать вот эти эффекты: * * *Wld_PlayEffect("DEMENTOR_FX",hero,hero,0,0,0,FALS E); * * *Wld_PlayEffect("spellFX_INCOVATION_RED",self,self ,0,0,0,FALSE); ---------------------------------------------------------------------- 17. Обработчики состояний заклинаний. Все обработчики расположены в директории скриптов ..\AI\Magic\ZS_Magic в одноименных файлах. //************************************************** ** // Обработчик состояния заклинания Зеленые щупальца //************************************************** **
// ---------------------------------------------------- // self - жертва заклинания // ----------------------------------------------------
// Функция реакции на локальное восприятие магии (заклинания) func void B_RestartGreententacle() { * *// если последнее примененное заклинание Зеленые щупальца * *if(Npc_GetLastHitSpellID(self) == SPL_Greententacle) * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self,0); * *}; };
// Закончить действие заклинания func void B_StopGreententacle() { * * *// возвратить общую функцию состояния реакции на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если НПС человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// реакция НПС на повреждение * * * *B_AssessDamage(); * *} * *else * *{ * * * *// установить временно враждебное отношение НПС к ГГ * * * *Npc_SetTempAttitude(self,ATT_HOSTILE); * *}; };
// Инициализация состояния func void ZS_Greententacle() { * *// установить локальное восприятие на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartGre ententacle); * *// разрешить восприятие повреждения * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age); * *// остановить проигрывание файлов анимации заклинания * *Npc_StopAni(self,"s_GreententacleA_Victim"); * *Npc_StopAni(self,"s_GreententacleB_Victim"); * *Npc_StopAni(self,"s_GreententacleC_Victim"); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp * * *(self); * *// если НПС находится не в бессознательном состоянии * *if(!C_BodyStateContains(self,BS_UNCONSCIOUS)) * *{ * * * *// если жертва человек * * * *if(self.guild < GIL_SEPERATOR_HUM) * * * *{ * * * * * *var int randy; * * * * * *//randy = Hlp_Random(3); * * * * * *// проигрывается анимация бессознательного состояния (Примечание: т.к. предыдущая строка в скрипте закрыта, то randy всегда имеет значение 0) * * * * * *if(randy == 0) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEA_VICTIM ",BS_UNCONSCIOUS); }; * * * * * *if(randy == 1) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEB_VICTIM ",BS_UNCONSCIOUS); }; * * * * * *if(randy == 2) *{ AI_PlayAniBS(self,"T_STAND_2_GREENTENTACLEC_VICTIM ",BS_UNCONSCIOUS); }; * * * *} * * * *else * * * *{ * * * * * *// анимация бессознательного состояния * * * * * *AI_PlayAniBS(self,"T_STAND_2_FREEZE_VICTIM",BS_UN CONSCIOUS); * * * *}; * *}; };
// Функция цикла состояния func int ZS_Greententacle_Loop () { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_TIME_Greententacle) * *{ * * * *// остановить действие заклинания * * * *B_StopGreententacle(); * * * *return LOOP_END; * *}; * *return * * * * * * *LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_GreenTentacle_End() { };
... ещё файл // **************************************** // Обработчик состояния заклинания Раздуть // ****************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Функция реакции на локальное восприятие магии (заклинания) func void B_RestartInflate() { * *// если последнее примененное заклинание Раздуть * *if(Npc_GetLastHitSpellID(self) == SPL_Inflate) * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self,0); * *}; };
// Закончить действие заклинания func void B_StopInflate() { * * *// возвратить общую функцию состояния реакции на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// реакция НПС на повреждение * * * *B_AssessDamage(); * *} * *else * *{ * * * *// установить временно враждебное отношение НПС к ГГ * * * *Npc_SetTempAttitude(self,ATT_HOSTILE); * *}; };
// Инициализация состояния func void ZS_Inflate() { * *// установить локальное восприятие на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartInf late); * *// остановить проигрывание файла анимации заклинания * *Npc_StopAni(self,"S_INFLATE_VICTIM"); * *// если НПС находится не в бессознательном состоянии * *if(!C_BodyStateContains(self,BS_UNCONSCIOUS)) * *{ * * * *// анимация бессознательного состояния * * * *AI_PlayAniBS(self,"T_STAND_2_INFLATE_VICTIM",BS_U NCONSCIOUS); * *}; * *// сброс времени цикла * *self.aivar[AIV_InflateStateTime] = 0; };
// Функция цикла состояния func int ZS_Inflate_Loop () { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_TIME_Inflate) * *{ * * * *// остановить действие заклинания * * * *B_StopInflate(); * * * *return LOOP_END; * *}; * *// если текущее время состояния не равно времени цикла * *if(Npc_GetStateTime(self) != self.aivar[AIV_InflateStateTime]) * *{ * * * *// в зависимости от времени состояния установить жирность (объем) фигуры жертвы * * * *// как видим по коэффициентам объема сначала идет раздутие фигуры, а затем возвращение к нормальному состоянию * * * *if(Npc_GetStateTime(self) == 1) * * * { *Mdl_SetModelFatness(self,1); * } * * * *else if(Npc_GetStateTime(self) == 2) *{ *Mdl_SetModelFatness(self,3); * } * * * *else if(Npc_GetStateTime(self) == 3) *{ *Mdl_SetModelFatness(self,8 ); * } * * * *else if(Npc_GetStateTime(self) == 4) *{ *Mdl_SetModelFatness(self,12); *} * * * *else if(Npc_GetStateTime(self) == 5) * * * *{ * * * * * * *Mdl_SetModelFatness(self,9); * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!" * * * * * *B_Say(self,other,"$Aargh_1"); * * * *} * * * *else if(Npc_GetStateTime(self) == 6) *{ *Mdl_SetModelFatness (self,15); } * * * *else if(Npc_GetStateTime(self) == 7) *{ *Mdl_SetModelFatness (self,18 ); } * * * *else if(Npc_GetStateTime(self) == 8 ) * * * *{ * * * * * *Mdl_SetModelFatness(self,11); * * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!" * * * * * *B_Say (self, other, "$Aargh_2"); * * * *} * * * *else if(Npc_GetStateTime(self) == 9) *{ *Mdl_SetModelFatness(self,15); *} * * * *else if(Npc_GetStateTime(self) == 10) { *Mdl_SetModelFatness(self,13); *} * * * *else if(Npc_GetStateTime(self) == 11) { *Mdl_SetModelFatness(self,12); *} * * * *else if(Npc_GetStateTime(self) == 12) { *Mdl_SetModelFatness(self,10); *} * * * *else if(Npc_GetStateTime(self) == 13) { *Mdl_SetModelFatness(self,8 ); * } * * * *else if(Npc_GetStateTime(self) == 14) * * * *{ * * * * * *Mdl_SetModelFatness(self,5); * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!" * * * * * *B_Say(self,other,"$Aargh_3"); * * * *} * * * *else if(Npc_GetStateTime(self) == 15) *{ *Mdl_SetModelFatness(self,6); *} * * * *else if(Npc_GetStateTime(self) == 16) *{ *Mdl_SetModelFatness(self,4); *} * * * *else if(Npc_GetStateTime(self) == 17) *{ *Mdl_SetModelFatness(self,2); *} * * * *else if(Npc_GetStateTime(self) == 18 ) *{ *Mdl_SetModelFatness(self,1); *} * * * *else if(Npc_GetStateTime(self) == 19) *{ *Mdl_SetModelFatness(self,1); *}; * * * *// установить время уикла на текущее время * * * *self.aivar[AIV_InflateStateTime] = Npc_GetStateTime(self); * * * *// если жизнь жертвы > ущерба заклинания * * * *if(self.attribute[ATR_HITPOINTS] > SPL_Inflate_DAMAGE) * * * *{ * * * * * *// нанести ужерб жертве * * * * * *B_MagicHurtNpc(other,self,SPL_Inflate_DAMAGE); * * * *} * * * *else * * * *{ * * * * * *// нанести полный ужерб жертве (смерть) * * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Inflate_End() { };
... ещё файл // ************************************************** ********* // Обработчик состояния магического горения // ----------------------------------------------------------- // В это состояние НПС переводится экзешником, а не скриптами // ************************************************** *********
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
const int SPL_MAGICBURN_DAMAGE_PER_SEC = 1; // ущерб в сек от заклинания
// Закончить действие заклинания func void B_StopMagicBurn() { * * *// возвратить общую функцию состояния реакции на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// реакция НПС на повреждение * * * *B_AssessDamage(); * * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния) * * * *AI_ContinueRoutine(self); * *} * *else * *{ * * * *// установить временно враждебное отношение НПС к ГГ * * * *Npc_SetTempAttitude(self,ATT_HOSTILE); * * * *// продолжить распорядок дня НПС * * * *AI_ContinueRoutine(self); * *}; }; *
// Функция реакции на локальное восприятие магии (заклинания) func void B_RestartBurn() { * *// если последнее примененное заклинание * *if (Npc_GetLastHitSpellID(self) == SPL_Firerain) * * * * * *// Огненный дождь * *¦¦ (Npc_GetLastHitSpellID(self) == SPL_ChargeFireball) * * *// или Большой огненный шар * *¦¦ (Npc_GetLastHitSpellID(self) == SPL_InstantFireball) * * // или Огненный шар * *¦¦ (Npc_GetLastHitSpellID(self) == SPL_Firebolt) * * * * * *// или Огненная стрела * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self,0); * * * *return; * *}; * *// если последнее примененное заклинание * *if (Npc_GetLastHitSpellID(self) == SPL_IceWave) * * * * * * // Ледяная волна * *¦¦ (Npc_GetLastHitSpellID(self) == SPL_IceCube) * * * * * * // или Ледяная глыба * *{ * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// очистить восприятия * * * *B_ClearPerceptions(self); * * * *// перевести жертву в состояние Магической заморозки * * * *AI_StartState(self,ZS_MagicFreeze,0,""); * *}; };
// Инициализация состояния func void ZS_MagicBurn() { * *// установить восприятие прекращения действия магии * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopMa gicBurn); * *// если состояние тела НПС не прерываемо * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE)) * *{ * * * *// НПС встает * * * *AI_StandUp(self); * *} * *else * *{ * * * *// НПС быстро встает * * * *AI_StandUpQuick(self); * *}; };
// Функция цикла состояния func int ZS_MagicBurn_Loop() { * * *// разрешить локальное восприятие на воздействие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartBur n); * *// если прошла 1 секунда * *if(Npc_GetStateTime(self) == 1) * *{ * * * *// сбросить время состояния * * * *Npc_SetStateTime(self,0); * * * *// нанести жертве секундный урон * * * *B_MagicHurtNpc(other,self,SPL_MAGICBURN_DAMAGE_PE R_SEC); * *}; * *// если жизнь жертвы кончилась * *if(self.attribute[ATR_HITPOINTS] <= 0) * *{ * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * * * *// НПС встает * * * *AI_StandUp(self); * * * *return LOOP_END; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_MagicBurn_End() { };
ЗЫ: Каким-то странным образом включается жирный шрифт, а отменить его нельзя, раньше тоже это наблюдал, но реже и удавалось убрать переформатированием текста. ЗЫЫЫ: Оказывается это видно только в редакторе!
|