Здравствуйте, мы продолжаем знакомство с основами работы в BioWare Aurora Neverwinter Nights Toolset. В этот раз мы разберем изготовление скриптовых сценок на движке игры.
ВСТУПЛЕНИЕ
Давайте немного поговорим о том, как работают скриптовые команды. Это важно в том аспекте, что для успешного построения сценки, необходимо понимать то, что вы делаете и видеть в строках кода все примерные движения объектов и события. Звучит несколько странно, похоже на фильм “Матрица” где, глядя на экран мониторов, их герои видели код и понимали то, что он представляет, вместо ползущих цифр по экрану. Но построить сценку, не понимая что происходит, а только наугад невозможно.
В скриптовых роликах основная задача вас, как режиссера, поставить все команды, из которых состоит ваш ролик в строгую последовательность, и задать жесткие временные рамки их исполнения. Больше всего времени при построении скриптовых сцен уходит на доводку исполнения той или иной команды в секундах и долях секунды. Поэтому изготовлять сам скрипт и тестить его, я рекомендую в отдельном, модуле. Так вот, что бы понять, как объект запоминает ту или иную команду, просто представьте, что у него есть специальный стек, в котором помещаются в очереди 75 команд. Цифра 75 критичный предел, больше NPC не запомнит за один раз. Для того, что бы построить сценку с командами, превышающими эту цифру, надо писать скрипт с задержкой исполнения команд. Но об этом чуть позже. Ну что, начнем?
ФУНКЦИИ
Наверняка вы уже смотрели в редакторе скриптов огромный список функций. Разберем основное различие между ActionSpeakString и SpeakString. Я специально выбрал эти две функции, которые выполняют одну и ту же задачу, только разными путями. На этом примере вы поймете, в чем их функциональное отличие. Например, у нас задача подойти к объекту и во время движения произнести фразу:
Пример 1.
ActionMoveToObject(oWp);
ActionSpeakString(“Произнесенная фраза”);
Наш объект, получив такую задачу, выполнит две команды по очереди. Эти команды будут загружены в его стек-команд в той последовательности, что вы видите. На деле мы получим вид: объект подошел, произнес фразу. А если нам надо во время пути, произнести фразу? Тогда мы воспользуемся функцией типа void():
Пример 2.
ActionMoveToObject(oWp);
ActionWait (3.0);
SpeakString(“Произнесенная фраза”);
Теперь наш объект, направляясь в точку oWp, во время следования (если она далеко) через три секунды произнесет фразу. Но не все функции имеют два вида, поэтому существует способ ставить команды типа void() в стек команд:
Пример 3.
ActionMoveToObject(oWp);
ActionDoCommand(SpeakString(“Произнесенная фраза”));
В итоге получаем, что пример один равен по функциональности примеру три.
ПРОСТЫЕ СЦЕНКИ
Я классифицировал сцены по сложности. Это не значит, что они в реальности существуют в таком виде, просто нам так будет легче разобраться. Вот код скрипта полностью (смотри модуль).
Neverwinter Script Source |
//:://///////////////////////////////////////////// //:: Copyright © 2004 WRG! //::////////////////////////////////////////////// /* СЦЕНА №1 */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 30.07.2004 //::////////////////////////////////////////////// void main() { object oPC = GetEnteringObject(); // Берем того, кто наступил на триггер object oDoor = GetObjectByTag("AM_DOOR_START"); // Наша дверь object oNPC = GetObjectByTag("NPC_01"); // НПС в закрытой локации object oWPpc = GetWaypointByTag("WP_PC_01"); // Точка, куда подойдет игрок // Проверим: Если тот, кто наступил на триггер не игрок ИЛИ на триггере есть // переменн. TRIGGER, то скрипту последует команда "return", т.е. ВОЗВРАТ if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1) return; { SetLocalInt(OBJECT_SELF, "TRIGGER", 1); // Сценка уже произошла SetCutsceneMode(oPC); // Переведем РС в режим Cutscene AssignCommand(oNPC, ClearAllActions()); // Почистим все Action_ у НПС AssignCommand(oPC, ClearAllActions()); // Почистим все Action_ у РС /* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Все команды ниже, это последовательные команды ТРИГГЕРУ, что бы он "ЗАПОМНИЛ" и "РАЗАДAЛ" задачи по адресам (Игроку, НПС и т.д.) в нужный момент времени. Количество этих команд не должно превышать цифру 75 - это максимальное количество запоминаемых действий одного объекта. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ ActionDoCommand(AssignCommand(oPC, ActionMoveToObject(oWPpc))); // Игрока отправим нужную точку ActionDoCommand(AssignCommand(oPC, SetFacingPoint(GetPosition(oDoor)))); // Повернем лицом к двери ActionDoCommand(AssignCommand(oPC, SetCameraFacing(280.0, 20.0, 45.0, CAMERA_TRANSITION_TYPE_MEDIUM))); // Установим камеру в том положение, что нам надо ActionWait(5.5); // Сделаем паузу ActionDoCommand(AssignCommand(oNPC, ActionJumpToObject(oDoor))); // Отправим НПС к нам ActionDoCommand(AssignCommand(oNPC, SetFacingPoint(GetPosition(oPC)))); // Повернем его в нашу сторону ActionWait(2.0); ActionDoCommand(AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 3.0))); // Заставим проиграть анимацию САЛЮТ. Он нам помашет рукой ActionDoCommand(AssignCommand(oNPC, PlayVoiceChat(VOICE_CHAT_HELLO))); // Проиграет звук привета ActionDoCommand(AssignCommand(oNPC, SpeakString("Привет!"))); // Произнесет фразу ActionDoCommand(AssignCommand(oPC, SetCameraFacing(280.0, 7.0, 45.0, CAMERA_TRANSITION_TYPE_SLOW))); //Изменим положение камеры ActionWait(3.5); ActionDoCommand(AssignCommand(oNPC, ActionMoveToObject(oPC))); // Отправим НПС к игроку ActionDoCommand(AssignCommand(oNPC, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); // Убираем режим сцен у игрока ActionDoCommand(AssignCommand(oNPC, ActionStartConversation(oPC))); // НПС начинает разговор с игроком } } |
Neverwinter Script Source |
if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1) return; |
Neverwinter Script Source |
ActionDoCommand(AssignCommand(oPC, SetFacingPoint(GetPosition(oDoor)))); |
Neverwinter Script Source |
ActionDoCommand(AssignCommand(oCaet, PlayVoiceChat(VOICE_CHAT_HELLO))); |
Neverwinter Script Source |
ActionDoCommand(AssignCommand(oCaet, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); |
Neverwinter Script Source |
//:://///////////////////////////////////////////// //:: Copyright © 2004 WRG! //::////////////////////////////////////////////// /* СЦЕНА №2 */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 7.08.2004 //::////////////////////////////////////////////// void main() { object oPC = GetPCSpeaker(); // Это наш любимый персонаж =) object oNPC = GetObjectByTag("NPC_02"); // Подлый воришка! object oDoor = GetNearestObjectByTag("AM_DOOR_START"); // Дверь, нужна как ориентир object oLuk = GetNearestObjectByTag("AM_LUK"); // Секретный люк в полу object oSec = OBJECT_SELF; // Это наш собеседник object oWPpc = GetWaypointByTag("WP_PC_02"); // Точка, куда "прыгает" игрок в первый раз второй object oWPpc2 = GetWaypointByTag("WP_PC_03"); // Точка, куда "прыгает" игрок во второй раз object oWP1 = GetWaypointByTag("WP_SC02_01"); // Точки вора object oWP2 = GetWaypointByTag("WP_SC02_02"); object oWP3 = GetWaypointByTag("WP_SC02_03"); object oWP4 = GetWaypointByTag("WP_SC02_04"); object oWP5 = GetWaypointByTag("WP_SC02_05"); //::::::::::::::::::::::: ПОМОЩНИКИ ИГРОКА. Определим :::::::::::::::::::::::::: object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: effect eCutInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); // Невидимость в сценке effect eCutPar = EffectCutsceneParalyze(); // Неподвижность нашим спутникам (чтоб чего не выкинули...) { SetLocalInt(oPC, "CUT_SCEN_02", TRUE); // Сценка была (проверка в диалоге) SetLocalLocation(oPC,"START_POINT", GetLocation(oPC)); // Заппомним КООРДИНАТЫ Игрока AssignCommand(oSec, ActionPauseConversation()); // Сделаем паузу в диалоге с НПС AssignCommand(oNPC, ClearAllActions()); // Почистим все Action_ у НПС AssignCommand(oNPC, ActionJumpToObject(oWP1)); // Отправим НПС к нам AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oDoor)))); // Повернем НПС в сторону двери, т.е. к нам лицом FadeToBlack(oPC, FADE_SPEED_FASTEST); // Занавес из черного экрана (ОЧЕНЬ быстро) AssignCommand(oPC, ClearAllActions()); // Почистим все Action_ у РС ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oPC, 41.0); // Делаем игрока невидимым SetCutsceneMode(oPC); // Переведем РС в режим Cutscene SetAILevel(oNPC, AI_LEVEL_HIGH); // Изменим AI у нашего вора ВЫСОКИМ, так он лучше будет соображать =) //::::::::::::: ОБРАБОТКА ФАМИЛЬЯРОВ - Нивидимость и неподвижность ::::::::::: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oAnimal, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oAnimal, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oHenchman, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oHenchman, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oDominated, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oDominated, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oFamiliar, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oFamiliar, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oSummoned, 40.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oSummoned, 40.5); //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: DelayCommand(1.0, AssignCommand(oPC, JumpToObject(oWPpc))); // Отправим Игрока в нужную точку DelayCommand(1.5, AssignCommand(oPC, SetCameraFacing(10.0, 12.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP))); // Камеру поставим в нужный ракурс DelayCommand(2.0, FadeFromBlack(oPC, FADE_SPEED_MEDIUM)); // Уберем занавес из черного экрана (МЕДЛЕННО) DelayCommand(2.5, AssignCommand(oPC, ClearAllActions())); DelayCommand(3.0, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_LOOK_FAR, 0.9, 5.0))); // Наш вор смотрит в даль... DelayCommand(3.5, AssignCommand(oPC, SetCameraFacing(10.0, 20.0, 40.0, CAMERA_TRANSITION_TYPE_SLOW))); // Повернем ракурс камеры DelayCommand(4.0, AssignCommand(oNPC, SpeakString("Сваливать пора..."))); // Воришка сдрейфил =) DelayCommand(5.0, AssignCommand(oNPC, ActionMoveToObject(oWP2))); // Пошел в точку 2 DelayCommand(7.0, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 0.9, 3.0))); // Полез открывать замок и шарить руками DelayCommand(8.0, AssignCommand(oNPC, SpeakString("Еще пару вещичек..."))); // Жадность фраера сгубила =) DelayCommand(9.5, AssignCommand(oNPC, ActionForceMoveToObject(oWP3, TRUE, 1.0, 7.0))); // Бежит в точку 3 DelayCommand(10.0, AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oWP3))))); // Повернем его рыльцем в сторону нужную нам DelayCommand(11.0, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 0.9, 5.0))); // Полез открывать замок и шарить руками //================== ПЕРЕМЕСТИМ ИГРОКА В ДРУГУЮ ТОЧКУ НЕЗАМЕТНО ================ DelayCommand(12.0, AssignCommand(oPC, ClearAllActions())); DelayCommand(12.5, FadeToBlack(oPC, FADE_SPEED_FASTEST)); // Занавес из черного экрана (ОЧЕНЬ быстро) DelayCommand(13.5, AssignCommand(oPC, JumpToObject(oWPpc2)));// Отправим Игрока в точку 2 DelayCommand(13.6, AssignCommand(oPC, SetCameraFacing(130.0, 20.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP))); // Повернем ракурс камеры DelayCommand(14.5, FadeFromBlack(oPC, FADE_SPEED_MEDIUM)); // Уберем занавес из черного экрана (МЕДЛЕННО) //============================================================================== DelayCommand(17.0, AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oDoor))))); DelayCommand(19.0, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_LOOK_FAR, 0.9, 3.0))); DelayCommand(20.0, AssignCommand(oNPC, SpeakString("Понабежало разных зевак. Уроды..."))); DelayCommand(21.0, AssignCommand(oNPC, ActionForceMoveToObject(oWP4, FALSE, 1.0, 15.0))); DelayCommand(24.0, AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oWP5))))); DelayCommand(25.0, AssignCommand(oPC, ClearAllActions())); DelayCommand(25.6, AssignCommand(oPC, SetCameraFacing(130.0, 10.0, 40.0, CAMERA_TRANSITION_TYPE_SLOW))); DelayCommand(25.0, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 0.9, 3.0))); DelayCommand(30.0, AssignCommand(oLuk, ActionPlayAnimation(ANIMATION_PLACEABLE_OPEN, 1.0))); // Даем команду люку открыть крышку DelayCommand(33.5, AssignCommand(oNPC, ClearAllActions())); DelayCommand(30.0, AssignCommand(oNPC, ActionMoveToObject(oWP5))); // Говорим НПС стать в люк DelayCommand(36.5, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 3.0, 1.0))); DelayCommand(37.5, AssignCommand(oNPC, ClearAllActions())); DelayCommand(37.8, AssignCommand(oNPC, ActionDoCommand(DestroyObject(oNPC)))); // Говорим НПС убить СЕБЯ DelayCommand(38.5, AssignCommand(oLuk, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE, 2.0))); //========================= ВЕРНЕМ ИГРОКА НАЗАД В РАЗГОВОР =================== DelayCommand(39.0, AssignCommand(oPC, ClearAllActions())); // Почистим все Action_ у РС DelayCommand(39.5, FadeToBlack(oPC, FADE_SPEED_FASTEST));// Занавес из черного экрана (ОЧЕНЬ быстро) DelayCommand(40.5, AssignCommand(oPC, ActionJumpToLocation(GetLocalLocation(oPC,"START_POINT")))); // Отправим игрока в ту точку, что мы ЗАПОМНИЛИ в начале скрипта DelayCommand(41.5, FadeFromBlack(oPC, FADE_SPEED_MEDIUM)); // Уберем занавес из черного экрана (МЕДЛЕННО) DelayCommand(42.5, AssignCommand(oSec, ActionResumeConversation())); // "Продолжаем разговор!" (с) Карлсон DelayCommand(43.0, SetCutsceneMode(oPC, FALSE)); // Убираем режим сцен у игрока } } |
Neverwinter Script Source |
SetLocalLocation(oPC,"START_POINT", GetLocation(oPC)); |
Neverwinter Script Source |
SetAILevel(oNPC, AI_LEVEL_HIGH); |
Neverwinter Script Source |
effect eSlow = EffectSlow(); |
Neverwinter Script Source |
ChangeToStandardFaction(oNPC, STANDARD_FACTION_HOSTILE); |
Neverwinter Script Source |
ChangeFaction() |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Copyright © 2004 WRG! www.wrg.ru //:: am_scen_warr_01 //::////////////////////////////////////////////// /* СЦЕНА ФИНАЛЬНОГО БОЯ С ВОИНОМ ОРДЫ ДЕЙСТВИЕ В ЧЕТЫРЕХ АКТАХ (СПЕЦИАЛЬНАЯ РЕДАКЦИЯ ДЛЯ ОБУЧАЮЩЕГО МОДУЛЯ) Комментарии сделаны либо сбоку, либо сразу же под нужной строкой кода. На отладку этой сценки ушло времени больше недели. */ //::////////////////////////////////////////////// //:: Created By: Aiwan Aiwan@e-mail.ru //:: Created On: 21.02.2004 //::////////////////////////////////////////////// #include "am_libcutscen" void main() { //================ Буква Я в стрингах (Сделал Lex) ============================ string ya = GetName(GetObjectByTag("YA")); // "+ya+" //=============================== СОЗДАНИЯ =================================== object oPC = GetEnteringObject(); // Игрок object oDallik = GetNearestObjectByTag("DALLIK_STEADFAST"); // Даллик object oWord = GetObjectByTag("AM_WARRIOR_HORDE"); // Воин Орды object oMag = GetObjectByTag("AM_MAG_WARRIOR"); // Маг object oTrone = GetObjectByTag("AM_TRONE_WARRIOR"); // Трон [creatur_] object oSlave1 = GetObjectByTag("AM_SKELLETON_SLAVE_01"); // Скелет - Раб 1 object oSlave2 = GetObjectByTag("AM_SKELLETON_SLAVE_02"); // Скелет - Раб 2 object oSlave3 = GetObjectByTag("AM_SKELLETON_SLAVE_03"); // Скелет - Раб 3 object oSlave4 = GetObjectByTag("AM_SKELLETON_SLAVE_04"); // Скелет - Раб 4 //----------------------------- ПОМОЩНИКИ ИГРОКА ------------------------------ object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); //------------------ АРМИЯ ТЬМЫ В ЗАКРЫТОЙ ЛОКАПЦИИ ---------------------------- object oSk1 = GetObjectByTag("AM_SKEL_01"); // Скелет - воин 1 object oSk2 = GetObjectByTag("AM_SKEL_02"); // Скелет - воин 2 object oSk3 = GetObjectByTag("AM_SKEL_03"); // Скелет - воин 3 object oSk4 = GetObjectByTag("AM_SKEL_04"); // Скелет - воин 4 object oSk5 = GetObjectByTag("AM_SKEL_05"); // Скелет - воин 5 object oSk6 = GetObjectByTag("AM_SKEL_06"); // Скелет - маг 6 object oSk7 = GetObjectByTag("AM_SKEL_07"); // Скелет - маг 7 object oSk8 = GetObjectByTag("AM_SKEL_08"); // Скелет - воин 8 object oSk9 = GetObjectByTag("AM_SKEL_09"); // Скелет - клер 9 object oSk10 = GetObjectByTag("AM_SKEL_10"); // Скелет - воин 10 object oSk11 = GetObjectByTag("AM_SKEL_11"); // Скелет - воин 11 object oSk12 = GetObjectByTag("AM_SKEL_12"); // Скелет - клер 12 object oSkBoss = GetObjectByTag("AM_SKEL_BOSS"); // Скелет - Boss //=============================== ОБЪЕКТЫ ==================================== object oMlrR = GetObjectByTag("AM_FLEG_MISTLAR_R"); // Мистлар левый object oMlrL = GetObjectByTag("AM_FLEG_MISTLAR_L"); // Мистлар правый object oInvis = GetObjectByTag("AM_INVIS_PORTAL"); // Невидимый объект ДЛЯ атаки по нему object oPlsTrone = GetObjectByTag("AM_PLS_TRON_WARRIOR"); // Трон [pls_] object oDoor = GetObjectByTag("AM_D_BAATOR_OUT1"); // Дверь портала object oGate = GetObjectByTag("AM_DOOR_WAR_ORD_T"); // Ворота сверху //============================== ЛОКАЦИИ ===================================== location lClose = GetLocation(GetObjectByTag("AIWAN_CLOSE_ARENA")); //Скрыт.арена Aiwan'a location lTrone = GetLocation(oPlsTrone); // //=============================== ТОЧКИ ПУТИ ================================= //----------- Точки Воинa Орды --------------- object oWPWar1 = GetObjectByTag("WP_WARRIOR_01"); object oWPWar2 = GetObjectByTag("WP_WARRIOR_02"); object oWPWar3 = GetObjectByTag("WP_WARRIOR_03"); //---------------- Портал --------------------- object oWPport = GetObjectByTag("WP_WARRIOR_PORTAL"); //-------------- Место трона ------------------ object oWPTrone = GetObjectByTag("WP_TRONE_WARRIOR"); //-------------- Точки спавна ----------------- object oWPSpawn = GetObjectByTag("WP_FLEG_SPAWN"); //----------- Центр зала камеры --------------- object oWPCent = GetObjectByTag("WP_FLEG_PC_CENTRE"); //------------- Точки игрока ------------------ object oWPC1 = GetObjectByTag("WP_FLEG_PC_01"); object oWPC2 = GetObjectByTag("WP_FLEG_PC_02"); object oWPC3 = GetObjectByTag("WP_FLEG_PC_03"); object oWPC4 = GetObjectByTag("WP_FLEG_PC_04"); //-------------- Точки стражи ----------------- object oWPnpc1 = GetObjectByTag("WP_FLEG_NPC_01"); object oWPnpc2 = GetObjectByTag("WP_FLEG_NPC_02"); object oWPnpc3 = GetObjectByTag("WP_FLEG_NPC_03"); object oWPnpc4 = GetObjectByTag("WP_FLEG_NPC_04"); object oWPnpc5 = GetObjectByTag("WP_FLEG_NPC_05"); object oWPnpc6 = GetObjectByTag("WP_FLEG_NPC_06"); //--------------- Охрана у трона --------------- object oWPSlave1 = GetObjectByTag("WP_TRONE_SLAVE_01"); object oWPSlave2 = GetObjectByTag("WP_TRONE_SLAVE_02"); //-------------- Север - Юг ----------------- object oSouth = GetWaypointByTag("WP_SOUTH"); // Юг object oNorth = GetWaypointByTag("WP_NORTH"); // Север //-------------- Точки спавна скелетов ----------------- object oWPSpsk1 = GetObjectByTag("WP_FLEG_SPAWN_01"); object oWPSpsk2 = GetObjectByTag("WP_FLEG_SPAWN_02"); object oWPSpsk3 = GetObjectByTag("WP_FLEG_SPAWN_03"); object oWPSpsk4 = GetObjectByTag("WP_FLEG_SPAWN_04"); object oWPSpsk5 = GetObjectByTag("WP_FLEG_SPAWN_05"); object oWPSpsk6 = GetObjectByTag("WP_FLEG_SPAWN_06"); object oWPSpsk7 = GetObjectByTag("WP_FLEG_SPAWN_07"); object oWPSpsk8 = GetObjectByTag("WP_FLEG_SPAWN_08"); object oWPSpsk9 = GetObjectByTag("WP_FLEG_SPAWN_09"); object oWPSpsk10 = GetObjectByTag("WP_FLEG_SPAWN_10"); object oWPSpsk11 = GetObjectByTag("WP_FLEG_SPAWN_11"); object oWPSpsk12 = GetObjectByTag("WP_FLEG_SPAWN_12"); object oWPSpBoss = GetObjectByTag("WP_FLEG_SPAWN_BOSS"); //-------------- Точка Даллика Стидфаста --------------- object oWPd = GetObjectByTag("WP_DALLIK_IN_FLEG"); //=============================== ВИЗУАЛЬНЫЕ ЭФФЕКТЫ ========================= effect eGhost = EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE); // Эффект духа effect eCutInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); // Невидимость в сценке effect eCutPar = EffectCutsceneParalyze();// Неподвижность нашим спутникам (чтоб чего не выкинули...) effect eSpawn = EffectVisualEffect(VFX_IMP_DEATH_L); effect eSpawnD = EffectVisualEffect(VFX_IMP_RAISE_DEAD); effect eLighS = EffectVisualEffect(VFX_IMP_LIGHTNING_S); effect eLighM = EffectVisualEffect(VFX_IMP_LIGHTNING_M); // Разные визуальные эффекты, если хотите их смениить, то наведите на них курсор и нажмите F2 effect eHaste = EffectHaste(); effect eSlow = EffectSlow(); // Замедление движений у игрока. Игрок ИДТИ не может, // он только бежит, это движковое ограничение. //++++++++++++++++++++++ МОТОР! КАМЕРА! СНИМАЕМ! ++++++++++++++++++++++++++++++ if (GetIsPC(oPC) && !GetLocalInt(OBJECT_SELF, "TRIGGER")) { //======================= ПОДГОТОВКА К ПЕРВОМУ АКТУ ========================= SetLocalInt(OBJECT_SELF, "TRIGGER", TRUE); SetLocked(oGate, FALSE); SetCutsceneMode(oPC); FadeToBlack(oPC, FADE_SPEED_FASTEST); //------------------------- ОБРАБОТКА ФАМИЛЬЯРОВ ------------------------------- ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oAnimal, 355.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oAnimal, 354.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oHenchman, 355.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oHenchman, 354.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oDominated, 355.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oDominated, 354.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oFamiliar, 355.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oFamiliar, 354.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oSummoned, 355.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oSummoned, 354.0); //------------------------------------------------------------------------------ ActionCreate(OBJECT_TYPE_CREATURE, "am_dallik", GetLocation(oWPSpawn)); // Создаем нашего НПС тут же, недалеко и "ПРЯЧЕМ" его просто сделав невидимым object oDallik = GetNearestObjectByTag("DALLIK_STEADFAST"); // Даллик // Определим его как oDallik, если вы это сделаете выше, то скрипт // просто не найдет такой объект, ведь его еще не было! Поэтому делайте так. location lClose; SetPlotFlag(oDallik, FALSE); // Убираем галочку СЮЖЕТНОГО НПС скриптом, теперь его можно убить AssignCommand(oSlave1, ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 5.0, 5.0)); AssignCommand(oSlave2, ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 5.0, 7.0)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oMag, 85.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oPC, 354.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSlow, oPC, 354.0); // Делаем игрока способным идти шагом ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oDallik, 200.5); // "ПРЯЧЕМ" NPC просто сделав невидимым ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oWord, 11.5); // "ПРЯЧЕМ" NPC просто сделав невидимым SetAILevel(oWord, AI_LEVEL_HIGH); // Добавим прачку извилин AssignCommand(oDallik, ClearAllActions()); AssignCommand(oWord, ClearAllActions()); AssignCommand(oPC, ClearAllActions()); AssignCommand(oMag, ClearAllActions()); DelayCommand(0.9, AssignCommand(oPC, ActionJumpToObject(oWPC2))); AssignCommand(oWord, ActionJumpToObject(oWPport)); // Теперь как буд-то он прибыл из бездны А сам стоит за углом MusicBackgroundChangeNight(GetArea(OBJECT_SELF), 43); // Сменим музыку на более устращающую MusicBackgroundChangeDay(GetArea(OBJECT_SELF), 43); // Сменим музыку на более устращающую DelayCommand(2.0, FadeFromBlack(oPC, FADE_SPEED_MEDIUM)); //========================== НАЧАЛО - АКТ ПЕРВЫЙ ============================= |
Aiwan, могу выложить базу, ЗНАЧИТЕЛЬНО облегчающую создания катсцен . Команды НАМНОГО проще в обращнии, чем *официальные*. По крайней мере мне этот инлюд сэкономил достаточно много времени.
Tarre, выложи плиз!
// Tarre я не понял, ты чего старый ник не юзаешь?
Выложи в тему скриптов.
Тарре, выкладывай сюда, а не в скрипты. Айв, тебе чем не нравится, чтобы здесь лежало? Все по теме. К тому же с удовольствием гляну этот инклюд...
Сам инклюд
Neverwinter Script Source |
void GestaltDebugOutput(object oPC) { // Get the current position of oPC's camera float fDirection = GetLocalFloat(oPC,"fCameraDirection"); float fRange = GetLocalFloat(oPC,"fCameraRange"); float fPitch = GetLocalFloat(oPC,"fCameraPitch"); // Fire a message to say where the camera is AssignCommand(oPC,SpeakString(FloatToString(fDirection) + ", " + FloatToString(fRange) + ", " + FloatToString(fPitch))); } void GestaltStopCameraMoves(object oPC, int iParty = 0, int bAuto = TRUE, int iCamID = 0) { object oParty; string sCam; int iCount; if (iParty == 1) { oParty = GetFirstFactionMember(oPC); } else if (iParty == 2) { oParty = GetFirstPC(); } else { oParty = oPC; } while (GetIsObjectValid(oParty)) { if (bAuto) { iCamID = GetLocalInt(oParty,"iCamCount"); } iCount = iCamID; while (iCount > 0) { // Find the camera movement sCam = "iCamStop" + IntToString(iCount); SetLocalInt(oParty,sCam,1); iCount--; // Uncomment the line below to get a message in the game confirming each id which is cancelled // AssignCommand(oParty,SpeakString("Camera movement id " + IntToString(iCount) + "has been stopped")); } if (iParty == 1) { oParty = GetNextFactionMember(oParty,TRUE); } else if (iParty == 2) { oParty = GetNextPC(); } else { return; } } } vector GetVectorAB(object oA, object oB) { vector vA = GetPosition(oA); vector vB = GetPosition(oB); vector vDelta = (vA - vB); return vDelta; } float GetHorizontalDistanceBetween(object oA, object oB) { vector vHorizontal = GetVectorAB(oA,oB); float fDistance = sqrt(pow(vHorizontal.x,2.0) + pow(vHorizontal.y,2.0)); return fDistance; } float GestaltGetDirection(object oTarget, object oPC) { vector vdTarget = GetVectorAB(oTarget,oPC); float fDirection = VectorToAngle(vdTarget); return fDirection; } void GestaltCameraPoint(float fDirection, float fRange, float fPitch, float fdDirection, float fdRange, float fdPitch, float fd2Direction, float fd2Range, float fd2Pitch, float fCount, object oPC, int iCamID, int iFace = 0) { // Check whether this camera movement has been stopped string sCam = "iCamStop" + IntToString(iCamID); if (GetLocalInt(oPC,sCam) == 1) { return; } // Work out where to point the camera fDirection = fDirection + ((fd2Direction * pow(fCount,2.0)) / 2) + (fdDirection * fCount); fRange = fRange + ((fd2Range * pow(fCount,2.0)) / 2) + (fdRange * fCount); fPitch = fPitch + ((fd2Pitch * pow(fCount,2.0)) / 2) + (fdPitch * fCount); // Reset fDirectionNew if it's gone past 0 or 360 degrees while (fDirection < 0.0) { fDirection = (fDirection + 360.0); } while (fDirection > 360.0) { fDirection = (fDirection - 360.0); } // Set the camera and/or player facing, according to iFace if (iFace < 2) { AssignCommand(oPC,SetCameraFacing(fDirection,fRange,fPitch)); } if (iFace > 0) { AssignCommand(oPC,SetFacing(fDirection)); } // Store the current position of the camera SetLocalFloat(oPC,"fCameraDirection",fDirection); SetLocalFloat(oPC,"fCameraRange",fRange); SetLocalFloat(oPC,"fCameraPitch",fPitch); } void GestaltFaceTarget(object oTarget, float fRange, float fPitch, object oPC, int iFace, int iParty = 0, int iCamID = 0) { // Check whether this camera movement has been stopped string sCam = "iCamStop" + IntToString(iCamID); if (iCamID > 0 && GetLocalInt(oPC,sCam) == 1) { return; } float fDirection; object oParty; if (iParty == 1) { oParty = GetFirstFactionMember(oPC); } else if (iParty == 2) { oParty = GetFirstPC(); } else { oParty = oPC; } while (GetIsObjectValid(oParty)) { fDirection = GestaltGetDirection(oTarget,oParty); if (iFace < 2) { AssignCommand(oParty,SetCameraFacing(fDirection,fRange,fPitch)); } if (iFace > 0) { AssignCommand(oParty,SetFacing(fDirection)); } if (iParty == 1) { oParty = GetNextFactionMember(oParty,TRUE); } else if (iParty == 2) { oParty = GetNextPC(); } else { return; } } } float GestaltGetPanRate(float fDirection, float fDirection2, float fTicks, int iClockwise) { // Calculates how far the camera needs to move each to tick to go from fDirection to fDirection2 // in fTicks steps, correcting as necessary to account for clockwise or anti-clockwise movement float fdDirection; if (iClockwise == 0) { if (fDirection > fDirection2) { fdDirection = ((fDirection2 + 360.0 - fDirection) / fTicks); } else { fdDirection = ((fDirection2 - fDirection) / fTicks); } } if (iClockwise == 1) { if (fDirection2 > fDirection) { fdDirection = ((fDirection2 - fDirection - 360.0) / fTicks); } else { fdDirection = ((fDirection2 - fDirection) / fTicks); } } if (iClockwise == 2) { float fCheck = fDirection2 - fDirection; if (fCheck > 180.0) { fdDirection = ((fDirection2 - fDirection - 360.0) / fTicks); } else if (fCheck < -180.0) { fdDirection = ((fDirection2 + 360.0 - fDirection) / fTicks); } else { fdDirection = ((fDirection2 - fDirection) / fTicks); } } return fdDirection; } void GestaltCameraMove(float fDelay, float fDirection, float fRange, float fPitch, float fDirection2, float fRange2, float fPitch2, float fTime, float fFrameRate, object oPC, int iClockwise = 0, int iFace = 0, int iParty = 0) { // Get timing information float fTicks = (fTime * fFrameRate); float fdTime = (fTime / fTicks); float fStart = fDelay; float fCount; float fdDirection = GestaltGetPanRate(fDirection,fDirection2,fTicks,iClockwise); float fdRange = ((fRange2 - fRange) / fTicks); float fdPitch = ((fPitch2 - fPitch) / fTicks); int iCamID; object oParty; if (iParty == 1) { oParty = GetFirstFactionMember(oPC); } else if (iParty == 2) { oParty = GetFirstPC(); } else { oParty = oPC; } while (GetIsObjectValid(oParty)) { // Set the camera to top down mode SetCameraMode(oParty,CAMERA_MODE_TOP_DOWN); // Give the camera movement a unique id code so that it can be stopped iCamID = GetLocalInt(oParty,"iCamCount") + 1; SetLocalInt(oParty,"iCamCount",iCamID); // reset variables fCount = 0.0; fDelay = fStart; // Uncomment the line below to get a message in the game telling you the id of this camera movement // AssignCommand(oParty,SpeakString("Camera id - " + IntToString(iCamID))); // After delay, stop any older camera movements and start this one DelayCommand(fStart,GestaltStopCameraMoves(oParty,0,FALSE,iCamID - 1)); while (fCount <= fTicks) { DelayCommand(fDelay,GestaltCameraPoint(fDirection,fRange,fPitch,fdDirection,fdRange,fdPitch,0.0,0.0,0.0,fCount,oParty,iCamID,iFace)); fCount = (fCount + 1.0); fDelay = fStart + (fCount * fdTime); } if (iParty == 1) { oParty = GetNextFactionMember(oParty,TRUE); } else if (iParty == 2) { oParty = GetNextPC(); } else { return; } } } void GestaltCameraSmoothStart(float fdDirection1, float fdRange1, float fdPitch1, float fdDirection2, float fdRange2, float fdPitch2, float fTime, float fFrameRate, object oParty, object oSync, int iCamID) { // Get starting position for camera float fDirection = GetLocalFloat(oSync,"fCameraDirection"); float fRange = GetLocalFloat(oSync,"fCameraRange"); float fPitch = GetLocalFloat(oSync,"fCameraPitch"); // Get timing information float fTicks = (fTime * fFrameRate); float fdTime = (fTime / fTicks); float fDelay = 0.0; float fCount = 0.0; // Get camera speed and acceleration float fdDirection = fdDirection1 / fFrameRate; float fdRange = fdRange1 / fFrameRate; float fdPitch = fdPitch1 / fFrameRate; float fd2Direction = (fdDirection2 - fdDirection1) / ((fTicks - 1) * fFrameRate); float fd2Range = (fdRange2 - fdRange1) / ((fTicks - 1) * fFrameRate); float fd2Pitch = (fdPitch2 - fdPitch1) / ((fTicks - 1) * fFrameRate); // Start camera movement while (fCount < fTicks) { DelayCommand(fDelay,GestaltCameraPoint(fDirection,fRange,fPitch,fdDirection,fdRange,fdPitch,fd2Direction,fd2Range,fd2Pitch,fCount,oParty,iCamID)); fCount = (fCount + 1.0); fDelay = (fCount * fdTime); } // Uncomment the line below to display the starting position of the camera movement // GestaltDebugOutput(oSync); // Uncomment the line below to display the finishing position of the camera movement // DelayCommand(fDelay,GestaltDebugOutput(oSync)); } void GestaltCameraSmooth(float fDelay, float fdDirection1, float fdRange1, float fdPitch1, float fdDirection2, float fdRange2, float fdPitch2, float fTime, float fFrameRate, object oPC, int iParty = 0, int iSync = 1) { object oParty; object oSync; int iCamID; if (iParty == 1) { oParty = GetFirstFactionMember(oPC); } else if (iParty == 2) { oParty = GetFirstPC(); } else { oParty = oPC; } while (GetIsObjectValid(oParty)) { // Work out whose camera position to use as the starting position if (iSync == 1) { oSync = oPC; } else { oSync = oParty; } // Set the camera to top down mode SetCameraMode(oParty,CAMERA_MODE_TOP_DOWN); // Give the camera movement a unique id code so that it can be stopped iCamID = GetLocalInt(oParty,"iCamCount") + 1; SetLocalInt(oParty,"iCamCount",iCamID); // Uncomment the line below to get a message in the game telling you the id of this camera movement // AssignCommand(oParty,SpeakString("Camera id - " + IntToString(iCamID))); // After delay, stop any older camera movements and start this one DelayCommand(fDelay,GestaltStopCameraMoves(oParty,0,FALSE,iCamID - 1)); DelayCommand(fDelay,GestaltCameraSmoothStart(fdDirection1,fdRange1,fdPitch1,fdDirection2,fdRange2,fdPitch2,fTime,fFrameRate,oParty,oSync,iCamID)); if (iParty == 1) { oParty = GetNextFactionMember(oParty,TRUE); } else if (iParty == 2) { oParty = GetNextPC(); } else { return; } } } void GestaltCameraFace(float fDelay, object oStart, float fRange, float fPitch, object oEnd, float fRange2, float fPitch2, float fTime, float fFrameRate, object oPC, int iClockwise = 0, int iFace = 0, int iParty = 0) { // Get timing information float fCount = 0.0; float fStart = fDelay; float fTicks = (fTime * fFrameRate); float fdTime = (fTime / fTicks); float fDirection; float fDirection2; float fdDirection; float fdRange = ((fRange2 - fRange) / fTicks); float fdPitch = ((fPitch2 - fPitch) / fTicks); object oParty; int iCamID; // Get first player if (iParty == 1) { oParty = GetFirstFactionMember(oPC); } else if (iParty == 2) { oParty = GetFirstPC(); } else { oParty = oPC; } while (GetIsObjectValid(oParty)) { // Set the camera to top down mode SetCameraMode(oParty,CAMERA_MODE_TOP_DOWN); // Give the camera movement a unique id code so that it can be stopped iCamID = GetLocalInt(oParty,"iCamCount") + 1; SetLocalInt(oParty,"iCamCount",iCamID); // reset variables fCount = 0.0; fDelay = fStart; // Work out rotation rate for this player fDirection = GestaltGetDirection(oStart,oParty); fDirection2 = GestaltGetDirection(oEnd,oParty); fdDirection = GestaltGetPanRate(fDirection,fDirection2,fTicks,iClockwise); // After delay, stop any older camera movements and start this one DelayCommand(fStart,GestaltStopCameraMoves(oParty,0,FALSE,iCamID - 1)); while (fCount <= fTicks) { DelayCommand(fDelay,GestaltCameraPoint(fDirection,fRange,fPitch,fdDirection,fdRange,fdPitch,0.0,0.0,0.0,fCount,oParty,iCamID,iFace)); fCount = (fCount + 1.0); fDelay = fStart + (fCount * fdTime); } if (iParty == 1) { oParty = GetNextFactionMember(oParty,TRUE); } else if (iParty == 2) { oParty = GetNextPC(); } else { return; } } } void GestaltCameraTrack(float fDelay, object oTrack, float fRange, float fPitch, float fRange2, float fPitch2, float fTime, float fFrameRate, object oPC, int iFace = 0, int iParty = 0) { // Get timing information float fCount; float fStart = fDelay; float fTicks = (fTime * fFrameRate); float fdTime = (fTime / fTicks); float fSRange = fRange; float fSPitch = fPitch; float fdRange = ((fRange2 - fRange) / fTicks); float fdPitch = ((fPitch2 - fPitch) / fTicks); object oParty; int iCamID; if (iParty == 1) { oParty = GetFirstFactionMember(oPC); } else if (iParty == 2) { oParty = GetFirstPC(); } else { oParty = oPC; } while (GetIsObjectValid(oParty)) { // Set the camera to top down mode SetCameraMode(oParty,CAMERA_MODE_TOP_DOWN); // Give the camera movement a unique id code so that it can be stopped iCamID = GetLocalInt(oParty,"iCamCount") + 1; SetLocalInt(oParty,"iCamCount",iCamID); // reset variables fCount = 0.0; fDelay = fStart; fRange = fSRange; fPitch = fSPitch; // After delay, stop any older camera movements and start this one DelayCommand(fStart,GestaltStopCameraMoves(oParty,0,FALSE,iCamID - 1)); while (fCount <= fTicks) { DelayCommand(fDelay,GestaltFaceTarget(oTrack,fRange,fPitch,oParty,iFace,0,iCamID)); fPitch = (fPitch + fdPitch); fRange = (fRange + fdRange); fCount = (fCount + 1.0); fDelay = fStart + (fCount * fdTime); } if (iParty == 1) { oParty = GetNextFactionMember(oParty,TRUE); } else if (iParty == 2) { oParty = GetNextPC(); } else { return; } } } void GestaltFixedCamera(object oPC, float fFrameRate = 50.0) { // Thanks to Tenchi Masaki for the idea for this function string sCamera = GetLocalString(oPC,"sGestaltFixedCamera"); // Gets the camera position to use if (sCamera == "STOP") // Camera tracking is turned off, stop script and don't recheck { return; } if (sCamera == "") // Camera tracking is inactive, stop script but recheck in a second { DelayCommand(1.0,GestaltFixedCamera(oPC,fFrameRate)); return; } float fHeight = GetLocalFloat(oPC,"fGestaltFixedCamera"); // Gets the camera height to use if (fHeight == 0.0) { fHeight = 10.0; } // Defaults camera height to 10.0 if none has been set yet object oCamera = GetObjectByTag(sCamera); float fDelay = 1.0 / fFrameRate; float fRange = GetHorizontalDistanceBetween(oPC,oCamera); float fAngle = GestaltGetDirection(oPC,oCamera); // Works out angle between camera and player float fPitch = atan(fRange/fHeight); // Works out vertical tilt float fDistance = sqrt(pow(fHeight,2.0) + pow(fRange,2.0)); // Works out camera distance from player if (fDistance > 30.0) { fDistance = 30.0; } // Sets distance to 30.0 if player is too far away if (fDistance < 5.0) { fDistance = 5.0; } // Sets distance to 5.0 if player is too close AssignCommand(oPC,SetCameraFacing(fAngle,fDistance,fPitch)); DelayCommand(fDelay,GestaltFixedCamera(oPC,fFrameRate)); }[/CODE] и прототипы к функциям [CODE]// Stops all camera movements immediately // oPC the player whose camera movements you want to stop // iParty sets whether to stop the camera of only oPC (0), all the players in oPC's party (1) or all the players on the server (2) // DO NOT CHANGE THE FOLLOWING SETTINGS! // bAuto sets whether the function should stop all camera movement (TRUE) or only ones with an id lower than iCamID (FALSE) // iCamID the ID of the last camera move you want to stop (this is only needed if bAuto is set to FALSE) void GestaltStopCameraMoves(object oPC, int iParty = 0, int bAuto = TRUE, int iCamID = 0); // Gets the vector linking object A to object B vector GetVectorAB(object oA, object oB); // Finds the horizontal distance between two objects, ignoring any vertical component float GetHorizontalDistanceBetween(object oA, object oB); // Finds the compass direction from the PC to a target object float GestaltGetDirection(object oTarget, object oPC); // Turns a character and/or their camera to face the specified target object // oTarget the object to face // fRange the distance between the player and the camera // fPitch the vertical tilt of the camera // NOTE that fRange and/or fPitch can be set to -1.0 to keep the camera's range and/or pitch unchanged // oPC the character you want to move // NOTE that this can be an NPC, as long as iFace == 2 // iFace sets whether the camera (0), the character (2) or both (1) turn to face the specified direction // NOTE that fRange and fPitch won't do anything if iFace == 2, as only the character is being moved // iParty sets whether to move the camera of only oPC (0), all the players in oPC's party (1) or all the players on the server (2) // iCamID the ID of the camera movement - DO NOT CHANGE THIS! void GestaltFaceTarget(object oTarget, float fRange, float fPitch, object oPC, int iFace, int iParty = 0, int iCamID = 0); // Moves the camera smoothly from one position to another over the specified time // STARTING TIME - // fDelay how many seconds to wait before starting the movement // STARTING CONDITIONS - // fDirection initial direction (0.0 = due east) // fRange initial distance between player and camera // fPitch initial pitch (vertical tilt) // FINAL CONDITIONS - // fDirection2 finishing direction // fRange2 finishing distance // fPitch2 finishing tilt // TIME SETTINGS - // fTime number of seconds it takes camera to complete movement // fFrameRate number of movements per second (governs how smooth the motion is) // MISC SETTINGS - // oPC the PC you want to apply the camera movement to // iClockwise set to 1 if you want the camera to rotate clockwise, 0 for anti-clockwise, or 2 for auto-select // iFace sets whether the camera (0), the character (2) or both (1) turn to face the specified direction // iParty sets whether to move the camera of only oPC (0), all the players in oPC's party (1) or all the players on the server (2) void GestaltCameraMove(float fDelay, float fDirection, float fRange, float fPitch, float fDirection2, float fRange2, float fPitch2, float fTime, float fFrameRate, object oPC, int iClockwise = 0, int iFace = 0, int iParty = 0); // Produces smooth transitions between different camera movements by setting initial and final speeds // The function then interpolates between the two so that the movement rate changes smoothly over the // duration of the movement. // STARTING TIME - // fDelay how many seconds to wait before starting the movement // MOVEMENT RATES AT START OF MOTION - // fdDirection1 how fast the camera's compass direction should change by in degrees per second // positive numbers produce an anti-clockwise movement, negative anti-clockwise // fdRange1 how fast the camera's range should change in meters per second // positive numbers move the camera away from the player, negative towards them // fdPitch1 how fast the camera's pitch should change in degrees per second // positive numbers tilt the camera down towards the ground, negative up towards vertical // MOVEMENT RATES AT END OF MOTION - // fdDirection2 how fast the camera's compass direction should change by in degrees per second // positive numbers produce an anti-clockwise movement, negative anti-clockwise // fdRange2 how fast the camera's range should change in meters per second // positive numbers move the camera away from the player, negative towards them // fdPitch2 how fast the camera's pitch should change in degrees per second // positive numbers tilt the camera down towards the ground, negative up towards vertical // TIME SETTINGS - // fTime number of seconds it should take the camera to complete movement // fFrameRate number of movements per second (governs how smooth the motion is) // MISC SETTINGS - // oPC the player whose camera you want to move // iParty sets whether to move the camera of only oPC (0), all the players in oPC's party (1) or all the players on the server (2) // iSync sets whether to use separate camera starting positions for every player (0) or sync them all to oPC's camera position (1) void GestaltCameraSmooth(float fDelay, float fdDirection1, float fdRange1, float fdPitch1, float fdDirection2, float fdRange2, float fdPitch2, float fTime, float fFrameRate, object oPC, int iParty = 0, int iSync = 1); // Turns the camera and/or player between two objects // NOTE that this will only work properly if the player and target objects are stationary while the function is active // STARTING TIME - // fDelay how many seconds to wait before starting the movement // STARTING CONDITIONS - // oStart object to face at start of movement // fRange initial distance between player and camera // fPitch initial pitch (vertical tilt) // FINAL CONDITIONS - // oEnd object to finish movement facing // fRange2 finishing distance // fPitch2 finishing tilt // TIME SETTINGS - // fTime number of seconds it takes camera to complete movement // fFrameRate number of movements per second (governs how smooth the motion is) // MISC SETTINGS - // oPC the player whose camera you want to move // iClockwise set to 1 if you want the camera to rotate clockwise, 0 for anti-clockwise, or 2 for auto-select // iFace controls whether the camera (0), the character (2) or both (1) turn // iParty sets whether to move the camera of only oPC (0), all the players in oPC's party (1) or all the players on the server (2) void GestaltCameraFace(float fDelay, object oStart, float fRange, float fPitch, object oEnd, float fRange2, float fPitch2, float fTime, float fFrameRate, object oPC, int iClockwise = 0, int iFace = 0, int iParty = 0); // Tracks a moving object, turning the player's camera so that it always faces towards it // STARTING TIME - // fDelay how many seconds to wait before starting the movement // TARGET - // oTrack object to track the movement of // STARTING CONDITIONS - // fRange initial distance between player and camera // fPitch initial pitch (vertical tilt) // FINAL CONDITIONS - // fRange2 finishing distance // fPitch2 finishing tilt // TIME SETTINGS - // fTime how long the camera will track the object for // fFrameRate number of movements per second (governs how smooth the motion is) // MISC SETTINGS - // oPC the PC you want to apply the camera movement to // iFace controls whether the camera (0), the character (2) or both (1) turn // iParty sets whether to move the camera of only oPC (0), all the players in oPC's party (1) or all the players on the server (2) void GestaltCameraTrack(float fDelay, object oTrack, float fRange, float fPitch, float fRange2, float fPitch2, float fTime, float fFrameRate, object oPC, int iFace = 0, int iParty = 0); // Gives the illusion of the camera being fixed in one place and rotating to face the player as they move // oPC the PC you want to apply the camera movement to // fFrameRate number of movements per second (governs how smooth the motion is) // // To setup a fixed camera position, place a waypoint with a unique tag in your area // Set the camera's tag as a LocalString "sGestaltFixedCamera" on the PC to let them know to use that camera // Set a LocalFloat "fGestaltFixedCamera" on the PC to set the camera's vertical position // Set "sGestaltFixedCamera" to "" to pause the tracking, or to "STOP" to end the tracking void GestaltFixedCamera(object oPC, float fFrameRate = 50.0); |
Большое спасибо!
Теперь не прийдется качать Лексикон
Хех, Гештальт Камера - старинный инклюд времен первого НВН. Не расчитан на Катсцены. Можете его адаптировать под них, но... имхо не имеет смысла. Я с него соскочил с появлением СоУ, где можно было сценки делать. Хех. Я думал будет более интересное что-то...
Ну почему же не рассчитан... очень даж рассчитан. Лично МНЕ намного удобней юзать эту инлюду, чем стандартные функции. Кстати с помощью этой вещи можно реализовать фиксированную камеру(в принипе так тож можно, но нечто похожее я видел только при плавании камеры в ареи КАРТА ВАСТА Проклятия).
Да нет, Тарре, не обижайся! Извини меня, если че не так .
Фиксированая камера, это не что иное, как удаление с экрана героя. Джамп в невидимом состоянии...
Про фикс: я не совсем то имел ввиду.Про катсцен_инвизибл я и так знаю. Я иел ввиду, что можно релизовать такую полезнейшую вещь, как неуправляемая героем камера, причем все это не в режиме катсцены.
Вопрос назрел к Айвану.
Что то у меня неполучается чтобы при нападении камера к монстру развернулась.
Ну ты даешь! У РС куча забот а ты его еще камерой мутузишь!
Кстати спецы по векторам у нас Лекс и Баал. Так что разрулят, если возникнут вопросы .
LEX: не переводи на меня стрелки, ДБ. Я не шарю в векторах. Ты и Баал, вот, кто шарят.
Интересный вопросик.
У нас есть один момент - заходишь в локацию. На игрока накладывается СетКутСценеМод=Трю,
потом эффект - КутСценИнвизибл. Тоесть как бы началась сценка и игрока не видно, видно только НеПиСей.
Так вот стоит нажать Esc как игрок появляется и появляется панель управления игрока(HUD).
И во время кутсцены игрок уже может ходить вокруг "отыгрывающих" НПС.
Пробовал наложить на него СетКоммандэйбл(Фолс, оПС). Но это ничего не поненяло - жм у Esc игрок появляется, только двигатся не может.
В чем дело не пойму.
З.Ы. У меня НВН в окне, может из за этого?!
Может и из-за этого... Но скорее всего это из-за известного бага - ставить на онЭнтр локации катсцену нельзя... Возможны кучи багов. Лучше поставить триггер при входе в локу и на него вешать катсцену.
Нет. Ав, тебе надо было сначала у меня спросить. Просто я в своем моде для теста (вдруг с катсценой что не так) на он_катсцен_абортед поставил снятие всех эффектов + рестор положения камеры :-)
Подскажите что тут не правильно...
Neverwinter Script Source |
void main() { object oPC = GetEnteringObject(); object oNPC1 = GetNearestObjectByTag("NPC_1", OBJECT_SELF); object oNPC2 = GetNearestObjectByTag("NPC_2", OBJECT_SELF); object oNPC3 = GetObjectByTag("NPC_3"); object oDoor = GetNearestObjectByTag("DOOR", OBJECT_SELF); object oWP = GetObjectByTag("GO_AWAY"); //Стоит в комнате за дверью oDoor effect eDis = EffectDisappear(0); if(!GetIsPC(oPC)) return; { SetCutsceneMode(oPC); //Включается катсцена ActionDoCommand(SetCameraFacing(180.0, 15.0, 50.0, CAMERA_TRANSITION_TYPE_SLOW)); ActionWait(1.0); ActionDoCommand(AssignCommand(oNPC1, SetFacing(270.0))); //НПС смотрит на юг (потмоу как там второй НПС) ActionDoCommand(AssignCommand(oNPC1, SpeakString("Ты тупой казел!", TALKVOLUME_TALK))); ActionDoCommand(AssignCommand(oNPC2, SetFacing(90.0))); //Поворачивает голову на север - если она смотрит не на север, и отвечает... ActionDoCommand(AssignCommand(oNPC2, SpeakString("Завались, баран!", TALKVOLUME_TALK))); ActionDoCommand(AssignCommand(oNPC1, SpeakString("Ты нарвалсЯ, ублюдок!", TALKVOLUME_TALK))); //Здесь мне влом прикручивать YA было ActionDoCommand(AssignCommand(oNPC1, ActionMoveToObject(oNPC2, TRUE, 1.0))); //Первый Непись подходит ко второму ActionDoCommand(AssignCommand(oNPC1, ActionAttack(oNPC2, TRUE))); //Атаковать второго НПС (не пашет) ActionWait(5.0); //Ждем покуда оин подерутся какое-то время ActionDoCommand(AssignCommand(oPC, SetFacingPoint(GetPosition(oDoor)))); //Поворачиваемся к двери, а далее совсем смешно... ActionDoCommand(AssignCommand(oDoor, ActionOpenDoor(OBJECT_SELF))); //Дверь открывается ActionDoCommand(AssignCommand(oNPC3, ActionMoveToObject(oNPC1, TRUE, 1.0))); //Непись не идет ActionDoCommand(AssignCommand(oDoor, ActionCloseDoor(OBJECT_SELF))); //Дверь закрывается ActionDoCommand(AssignCommand(oNPC3, PlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 2.0))); //Анимация хз - проигрывается или нет ActionDoCommand(AssignCommand(oNPC3, ActionMoveToObject(oNPC2, TRUE, 1.0))); //Тоже что и выше (ну это типа в наручники заковывает ActionDoCommand(AssignCommand(oNPC3, PlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 2.0))); ActionDoCommand(AssignCommand(oNPC1, ActionForceFollowObject(oNPC3, 0.0))); //Идут к Неписю, который остался стоять в предыдущей комнатке ActionDoCommand(AssignCommand(oNPC2, ActionForceFollowObject(oNPC3, 0.0))); ActionDoCommand(AssignCommand(oNPC3, ActionMoveToObject(oDoor, FALSE, 1.0))); ActionDoCommand(AssignCommand(oDoor, ActionOpenDoor(OBJECT_SELF))); ActionDoCommand(AssignCommand(oNPC3, ActionMoveToObject(oWP, FALSE, 0.0))); ActionWait(1.0); ActionDoCommand(DestroyObject(oNPC1, 0.0)); ActionDoCommand(DestroyObject(oNPC2, 0.0)); ActionDoCommand(DestroyObject(oNPC3, 0.0)); ActionDoCommand(DestroyObject(OBJECT_SELF, 0.0)); //Кстати сам триггер тоже удаляется, где-то слышал что говорили - что их нельзя удалить и т.п. ActionDoCommand(SetCutsceneMode(oPC, FALSE)); } } |
А скрипт на чем стоит? Триггер? Лока? Еще что?..
Триггер OnEnter
2GoDoom
Катсцены пишутся по такой схеме:
Neverwinter Script Source |
DelayCommand(x.x, AssignCommand(...)) |
Окей, спасибо - буду пробовать
Добавлено в [mergetime]1089639537[/mergetime]
Еще большие глюки
Правильно написано?:
Neverwinter Script Source |
void main() { object oPC = GetEnteringObject(); object oNPC1 = GetNearestObjectByTag("NPC_1", OBJECT_SELF); object oNPC2 = GetNearestObjectByTag("NPC_2", OBJECT_SELF); object oNPC3 = GetObjectByTag("NPC_3"); object oDoor = GetNearestObjectByTag("DOOR", OBJECT_SELF); object oWP = GetObjectByTag("GO_AWAY"); effect eDis = EffectDisappear(0); if(!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1) return; { SetLocalInt(OBJECT_SELF, "TRIGGER", 1); SetCutsceneMode(oPC); ActionDoCommand(SetCameraFacing(180.0, 15.0, 50.0, CAMERA_TRANSITION_TYPE_SLOW)); DelayCommand(1.0 ,AssignCommand(oNPC1, SetFacing(270.0))); DelayCommand(2.0 ,AssignCommand(oNPC1, SpeakString("?? ????? ?????!", TALKVOLUME_TALK))); DelayCommand(4.0 ,AssignCommand(oNPC2, SetFacing(90.0))); DelayCommand(4.5 ,AssignCommand(oNPC2, SpeakString("????????, ?????!", TALKVOLUME_TALK))); DelayCommand(5.0 ,AssignCommand(oNPC1, SpeakString("?? ????????, ???????!", TALKVOLUME_TALK))); DelayCommand(5.0 ,AssignCommand(oNPC1, ActionMoveToObject(oNPC2, TRUE, 1.0))); DelayCommand(5.5 ,AssignCommand(oNPC1, ActionAttack(oNPC2, FALSE))); DelayCommand(10.0 ,AssignCommand(oPC, SetFacingPoint(GetPosition(oDoor)))); DelayCommand(10.5 ,AssignCommand(oDoor, ActionOpenDoor(OBJECT_SELF))); DelayCommand(11.5 ,AssignCommand(oDoor, ActionCloseDoor(OBJECT_SELF))); DelayCommand(11.0 ,AssignCommand(oNPC3, ActionMoveToObject(oNPC1, TRUE, 1.0))); DelayCommand(11.0 ,AssignCommand(oNPC3, PlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 2.0))); DelayCommand(12.0 ,AssignCommand(oNPC3, ActionMoveToObject(oNPC2, TRUE, 1.0))); DelayCommand(12.0 ,AssignCommand(oNPC3, PlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 2.0))); DelayCommand(12.5 ,AssignCommand(oNPC1, ActionForceFollowObject(oNPC3, 0.0))); DelayCommand(12.5 ,AssignCommand(oNPC2, ActionForceFollowObject(oNPC3, 0.0))); DelayCommand(13.0 ,AssignCommand(oNPC3, ActionMoveToObject(oDoor, FALSE, 1.0))); DelayCommand(14.0 ,AssignCommand(oDoor, ActionOpenDoor(OBJECT_SELF))); DelayCommand(14.5 ,AssignCommand(oNPC3, ActionMoveToObject(oWP, FALSE, 0.0))); DelayCommand(15.0 ,DestroyObject(oNPC1, 0.0)); DelayCommand(15.0 ,DestroyObject(oNPC2, 0.0)); DelayCommand(15.0 ,DestroyObject(oNPC3, 0.0)); DelayCommand(15.0 ,DestroyObject(OBJECT_SELF, 0.0)); DelayCommand(16.0 ,SetCutsceneMode(oPC, FALSE)); } } |
Ну вроде как все правильно. А что глючит-то? Как?
ну вообщем так:
Я встаю на триггер, вклчюается катсцена:
Мужик перекрикиваются, очень резко поворачиваются друг на друга, затем один подбегает и стоит. Через пару секунд камера не трогается с места а мой персонаж очень резко поворачивается, затем открывается дверь, закрывается дверь, затем два дрочуна бегут к двери, из двери бежит охраник и пропадают недобегая никуда...
Вот так то
Как это пропадают?
Neverwinter Script Source |
DelayCommand(15.0 ,DestroyObject(oNPC1, 0.0)); DelayCommand(15.0 ,DestroyObject(oNPC2, 0.0)); DelayCommand(15.0 ,DestroyObject(oNPC3, 0.0)); DelayCommand(15.0 ,DestroyObject(OBJECT_SELF, 0.0)); |
Хех, если ты хошь, чтобы они друг друга атаковали, сменяй фракции каждому перед атакой друг друга. Сделай фракцию, нейтральную ко всем и враждебную к самой себе. Перед ActionAttack сделай ChangeFaction() .
А чтобы не пропадали раньше времени, действительно увеличь паузу до дестроя. И еще. Привыкни писать без "двойных" делэев...
Neverwinter Script Source |
DelayCommand(15.0 ,DestroyObject(oNPC1, 0.0)); |
Neverwinter Script Source |
DelayCommand(15.0 ,DestroyObject(oNPC1)); |
Окей... сча попробуем
Спасибо
Добавлено в [mergetime]1089709917[/mergetime]
Атокавать и с другой фракцией не атакуют
Добавлено в [mergetime]1089710092[/mergetime]
Одному поставил Hostile - начали драться... проблема в том что охраник стал подбегать и тоже бить хостайла )
Добавлено в [mergetime]1089710732[/mergetime]
Вау.. какая хрень у меня получилась Только камера в середине катсцены не поворачивается почему-то
1. Челу начинают драться.. кричат... выливается кровь...
2. Прибегает мент, они успокаиваются, мент крутит рукой типа "в наручники", затем один (тот что начинал драться) идет за ментом, а другой его бьет в догонку
3. И все...
Neverwinter Script Source |
void main() { object oPC = GetEnteringObject(); object oItem = GetObjectByTag("111"); if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1) return; { SetLocalInt(OBJECT_SELF, "TRIGGER", 1); SetCutsceneMode(oPC); AssignCommand(oPC, ClearAllActions()); AssignCommand(oItem, ClearAllActions()); ActionDoCommand(AssignCommand(oItem, SetCameraFacing(250.0, 20.0, 45.0, CAMERA_TRANSITION_TYPE_MEDIUM))); ActionWait(5.5); ActionDoCommand(AssignCommand(oItem, SetCameraFacing(250.0, 7.0, 45.0, CAMERA_TRANSITION_TYPE_SLOW))); ActionWait(3.5); ActionDoCommand(AssignCommand(oItem, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); ActionDoCommand(AssignCommand(oItem, ActionStartConversation(oPC))); } } |
Ragnor, 1ое - тута нету Акшон Вайтов - тут есть Делай Комманд (как я уже понял).
2ое - Что за oItem? и зачем катсцену как-то странно вырубаешь?
Буду ждать статью
Neverwinter Script Source |
ActionDoCommand(AssignCommand(oItem, SetCameraFacing(250.0, 20.0, 45.0, CAMERA_TRANSITION_TYPE_MEDIUM))); |
Neverwinter Script Source |
ActionWait(5.5); |
Neverwinter Script Source |
ActionDoCommand(AssignCommand(oItem, ActionStartConversation(oPC))); |
Tarre Talliorne для того, что бы отрепетировать скриптовую сценку надо делать все на одном объекте. В часности, это триггер. Ты пишешь правильные мысли, но для сценки они не подходят. Все твои команды в скрипте уйдут по адресам: оРС, оНПС и т.д. Я учу, делать сценку на стеке ОДНОГО ТРИГГЕРА. Каждая команда триггеру это переадресация команды для РС или НПС и т.д. Потаму как тогда можно проследить порядок выполнения, и не надо будет лишних команд, типа ActionWait для РС ActionWait для НПС и т.д. Если присмотреться повнимательней, то все команды забиваются в стек триггера. Потаму и юзают в идеале DelayCommand. Так что Ragnor, то что говорит Tarre Talliorne верно для скриптинга вообще, но для катсценки луче делай как я показал.
СМОТРИЕ НАЧАЛО ТЕМЫ. СТАТЬЯ ИЗМЕНИЛАСЬ КАРДИНАЛЬНО!
Куль. Как я завиудю новичкам! :-) Когда начинали мы, у нас даже нормальных мануалов не было, все (нет, не все... ВООБЩЕ ВСЕ) приходилось осваивать самому... Было времечко. :-) А вообще статья здоровская. Так держать!
Tarre Talliorne спасибки! Главное что б ее читала молодежь Кстати, ты тож мог бы народ подучить чем ни будь...
Хм... Сейчас я сам с удовольствием занимаюсь копанием в биоповоровских инклюдах... Но это(их разбор) для новичков сложновато. Может быть, напишу краткое руководство по созданию инклюд-функций разных типов... Если будет время, разумеется.
Добавлено в [mergetime]1091973019[/mergetime]
Да, и еще: в модуле в одном из скриптов ты перечисляешь всех ассоциэйтов(GetAssociate( . . . )) и кидаешь на них катсценовские эффекты (инвизибл и паралайз). Не есть гуд. Все это можно реализовать циклом. Вечерком кину в базу (или сюда - скрипт-то вроде только к катсценам отношение имеет). Даже 2 - один для СоУ (там только 1 цикл) и для ХотУ (там еще и вложенный - ведь может быть не 1 хенч)...
Напиши что можно сделать простым разкоменнтированием строк в стандартных скриптах. Будет востребована на ура!
Возникли небольшие траблы... Постараюсь ближе к ночи кинуть, но ничего гарантировать не могу. :\
<small>Добавлено в 19:37</small>
я подумаю
Айв, РЕСПЕКТ!
зацените - неплохо для нуба?
http://jedimax.narod.ru/Test.rar
Добавлено в [mergetime]1092103709[/mergetime]
там страница откроется и там еще раз надо нажать
Мммм.. А в чем маза? Ну появляются они и чего? Никакой анимации Нпс...
2 [MoF]Darth_Nick
Neverwinter Script Source |
void main() { ******************** ActionDoCommand(AssignCommand(oPC, SetFacingPoint(GetPosition(oNPC1)))); // Куда ты его ставишь лицом? ВЕДЬ НПС ЕЩЕ НЕ ПОЯВИЛСЯ! Тогда лучше на вейп его просто поверни. // Сейчас просто повезло, что в локации твой НПС стоит в нужном направлении, с другими координатами // относительно оси Z. Попросту он на другом этаже, но впереди РС. А мог бы быть сзади... ******************** ActionDoCommand(AssignCommand(oNPC1, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); // Нижние строки совершенно не нужны. Достаточно ОДИН раз убрать SetCutsceneMode у РС. ActionDoCommand(AssignCommand(oNPC2, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); ActionDoCommand(AssignCommand(oNPC3, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); ActionDoCommand(AssignCommand(oNPC4, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); ActionDoCommand(AssignCommand(oNPC5, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); } } |
Вроде оно. Часть моего 'lib_t_cutscene'. Удачи!
ЗЫ: первая функцаия для ХотУ, вторая - для СоУ, ее надо только раскомментировать
[NSS]
void ApplyOnPCPartyCutsceneEffects(object oPC, float fEffectDuration)
{ //----------------------------(scripting by Tarre from RAGE team)-----------
int i = 1, B = 1;
while (GetIsObjectValid(GetAssociate(i, oPC, B)))
{
while (GetIsObjectValid(GetAssociate(i, oPC, B)))
{
ApplyEffectToObject(1, EffectCutsceneParalyze(), GetAssociate(i, oPC, B), fEffectDuration);
ApplyEffectToObject(1, EffectVisualEffect(355) , GetAssociate(i, oPC, B), fEffectDuration);
b++;
}
i++;
}
}
/****for SoU - commented on 10.08.04********************************************
void ApplyOnPCPartyCutsceneEffects2(object oPC, float fEffectDuration)
{ //----------------------------(scripting by Tarre from RAGE team)-----------
int i = 1, B = 1;
while (GetIsObjectValid(GetAssociate(i, oPC, B)))
{
ApplyEffectToObject(1, EffectCutsceneParalyze(), GetAssociate(i, oPC, B), fEffectDuration);
ApplyEffectToObject(1, EffectVisualEffect(355) , GetAssociate(i, oPC, B), fEffectDuration);
i++;
}
}
********
Везде, где смайл - B.
Я их кину под началом темы, бо затеряются. Пиши.
Народ, помогите нубу - как при катсцене переместить игрока и нескольких неписей в другую локацию и после этого продолжить диалог? Как вообще перемещать обьекты между "area"ми?
Джампом. И больше никак. В статье я описал как джамп делать и как возвращаться В ТОЧКУ НАЧАЛА диалога. Я блин два месяца писал статью и хрен кто читает Но если ты хочешь ИДТИ пешком, то бишь гуськом за НПС, то тут есть скрипт в базе скриптов мой, по вейпам идем вслед НПС. Ищи...
Добавлено в [mergetime]1093702954[/mergetime]
Пауза в диалоге+ возврат в диалог... это про возврат.
Мож кто находил более лучшее решение делать старт катсцены сначала модуля кроме как делать паузу при начале игры ?
QUOTE (Raven @ Dec 20 2004, 19:27) |
Мож кто находил более лучшее решение делать старт катсцены сначала модуля кроме как делать паузу при начале игры ? |
QUOTE (Aiwan @ May 9 2004, 14:27) |
Убедительно прошу не ставить скрипты роликов на OnEnter стартовой локации при начале модуля! Если у вас большая необходимость в этом, то просто напишите задержку на несколько секунд для выполнения вашей скриптовой сценки. Дело в том, что при старте модуля движок игры выполняет внутренние команды необходимые для старта и ваш скрипт пройдет при неуправляемой камере, которая упрется в пол или еще куда. |
Ставь на триггер.
Neverwinter Script Source |
//:://///////////////////////////////////////////// //:: Created By: MasterMage © //:: Created On: //:://///////////////////////////////////////////// void main() { //------------------------------Objects---------------------------- object oPC=GetEnteringObject(); object oD=GetObjectByTag("Djegan"); object oK=GetObjectByTag("Kalaxana"); object oWP1=GetWaypointByTag("impire_point_1"); object oWP2=GetWaypointByTag("impire_point_2"); object oWP3=GetWaypointByTag("impire_point_3"); object oWP4=GetWaypointByTag("impire_point_4"); object oWP5=GetWaypointByTag("point_dj"); object oWPpc1=GetWaypointByTag("pc_point_1"); object oWP6=GetWaypointByTag("impire_point_6"); object oWPpc2=GetWaypointByTag("pc_point_2"); object oWPpc3=GetWaypointByTag("pc_point_3"); //-------------------------------Location--------------------------- location Loc1=GetLocation(oWP1); //-------------------------------Effects---------------------------- effect eCutInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); effect oE1=EffectVisualEffect(VFX_IMP_TORNADO); effect oE2=EffectVisualEffect(VFX_IMP_UNSUMMON); //-------------------------------Script----------------------------- if (!GetIsPC(oPC)||GetLocalInt(oPC,"impire_rolic")==TRUE) return; { AssignCommand(oPC,ClearAllActions()); SetLocalInt(oPC,"impire_rolic",TRUE); SetLocalLocation(oPC,"impire",GetLocation(oPC)); SetCutsceneMode(oPC); AssignCommand(oPC,JumpToObject(oD)); ApplyEffectToObject(DURATION_TYPE_PERMANENT,eCutInv,oPC); DelayCommand(4.5, AssignCommand(oPC,SetCameraFacing(0.0,12.0,49.0,CAMERA_TRANSITION_TYPE_MEDIUM))); DelayCommand(10.0,AssignCommand(oD,ActionMoveToObject(oWP5,FALSE))); DelayCommand(11.0,AssignCommand(oPC,ActionMoveToObject(oWP5,FALSE,1.5))); DelayCommand(14.0,AssignCommand(oPC,SetFacingPoint(GetPosition(oWP1)))); DelayCommand(17.0,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,oE1,Loc1,2.5)); DelayCommand(17.1,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,oE2,Loc1,2.6)); DelayCommand(17.5,AssignCommand(oK,JumpToObject(oWP1))); DelayCommand(18.0,AssignCommand(oK,ActionSpeakString("Джегань! Где тебйа носит?"))); DelayCommand(18.5,AssignCommand(oD,SetFacingPoint(GetPosition(oK)))); DelayCommand(19.0,AssignCommand(oPC,ActionMoveToObject(oK,FALSE,1.5))); DelayCommand(20.0, AssignCommand(oPC,SetCameraFacing(20.0,7.0,55.0,CAMERA_TRANSITION_TYPE_SLOW))); DelayCommand(23.0,AssignCommand(oD,ActionMoveToObject(oK,FALSE,0.5))); DelayCommand(24.0,AssignCommand(oD,ActionSpeakString("Калахана!"))); DelayCommand(25.0,AssignCommand(oK,ActionMoveToObject(oWP2,FALSE,15.0))); DelayCommand(27.5,AssignCommand(oPC,ActionMoveToObject(oWP2,FALSE,16.0))); DelayCommand(34.5,AssignCommand(oPC,SetFacingPoint(GetPosition(oD)))); DelayCommand(35.5,AssignCommand(oD,ActionMoveToObject(oPC,TRUE,0.5))); DelayCommand(40.0,AssignCommand(oD,ActionSpeakString("Что это за поведение?"))); DelayCommand(41.5, AssignCommand(oPC,SetCameraFacing(270.0,15.0,45.0,CAMERA_TRANSITION_TYPE_FAST))); DelayCommand(44.0,AssignCommand(oK,ActionSpeakString("Мать Исповедница что-то замышлйает!"))); DelayCommand(45.0,AssignCommand(oD,ActionSpeakString("Это не дает тебе повода так бесцеремонно обращатьсйа со мной!"))); DelayCommand(47.0,FadeToBlack(oPC,FADE_SPEED_FASTEST)); DelayCommand(47.3,AssignCommand(oD,ActionMoveToObject(oWP2,TRUE,15.0))); DelayCommand(47.4,AssignCommand(oPC,JumpToObject(oWPpc1))); DelayCommand(47.5,AssignCommand(oPC,SetFacing(200.0))); DelayCommand(47.7,FadeFromBlack(oPC,FADE_SPEED_SLOW)); DelayCommand(48.0, AssignCommand(oPC,SetCameraFacing(200.0,15.0,55.0,CAMERA_TRANSITION_TYPE_SLOW))); DelayCommand(51.0, AssignCommand(oPC,SetCameraFacing(125.0,15.0,55.0,CAMERA_TRANSITION_TYPE_SLOW))); DelayCommand(54.0,FadeToBlack(oPC,FADE_SPEED_FASTEST)); DelayCommand(54.3,AssignCommand(oPC,JumpToObject(oWP2))); DelayCommand(54.4,AssignCommand(oPC,SetFacingPoint(GetPosition(oK)))); DelayCommand(54.5, AssignCommand(oPC,SetCameraFacing(270.0,7.0,49.0,CAMERA_TRANSITION_TYPE_FAST))); DelayCommand(54.8,FadeFromBlack(oPC,FADE_SPEED_SLOW)); DelayCommand(55.0,AssignCommand(oK,ActionMoveToObject(oWP2,FALSE,0.3))); DelayCommand(55.1,AssignCommand(oD,ActionMoveToObject(oWP6,FALSE,0.3))); DelayCommand(59.0,FadeToBlack(oPC,FADE_SPEED_FASTEST)); DelayCommand(60.3,AssignCommand(oPC,JumpToObject(oWPpc2))); DelayCommand(60.4,AssignCommand(oPC,SetFacing(180.0))); DelayCommand(60.6,AssignCommand(oK,ActionMoveToObject(oWP3,FALSE))); DelayCommand(60.6,AssignCommand(oD,ActionMoveToObject(oWP3,FALSE))); DelayCommand(60.7,FadeFromBlack(oPC,FADE_SPEED_SLOW)); DelayCommand(62.1, AssignCommand(oPC,SetCameraFacing(180.0,3.0,79.0,CAMERA_TRANSITION_TYPE_FAST))); DelayCommand(64.0,AssignCommand(oPC,ActionMoveToObject(oWPpc3,FALSE))); DelayCommand(67.0,AssignCommand(oK,ActionMoveToObject(oWP4,FALSE))); DelayCommand(67.1,AssignCommand(oD,ActionMoveToObject(oWP4,FALSE))); DelayCommand(73.0,AssignCommand(oPC,ActionMoveToObject(oWP4,FALSE,3.0))); DelayCommand(80.8,AssignCommand(oK,SetFacingPoint(GetPosition(oD)))); DelayCommand(81.0,AssignCommand(oD,SetFacingPoint(GetPosition(oK)))); DelayCommand(82.0,AssignCommand(oK,ActionSpeakString("Я искала тебйа везде. Где ты был? У менйа есть план, как убрать Ричарда с дороги..."))); DelayCommand(89.0,AssignCommand(oD,ActionSpeakString("Дела были. Только сегоднйа приехал. Говори, что за план. Йа так устал, что ничему не удивлюсь."))); DelayCommand(95.5, AssignCommand(oPC,JumpToLocation(GetLocalLocation(oPC,"impire")))); DelayCommand(95.5,SetCutsceneMode(oPC,FALSE)); DelayCommand(98.5,RemoveEffect(oPC,eCutInv)); } } |
DelayCommand(98.5,RemoveEffect(oPC,eCutInv)); - эта конструкция у тебя отрабатывает??? Странно ты как-то эффект удаляешь...
DBColl
а что странного....Просто время невидимости расчитывать мне влом было, поэтому воспользовался удалением...
Так она действительно работает? У меня не получалось... Возможно из=за СоУ...
DBColl сам не знаю, но она работает тутулька в тутельку...Все прекрасно.....
Отлично. Очень удобно.
Раньше просто эффекты надо было удалять по его ID, в цикле проверяя каждый. А с вижуалами - так вообще дело было туго...
DBColl рад, что помог
Здравствуйте, я долго писал эту статью, перебирая всё возможное и невозможное.
И так к делу многие спрашивают зачем нужна знаменитая инклюда,
Neverwinter Script Source |
#include "x2_inc_cutscene" |
Neverwinter Script Source |
CutActionAttack CutActionMoveAwayFromObject CutActionMoveToObject CutActionMoveToLocation CutApplyEffectAtLocation CutBlackScreen CutDeath CutRemoveEffects |
Neverwinter Script Source |
CutActionMoveToObject! |
Neverwinter Script Source |
CutActionMoveToLocation(15.5, oЧТОНИБУДЬ, , FALSE); |
Neverwinter Script Source |
CutApplyEffectAtLocation(31.5, oPC, DURATION_TYPE_INSTANT, 464, oWP); |
Neverwinter Script Source |
CutApplyEffectToObject(27.0,DURATION_TYPE_INSTANT,VFX_FNF_SCREEN_BUMP, oPC); |
QUOTE (Nokoll @ Mar 11 2005, 14:55) |
И так к делу многие спрашивают зачем нужна знаменитая инклюда, Neverwinter Script Source #include "x2_inc_cutscene" |
Neverwinter Script Source |
#include "x2_inc_cutscene" |
Nokoll в теме готовых катсцен выкладывай.
Скажите Нужно ли мне дальше писать статью про инклюду?
вполне достаточно было бы сказать, что находится она(x2_inc_cutscene) в .\data\xp2_scripts.bif - весит почти 100k, посему постить ее, пожалуй, не стоит.
Добавлено в [mergetime]1111983333[/mergetime]
ps. более свежая (+1строка версия лежит в xp2patch.bif
А вот если ты ее опишешь... Какая ф-ция что делает и для чего может применяться...
QUOTE |
вполне достаточно было бы сказать, что находится она(x2_inc_cutscene) в .\data\xp2_scripts.bif - весит почти 100k, посему постить ее, пожалуй, не стоит |
QUOTE |
А вот если ты ее опишешь... Какая ф-ция что делает и для чего может применяться... |
С позволения форума я продолжу..
Итак:
Построение Скриптовых сцен с помощью инклюды «x2_inc_cutscene».
Разберём ещё несколько функций.
Neverwinter Script Source |
StartCutscene |
Neverwinter Script Source |
SetCutsceneMode(oPC);. |
Neverwinter Script Source |
StartCutscene |
Neverwinter Script Source |
void StartCutscene(object oPC, int iCut); |
Neverwinter Script Source |
void main() { object oPC = GetPCSpeaker(); int iCut = 1; |
Neverwinter Script Source |
DelayCommand(1.0, |
Neverwinter Script Source |
AssignCommand(oPC, ActionMoveToLocation (oCam1))); |
Neverwinter Script Source |
// Waypoints. location lPCStart = GetLocation(GetNearestObjectByTag("pc_start_wp", oPC)); |
Neverwinter Script Source |
CutJumpToLocation(3.0, oPC, lPCStart); |
Neverwinter Script Source |
CutActionMoveToLocation(3.5, oPC, lPCStart, FALSE); |
Neverwinter Script Source |
CutActionMoveToLocation(3.5, oPC, lPCStart, FALSE); |
Neverwinter Script Source |
CutActionMoveToLocation |
Neverwinter Script Source |
DelayCommand(3.5.. |
Neverwinter Script Source |
CutBlackScreen(0.0, oPC); |
Neverwinter Script Source |
CutFadeFromBlack(3.5, oPC, FADE_SPEED_MEDIUM); |
Neverwinter Script Source |
CutPlayAnimation(12.8, oPC, ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 2.0); |
Neverwinter Script Source |
CutClearAllActions(26.0, oPC, TRUE); |
Neverwinter Script Source |
CutPlaySound(27.2, oPC, "vs_nfenthim_dead"); |
Neverwinter Script Source |
CutDeath(27.2, oDead2, FALSE); |
Neverwinter Script Source |
CutJumpToObject(43.5, oPC, oСа1); |
Neverwinter Script Source |
CutFadeOutAndIn(43.1, oPC, 1.5); |
Neverwinter Script Source |
void CutCreateFire(int iCut, object oPC). |
Neverwinter Script Source |
{ int x = 1; |
Neverwinter Script Source |
object oWP = GetNearestObjectByTag("Efv", oPC, x); |
Neverwinter Script Source |
float fDelay = 0.0; |
Neverwinter Script Source |
if(iCut == GetLocalInt(oPC, "nCutsceneNumber")) { while(GetIsObjectValid(oWP)) { DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), GetLocation(oWP))); fDelay = fDelay + 0.13; 8( x = x + 1; oWP = GetNearestObjectByTag("hx_crsytal_cut_fire", oPC, x); } } } |
Neverwinter Script Source |
MultiJump |
Neverwinter Script Source |
AssignCommand(oPC, MultiJump(oPC, "PC_START")); |
Neverwinter Script Source |
CutActionCastFakeSpellAtObject(116.5, SPELL_WEIRD, oWа, oPC, PROJECTILE_PATH_TYPE_DEFAULT); |
Кстати, если есть в твоей инклюде такая чточка, чтобы если я прыгаю к точке, то сразу смотрел бы куды надо, чтобы не затемнять экран. Знаешь, как в фильмах... Камера просто смотрит уже в другое место...
А то неинтересно. Может надо точку стрелочкой ставить туды, куды надо смотреть?
В основном, мы и раньше обходились без этого, здесь просто добавлена возможноть устанавливать время...
Но ты молодец... Потом готовую статью посмести в топик с мануалами, правда, когда мы приведем его в порядок. Будут тама статьи для ньюбов
MasterMage Поставь Точьку с градусами куда надо, То.е, куда смотрел бы ПК.
Я уверяю ПК Этой функцией прыгает и автоматом поворачивается т.к поставлена точка.
Neverwinter Script Source |
CutJumpToLocation(3.0, oPC, lPCStart); |
Nokoll в том-то и дело, что поворачивается, а надо, чтобы не было поворота камеры... Или я тебя не понял?
А дак ты про это, попробуй поставить функцыю камеры SNAP!
Мастер маге попробуй так.
Neverwinter Script Source |
CutSetCamera(28.8, oPC, CAMERA_MODE_TOP_DOWN, 270.0, 3.0, 75.0, CAMERA_TRANSITION_TYPE_FAST); CutSetCamera(29.8, oPC, CAMERA_MODE_TOP_DOWN, 270.0, 3.0, 75.0, CAMERA_TRANSITION_TYPE_SNAP); |
ребяты, такой вопрос
Делаю катсцену - герой приходит в город, и камера облетает по этому городу.
Делаю естчественно через пробег невидимого героя по вейпойнтам
И такая возникла проблема.
на каждом вейпойнте герой останавливается на полсекунды. При этом, неважно, где находится следующий вейпойнт - просто команды по вейпойнтам кладутся в стек.
Как этого избежать? Как сделать плавное неостанавливающееся движение?
Поставь РС в центр и просто прокрути самой дальней камерой весь твой путь. По другому НИКАК.
ПОМОГИТЕ!!! !! Пытался сделать кут-сцену(третий раз), всё как бы шло нормально (что странно), а потом набираю "SetCutsceneMode(oPC);", а он пишет "ОШИБКА: НЕТ ЛЕВОЙ СКОБКИ В СПИСКЕ"
Вот что я пока написал...
Neverwinter Script Source |
void main() { //--------------------------Creature----------------------------- object oPC = GetEnteringObject(); object oWHO = GetNearestObjectByTag("Guild_WHO"); //спрашивающий object oTO = GetObjectByTag("Guild_TO"); //отвечающий object o3 = GetObjectByTag("Guild_MAG1"); object o4 = GetObjectByTag("Guild_MAG2"); object o5 = GetObjectByTag("Guild_WARRIOIR"); object o6 = GetObjectByTag("Guild_Rpgue"); //---------------------------Location---------------------------- location lClose = GetLocation(GetObjectByTag("CLOSE_ARENA")); location lTrone = GetLocation(GetObjectByTag("Open_ARENA")); //---------------------------Waypont----------------------------- object oWPwho1 = GetObjectByTag("WP_WHO_01"); object oWPwho2 = GetObjectByTag("WP_WHO_02"); object oWPwho3 = GetObjectByTag("WP_WHO_03"); object oWPto1 = GetObjectByTag("WP_TO_1"); object oWPto2 = GetObjectByTag("WP_TO_2"); object oWPpc1 = GetObjectByTag("WP_PC_1"); object oWPpc2 = GetObjectByTag("WP_PC_2"); object oWPpc3 = GetObjectByTag("WP_PC_3"); object oWPpc4 = GetObjectByTag("WP_PC_4"); //----------------------------Effect------------------------------ effect eCutPar = EffectCutsceneParalyze(); effect eSlow = EffectSlow //----------------------------НАчало------------------------------ SetCutsceneMode(oPC); } |
QUOTE |
ПОМОГИТЕ!!! !! Пытался сделать кут-сцену(третий раз), всё как бы шло нормально (что странно), а потом набираю "SetCutsceneMode(oPC);", а он пишет "ОШИБКА: НЕТ ЛЕВОЙ СКОБКИ В СПИСКЕ" Вот что я пока написал... |
Neverwinter Script Source |
effect eSlow = EffectSlow(); |
Neverwinter Script Source |
object oPC = GetEnteringObject(); if (!GetIsPC(oPC)) return; |
QUOTE |
И еще, какая команда затемняет экран что бы герой мог спокойненько телепортироваться в другой вейпонт? |
Neverwinter Script Source |
DelayCommand(2.0,FadeToBlack(oPC, FADE_SPEED_FASTEST)); |
Neverwinter Script Source |
DelayCommand(5.0, FadeFromBlack(oPC, FADE_SPEED_FASTEST)); |
DEM Так меньше багов в действительности. помойму стандартное скриптописание не совсем для кут сцены сделано. так багов в 100% меньше я только так всё с 1ого раза получается.
Neverwinter Script Source |
// Activate dem cut-scene int CUTSCENE_NUMBER = 1; #include "x2_inc_cutscene" void CallPlayAnimation2(int nCutscene, object oObject, int nAnimation, float fLength) { if(nCutscene == GetLocalInt(oObject, "nCutsceneNumber")) { AssignCommand(oObject, PlayAnimation(nAnimation, 0.3, fLength)); } } void CutPlayAnimation2(float fDelay, object oObject, int nAnimation, float fLength, int iShift = TRUE) { int nCutscene = GetActiveCutsceneNum(); fDelay = CutCalculateCurrentDelay(fDelay, nCutscene); DelayCommand(fDelay, DelayCommand(GetShift(oObject, iShift), CallPlayAnimation2(nCutscene, oObject, nAnimation, fLength))); } void main() { int nDoOnce = GetLocalInt(GetArea(OBJECT_SELF), "NPC1"); if(nDoOnce == 1) return; SetLocalInt(GetArea(OBJECT_SELF), "NPC2", 1); object oMor = GetObjectByTag("Sa"); object oCamera1 = GetObjectByTag("wp_camera1a"); object oCamera2 = GetObjectByTag("wp_camera2a"); object oPC = GetEnteringObject(); object oCameraM = GetObjectByTag("camera_"); object oNPC1 = GetObjectByTag("NPC1"); object oNPC2 = GetObjectByTag("NPC2"); object oCopyPC = GetObjectByTag("PC_COP");//Sozdaiot copiu PC s tegom/ effect eVis = EffectVisualEffect(VFX_DUR_DEATH_ARMOR); CutSetActiveCutscene(CUTSCENE_NUMBER, CUT_DELAY_TYPE_CUMULATIVE); CutSetActiveCutsceneForObject(oPC, CUTSCENE_NUMBER, TRUE); CutSetActiveCutsceneForObject(oNPC1, CUTSCENE_NUMBER); CutSetActiveCutsceneForObject(oNPC2, CUTSCENE_NUMBER); CutSetCutsceneMode(0.2, oPC, TRUE, CUT_CAMERA_HEIGHT_MEDIUM, TRUE, TRUE); CutApplyEffectToObject2(0.0,и так-далее, я думаю полный мой скрипт тебе ненужен. |
Меф
А ты сваяй какой-нибудь туториал по кут-сценам. А че, звучит здорово? Может малек и запаришся, зато народ уважать будет
ЗЫ: Мож и я подучусь на старости лет, так сказать...
Добавлено в [mergetime]1123493805[/mergetime]
Помогите, кто знает.
Создавал я как-то кут-сценку в которой был жестокий бой между Чемпионом Костяных Големов и отважным хероем. Так вот, делал все по стандартке: игрока и его компаньонов сделал невидимыми, парализовал (только компаньонов) и прыгал игроком с точки на точку, меняя при необходимости камеру.
Так вось, когда я тестил свое творение, я нашел один баг: Чемпион Големов кастит "Перст Смерти", а он у него 17 уровня (хорошо что игрок бессмертен на время ). Но когда я проходил недалече от этой парочки, Голем как раз кастует этот спелл и получается неприятная ситуация. Идет себе сцена, идет... вот Голем колдует спелл... и бац, визуальный эффект от спелла захватывает не только хероя, но и игрока. В результате крааасивый эффект от спелла появляется на невидимом месте (как раз там, где и стоит игрок). Вопрос на засыпку: как устранить баг?
QUOTE (DraX @ Aug 8 2005, 13:15) |
А ты сваяй какой-нибудь туториал по кут-сценам. А че, звучит здорово? Может малек и запаришся, зато народ уважать будет |
Спасибо Aiwan! Бегу качать...
Народ! Подскажите плиз! Как зделаьб что бы камера вращалась 2 секунды?
Добавлено в 22:35
УРА! Я сделал свою первую кат-сцену... Я не помню использовал ли я ту инклюду, но лучше поставить
Aiwan: Дем, я удалил твой код. Пожалуйста здесь только вопросы. Не надо все свои катсцены сюда выкладывать, иначе невозможно читать топик. Ок? Надеюсь ты не обидишься.
Тоесть вращалась 2 секунды? А вообще есть несколько скоростей поворота камеры, вот их и подгадывай.
CAMERA_TRANSITION_TYPE_CRAWL
CAMERA_TRANSITION_TYPE_FAST
CAMERA_TRANSITION_TYPE_MEDIUM
CAMERA_TRANSITION_TYPE_SLOW
CAMERA_TRANSITION_TYPE_SNAP
CAMERA_TRANSITION_TYPE_VERY_FAST
CAMERA_TRANSITION_TYPE_VERY_SLOW
А где ты тут камеру устанавливаешь?
Вот у меня проблема.... Сделал кат-сцену, всё идёт ОК, НО после того как она проиграет, вся непись повторяет свои действия... Ну например, идёт слуга к королю, что нить говорит и уходит в другой край карты сказать, что-то другой НеПиСи. ПОТОМ ОНА ВОЗВРАЩАЕТЬСЯ К КОРОЛЮ И ГОВОРИТ ТОЖЕ САМОЕ, ПОТОМ КО ВТОРОЙ НеПиСи и т.д.
Поставь локалку на триггер. Смотри как я описал все в туториале.
DEM да, ты стоишь на триггере. Скорее всего.
Хочу спросить, можно ли каким-либо способом контролировать время движения камеры, кроме как скоростями (CAMERA_TRANSITION_TYPE) или нет? Если нет, то начать ли мне делать ее? Заранее спасибо.
Можешь использовать Delay команды, для расстановки по времени. Там настрой промежутки задержки. А скорость движения
QUOTE (DraX @ Aug 12 2005, 13:06) |
(CAMERA_TRANSITION_TYPE) |
Скажите пожалуйста, как зделать что бы когда игрок загрузил модуль, была анимация, что он лежит, а потом встаёт...
Ставь на OnClientEnter в модульных св-вах, что тебе нужно.
Не знаю, естьли анимация лежания(на моей версии такой нет), можно использовать ANIMATION_LOOPING_DEAD_FRONT, только тогда время проигрывания побольше и черный экран в начале.
На onClientEnter некоторые скрипты иногда и глючат. Лучше всего использовать такой вариант:
1. Рисуем триггер вокруг точки, в которой должен появиться игрок.
2. Соответствующий скрипт ставим в onEnter триггера, заведомо включив проверку скрипта на единождую активацию.
Не то, чтобы я был против идеи ставить скрипт на onClientEnter. Просто люди советовали, да и свой опыт тоже имеется. Поэтому, прошу сильно не бить
ЗЫ: Еще лучше сделать выход из затемнения. Этакое интро.
DraX, могу тебя уверить, что скрипт, пусть даже стоящий на OnEntere тригера может в данном случае глючить(особенно большой скипт), потому что дело не в том, где стоит скрипт, а когда он выполняется. В данном случае и в первом и во вотором варианте он выполняется в самом начале модуля, так сказать при загрузки игры.
И скрипт просто мизерный.
Хотя, на григере багов возможно и меньше будет.
QUOTE (DraX @ Aug 25 2005, 16:58) |
ЗЫ: Еще лучше сделать выход из затемнения. Этакое интро. |
Neverwinter Script Source |
void main() { object oPC = GetEnteringObject(); if (!GetIsPC(oPC)) return; if (GetLocalInt(oPC, "hallwayfirstvisit")== 0) { SetLocalInt(oPC, "hallwayfirstvisit", 1); DelayCommand(0.2, SetCutsceneMode(oPC)); AssignCommand(oPC, SetCameraFacing(120.0, 8.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP)); AssignCommand(oPC, DelayCommand(1.0, SetCameraFacing(180.0, 25.0, 40.0, CAMERA_TRANSITION_TYPE_FAST))); DelayCommand(4.5, SetCutsceneMode(oPC, FALSE)); } } |
Надо камеру поставить незаметно в нужное положение. Ведь ты мог ее дернуть мыхой и она пошла крутиться... А потом сценка и все идет по инерции. Ставь затемнение, ставь камеру в нужное положение и вперед по сценарию. Проверенный способ. Все остальное ненадежно. Главное очисти все акции у РС перед сценкой, тогда и инерцию камеры уберешь.
Neverwinter Script Source |
void main() { if(GetIsPC(oPC) && !GetLocalInt(OBJECT_SELF, "TRIGGER")) { FadeToBlack(oPC, FADE_SPEED_FASTEST); SetLocalInt(OBJECT_SELF, "TRIGGER", TRUE); AssignCommand(oPC, ClearAllActions()); DelayCommand(1.5, SetCutsceneMode(oPC, TRUE)); DelayCommand(2.2, AssignCommand(oPC, JumpToObject(oWp))); DelayCommand(2.3, AssignCommand(oPC, SetCameraFacing(120.0, 8.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP))); DelayCommand(3.0, FadeFromBlack(oPC, FADE_SPEED_MEDIUM)); DelayCommand(4.0, AssignCommand(oPC, SetCameraFacing(180.0, 25.0, 50.0, CAMERA_TRANSITION_TYPE_SLOW))); /// и так далее... |
Здравствуйте. Во-первых, я бы хотел спросить - Аищан, у меня в Навигаторе есть статья, чудным образом похожая на твою (один в один), поясни пожалуйста.И во-вторых - я сейчас делаю модуль, думаю, что на него уйдет ещё много времени, сейчас это не важно. Важно то, что у меня перестали работать Цутсценьы !!!!!!!!!!!!! Что такое ??????!!!!!!!!! :сщоон:
QUOTE |
Аищан, у меня в Навигаторе есть статья, чудным образом похожая на твою (один в один), поясни пожалуйста. |
QUOTE |
И во-вторых - я сейчас делаю модуль, думаю, что на него уйдет ещё много времени, сейчас это не важно. Важно то, что у меня перестали работать Цутсценьы !!!!!!!!!!!!! Что такое ??????!!!!!!!!! :сщоон: |
QUOTE |
А ка же, если его не снимать!? Снимать надо обязательно!? |
RoHaN привет. Статья моя, вот и все совпадения.
QUOTE (RoHaN @ Dec 27 2005, 11:11) |
Важно то, что у меня перестали работать Цутсценьы !!!!!!!!!!!!! Что такое ??????!!!!!!!!! |
Помогите PLZ . У меня перестали работать Кутсцены !!!!!!!!!! Я в недоумении, подскажите, что делать ???????
Добавлено в [mergetime]1135773618[/mergetime]
Как сдеать чтобы трупы не убирались сами по себе с поля боя ????????
Добавлено в [mergetime]1135774008[/mergetime]
{Обясняю}В своём модуле я сделал несколько не сложных сценок (порядка 4-5). А потом делаю очередной триггер со сценкой, а он отказывается работать !!!!!!!!!!!!!
QUOTE |
Как сдеать чтобы трупы не убирались сами по себе с поля боя ???????? |
QUOTE |
{Обясняю}В своём модуле я сделал несколько не сложных сценок (порядка 4-5). А потом делаю очередной триггер со сценкой, а он отказывается работать !!!!!!!!!!!!! |
ТЕМА: ПОСТРОЕНИЕ СКРИПТОВЫХ СЦЕН, Основы написания Cutscene
QUOTE (RoHaN @ Dec 28 2005, 15:37) |
Как сдеать чтобы трупы не убирались сами по себе с поля боя ???????? |
Привет народ !
Это снова я . Долго не мог прочитать ваши ответы. т.к. деньги коньчились .
Можно ещё раз про время разложения трупов PLZ . И ещё свой модуль, котором я уже упоминал, почти закончен . Большой вам РЕСПЕКТ за оказанную помощь .[COLOR=gray]
Как я знаю разложение трупов настраивается через свойства объекта...
Здрасьте, вот делал сценку на основе Айванской и решил добавить спелл огненного шара, но ничего не вышло, вот пример, делал как было показано в тулсете...
Elf-Drow, закрывай тег - [/NSS] !!!
По заклу. Тебе ведь редкатор показывает, что строчка не правильная!
2RoHaN
http://nwcustom.jino-net.ru/upload/loot_courpse.gif
если у тебя русская, посмотри по расположению вкладки
Теперь более менее, а именно так нужно записывать или можно как-нибудь покороче? Я видел пару скриптов которые можно было записывать или мега длинно или коротко...
Да об этом, все работает, но только не ActionCastSpellAtObject а ActionCastFakeSpellAtObject, то есть иллюзия. Почему НПС не может колдовать, а делает тока иллюзию?
При создании сценки я руководствовался тем же. Поставил НПС 30 уровень волшебника, 20 колдуна, на всякий. Потом поставил галочку на то, чтобы файрбол был как бы готов у НПС и он мог его использовать. Но НПС в то, время, когда должен колдовать тупо стоит, а затем продолжает выполнять последующие действия, плевав на колдовство...
Вот
Elf-Drow, ну эта ведь у тебя работает.
У тебя с ActionCastSpellAtObject не работает, так вот, покажи как ты пишешь с ActionCastSpellAtObject. Ты уверен, что непись может скаставать этот закл на нужный объект, ему ни чего не мешает, например расстояние?
Возможно, что ты не правильно настраиваешь закл у мага. Чтобы этого избежать на 100% в функции
Может быть, этот вопрос уже задавался, но тем не менее: как сделать так, чтобы диалог нельзя было прервать (тот "бокс" в Свойствах не делает ничего) и при этом скрывался интерфейс? Например, с такого разговора начинается модуль Kingmaker. Очень впечатляюще.
Нужно просто установить режим кутсцены.
Сейчас у меня стоит вот что в ActionTaken первых строк разговора, принадлежащих NPC.
Попробуй установить режим кутсцены до начала диалога.
(Например при наступании на триггер, вход в локу и т.п...)
Что же мне, каждый раз так изворачиваться? У меня диалогов тьма. Пробовал, между прочим, вписать OWNER_SELF через oTarget вместо игрока, тогда вообще ничего не происходит.
не, зачем же так?
стандартный скрипт на начало разговора nw_c2_default4 берем и впихиваем туда сценку:
По моему, достаточно просто сделать так:
З.Ы.:В своем модуле проверял...
не знаю как ты проверял, но данный скрипт на триггере запустит диалог с триггером в режиме катсцены. а надо то с НПС.
Что ж, рецепт Феникса помог. Штука, конечно, в том, что теперь на все-все ветки в конце придется ставить скрипт, выключающий режим фильма...
Chimeric дык есть и стандартный скрипт запускаемый при завершении диалога, добавь еще и туда строчку
Хм. Данную проблему решал давно и с успехом. Извиняюсь что так поздно заглянул в тему...
В каждом диалоге, создаешь служебную корневую строку В САМОМ ВЕРХУ. Она никогда не появится, но будет работать на нас. На нее вешаешь скрипт первый. Самое главное запомни, если на РС навешать функцию катсцены два раза или три то будут глюки. Это даже в комментах биовар есть. Второй скрипт вешаешь на строку в диалоге. Все.
А еще проще поставить Alternative Core и все глобальные события как на ладоне.
привет,
доскажите почему на определенной фразе разговора не запускается КатСцена?
Такая же как на первой страничке первая катСцена от Айвана..
в режиме диалога катсцена не врубается, насколько я знаю. Надо до, или после.
Lex, как определить конец диалога?
У меня кат-чцена была на последней фразе диалога
Nashman, наши телепаты никак не могут тебе помочь? Могу сказать точную причину - ты что то затупил.
Мне нужно сделать такое(это ка-сценка):
Появляется ПС возле НПС, далее после разговора выбирается путь куда они пойдут, в зависимости от варианта ответа ПС...
ПС: Примерно такую сценку надо сделать
Nachman
Ну, а какие проблемы то ?
Отслеживай игрока, включай режим кутсцены, начинай диалог...
PS: готовый код в этой теме никто выкладывать не будет - тема не о том.
Зачем сцека вообще? Там все в диалоге решается. Строка выход.
Модуль в первом посте топика отсутствует..
Тебе что надо то? Говори выложу
Спасибо Айв., но уже все,
Только вопрос есть у меня, знаю не очень хороший, так, как ответ где-то видел но вот где не знаю....
Вопрос:
Как камерой управлять? Типа понять смыл этих цифр.
Под модулем я имел в виду то, что под надписью:
Добрый вечер,если кто знает,как отобразить в катсцене анимацию удара без самого удара напишите,очень надо!С уваж.Всем.
Поиск юзай.
http://www.wrg.ru/forums/index.php?showtopic=731&st=2520
В ссылке приводимой мною выше смотри посты за 1 мая, там все разобрано.
Как сделать так, чтобы во время кутсцены начался диалог, и когда он заканчивается, заканчивается и кутсцена? Это как в Кингмэйкере, после битвы (когда заходишь в город).
Мы тут это уже рассматривали. Я в частности приводил скрипты. Ищи.
Я все просмотрел, но того, что мне нужно не нашел. Вот, буквально 5 минут назад закончил смотреть.
Делаешь триггер, ставишь на онЕнтр мой код. Таг НПС с которым начинается диалог должен быть равен тагу триггера: TR_CONV_[ТАГ_НПС_ДЛЯ_ДИАЛОГА]. Имя триггера фраза над НПС, типа "Эй, стой засранец!"
Aiwan
У него все это происходит в кутсцене, т.е тут триггер не понадобиться.
*Шум падающего тела, которое соскребает со стола клавиатуру и матерится неприличными словам*
Я что то не видел, что бы было об этом написано конкретно... Придется заняться телепатией...
*Встал на пол, ноги поставил на ширине плеч. Чуть присел. Совершаю вращательные движения тазом.*
Раз два три четыре пять. Начинаю телепать!
Как сделать, чтобы сначала на ПС наложилось заклинание "Цепь молний", а потом его убило, чтоб на части разлетелся?..
Белатрис
Скажи мне, а каким боком это относиться к этой темe...?
Не понял......
Белатрис, устное предупреждение за то что вопросы не по теме. Иди в раздел вопросы новичков.
Доброе утро!Айван,вопрос персонально тебе,так как этого я в этой теме не нашел,а в катсценах дока ты.Так вот,в тулсете есть классный инклюд"x1_?_cutscene"точное название не помню,но найти его в скриптах не проблема.Там очень удобная система cut+действие не надо писать все эти ассигн и делай(добавляешь только время между действиями,а не от начала скрипта)вообщем супер!Написал сценку, еще одну,еще.Первая играет,а вторая...На триге она не запускается,иду на тригер другой третей сценки: запускает 2 сцену!:-|
2 Noah
Дык та инклюда не простая , там нужно указывать номер сценки (что-то типа того) примеры кодов погляди в СоУ, там точно есть.
ЗЫ: вообще согласен, библиотечка оч удобная.
[quote name='Waromon' date='Aug 30 2006, 10:28' post='90753']
2 Noah
Дык та инклюда не простая ;), там нужно указывать номер сценки (что-то типа того) примеры кодов погляди в СоУ, там точно есть. ;)
Иногда мозг встает и отказывается работать!Как работает этот инклюд?Кто работал подскажите,а то сейчас все сцены не корректно работают,а режим катсцены не работают.
Доброго времени суток всем!
Помогите, плз. опять у меня проблемы.
Пытаюсь написать небольшую катсцену. Игрок сидит в камере. Сам выбраться не может - на двери флажок "plot", чтобы ее открыть, нужен ключ с тэгом "Cell_key". Приходит охранник. После разговора с ПС он должен открыть дверь ключом, выпустить ПС и отвести к коменданту. Ключ от двери у охранника в инвентаре (проверяла неоднократно - он там присутствует, тэги ключа и замка на двери совпадают).
Компилится. НО: охранник пытается открыть дверь, но не открывает. Пробовала через ActionUnlockObject(GetObjectByTag("MYCELL")) - результат тот же.
Сама катсцена ставится на ActionTaken в беседе с охранником. Выглядит так:
Трудно судить что тебе надо. Ведь не вижу ни расстояний ни предметов рядом и прочее. Нужна очень подробная инфа: НПС подошел, повернулся, пукнул, ойкнул, повернулся, отошел. Сел, поковырял в носу... Как тольк оты составишь эти действия. Написать будет тебе проще.
Спасибо!!!
Надеюсь, не очень напрягла. Буду, все-таки, с твоей статьей разбираться.
Когда все понятно как 2х2, то ответ не в напряг, было бы время и чувство что ответ не уйдет в песок... Изучай статью.
Айв, а катсцена глючит...
В общем, сначала добавила все как ты написал - у меня охранник стал открывать дверь, все нормально, но он почему-то идет не по коридору, а хочет пройти через стену, ПС - за ним. Оччень смешно...
Ну, подкорректировала я по мере возможности и вот что вышло:
1,2,3 - ты сразу катсцену отрубаешь, ибо
Пасибо, Lex.
С тем, где что поменять, понятно. И почему поменять, тоже.
Можно, еще спрошу:
4. По точкам уже пробовала отправить ПС, до того, как сюда зашла, так он вообще никуда не идет. Сложновато мне в точки превращать, лучше через эффект буду.
Это пойдет
4 - попробуй разные варианрты (у слоу бяка есть: на персе будут шмотки с имуном к слоу и все обломается )
ты хоть почитай описание ApplyEffectToObject. Там еще требуется длительность указать (INSTANCE, PERMANENT, TEMPORARY)
6 - нет. Посмотри описание ActionDoCommand - там 1 параметр, а ты передаешь 2. Теоретически там должно быть:
1. Если это в диалоге, то идет инерция от него. Убери в свойствах диалога что бы камера приблежалась.
2,3 Лекс отвеил.
4. Недавно решал точно такую же проблему. Сперва парился как ты потом плюнул. И сделал по уму.
Вот весь код, хочешь смотри. Думаю разберешься.
Сеньк. Я бы без вашей помощи просто плюнула бы на все уже давно.
Lex, я просто вчера поспешила с постом, Инет все время вырубался. Потом только вспомнила, что есть же и длительность, и тип, и все прочее. Просто с эффектами почти не работала еще. Буду пробовать.
Ту строчку, которая пункт 6, счас попробую поставить.
Aiwan, если я правильно поняла, ты просто ускорил НПС? Класс! Попробую и этот вариант.
Кто-нибудь знает, как сделать так, чтобы при включении диалога позиция камеры не изменялась. А то она все портит!
Надеюсь, понятно изложился.
В конце диалога в том месте где окно скриптов есть опция. Пощелкай увидишь. Отключить зум при начале диалога.
Как сделать, чтоб НПС с тэгом, допустим, "1", стрелял с лука по НПСу с тэгом "2"?
И как прекратить стрельбу?
Заранее благодарен!
Создать две фракции нейтральные к РС и ненавидящие друг друга. Скриптом помещать НПС в эту фракцию. Из оружия оставить одни арбалеты. Дальше проявить смекалку.
Извините за то что не утруждал себя поиском данной сценке. Но поскольку я не умею сам писать скр. сценки то прошу вас уважаемые скриптеры спросить - Есть ли в этом разделе скрипт такой сценки:
После захода в Триггер ГГ начинается сценка:
Стоят вокруг платформы 4 НПС, за ними еще двое.
НПС 1 говорит НПС 2 *Тететете*, тот отвечает *Тетете*. После этого Из центра платформы (Точка маршрута?) исходит эффект как при Способности монстра "Рев, Смерть", умирают 4 НПС. НПС 2 говорит НПС 1 *Тетете* и бежит через открытую дверь-силовое поле к Точке маршрута и там исчезает. НПС 1 колдует как-будто заклинание "Луч негативной энергии" и силовое поле активизируется. После этого фракция НПС 1 становится "Вражденбый"
тут готовых сценок всего пара штук, они для примера. Выкладывать готовые ролики нет никакого резона - они уникальны для каждого модуля, ибо в основном связаны или с сюжетом или с квестом. Ролики надо писать самому или искать скриптера. В этой теме можно посмотреть готовые работы для примера и задать вопросы.
Раз уж про это зашла речь, есть (была точнее) такая http://www.city-of-masters.ru/forums/index.php?showtopic=1005 (я всей душой люблю археологию и поиск).
Может быть, что нибуть, да и пригодится.
Хорошая тема, Но там нет нужной сценки
Попыталась тут недавно расписать катсцену, и вот что у меня вышло:
Shadowdweller, есть небольшая ошибочка с анимацией, забыли проставить скорость…
shadowdweller, я ж сказал тебе не делать одинаковых таймингов. Бывает что не срабатывают сразу несколько секунда и доля секунды одинаковые. Сделай вместо двух 18.0, 18.0 и 18.1
1. Камера встанет так как ты ее задала. Если от старта до финиша координат много, то она и будет ее крутить пока не встанет. Ты собственно чего хотела от камеры? Поставить четко, плавно повести или еще что? Ты от балды влепили координаты и что то ждешь. Так не пойдет.
2. Ошибка вот де:
Gennady, спасибо, обязательно учту. Правда, не совсем понятно со счетчиком. Что такое строй, а что такое счетчик? У меня, получается, все перепутано, что ли? Объясняйте мне на пальцах, плз, я не скриптер...
Aiwan, я делала все так, как ты описал в статье.
1. Насчет камеры ты зря - я локацию сначала рисовала на бумаге со всеми вейпойнтами, плейсиблами и т.д., и прекрасно видела, как должна быть развернута камера. Другое дело - если проблема в скорости или в недостатке времени на разворот.
Мне нужно, чтобы участников сцены было видно всех по мере того, как они что-то делают. Вейп, куда бежит oRugo, находится от перса в совершенно противоположной стороне, если не вращать камеру, его элементарно не видно.
2. Про oRugo - спасибо. Исправлю.
3. Т. е. задержку увеличить, я правильно поняла?
5. Ясно.
Спасибо.
2 Ген, не путай ее. Пусть пока учится на задержках делать сценки.
2 Шад. Пришли мне свой модуль я тебе скажу где у тебя затык. На пальцах трудно объяснить и понять что и как.
2 gennady
Кажется, насчет строя и счетчика начинаю понимать, хоть и неясно, в чем у меня ошибка кроме того, что задержки слишком короткие.
Ссылка очень полезная, спасиб.
2 Aiwan
Ушло.
Отправил тебе позавчера назад письмо со сценкой. Жду...
Что сдеся не так?
чтобы получить нормальный ответ, нужно задать нормально вопрос? Довольно простая истина, не кажется?
Где скрипт стоит?
Что в игре получается, когда запускается скрипт?
Что хотел автор, когда писал скрипт?
Наши форумные телепаты все в отпуске, так что придется (ах, какая досада) утрудить себя постановкой вопроса.
Навскидку могу только сказать, что
- Фразы тут все выдадутся разом, а не как надо бы, по мере выполнения анимации. Чтобы было как надо, надо использовать ActionSpeakString.
- ActionDoCommand тут не к месту
- нет синхронизации между действиями НПС и действиями ИГРОКА - они одновременно все делают.
- снятие эффекта катсцены не корректное. Те сниматься она по идее будет почти сразу (через 1 секунду, как закончится анимация)
знаю, что повторюсь но все-таки:
мне нужно было, чтобы один персонаж подошел к другому, они перебросились бы парой фраз и второй персонаж присоиденился бы к первому.
(первый - это само собой главный персонаж)
писал
Узнал ответ на первый вопрос. Оказывается для того, чтобы забросить NPC в команду к вашему персонажу необходимо писать команду не
AddToParty, а AddHenchman - и тогда всё работает отлично
1. Никак, только если есть стрела в виде объекта.
2. В начале катсцены запомни то место, где стоял РС так:
затем сам ролик внедрить как BIC файл.
только после такого ролика прийдётся завершать модуль
а вообще пункты 3-6 можно заменить на "превратить персонажа в стрелу" (см. SetCreatureAppearance(...) или как-то так).
нарисовать и вставить стрелу не так уж сложно, но только если знать макс и техннику нвн.
вопщем лучше сделать выстрел из лука на красивой декорации с красивого ракурса чем маятся неделями над одной сценой, например из-за плеча героя неплохо выстрел выглядит.
Подведу итог сказанному. Не парься с такими вещами, игрок не заметит ничего. Ты потратишь пару месяцев на ролик который идет 1 минута.
Самое простое сделать так - всплывающий текст или диалог. "Игрок нагнулся и увидел на земле лежащую стрелу. Внимательно изучив надписи на основании он прочитал текст: "Дружище, не парься, сделай все проще. Дядюшка Айван".
Игрок опустил глаза и увидел в своём теле стрелу. Внимательно изучив надписи на основании он прочитал текст: "Дружище, не парься, сделай все проще. Дядюшка Айван"
Добрый день
Пожалуйста, помогите розобраться с ситуацией.
У меня при использовании функции SetCameraFacing (Строка скопирована из первого примера), камера почему-то упирается в ноги игроку
Менял ростаяние. Без толку. Как думаете, что можна сделать?
Я в своё время копировал отсюда же, не было никаких проблем!
У меня в ролике получился ляп, которыя я почему-то никак не могу устранить.
Задумка: Герой сидит в тюремной камере, открывается дверь. В дверь входит NPC, подходит к герою и начинается диалог.
Проблема: NPC всегда входит в дверь ЗАДОМ, разворачиваясь уже по дороге к герою.
Очень просто. Поставь поинт перед дверью и джампай его на поинт а не в дверь.
Спасибо. Все встало на свои места. Только он теперь приветствие не говорит. Или говорит, но еще до того как входит в комнату . Но это уже мелочи.
Теперь и они устранены
Я тут недавно , может это и не в тему , кто знает скрипт чтоб воскрешение отменить, что бы в модуле только загружаться можно было?
Спасибо всем, кто тут объяснял, что к чему! Единственная вещь, которая у нас так и не получается - это замедление РС Уже и так его, и сяк, а оно все свое толдычит "Immune to Slow"! Пытались уже даже убрать на время эффект иммунитета с РС, но такое чувство, что оно ваще не реагирует ни на что. Откуда например у визарда первого уровня взяться этому иммунитету? Получается, что это никак не возможно?! Вот мы тута пытались таким образом сделать:
Пожалуйста, посмотрите скрипт и скажите в чем ошибка. Проблема в том, что некоторые НПС, которые должны атаковать невидимый объект, тормозят и вместо положенных 2-3 секунд на начало атаки, стоят, как пни в лесу, почти до конца катсцены.
Здравствуйте! Подскажите пожалуйста, что здесь не так?
* Напрягаю свои телепатические свойства * *ПУК*
Парень, у тебя может быть ВСЕ не так. У тебя может быть 10 одинаковых вейпоинтов и НПС по ним не идут. У тебя может быть туева хуча разных МОЖЕТ БЫТЬ которые видно ТОЛЬКО у тебя при просмотре скриптовой сцены. Твое сообщение что-то типа куска кода на форуме: Чуваки пишу прогу, но что-то нихера не пашет. Че не так?
КАК МИНИМУМ мы должны знать, а что ты ВООБЩЕ хотел сделать? И ЧТО НЕ ТАК ВООБЩЕ?
Здравствуйте, я тут новенький. Вчера нашёл эту тему и начал активно пытаться наклепать что-нибудь прямо работающее.
Первый скрипт получился и работает отлично
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)