Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Город Мастеров _ Neverwinter Nights Aurora Toolset _ ПОСТРОЕНИЕ СКРИПТОВЫХ СЦЕН

Автор: Aiwan May 9 2004, 14:27

Здравствуйте, мы продолжаем знакомство с основами работы в 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))); // НПС начинает разговор с игроком
   }
}


Этот скрипт обязательно ставится на триггер, или на вход в локацию и т.д. И все действия поставлены в строгую очередь на стеке этого объекта, в данном случае триггера. Убедительно прошу не ставить скрипты роликов на OnEnter стартовой локации при начале модуля! Если у вас большая необходимость в этом, то просто напишите задержку на несколько секунд для выполнения вашей скриптовой сценки. Дело в том, что при старте модуля движок игры выполняет внутренние команды необходимые для старта и ваш скрипт пройдет при неуправляемой камере, которая упрется в пол или еще куда.

Вернемся к нашему скрипту. Вы заметили, что с точки зрения программирования я его написал неверно? Точнее он перегружен лишними функциями. Это верно, но я хочу, что бы вы поняли, почему я это сделал.
ActionDoCommand() в нашем случае, ставит все остальные команды в очередь стека триггера. В противном случае, все наши команды мгновенно ушли бы по адресам: игроку, NPC, и они выполнили все это в той последовательности что получили. Но мы сделали так, что триггер запомнил все нужные действия для каждого объекта у себя и просто раздал их каждому в нужный момент. Этим мы освободили себя от ненужного отслеживания выполнения команд каждым участником сценки. Попросту, мы сделали триггер нашим командиром. И в этом случае, выполнение команд можно просто отделить друг от друга командой ActionWait() для триггера.

Я советую не уничтожать вам этот триггер в конце, как делают многие, так как он может уничтожиться раньше завершения акций и ваш ролик не успеет завершиться. Советую NPC при таких сценках уже готового из синьки ставить в закрытую локацию, специально изготовленную для таких нужд. Дело в том, что при одиночной игре при команде CreateObject() компьютер ваш будет немного тормозить. Это связано с тем, что в случае одиночной игры он и сервер и клиент одновременно. Поэтому на вашей супер тачке Р-IV 3000 и мозгами 1 Гб может виден слегка заметное подергивание. И чем больше вы создаете объектов, тем больше тормозов. Для шардов это не актуально, у них клиент и сервер на разных машинах.

Разберем некоторые части скрипта подробно.

Neverwinter Script Source
if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1)
  return;

Этот строчка не даст запускаться скрипту если на триггер наступил не РС или скрипт уже один раз сработал.

SetCutsceneMode(oPC); Переводит РС в режим сцены, убирает панель и делает его недоступным для управления игроком.

Neverwinter Script Source
ActionDoCommand(AssignCommand(oPC, SetFacingPoint(GetPosition(oDoor))));

Эта строчка поворачивает оРС в сторону, в данном случае лицом на дверь из которой появится NPC.

Команда SetCameraFacing() установит камеру в то положение, которое вам нужно для комфортного просмотра вашей сценки. Я разберу на примере параметров нашего скрипта:

CAMERA_TRANSITION_TYPE_SNAP немедленно переместит камеру на новую позицию, тогда как другие типы, перемещают постепенно в позицию.
CAMERA_TRANSITION_TYPE_MEDIUM - переместит камеру в то положение, которое мы укажем из исходного.
250.0 - градусы относительно оси.
(0.0f=East, 90.0f=North, 180.0f=West, 270.0f=South) начертите на бумаге схему с градусами и сторонами света, вам будет удобнее ориентироваться.
20.0 удаление от игрока. (Мин 5 мах 20)
45.0 наклон (1 - вертикально, 50.0 мах почти в горизонт)

Neverwinter Script Source
ActionDoCommand(AssignCommand(oCaet, PlayVoiceChat(VOICE_CHAT_HELLO)));

Это наша дама выкрикнет приветствие. Запомните, что это будет действовать, только если установлен звук у NPC с такой возможностью. Этого звука нет у монстров и прочих неважных NPC. Такие звуки есть у стандартных комплексов звуков РС или хеньчманов. Так что если вы примените PlayVoiceChat() и у вас не будет звука в скрипте, просто смените у NPC набор звуков в свойствах. Но стоит знать одну особенность стандартных скриптов от BioWare. Если вы пользуетесь PlayVoiceChat(), то параллельно звуку будет SpeakString() фразы из скриптов по умолчанию. Что бы не появлялись английские фразы в сценке надо поставить следом за функцией PlayVoiceChat() строку с какой-нибудь фразой из сценки, причем время срабатывания должно быть одно и то же, и лишь порядок функций должен быть такой: звук и сразу фраза. Мы просто накладываем одну строку сразу на другую, скрывая иностранные буквы и фразы.

Neverwinter Script Source
ActionDoCommand(AssignCommand(oCaet, ActionDoCommand(SetCutsceneMode(oPC, FALSE))));


Снимает режим скриптовых сцен у РС.

Сделайте одну две НЕЙТРАЛЬНУЮ КО ВСЕМ фракцию, специально для SetCutsceneMod(). Дело в том, что врагов РС трудно будет заставить не убивать вас, а если у него будет нейтральная фракция, то можно ее сменить прямо в скрипте с одной на другую. Но об этом позже.

Я не затрагивал такие параметры, как поведение хеньчмана, фамильяра и т.д. На такую короткую сценку можно, например, просто поставить дополнительную точку и ставить их туда. Сценка короткая и сбоев из-за свободы помощников быть не должно. Как управлять камерой и РС при перемещении сценки и другие сложные вопросы мы рассмотрим ниже.


СЛОЖНЫЕ СЦЕНКИ
В понятие “Сложные”, я вкладываю управление игроком при перемещении, обработку помощников и использование команд больше чем может вместить стек одного объекта. К тому же вам, наверное, хотелось бы переместить камеру и показать с разных ракурсов одну и ту же сцену. Спешу сразу вас разочаровать, “Aurora Engine” не позволяет отрывать камеру от игрока, но это не повод для того, что бы ни пользоваться перемещением камеры. Реализуется это следующим образом: делаем затухание экрана, на игрока накладываем невидимость, перемещаем его в нужную точку с нужным ракурсом, убираем затухание, пошла сценка.


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"); // Дверь, нужна как ориентир wink3.gif
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)))));
    // Повернем его рыльцем в сторону нужную нам smile.gif
    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)))); // Говорим НПС убить СЕБЯ wink3.gif
    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)); // Убираем режим сцен у игрока
    }
}


Основное отличие от кода первого скрипта здесь будет наличие такой функции как DelayCommand(). Эта функция позволяет задержать выполнение той или иной команды на требуемый отрезок времени от начала отчета, которое равно запуску скрипта. Наше построение команд тоже несколько изменится, теперь мы не будем вешать все на один объект, заполняя его стек-команд, соответственно отпала нужда в ActionDoCommand().

Лучше откройте его в Toolset-е и посмотрите скрипт в нем. Я еще объясню некоторые моменты, которые не стал комментировать в нем и важные моменты вообще о которых можно и нужно сказать отдельно.

Теперь я определил спутников игрока, будь то: животное, фамильяр или хеньчман. И для того, что бы наш спутник вел себя адекватно, а вернее не мешал и не болтался под ногами, мы его просто-напросто парализовали специальным эффектом EffectCutsceneParalyze(). Теперь он точно не кинется за нами вдогонку при перемещении камеры и не станет на пути NPC.
Еще один момент. Я несколько усложнил задачу в скрипте и сделал его на диалоге, который переходит в паузу и продолжается с той же строки после прохождения сценки. Для того чтобы мы взяв игрока из точки диалога могли, точно его вернуть назад, воспользуемся этой функцией:
Neverwinter Script Source
SetLocalLocation(oPC,"START_POINT", GetLocation(oPC));
В ней мы запомнили координаты игрока и в конце скрипта вернем его назад в исходную точку.

Еще момент. Если мы хотим что бы игрок участвовал в каком то эпизоде в сценке, но перед этим он был невидим то подбираем для него время при котором он будет скрыт от нас, затем эффект заканчивается, мы его показываем, после опять накладываем эффект невидимости и т.д. Все это естественно с затуханием экрана, или если у вас свои планы то не делайте. Тут выбор за вами.

Neverwinter Script Source
SetAILevel(oNPC, AI_LEVEL_HIGH);
Этой строкой мы сделали AI у нашего NPC высоким, для того, что бы он лучше искал путь до нужного объекта, пользовался разными зельями в общем, что бы не “тупил”. Однако это сильно нагружает систему, ведь по умолчанию стоит AI_LEVEL_DEFAULT. После того, как пройдет сценка, верните этот параметр на место, если вы не уничтожаете NPC.

Neverwinter Script Source
effect eSlow = EffectSlow();
В игре нет возможности заставить игрока идти к цели, а не бежать. Если мы можем отправить NPC пешком, то игрока мы можем заставить идти только при помощи такого эффекта.

Иногда, для того, что бы показать появление NPC, не обязательно его брать из закрытой локации или создавать скриптом. Можно просто поставить его в нужную точку или в укромное место и при запуске скрипта сделать его невидимым несколько секунд и снять эффект когда нужно. Он как бы появился из неоткуда, а сам на самом деле, будет стоять все это время парализованный и невидимый за рядышком. Я этим очень часто пользуюсь, чего советую и вам.

Так как наши участники сценки все с одной или двумя нейтральными фракциями, то изменить в конце нашего ролика фракцию можно командой:
Neverwinter Script Source
ChangeToStandardFaction(oNPC, STANDARD_FACTION_HOSTILE);
Если необходима другая фракция, не стандартная, то это тоже можно сделать
Neverwinter Script Source
ChangeFaction()
(смотрите функции).

ЗАКЛЮЧЕНИЕ
Я хотел написать еще одну сценку, но потом подумал, что вам будет интересней увидеть не бутафорскую, а настоящую сцену. Так вот, я выкладываю вместе с модулем скрипт финальной сцены в модуле “Проклятие Левора – Пламя Флегетоса”. Это третий модуль первой части нашей команды, его можно взять с диска журнала “Навигатор Игрового Мира” за июнь месяц или с нашего сайта www.wrg.ru. Просто сделайте экспорт этого скрипта в модуль и посмотрите, какой объект что делает и как себя ведет. Я сделал необходимые комментарии, поэтому если вы разобрались с первыми двумя скриптами, то этот поймете без проблем. Не гарантирую, что в той версии модуля, которая в журнале, он будет работать как часы, так как я его дорабатывал, но для вас главное будет посмотреть код.
Код скриптов, что я вам привожу, не обременен дополнительными условиями. Например, можно присвоить переменную и при наличии таковой сделать разные фразы или финал сценки. Но все это уже на ваше личное усмотрение. Моя задача научить вас азам.

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));
        // Создаем нашего НПС тут же, недалеко и "ПРЯЧЕМ" его просто сделав невидимым wink3.gif
        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); // Добавим прачку извилин smile.gif
        AssignCommand(oDallik, ClearAllActions());
        AssignCommand(oWord, ClearAllActions());
        AssignCommand(oPC, ClearAllActions());
        AssignCommand(oMag, ClearAllActions());
        DelayCommand(0.9, AssignCommand(oPC, ActionJumpToObject(oWPC2)));
        AssignCommand(oWord, ActionJumpToObject(oWPport));
        // Теперь как буд-то он прибыл из бездны smile.gif А сам стоит за углом
        MusicBackgroundChangeNight(GetArea(OBJECT_SELF), 43); // Сменим музыку на более устращающую
        MusicBackgroundChangeDay(GetArea(OBJECT_SELF), 43);  // Сменим музыку на более устращающую
        DelayCommand(2.0, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
//==========================  НАЧАЛО - АКТ ПЕРВЫЙ  =============================


ПРОДОЛЖЕНИЕ СКРИПТА СМОТРИТЕ В МОДУЛЕ!

 Cutscene.rar ( 0 байт ) : 40
 

Автор: Tarre Talliorne May 12 2004, 20:54

Aiwan, могу выложить базу, ЗНАЧИТЕЛЬНО облегчающую создания катсцен good.gif . Команды НАМНОГО проще в обращнии, чем *официальные*. По крайней мере мне этот инлюд сэкономил достаточно много времени.

Автор: 2GoDoom May 12 2004, 21:40

Tarre, выложи плиз! smile.gif

Автор: Aiwan May 12 2004, 23:40

// Tarre я не понял, ты чего старый ник не юзаешь?
Выложи в тему скриптов. wink3.gif

Автор: DBColl May 13 2004, 13:09

Тарре, выкладывай сюда, а не в скрипты. smile.gif Айв, тебе чем не нравится, чтобы здесь лежало? Все по теме. К тому же с удовольствием гляну этот инклюд...

Автор: Tarre Talliorne May 13 2004, 15:12

Сам инклюд

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);


Если надо, могу выложить более подробное объяснение. Но, думаю, и так все ясно.
ЗЫ: зацените GestaltCameraMove() - шедевр biggrin.gif

Автор: 2GoDoom May 13 2004, 16:40

Большое спасибо! smile.gif
Теперь не прийдется качать Лексикон wink3.gif

Автор: DBColl May 13 2004, 21:38

Хех, Гештальт Камера - старинный инклюд времен первого НВН. Не расчитан на Катсцены. Можете его адаптировать под них, но... имхо не имеет смысла. Я с него соскочил с появлением СоУ, где можно было сценки делать. Хех. smile.gif Я думал будет более интересное что-то... sad.gif

Автор: Tarre Talliorne May 15 2004, 17:26

Ну почему же не рассчитан... очень даж рассчитан. Лично МНЕ намного удобней юзать эту инлюду, чем стандартные функции. Кстати с помощью этой вещи можно реализовать фиксированную камеру(в принипе так тож можно, но нечто похожее я видел только при плавании камеры в ареи КАРТА ВАСТА Проклятия).

Цитата
Я думал будет более интересное что-то

Извините если что не так smile.gif)

Автор: DBColl May 16 2004, 02:30

Да нет, Тарре, не обижайся! good.gif Извини меня, если че не так wink3.gif.

Фиксированая камера, это не что иное, как удаление с экрана героя. wink3.gif Джамп в невидимом состоянии...

Автор: Tarre Talliorne May 16 2004, 19:14

Про фикс: я не совсем то имел ввиду.Про катсцен_инвизибл я и так знаю. Я иел ввиду, что можно релизовать такую полезнейшую вещь, как неуправляемая героем камера, причем все это не в режиме катсцены.

Автор: Аваддон Jun 23 2004, 22:04

Вопрос назрел к Айвану.
Что то у меня неполучается чтобы при нападении камера к монстру развернулась.

Код

object oEnemy = GetLastAttacker();
float fEnemy=GetFacing(oEnemy);
AssignCommand(oPC, SetCameraFacing(fEnemy, 5.0, 45.0, CAMERA_TRANSITION_TYPE_MEDIUM));

Автор: Aiwan Jun 23 2004, 23:47

Ну ты даешь! shok.gif У РС куча забот а ты его еще камерой мутузишь! lol.gif

Код

vector vD = GetPosition(oEnemy) - GetPosition(oPC);
float fEnemy = VectorToAngle(vD);
AssignCommand(oPC, SetCameraFacing(fEnemy, 5.0, 45.0, CAMERA_TRANSITION_TYPE_MEDIUM));

Не подумай что я такой умный unsure.gif это код ДБа. Просто я знаю где он и как работает biggrin.gif

Автор: DBColl Jun 24 2004, 02:57

Кстати спецы по векторам у нас Лекс и Баал. Так что разрулят, если возникнут вопросы wink3.gif.

LEX: не переводи на меня стрелки, ДБ. Я не шарю в векторах. Ты и Баал, вот, кто шарят.

Автор: Аваддон Jul 9 2004, 00:07

Интересный вопросик.
У нас есть один момент - заходишь в локацию. На игрока накладывается СетКутСценеМод=Трю,
потом эффект - КутСценИнвизибл. Тоесть как бы началась сценка и игрока не видно, видно только НеПиСей.
Так вот стоит нажать Esc как игрок появляется и появляется панель управления игрока(HUD).
И во время кутсцены игрок уже может ходить вокруг "отыгрывающих" НПС.
Пробовал наложить на него СетКоммандэйбл(Фолс, оПС). Но это ничего не поненяло - жм у Esc игрок появляется, только двигатся не может.
В чем дело не пойму.
З.Ы. У меня НВН в окне, может из за этого?!

Автор: DBColl Jul 9 2004, 11:52

Может и из-за этого... Но скорее всего это из-за известного бага - ставить на онЭнтр локации катсцену нельзя... sad.gif Возможны кучи багов. Лучше поставить триггер при входе в локу и на него вешать катсцену.

Автор: Tarre Talliorne Jul 9 2004, 14:20

Нет. Ав, тебе надо было сначала у меня спросить. Просто я в своем моде для теста (вдруг с катсценой что не так) на он_катсцен_абортед поставил снятие всех эффектов + рестор положения камеры :-)

Автор: 2GoDoom Jul 12 2004, 14:15

Подскажите что тут не правильно...

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 было smile.gif
  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));
}

}


Что самое обидное - они не подравшись, и кстати за ними не пришел мент из комнаты, начинают бежать к двери и пропадают не добежав. А дверь открылась. smile.gif
Подскажите плиз

Автор: DBColl Jul 12 2004, 15:02

А скрипт на чем стоит? Триггер? Лока? Еще что?..

Автор: 2GoDoom Jul 12 2004, 15:32

Триггер OnEnter

Автор: DBColl Jul 12 2004, 15:45

2GoDoom
Катсцены пишутся по такой схеме:

Neverwinter Script Source
DelayCommand(x.x, AssignCommand(...))

Иначе ты будешь еще долго разбираться в стеке акций... И сбои никогда неисключены. А через DelayCommand все всегда получается и быстрее, и безошибочнее.

Автор: 2GoDoom Jul 12 2004, 16:14

Окей, спасибо - буду пробовать
Добавлено в [mergetime]1089639537[/mergetime]
Еще большие глюки sad.gif
Правильно написано?:

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));
}
}

Добавлено в [mergetime]1089639872[/mergetime]
Еще что не понятно - камера то не крутится sad.gif

Автор: Tarre Talliorne Jul 12 2004, 17:46

Код
ActionDoCommand(SetCameraFacing(180.0, 15.0, 50.0, CAMERA_TRANSITION_TYPE_SLOW));

Неверно. Верно так:
Код
AssignCommand(oPC, SetCameraFacing(180.0, 15.0, 50.0, CAMERA_TRANSITION_TYPE_SLOW));

Автор: DBColl Jul 12 2004, 18:19

Ну вроде как все правильно. А что глючит-то? Как?

Автор: 2GoDoom Jul 12 2004, 19:22

ну вообщем так:
Я встаю на триггер, вклчюается катсцена:
Мужик перекрикиваются, очень резко поворачиваются друг на друга, затем один подбегает и стоит. Через пару секунд камера не трогается с места а мой персонаж очень резко поворачивается, затем открывается дверь, закрывается дверь, затем два дрочуна бегут к двери, из двери бежит охраник и пропадают недобегая никуда...

Вот так то sad.gif

Автор: Аваддон Jul 13 2004, 01:53

Как это пропадают? shok.gif

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));

Значит время увелич раз они за 15 сек не добегают biggrin.gif ph34r.gif

Автор: DBColl Jul 13 2004, 11:24

Хех, если ты хошь, чтобы они друг друга атаковали, сменяй фракции каждому перед атакой друг друга. Сделай фракцию, нейтральную ко всем и враждебную к самой себе. wink3.gif Перед ActionAttack сделай ChangeFaction() wink3.gif.

А чтобы не пропадали раньше времени, действительно увеличь паузу до дестроя. И еще. Привыкни писать без "двойных" делэев...

Neverwinter Script Source
DelayCommand(15.0 ,DestroyObject(oNPC1, 0.0));

Нафига в Destroy ты указывал 0.0? Здесь оно только путает. Достаточно:
Neverwinter Script Source
DelayCommand(15.0 ,DestroyObject(oNPC1));

Автор: 2GoDoom Jul 13 2004, 11:43

Окей... сча попробуем
Спасибо smile.gif
Добавлено в [mergetime]1089709917[/mergetime]
Атокавать и с другой фракцией не атакуют sad.gif
Добавлено в [mergetime]1089710092[/mergetime]
Одному поставил Hostile - начали драться... проблема в том что охраник стал подбегать и тоже бить хостайла smile.gif)
Добавлено в [mergetime]1089710732[/mergetime]
Вау.. какая хрень у меня получилась smile.gif Только камера в середине катсцены не поворачивается почему-то sad.gif
1. Челу начинают драться.. кричат... выливается кровь...
2. Прибегает мент, они успокаиваются, мент крутит рукой типа "в наручники", затем один (тот что начинал драться) идет за ментом, а другой его бьет в догонку smile.gif
3. И все... smile.gif

Автор: Ragnor Jul 27 2004, 10:13

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)));
  }
}


Что тут не правильно? По идеи игрок должен наступить на тригер и камера переходит на обьект с тегом 111 но камера остаётс на ПК и к томуже не двигается

Автор: 2GoDoom Jul 27 2004, 12:15

Ragnor, 1ое - тута нету Акшон Вайтов - тут есть Делай Комманд (как я уже понял).
2ое - Что за oItem? и зачем катсцену как-то странно вырубаешь?

Автор: Aiwan Jul 27 2004, 14:27

Цитата(Ragnor @ Jul 27 2004, 13:13)
По идеи игрок должен наступить на тригер и камера переходит на обьект с тегом 111 но камера остаётс на ПК и к томуже не двигается

Камера НИКОГДА не отрывается от РС. Это зашито в движок.
Что бы показать яко бы движенеие камеры, делается так: тушишь экран, делаешь РС невидимым, прыгаешь туда куда надо, и осветляешь экран.

Короче, на днях напишу вторую статью... Может через недельку.
Добавлено в [mergetime]1090927888[/mergetime]
2GoDoom в принципе все правильно. Так что тут делей не нужен, ведь он все действия вешает на ПОРЯДОК АКТИОНОВ У ТРИГГЕРА. Там можно ActionWait

Автор: Ragnor Jul 27 2004, 14:53

Буду ждать статью yes3.gif

Автор: Tarre Talliorne Jul 28 2004, 18:31

Neverwinter Script Source
ActionDoCommand(AssignCommand(oItem, SetCameraFacing(250.0, 20.0, 45.0, CAMERA_TRANSITION_TYPE_MEDIUM)));

Тут ActionDoCommand() не надо: эта функция заставляет ПОТОКОВУЮ команду становиться в СТЕК АКЦИЙ. А если стековая команда стоит первой в стеке, она выполняется также, как и потоковая, т.е. мгновенно.

Neverwinter Script Source
ActionWait(5.5);

А вот тут уже надо AssignCommand(oItem или oPC). Так, как делаешь ты, ты заставляешь ждать не ПС или Айтем, а триггер, что тебе, по ходу, помочь не может.

Neverwinter Script Source
ActionDoCommand(AssignCommand(oItem, ActionStartConversation(oPC)));

Здесь тоже ActiondoCommand не надоть: ActionStartConv. - "стековая" команда.

Автор: Aiwan Jul 28 2004, 18:55

Tarre Talliorne для того, что бы отрепетировать скриптовую сценку надо делать все на одном объекте. В часности, это триггер. Ты пишешь правильные мысли, но для сценки они не подходят. Все твои команды в скрипте уйдут по адресам: оРС, оНПС и т.д. Я учу, делать сценку на стеке ОДНОГО ТРИГГЕРА. Каждая команда триггеру это переадресация команды для РС или НПС и т.д. Потаму как тогда можно проследить порядок выполнения, и не надо будет лишних команд, типа ActionWait для РС ActionWait для НПС и т.д. Если присмотреться повнимательней, то все команды забиваются в стек триггера. Потаму и юзают в идеале DelayCommand. Так что Ragnor, то что говорит Tarre Talliorne верно для скриптинга вообще, но для катсценки луче делай как я показал.

Автор: Tarre Talliorne Jul 29 2004, 15:49

Цитата
Tarre Talliorne для того, что бы отрепетировать скриптовую сценку надо делать все на одном объекте.В часности, это триггер.

Совсем необязталеьно. Я про триггер. Небольшие сценки с одним\двумя персами можно делать и на самих этих персах. Так как on_enter триггера глючит бажено, а on_exit использовать-изврат чистой воды.
Но в общем-то, респект.

Автор: Aiwan Aug 8 2004, 12:52

СМОТРИЕ НАЧАЛО ТЕМЫ. СТАТЬЯ ИЗМЕНИЛАСЬ КАРДИНАЛЬНО!

Автор: Tarre Talliorne Aug 8 2004, 13:58

Куль. Как я завиудю новичкам! :-) Когда начинали мы, у нас даже нормальных мануалов не было, все (нет, не все... ВООБЩЕ ВСЕ) приходилось осваивать самому... Было времечко. :-) А вообще статья здоровская. Так держать!

Автор: Aiwan Aug 8 2004, 16:01

Tarre Talliorne спасибки! wink3.gif Главное что б ее читала молодежь biggrin.gif Кстати, ты тож мог бы народ подучить чем ни будь...

Автор: Tarre Talliorne Aug 8 2004, 16:46

Хм... Сейчас я сам с удовольствием занимаюсь копанием в биоповоровских инклюдах... Но это(их разбор) для новичков сложновато. Может быть, напишу краткое руководство по созданию инклюд-функций разных типов... Если будет время, разумеется.
Добавлено в [mergetime]1091973019[/mergetime]
Да, и еще: в модуле в одном из скриптов ты перечисляешь всех ассоциэйтов(GetAssociate( . . . )) и кидаешь на них катсценовские эффекты (инвизибл и паралайз). Не есть гуд. Все это можно реализовать циклом. Вечерком кину в базу (или сюда - скрипт-то вроде только к катсценам отношение имеет). Даже 2 - один для СоУ (там только 1 цикл) и для ХотУ (там еще и вложенный - ведь может быть не 1 хенч)...

Автор: Aiwan Aug 8 2004, 17:00

Напиши что можно сделать простым разкоменнтированием строк в стандартных скриптах. Будет востребована на ура!

Цитата(Tarre Talliorne @ Aug 8 2004, 19:46)
Да, и еще: в модуле в одном из скриптов ты перечисляешь всех ассоциэйтов(GetAssociate( . . . )) и кидаешь на них катсценовские эффекты (инвизибл и паралайз). Не есть гуд. Все это можно реализовать циклом.

Да, это верно. Цикл есть в инклюде ДБа, а ее я не приводил blum3.gif К этому скрипто подключены две инклюды в реале... Просто новичкам надо ПОЩУПАТЬ все самим и потрогать wink3.gif А свою инклюду давай! Народ спасибо скажет!

Автор: Tarre Talliorne Aug 8 2004, 19:30

Возникли небольшие траблы... Постараюсь ближе к ночи кинуть, но ничего гарантировать не могу. :\
<small>Добавлено в 19:37</small>

Цитата
Напиши что можно сделать простым разкоменнтированием строк в стандартных скриптах. Будет востребована на ура!

НПС спавн покоя не дает? :-) Инклюда вэйповская довольно проста, так что можно начать с нее. Но, с другой стороны, зачем бедному новичкеу знать такие тонкости. С третьей стороны, если не рыться в инкл., все мои действия сведуться к банальному переводу комментов из дефолтного скрипта на спавн и статей из лексикона (в апрельском вроде был туториал по касто-вейпам)... Я в растерянности :-)

Автор: Aiwan Aug 8 2004, 22:20

Цитата(Tarre Talliorne @ Aug 8 2004, 22:30)
третьей стороны, если не рыться в инкл., все мои действия сведуться к банальному переводу комментов из дефолтного скрипта на спавн и статей из лексикона

Это то что надо wink3.gif

Автор: Tarre Talliorne Aug 9 2004, 18:43

я подумаю

Автор: DBColl Aug 9 2004, 20:08

Айв, РЕСПЕКТ! good.gif

Автор: [MoF]Darth_Nick Aug 10 2004, 04:57

зацените - неплохо для нуба?

http://jedimax.narod.ru/Test.rar
Добавлено в [mergetime]1092103709[/mergetime]
там страница откроется и там еще раз надо нажать biggrin.gif

Автор: Аваддон Aug 10 2004, 15:06

Мммм.. А в чем маза?smile.gif Ну появляются они и чего? Никакой анимации Нпс...

Автор: Aiwan Aug 10 2004, 15:33

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))));
}
}

Автор: Tarre Talliorne Aug 10 2004, 19:32

Вроде оно. Часть моего '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.

Автор: Aiwan Aug 10 2004, 23:46

Я их кину под началом темы, бо затеряются. Пиши.

Автор: GolerGkA Aug 28 2004, 16:44

Народ, помогите нубу - как при катсцене переместить игрока и нескольких неписей в другую локацию и после этого продолжить диалог? Как вообще перемещать обьекты между "area"ми?

Автор: Aiwan Aug 28 2004, 17:21

Джампом. И больше никак. В статье я описал как джамп делать и как возвращаться В ТОЧКУ НАЧАЛА диалога. Я блин два месяца писал статью и хрен кто читает pleasantry.gif Но если ты хочешь ИДТИ пешком, то бишь гуськом за НПС, то тут есть скрипт в базе скриптов мой, по вейпам идем вслед НПС. Ищи...
Добавлено в [mergetime]1093702954[/mergetime]
Пауза в диалоге+ возврат в диалог... это про возврат.

Автор: Raven Dec 20 2004, 20:27

Мож кто находил более лучшее решение делать старт катсцены сначала модуля кроме как делать паузу при начале игры ?

Автор: DBColl Dec 20 2004, 20:54

QUOTE (Raven @ Dec 20 2004, 19:27)
Мож кто находил более лучшее решение делать старт катсцены сначала модуля кроме как делать паузу при начале игры ?

Это как?! wacko.gif Ставь триггер под точку старта и на него (OnEnter) вешай сцену...

Автор: Raven Dec 20 2004, 21:12

QUOTE (Aiwan @ May 9 2004, 14:27)
Убедительно прошу не ставить скрипты роликов на OnEnter стартовой локации при начале модуля! Если у вас большая необходимость в этом, то просто напишите задержку на несколько секунд для выполнения вашей скриптовой сценки. Дело в том, что при старте модуля движок игры выполняет внутренние команды необходимые для старта и ваш скрипт пройдет при неуправляемой камере, которая упрется в пол или еще куда.


Я вот по поводу этого и спрашиваю

Автор: Aiwan Dec 21 2004, 00:02

Ставь на триггер.

Автор: MasterMage Jan 16 2005, 16:29

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));

}
}

мой первый ролик, смотрите!! Класный, но простой...wink.gif

Автор: DBColl Jan 17 2005, 10:49

DelayCommand(98.5,RemoveEffect(oPC,eCutInv)); - эта конструкция у тебя отрабатывает??? this.gif Странно ты как-то эффект удаляешь...

Автор: MasterMage Jan 17 2005, 16:29

DBColl
а что странногоwink.gif....Просто время невидимости расчитывать мне влом было, поэтому воспользовался удалением... biggrin.gif

Автор: DBColl Jan 18 2005, 00:55

Так она действительно работает? У меня не получалось... dntknw.gif Возможно из=за СоУ... black eye.gif

Автор: MasterMage Jan 18 2005, 13:21

DBColl dntknw.gif сам не знаю, но она работает тутулька в тутельку...Все прекрасно..... yes.gif

Автор: DBColl Jan 18 2005, 18:41

Отлично. yes.gif Очень удобно. good.gif
Раньше просто эффекты надо было удалять по его ID, в цикле проверяя каждый. А с вижуалами - так вообще дело было туго... black eye.gif swoon.gif

Автор: MasterMage Jan 18 2005, 19:26

DBColl рад, что помог biggrin.gif

Автор: Nokoll Mar 11 2005, 14:55

Здравствуйте, я долго писал эту статью, перебирая всё возможное и невозможное.
И так к делу многие спрашивают зачем нужна знаменитая инклюда,

Neverwinter Script Source
#include "x2_inc_cutscene"

Дак вот и поесьню, инклюда значительно упрощает исполнение определённых команд.
В инклюде есть…
Neverwinter Script Source
CutActionAttack
CutActionMoveAwayFromObject
CutActionMoveToObject
CutActionMoveToLocation
CutApplyEffectAtLocation
CutBlackScreen
CutDeath
CutRemoveEffects

И многое, многое другое.Чем же упращает эта инклюда.
Да тем что не надо в ней ставить ни DelayCommand(, ни AssignCommand и т.д.
Вот пример например использование
Neverwinter Script Source
CutActionMoveToObject!

Neverwinter Script Source
CutActionMoveToLocation(15.5, oЧТОНИБУДЬ, , FALSE);
//всё очень просто ставите действие и время выполнения.
Ещё пример.. Лёгкое наложения эффекта/
Neverwinter Script Source
CutApplyEffectAtLocation(31.5, oPC, DURATION_TYPE_INSTANT, 464, oWP);

Однако CutApplyEffectAtLocation, отличается от CutApplyEffectToObject. А вот чем
CutApplyEffectToObject с этой функцией стало, заметно проще использовать эффекты. Без занесения эффекта, В память.
Вот пример…
Neverwinter Script Source
CutApplyEffectToObject(27.0,DURATION_TYPE_INSTANT,VFX_FNF_SCREEN_BUMP, oPC);
и заносить в пямять effect ненадо..
Я продолжу свою статью если её сочтут нужной .

Автор: slavaz Mar 11 2005, 15:51

QUOTE (Nokoll @ Mar 11 2005, 14:55)
И так к делу многие спрашивают зачем нужна знаменитая инклюда,
Neverwinter Script Source
#include "x2_inc_cutscene"


Выложи где-нить эту знаменитую инклуду, чтобы посмотреть на неё хотя бы... yes.gif

Автор: Nokoll Mar 11 2005, 18:45

Neverwinter Script Source
#include "x2_inc_cutscene"
вот она я же выложил поставь её перед скриптом и сам увидиш что в тулсе, изменится.

Автор: slavaz Mar 11 2005, 19:11

QUOTE(Nokoll @ Mar 11 2005, 18:45)
NSS
#include "x2_inc_cutscene"
вот она я же выложил поставь её перед скриптом и сам увидиш что в тулсе, изменится.

Если я поставлю эту строку в своём скрипте , то компилятор выдаст мне сообщение об ошибке - потому что СОДЕРЖИМОГО файла x2_inc_cutscene.nss у меня нет. Этот файл есть только у тебя. Поэтому для того, чтобы я попробовал функции твоей библиотеки, мне нужен этот файл. Вернее, его содержимое.
Вот это содержимое я и прошу у тебя.

Автор: Aiwan Mar 11 2005, 19:58

Nokoll в теме готовых катсцен выкладывай.

Автор: Nokoll Mar 28 2005, 02:59

Скажите Нужно ли мне дальше писать статью про инклюду?

Автор: dumbo Mar 28 2005, 07:10

вполне достаточно было бы сказать, что находится она(x2_inc_cutscene) в .\data\xp2_scripts.bif - весит почти 100k, посему постить ее, пожалуй, не стоит.
Добавлено в [mergetime]1111983333[/mergetime]
ps. более свежая (+1строкаpardon.gif версия лежит в xp2patch.bif smile.gif

Автор: Lemegeton Mar 28 2005, 11:10

А вот если ты ее опишешь... Какая ф-ция что делает и для чего может применяться... biggrin.gif

Автор: Nokoll Mar 28 2005, 21:03

QUOTE
вполне достаточно было бы сказать, что находится она(x2_inc_cutscene) в .\data\xp2_scripts.bif - весит почти 100k, посему постить ее, пожалуй, не стоит

dumbo Не ты не понел я имел в виду, не вешать инклюду целую, а описать все её функцыи, как я зделал это выше.
QUOTE
А вот если ты ее опишешь... Какая ф-ция что делает и для чего может применяться...

ДА!

Автор: Nokoll Apr 3 2005, 01:39

С позволения форума я продолжу.. biggrin.gif wink.gif
Итак: diablo.gif
Построение Скриптовых сцен с помощью инклюды «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);
затем делаем int и ПК соответственно, делаем это так:
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));

Далее эту location тобеж точку WP можно использовать скока угодно без лишнего повтора. Вот приведу пример. wink.gif
1.
Neverwinter Script Source
CutJumpToLocation(3.0, oPC, lPCStart);
Всё просто Функция время исполнения.
2. И ненадо никаких нудных DelayCommand(3.5, AssignCommand и т.д
3.
Neverwinter Script Source
CutActionMoveToLocation(3.5, oPC, lPCStart, FALSE);
Вот ПК идёт к Запомненной точьке, и сейчас простая функция время исполнения. Если кому не понятно я разберу.
Neverwinter Script Source
CutActionMoveToLocation(3.5, oPC, lPCStart, FALSE);

Neverwinter Script Source
CutActionMoveToLocation
сама функция инклюды, (3.5, время исполнения, как и в

Neverwinter Script Source
DelayCommand(3.5..
тока проще, oPC наш любимый игрок, lPCStart, Точька ВП куда пойдёт ПК, FALSE это означает что он будет идти медленно.
Neverwinter Script Source
CutBlackScreen(0.0, oPC);
очень просто чёрный экран.
Neverwinter Script Source
CutFadeFromBlack(3.5, oPC, FADE_SPEED_MEDIUM);
Очень просто его снимаем 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");
На удивление очень простое проигрование любого звука. «vs_nfenthim_dead» Это тег звука.
Neverwinter Script Source
CutDeath(27.2, oDead2, FALSE);
На удивление просто Убиение существа без добавления эффекта.
Neverwinter Script Source
CutJumpToObject(43.5, oPC, oСа1);
Простейший Джамп ПК. rolleyes.gif
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);
      }
    }
}

Таким Образом Эффекты будут бить через 1 секунду.на +1. Это очень полезно.
Чем по сто раз делать точьки с тегами.
-----------------------------
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);

Насколько я помню функция позволяющая сразу нескольким существам, кастовать 1 Заклинание. Очень удобно.
Фу Чивото я под устал, обязательно буду узнавать новое про эту инклюду, и постить здесь biggrin.gif
Спасибо За внимание! blush.gif blush.gif stink.gif victory.gif biggrin.gif

Добавлено в [mergetime]1112481707[/mergetime]
Я ОЧЕНЬ НАДЕЮСЬ ЧТО ЭТО КАМУНИБУДЬ ПРИГОДИТСЯ!!

Автор: MasterMage Apr 3 2005, 12:17

Кстати, если есть в твоей инклюде такая чточка, чтобы если я прыгаю к точке, то сразу смотрел бы куды надо, чтобы не затемнять экран. Знаешь, как в фильмах... Камера просто смотрит уже в другое место...
А то неинтересно. Может надо точку стрелочкой ставить туды, куды надо смотреть?
В основном, мы и раньше обходились без этого, здесь просто добавлена возможноть устанавливать время...
Но ты молодец... Потом готовую статью посмести в топик с мануалами, правда, когда мы приведем его в порядок. Будут тама статьи для ньюбов yes.gif

Автор: Nokoll Apr 3 2005, 14:25


MasterMage Поставь Точьку с градусами куда надо, То.е, куда смотрел бы ПК.
Я уверяю ПК Этой функцией прыгает и автоматом поворачивается т.к поставлена точка.

Neverwinter Script Source
CutJumpToLocation(3.0, oPC, lPCStart);

Но мож надо ещё потереть все Актион, я просто непомню.

Автор: MasterMage Apr 3 2005, 18:33

Nokoll в том-то и дело, что поворачивается, а надо, чтобы не было поворота камеры... Или я тебя не понял? black eye.gif

Автор: Nokoll Apr 3 2005, 22:50

А дак ты про это, попробуй поставить функцыю камеры SNAP!

Автор: Nokoll Apr 5 2005, 16:55

Мастер маге попробуй так.

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);                                     




LEX: Кнопку NSS на что дали, а?

Автор: Shoihet Jul 25 2005, 11:32

ребяты, такой вопрос
Делаю катсцену - герой приходит в город, и камера облетает по этому городу.
Делаю естчественно через пробег невидимого героя по вейпойнтам

И такая возникла проблема.
на каждом вейпойнте герой останавливается на полсекунды. При этом, неважно, где находится следующий вейпойнт - просто команды по вейпойнтам кладутся в стек.

Как этого избежать? Как сделать плавное неостанавливающееся движение?

Автор: Aiwan Jul 25 2005, 14:26

Поставь РС в центр и просто прокрути самой дальней камерой весь твой путь. По другому НИКАК.

Автор: DEM Jul 26 2005, 09:34

ПОМОГИТЕ!!! shout.gif shout.gif help.gif !! Пытался сделать кут-сцену(третий раз), всё как бы шло нормально (что странно), а потом набираю "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);

}

Добавлено в [mergetime]1122360681[/mergetime]
И еще, какая команда затемняет экран что бы герой мог спокойненько телепортироваться в другой вейпонт?

Автор: Archangel Jul 26 2005, 16:23

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));

Работай дальше, теперь все должно быть Ок! wink.gif

Автор: Мефистофель Jul 27 2005, 05:08

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,и так-далее, я думаю полный мой скрипт тебе ненужен.


на первый взгяд сложно но если понять настолько просто. Пиши в приват нучу писать Куты чтоб с первого раза получались.

Автор: DraX Aug 8 2005, 10:15

Меф
А ты сваяй какой-нибудь туториал по кут-сценам. А че, звучит здорово? Может малек и запаришся, зато народ уважать будет good.gif
ЗЫ: Мож и я подучусь на старости лет, так сказать...
Добавлено в [mergetime]1123493805[/mergetime]
Помогите, кто знает.
Создавал я как-то кут-сценку в которой был жестокий бой между Чемпионом Костяных Големов и отважным хероем. Так вот, делал все по стандартке: игрока и его компаньонов сделал невидимыми, парализовал (только компаньонов) и прыгал игроком с точки на точку, меняя при необходимости камеру.
Так вось, когда я тестил свое творение, я нашел один баг: Чемпион Големов кастит "Перст Смерти", а он у него 17 уровня (хорошо что игрок бессмертен на время biggrin.gif ). Но когда я проходил недалече от этой парочки, Голем как раз кастует этот спелл и получается неприятная ситуация. Идет себе сцена, идет... вот Голем колдует спелл... и бац, визуальный эффект от спелла захватывает не только хероя, но и игрока. В результате крааасивый эффект от спелла появляется на невидимом месте (как раз там, где и стоит игрок). Вопрос на засыпку: как устранить баг?

Автор: Aiwan Aug 8 2005, 15:40

QUOTE (DraX @ Aug 8 2005, 13:15)
А ты сваяй какой-нибудь туториал по кут-сценам. А че, звучит здорово? Может малек и запаришся, зато народ уважать будет

А зачем ваять Мефу, если он уже сваяен? dntknw.gif Иди в раздел ссылок в этом форуме и сливай туториал на русском мой. Там есть примеры и прочее по сценкам.

Автор: DraX Aug 8 2005, 16:02

Спасибо Aiwan! Бегу качать... smile.gif

Автор: DEM Aug 8 2005, 19:07

Народ! Подскажите плиз! Как зделаьб что бы камера вращалась 2 секунды? black eye.gif
Добавлено в 22:35
УРА! Я сделал свою первую кат-сцену... Я не помню использовал ли я ту инклюду, но лучше поставить biggrin.gif

Aiwan: Дем, я удалил твой код. Пожалуйста здесь только вопросы. Не надо все свои катсцены сюда выкладывать, иначе невозможно читать топик. Ок? Надеюсь ты не обидишься.

Автор: -fenix- Aug 8 2005, 19:39

Тоесть вращалась 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 Aug 10 2005, 13:07

Вот у меня проблема.... Сделал кат-сцену, всё идёт ОК, НО после того как она проиграет, вся непись повторяет свои действия... Ну например, идёт слуга к королю, что нить говорит и уходит в другой край карты сказать, что-то другой НеПиСи. ПОТОМ ОНА ВОЗВРАЩАЕТЬСЯ К КОРОЛЮ И ГОВОРИТ ТОЖЕ САМОЕ, ПОТОМ КО ВТОРОЙ НеПиСи и т.д.

Автор: Aiwan Aug 10 2005, 14:07

Поставь локалку на триггер. Смотри как я описал все в туториале.

Автор: MasterMage Aug 10 2005, 17:18

DEM да, ты стоишь на триггере. Скорее всего.

Автор: DraX Aug 12 2005, 13:06

Хочу спросить, можно ли каким-либо способом контролировать время движения камеры, кроме как скоростями (CAMERA_TRANSITION_TYPE) или нет? Если нет, то начать ли мне делать ее? Заранее спасибо.

Автор: MasterMage Aug 12 2005, 18:22

Можешь использовать Delay команды, для расстановки по времени. Там настрой промежутки задержки. А скорость движения

QUOTE (DraX @ Aug 12 2005, 13:06)
(CAMERA_TRANSITION_TYPE)

этим и юзай. smile.gif

Автор: DEM Aug 12 2005, 23:25

Скажите пожалуйста, как зделать что бы когда игрок загрузил модуль, была анимация, что он лежит, а потом встаёт...

Автор: -fenix- Aug 13 2005, 18:12

Ставь на OnClientEnter в модульных св-вах, что тебе нужно.
Не знаю, естьли анимация лежания(на моей версии такой нет), можно использовать ANIMATION_LOOPING_DEAD_FRONT, только тогда время проигрывания побольше и черный экран в начале.

Автор: DraX Aug 25 2005, 16:58

На onClientEnter некоторые скрипты иногда и глючат. Лучше всего использовать такой вариант:
1. Рисуем триггер вокруг точки, в которой должен появиться игрок.
2. Соответствующий скрипт ставим в onEnter триггера, заведомо включив проверку скрипта на единождую активацию.
Не то, чтобы я был против идеи ставить скрипт на onClientEnter. Просто люди советовали, да и свой опыт тоже имеется. Поэтому, прошу сильно не бить black eye.gif

ЗЫ: Еще лучше сделать выход из затемнения. Этакое интро. smile.gif

Автор: -fenix- Aug 25 2005, 17:58

DraX, могу тебя уверить, что скрипт, пусть даже стоящий на OnEntere тригера может в данном случае глючить(особенно большой скипт), потому что дело не в том, где стоит скрипт, а когда он выполняется. В данном случае и в первом и во вотором варианте он выполняется в самом начале модуля, так сказать при загрузки игры.
И скрипт просто мизерный.
Хотя, на григере багов возможно и меньше будет.

QUOTE (DraX @ Aug 25 2005, 16:58)
ЗЫ: Еще лучше сделать выход из затемнения. Этакое интро.

А ка же, если его не снимать!? Снимать надо обязательно!?

Автор: Chimeric Oct 29 2005, 07:08

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));
}
}


Требуется, чтобы при появлении в зоне (с крошечным отступлением, чтобы не глючило) запускался фильм. При этом камера бы смотрела на северо-запад (120) с увеличением 8. Через секунду камера должна начать подниматься и поворачиваться в западном направлении, пока не будет смотреть строго на запад с высоты 25. Получается такой пируэт. Вместо этого выходит так, что камера начинает, смотря на запад, так же и поднимается на высоту 25, а по истечении времени сценки, то есть через 4.5 секунд, резко переключается на вид, который должен был быть начальным - северо-запад на высоте в 8. Кстати, во время всего процесса персонаж так и стоит лицом к западу из-за направления вэйпойнта. Что, в принципе, меня устраивает.

Автор: Aiwan Oct 29 2005, 20:44

Надо камеру поставить незаметно в нужное положение. Ведь ты мог ее дернуть мыхой и она пошла крутиться... А потом сценка и все идет по инерции. Ставь затемнение, ставь камеру в нужное положение и вперед по сценарию. Проверенный способ. Все остальное ненадежно. Главное очисти все акции у РС перед сценкой, тогда и инерцию камеры уберешь.

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)));

    ///  и так далее...

Автор: RoHaN Dec 27 2005, 08:11

Здравствуйте. Во-первых, я бы хотел спросить - Аищан, у меня в Навигаторе есть статья, чудным образом похожая на твою (один в один), поясни пожалуйста.И во-вторых - я сейчас делаю модуль, думаю, что на него уйдет ещё много времени, сейчас это не важно. Важно то, что у меня перестали работать Цутсценьы !!!!!!!!!!!!! Что такое ??????!!!!!!!!! :сщоон:

Автор: Dik Morris Dec 27 2005, 09:30

QUOTE
Аищан, у меня в Навигаторе есть статья, чудным образом похожая на твою (один в один), поясни пожалуйста.

Вообщето это и есть статья Айвана... "Звезда по Имени Аврора". (Так по моему.)
QUOTE
И во-вторых - я сейчас делаю модуль, думаю, что на него уйдет ещё много времени, сейчас это не важно. Важно то, что у меня перестали работать Цутсценьы !!!!!!!!!!!!! Что такое ??????!!!!!!!!! :сщоон:

А вот тут поподробнее. Что именно не работает? Опиши ситуацию.
(Где стоит скрипт, что конкретно не идет, приведи код.)
QUOTE
А ка же, если его не снимать!? Снимать надо обязательно!?

PS: Феникс, давно хотел ответить но повода как то не было. smile.gif
Он имел ввиду, не FadeFromBlackа, а наоборот, сначала FadeToBlack(!) потом FadeFromBlack(!). Получается оч. красиво. yes.gif

Автор: Aiwan Dec 27 2005, 10:50

RoHaN привет. Статья моя, вот и все совпадения. pardon.gif

QUOTE (RoHaN @ Dec 27 2005, 11:11)
Важно то, что у меня перестали работать Цутсценьы !!!!!!!!!!!!! Что такое ??????!!!!!!!!!

Что значит перестали? Скажи что ты сделал, что так произошло?

Автор: RoHaN Dec 28 2005, 15:37

Помогите PLZ . У меня перестали работать Кутсцены !!!!!!!!!! Я в недоумении, подскажите, что делать ???????
Добавлено в [mergetime]1135773618[/mergetime]
Как сдеать чтобы трупы не убирались сами по себе с поля боя ????????
Добавлено в [mergetime]1135774008[/mergetime]
{Обясняю}В своём модуле я сделал несколько не сложных сценок (порядка 4-5). А потом делаю очередной триггер со сценкой, а он отказывается работать !!!!!!!!!!!!!

Автор: Dik Morris Dec 28 2005, 16:11

QUOTE
Как сдеать чтобы трупы не убирались сами по себе с поля боя ????????

Свойства NPC - улучшенный - время разложения. (там настрой нужное время, вообще подобные вопросы, лучше постить в других темах, например в: "Одиночный вопрос".)
QUOTE
{Обясняю}В своём модуле я сделал несколько не сложных сценок (порядка 4-5). А потом делаю очередной триггер со сценкой, а он отказывается работать !!!!!!!!!!!!!

Повторяю приведи код, скажи куда ставишь скрипт, обьясни ситуацию. Телепатией вроде не владеем, а причин чтоб не работало может быть оч. много... wink.gif

Автор: Lex Dec 28 2005, 19:03

ТЕМА: ПОСТРОЕНИЕ СКРИПТОВЫХ СЦЕН, Основы написания Cutscene

QUOTE (RoHaN @ Dec 28 2005, 15:37)
Как сдеать чтобы трупы не убирались сами по себе с поля боя ????????

Объяснишь связь между темой и вопросом?

Топай в "Вопросы Новичков". (по проблемам незапуска сценок тоже туда).
\\ пока преды не поставил.

Автор: RoHaN Jan 9 2006, 17:49

Привет народ !
Это снова я biggrin.gif . Долго не мог прочитать ваши ответы. т.к. деньги коньчились .
Можно ещё раз про время разложения трупов PLZ . И ещё свой модуль, котором я уже упоминал, почти закончен . Большой вам РЕСПЕКТ за оказанную помощь .[COLOR=gray]

Автор: DEM Feb 27 2006, 22:07

Как я знаю разложение трупов настраивается через свойства объекта...

Автор: Elf-Drow Mar 29 2006, 07:21

Здрасьте, вот делал сценку на основе Айванской и решил добавить спелл огненного шара, но ничего не вышло, вот пример, делал как было показано в тулсете...

NSS
//::///////////////////////////////////////////////
//:: Copyright © 2004 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 7.08.2004
//:://////////////////////////////////////////////

void main()
{
object oPC = GetPCSpeaker();
object oNPC = GetObjectByTag("NPC_UPIR");
object oDoor = GetNearestObjectByTag("DOOR1");
object oLuk = GetNearestObjectByTag("PORTAL");
object oSec = OBJECT_SELF;
object oWPpc = GetWaypointByTag("WP_PC1");
object oWPpc2 = GetWaypointByTag("WP_PC2");
object oWP1 = GetWaypointByTag("UPIR1");
object oWP2 = GetWaypointByTag("UPIR2");
object oWP3 = GetWaypointByTag("UPIR3");
object oWP4 = GetWaypointByTag("UPIR4");
object oWP5 = GetWaypointByTag("UPIR5");
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()); 
    AssignCommand(oNPC, ActionJumpToObject(oWP1));
    AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oDoor))));
    FadeToBlack(oPC, FADE_SPEED_FASTEST);
    AssignCommand(oPC, ClearAllActions());   
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oPC, 41.0);
    SetCutsceneMode(oPC); 
    SetAILevel(oNPC, AI_LEVEL_HIGH);
    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)));
    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)));
    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)));
    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, ActionCastSpellAtObject(int nFireball, object oNPC3, int nMetaMagic=METAMAGIC_FIRE, int bCheat=FALSE, int nDomainLevel=0, int nProjectilePathType_FIRE=PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell=TRUE); // Именно здесь я делаю спелл огненного шара. Делал как написано в тулсете
    DelayCommand(24.0, AssignCommand(oNPC, ActionForceMoveToObject(oWP4, FALSE, 1.0, 15.0)));
    DelayCommand(27.0, AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oWP5)))));
    DelayCommand(28.0, AssignCommand(oPC, ClearAllActions()));
    DelayCommand(28.6, AssignCommand(oPC, SetCameraFacing(130.0, 10.0, 40.0, CAMERA_TRANSITION_TYPE_SLOW)));
    DelayCommand(28.0, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 0.9, 3.0)));
    DelayCommand(33.0, AssignCommand(oLuk, ActionPlayAnimation(ANIMATION_PLACEABLE_OPEN, 1.0)));
    DelayCommand(36.5, AssignCommand(oNPC, ClearAllActions()));
    DelayCommand(33.0, AssignCommand(oNPC, ActionMoveToObject(oWP5)));
    DelayCommand(39.5, AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 3.0, 1.0)));
    DelayCommand(40.5, AssignCommand(oNPC, ClearAllActions()));
    DelayCommand(40.8, AssignCommand(oNPC, ActionDoCommand(DestroyObject(oNPC))));   
    DelayCommand(41.5, AssignCommand(oLuk, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE, 2.0)));
    DelayCommand(42.0, AssignCommand(oPC, ClearAllActions()));   
    DelayCommand(42.5, FadeToBlack(oPC, FADE_SPEED_FASTEST));
    DelayCommand(43.5, AssignCommand(oPC, ActionJumpToLocation(GetLocalLocation(oPC,"START_POINT"))));
    DelayCommand(44.5, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));   
    DelayCommand(45.5, AssignCommand(oSec, ActionResumeConversation()));
    DelayCommand(46.0, SetCutsceneMode(oPC, FALSE));
    }
}

Автор: -fenix- Mar 29 2006, 07:48

Elf-Drow, закрывай тег - [/NSS] !!!

По заклу. Тебе ведь редкатор показывает, что строчка не правильная!

NSS
void ActionCastSpellAtObject(int nSpell, object oTarget, int nMetaMagic=METAMAGIC_ANY, int bCheat=FALSE, int nDomainLevel=0, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell=FALSE)

void - показывает, что функция не возвращает значений.

ActionCastSpellAtObject - название функции

int nSpell, object oTarget, int nMetaMagic=METAMAGIC_ANY, int bCheat=FALSE, int nDomainLevel=0, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell=FALSE - параметры функции

В параметрах:
int, object... тип данных, которые должны записываться в этот параметр.
oTarget, nMetaMagic... - это название параметра, тебе это писать не надо, это самой функцией используется.
Ты замест int nSpell, object oTarget... должен написать нужное тебе и подходящее по смыслу.

Как-то путано, но ладно, покажу наглядно. Посмотри, как это должно записываться.
NSS
DelayCommand(21.0, AssignCommand(oNPC, ActionCastSpellAtObject(SPELL_FIREBALL, oNPC3, METAMAGIC_FIRE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);

Понятно?

Автор: [MoF]Darth_Nick Mar 29 2006, 09:10

2RoHaN
http://nwcustom.jino-net.ru/upload/loot_courpse.gif
если у тебя русская, посмотри по расположению вкладки

Автор: Elf-Drow Mar 29 2006, 10:30

Теперь более менее, а именно так нужно записывать или можно как-нибудь покороче? Я видел пару скриптов которые можно было записывать или мега длинно или коротко...

Автор: -fenix- Mar 29 2006, 16:09

QUOTE(Elf-Drow @ Mar 29 2006, 11:30) [snapback]75009[/snapback]
Теперь более менее, а именно так нужно записывать или можно как-нибудь покороче? Я видел пару скриптов которые можно было записывать или мега длинно или коротко...

Ты о чем?

Если о кол-ве параметров в функции, там это смотря устраивают тебя дефолтные или нет.

Стандартно функция выглядет так:
NSS
void ActionCastSpellAtObject(int nSpell, object oTarget, int nMetaMagic=METAMAGIC_ANY, int bCheat=FALSE, int nDomainLevel=0, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell=FALSE)

int nSpell и object oTarget, всегда должны быть тобой указаны, так как по умолчанию задать этот параметр не льзя, вернее не имеет смысла.
У всех остальных параметров есть дефолтная настройка, такие как: int nMetaMagic=METAMAGIC_ANY, int bCheat=FALSE... Тобишь, если тебя устраивает METAMAGIC_ANY, то ты можешь данный параметр вообще не писать, он по дефолту стоит равным METAMAGIC_ANY.
Но есть одно НО, если тебя не устраивает дефолт кокого-нить параметра, то прейдется писать и все параметры до него. Вот и получается, что если тебя все устраивает ты запишешь
NSS
DelayCommand(21.0, AssignCommand(oNPC, ActionCastSpellAtObject(SPELL_FIREBALL, oNPC3)));

А если не устраивает последний, то
NSS
DelayCommand(21.0, AssignCommand(oNPC, ActionCastSpellAtObject(SPELL_FIREBALL, oNPC3, METAMAGIC_FIRE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)));


Ты об этом спрашивал?

Автор: Elf-Drow Mar 30 2006, 14:46

Да об этом, все работает, но только не ActionCastSpellAtObject а ActionCastFakeSpellAtObject, то есть иллюзия. Почему НПС не может колдовать, а делает тока иллюзию?

Автор: -fenix- Mar 30 2006, 16:36

QUOTE(Elf-Drow @ Mar 30 2006, 15:46) [snapback]75274[/snapback]
Да об этом, все работает, но только не ActionCastSpellAtObject а ActionCastFakeSpellAtObject, то есть иллюзия. Почему НПС не может колдовать, а делает тока иллюзию?

Для колдовства нужно:
1) Чтобы НПС знал и мог пользоваться данным заклинанием.
2) Чтобы он мог достать этим заклинанием до жертвы. Тобишь расстояние подходящие.

Автор: Elf-Drow Mar 31 2006, 05:31

При создании сценки я руководствовался тем же. Поставил НПС 30 уровень волшебника, 20 колдуна, на всякий. biggrin.gif Потом поставил галочку на то, чтобы файрбол был как бы готов у НПС и он мог его использовать. Но НПС в то, время, когда должен колдовать тупо стоит, а затем продолжает выполнять последующие действия, плевав на колдовство...

Автор: -fenix- Mar 31 2006, 09:07

QUOTE(Elf-Drow @ Mar 31 2006, 06:31) [snapback]75425[/snapback]
Но НПС в то, время, когда должен колдовать тупо стоит, а затем продолжает выполнять последующие действия, плевав на колдовство...

QUOTE(-fenix- @ Mar 30 2006, 17:36) [snapback]75301[/snapback]
2) Чтобы он мог достать этим заклинанием до жертвы. Тобишь расстояние подходящие.

Может дело в этом?
Покажи эту строчку с кастом.

Автор: Elf-Drow Mar 31 2006, 10:05

Вот

NSS
DelayCommand(5.0, AssignCommand(oNPC, ActionCastFakeSpellAtObject(SPELL_FIREBALL, oNPC1)));

Автор: -fenix- Mar 31 2006, 12:40

Elf-Drow, ну эта ведь у тебя работает.
У тебя с ActionCastSpellAtObject не работает, так вот, покажи как ты пишешь с ActionCastSpellAtObject. Ты уверен, что непись может скаставать этот закл на нужный объект, ему ни чего не мешает, например расстояние?
Возможно, что ты не правильно настраиваешь закл у мага. Чтобы этого избежать на 100% в функции

NSS
void ActionCastSpellAtObject( int nSpell,object oTarget, int nMetaMagic = METAMAGIC_ANY, int bCheat = FALSE, int nDomainLevel = 0, int nProjectilePathType = PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell = FALSE)

параметр bCheat поставь TRUE. Если так напишешь, то для чтение закла маг не будет обязан его знать.


Еще, проверь объект, на который твой НПС кастует, возможно, ты в скрипте указал не его ТЕГ или написал его с ошибкой.

Автор: Elf-Drow Mar 31 2006, 16:56

NSS
DelayCommand(5.0, AssignCommand(oNPC, ActionCastSpellAtObject(SPELL_FIREBALL, oNPC1)));

Точно так же. Но я проверю с TRUE...
С TRUE работает!!! Но не наносится дамаг НПС
Все хорошо, продолжаю делать модуль...

Автор: Chimeric May 4 2006, 17:21

Может быть, этот вопрос уже задавался, но тем не менее: как сделать так, чтобы диалог нельзя было прервать (тот "бокс" в Свойствах не делает ничего) и при этом скрывался интерфейс? Например, с такого разговора начинается модуль Kingmaker. Очень впечатляюще.

Автор: Dik Morris May 4 2006, 17:52

Нужно просто установить режим кутсцены.

NSS
void SetCutsceneMode(
    object oCreature,
    int nInCutscene = TRUE
);

QUOTE
с такого разговора начинается модуль Kingmaker

Не знаю, не играл. smile.gif

Автор: Lex May 4 2006, 17:56

QUOTE(Chimeric @ May 4 2006, 18:21) [snapback]80750[/snapback]
тот "бокс" в Свойствах не делает ничего)

он для другого.
зы: не забыть после разговора катсцену снять.

Автор: Chimeric May 5 2006, 11:38

Сейчас у меня стоит вот что в ActionTaken первых строк разговора, принадлежащих NPC.

NSS
void main()
{

SetCutsceneMode(GetPCSpeaker(), TRUE);

}


Результат: разговор не происходит, начинается фильм, из которого не выбраться не Эскейпом и никак иначе.

Автор: Dik Morris May 5 2006, 12:07

Попробуй установить режим кутсцены до начала диалога.
(Например при наступании на триггер, вход в локу и т.п...)

Автор: Chimeric May 5 2006, 12:19

Что же мне, каждый раз так изворачиваться? У меня диалогов тьма. Пробовал, между прочим, вписать OWNER_SELF через oTarget вместо игрока, тогда вообще ничего не происходит.

Автор: Lex May 5 2006, 12:26

не, зачем же так?
стандартный скрипт на начало разговора nw_c2_default4 берем и впихиваем туда сценку:

NSS
//:://////////////////////////////////////////////////
//:: nw_c2_default4
/*
  Default OnConversation event handler for NPCs.

*/

//:://////////////////////////////////////////////////
//:: Copyright © 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:://////////////////////////////////////////////////

#include "nw_i0_generic"

void main()
{
    // See if what we just 'heard' matches any of our
    // predefined patterns
    int nMatch = GetListenPatternNumber();
    object oShouter = GetLastSpeaker();
    object oSelf = OBJECT_SELF;

    if (nMatch == -1)
    {
        // Not a match -- start an ordinary conversation
        if (GetCommandable(OBJECT_SELF))
        {
            if (GetIsPC(oShouter))
                SetCutsceneMode(oShouter, TRUE); // наша катсцена
            ClearAllActions();
            BeginConversation();
        }
    }
    // Respond to shouts from friendly non-PCs only
    else if (GetIsObjectValid(oShouter)
              && !GetIsPC(oShouter)
              && GetIsFriend(oShouter))
    {
        object oIntruder = OBJECT_INVALID;
        // Determine the intruder if any
        if(nMatch == 4)
        {
            oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER");
        }
        else if (nMatch == 5)
        {
            oIntruder = GetLastHostileActor(oShouter);
            if(!GetIsObjectValid(oIntruder))
            {
                oIntruder = GetAttemptedAttackTarget();
                if(!GetIsObjectValid(oIntruder))
                {
                    oIntruder = GetAttemptedSpellTarget();
                    if(!GetIsObjectValid(oIntruder))
                    {
                        oIntruder = OBJECT_INVALID;
                    }
                }
            }
        }

        // Actually respond to the shout
        RespondToShout(oShouter, nMatch, oIntruder);
    }

    // Send the user-defined event if appropriate
    if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE));
    }
}

Автор: Elf-Drow May 5 2006, 15:31

По моему, достаточно просто сделать так:
З.Ы.:В своем модуле проверял...

NSS
void main()
{
SetCutsceneMode(GetFirstPC());
ActionStartConversation(GetFirstPC(), "Res Ref диалога");
}


Можно на триггер какой-нить поставить или но OnConversation, но дык на энто не пробовал...

Автор: -fenix- May 5 2006, 18:11

QUOTE(Elf-Drow @ May 5 2006, 16:31) [snapback]80835[/snapback]
Можно на триггер какой-нить поставить или но OnConversation, но дык на энто не пробовал...

Стандартный диалоговый скрипт (nw_c2_default4) есть у каждого НПС после его размещения на карте. Зачем находить себе лишний геморой, если можно одну строчку написать?

Автор: Lex May 5 2006, 18:16

не знаю как ты проверял, но данный скрипт на триггере запустит диалог с триггером в режиме катсцены. а надо то с НПС.

Автор: Chimeric May 5 2006, 18:45

Что ж, рецепт Феникса помог. Штука, конечно, в том, что теперь на все-все ветки в конце придется ставить скрипт, выключающий режим фильма...

Автор: Neo May 5 2006, 19:09

Chimeric wink3.gif дык есть и стандартный скрипт запускаемый при завершении диалога, добавь еще и туда строчку

Автор: Aiwan May 5 2006, 19:16

Хм. Данную проблему решал давно и с успехом. Извиняюсь что так поздно заглянул в тему...
В каждом диалоге, создаешь служебную корневую строку В САМОМ ВЕРХУ. Она никогда не появится, но будет работать на нас. На нее вешаешь скрипт первый. Самое главное запомни, если на РС навешать функцию катсцены два раза или три то будут глюки. Это даже в комментах биовар есть. Второй скрипт вешаешь на строку в диалоге. Все.

NSS
//:://////////////////////////////////////////////
//:: Включаем РС режим катсцены
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 30.12.2005
//:://////////////////////////////////////////////

int StartingConditional()
{
    object oPC = GetPCSpeaker();
    object oSelf = OBJECT_SELF;
//-------------------------------------------------------
    if(GetCutsceneMode(oPC)==FALSE)
    {
      SetCutsceneMode(oPC, TRUE);
      AssignCommand(oSelf, ClearAllActions(TRUE));
      AssignCommand(oSelf, ActionStartConversation(oPC));
    }
    return FALSE;
}


NSS
//:://////////////////////////////////////////////
//:: Отключает РС режим катсцены
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 30.12.2005
//:://////////////////////////////////////////////

void main()
{
    object oPC = GetPCSpeaker();
    if(GetCutsceneMode(oPC)==TRUE)
    {
      SetCutsceneMode(oPC, FALSE);
    }
}


QUOTE(Chimeric @ May 5 2006, 21:45) [snapback]80877[/snapback]
выключающий режим фильма...

Проверь на хертбите НПС, если он разговаривает и с объектом РС, то ретурн. Если не разговаривает то катсцену удали у РС. Так в ПЛ было.

Автор: Lex May 5 2006, 21:46

QUOTE(Aiwan @ May 5 2006, 20:16) [snapback]80883[/snapback]
Проверь на хертбите НПС, если он разговаривает и с объектом РС, то ретурн. Если не разговаривает то катсцену удали у РС. Так в ПЛ было.

там было на хб модуля

Автор: -fenix- May 5 2006, 22:05

А еще проще поставить Alternative Core и все глобальные события как на ладоне. biggrin.gif

Автор: Nashman May 9 2006, 22:53

привет,
доскажите почему на определенной фразе разговора не запускается КатСцена?
Такая же как на первой страничке первая катСцена от Айвана..

Автор: Lex May 9 2006, 23:37

в режиме диалога катсцена не врубается, насколько я знаю. Надо до, или после.

Автор: Nashman May 11 2006, 00:54

Lex, как определить конец диалога?
У меня кат-чцена была на последней фразе диалога sad.gif

Автор: Aiwan May 11 2006, 09:11

Nashman, наши телепаты никак не могут тебе помочь? Могу сказать точную причину - ты что то затупил.

Автор: -fenix- May 11 2006, 21:01

QUOTE(Aiwan @ May 11 2006, 10:11) [snapback]81353[/snapback]
Nashman, наши телепаты никак не могут тебе помочь?

Открываю третий глаз. biggrin.gif
QUOTE(Aiwan @ May 11 2006, 10:11) [snapback]81353[/snapback]
Могу сказать точную причину - ты что то затупил.

Судя по имеющейся инфе:
QUOTE(Nashman @ May 9 2006, 23:53) [snapback]81225[/snapback]
Такая же как на первой страничке первая катСцена от Айвана..

Ты что-то намудрил в проверке:
NSS
if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1)

Или что у тебя там.

Автор: Nashman May 12 2006, 12:59

Мне нужно сделать такое(это ка-сценка):
Появляется ПС возле НПС, далее после разговора выбирается путь куда они пойдут, в зависимости от варианта ответа ПС...

ПС: Примерно такую сценку надо сделать smile.gif

Автор: Dik Morris May 12 2006, 13:08

Nachman

Ну, а какие проблемы то ?
Отслеживай игрока, включай режим кутсцены, начинай диалог...

PS: готовый код в этой теме никто выкладывать не будет - тема не о том. smile.gif

Автор: Aiwan May 12 2006, 15:48

Зачем сцека вообще? Там все в диалоге решается. Строка выход.

Автор: virusman May 18 2006, 23:48

Модуль в первом посте топика отсутствует..

Автор: Aiwan May 19 2006, 06:13

Тебе что надо то? Говори выложу smile.gif

Автор: Nashman May 20 2006, 15:21

Спасибо Айв., но уже всеwink3.gif,
Только вопрос есть у меня, знаю не очень хороший, так, как ответ где-то видел но вот где не знаю....
Вопрос:
Как камерой управлять? Типа понять смыл этих цифр.

Автор: Dik Morris May 20 2006, 15:51

QUOTE(Nashman @ May 20 2006, 18:21) [snapback]82380[/snapback]

Вопрос:
Как камерой управлять? Типа понять смыл этих цифр.


Читаем мануал:

QUOTE
CAMERA_TRANSITION_TYPE_SNAP немедленно переместит камеру на новую позицию, тогда как другие типы, перемещают постепенно в позицию.
CAMERA_TRANSITION_TYPE_MEDIUM - переместит камеру в то положение, которое мы укажем из исходного.

SetCameraFacing(0.0, 20.0, 45.0);
(0.0f=East, 90.0f=North, 180.0f=West, 270.0f=South) начертите на бумаге схему с градусами и сторонами света, вам будет удобнее ориентироваться.
20.0 удаление от игрока. (Мин 5 мах 20)
45.0 наклон (1 - вертикально, 50.0 мах почти в горизонт)

Автор: Neo May 20 2006, 15:58

QUOTE(Dik Morris @ May 20 2006, 16:51) [snapback]82382[/snapback]
Если да, то читаем мануал...
хых, а следом за мануалом читаем ту никому не нужную инфу, которая написана рядом с функцией в nwscript:
CODE
// Change the direction in which the camera is facing
// - fDirection is expressed as anticlockwise degrees from Due East.
//   (0.0f=East, 90.0f=North, 180.0f=West, 270.0f=South)
// A value of -1.0f for any parameter will be ignored and instead it will
// use the current camera value.
// This can be used to change the way the camera is facing after the player
// emerges from an area transition.
// - nTransitionType: CAMERA_TRANSITION_TYPE_*  SNAP will immediately move the
//   camera to the new position, while the other types will result in the camera moving gradually into position
// Pitch and distance are limited to valid values for the current camera mode:
// Top Down: Distance = 5-20, Pitch = 1-50
// Driving camera: Distance = 6 (can't be changed), Pitch = 1-62
// Chase: Distance = 5-20, Pitch = 1-50
// *** NOTE *** In NWN:Hordes of the Underdark the camera limits have been relaxed to the following:
// Distance 1-25
// Pitch 1-89
void SetCameraFacing(float fDirection, float fDistance = -1.0f, float fPitch = -1.0, int nTransitionType=CAMERA_TRANSITION_TYPE_SNAP)

а следом можно еще и значения констант посмотреть wink3.gif
CODE
int CAMERA_TRANSITION_TYPE_SNAP = 0;
int CAMERA_TRANSITION_TYPE_CRAWL = 2;
int CAMERA_TRANSITION_TYPE_VERY_SLOW = 5;
int CAMERA_TRANSITION_TYPE_SLOW = 20;
int CAMERA_TRANSITION_TYPE_MEDIUM = 40;
int CAMERA_TRANSITION_TYPE_FAST = 70;
int CAMERA_TRANSITION_TYPE_VERY_FAST = 100;

таким образом скорость камеры можно регулировать не только стандартом biggrin.gif

Автор: -fenix- May 20 2006, 16:00

QUOTE(Nashman @ May 20 2006, 16:21) [snapback]82380[/snapback]
Как камерой управлять? Типа понять смыл этих цифр.

Читаем первы пост.

Упс, третий ответ. За то человеку столько инфы дали. biggrin.gif


Автор: virusman May 22 2006, 15:27

Под модулем я имел в виду то, что под надписью:

QUOTE(Aiwan @ May 9 2004, 15:27) [snapback]1839[/snapback]

ПРОДОЛЖЕНИЕ СКРИПТА СМОТРИТЕ В МОДУЛЕ!
Cutscene.rar ( 0 байт ) Кол-во скачиваний: 40

Автор: Noah Jun 1 2006, 19:56

Добрый вечер,если кто знает,как отобразить в катсцене анимацию удара без самого удара напишите,очень надо!С уваж.Всем.

Автор: Dik Morris Jun 1 2006, 20:00

Поиск юзай.

http://www.wrg.ru/forums/index.php?showtopic=731&st=2520

Автор: Noah Jun 2 2006, 06:09

QUOTE(Dik Morris @ Jun 1 2006, 20:00) [snapback]83520[/snapback]

Поиск юзай.

http://www.wrg.ru/forums/index.php?showtopic=731&st=2520

поиск у меня не юзается,если можно подробно про атаку в катсцене раскажите,работа стоит.

Автор: Dik Morris Jun 2 2006, 06:55

В ссылке приводимой мною выше смотри посты за 1 мая, там все разобрано.

Автор: Белатрис Jun 11 2006, 05:46

Как сделать так, чтобы во время кутсцены начался диалог, и когда он заканчивается, заканчивается и кутсцена? Это как в Кингмэйкере, после битвы (когда заходишь в город).

Автор: Aiwan Jun 11 2006, 07:38

Мы тут это уже рассматривали. Я в частности приводил скрипты. Ищи.

Автор: Белатрис Jun 11 2006, 07:40

Я все просмотрел, но того, что мне нужно не нашел. Вот, буквально 5 минут назад закончил смотреть.

Автор: Dik Morris Jun 11 2006, 08:36

QUOTE(Белатрис @ Jun 11 2006, 07:46) [snapback]84402[/snapback]

Как сделать так, чтобы во время кутсцены начался диалог, и когда он заканчивается, заканчивается и кутсцена? Это как в Кингмэйкере, после битвы (когда заходишь в город).

NSS
DelayCommand(Задержка, если нужна конечно,
AssignCommand(Тот кто начинает диалог,
ActionStartConversation(С кем начинают диалог)));

QUOTE(Белатрис @ Jun 11 2006, 09:40) [snapback]84402[/snapback]

Я все просмотрел, но того, что мне нужно не нашел. Вот, буквально 5 минут назад закончил смотреть.


См. 131 сообщение.

Автор: Aiwan Jun 11 2006, 08:36

Делаешь триггер, ставишь на онЕнтр мой код. Таг НПС с которым начинается диалог должен быть равен тагу триггера: TR_CONV_[ТАГ_НПС_ДЛЯ_ДИАЛОГА]. Имя триггера фраза над НПС, типа "Эй, стой засранец!"

NSS
//:://////////////////////////////////////////////
//:: OnEnter  am_ten_convr_npc
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  Старт диалога с РС. Текст над NPC - Name триггера
  KeyTag - если больше 0, то непись ПОДБЕЖИТ.
  TR_CONV_[ТАГ_НПС_ДЛЯ_ДИАЛОГА]
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Original idea By: DBColl
//:: Created On: 22.04.2005
//:://////////////////////////////////////////////

void main()
{
    object oPC = GetEnteringObject();
    object oTrig = OBJECT_SELF;
    string sTag = GetTag(oTrig); // Таг триггера
    string sNPC = GetStringRight(sTag, (GetStringLength(sTag)- 8)); // Таг НПС
    object oNPC = GetNearestObjectByTag(sNPC);
    string sSpeak = GetName(oTrig); // Фраза
    vector vD = GetPosition(oNPC) - GetPosition(oPC);
    float fDir = VectorToAngle(vD);
    int bRun = StringToInt(GetLockKeyTag(oTrig));
    if (!GetIsPC(oPC)) return;
    if (GetLocalInt(oTrig, "HAS_OPERATED")) return;
    if (!GetIsObjectValid(oNPC)) return;
    if (GetArea(OBJECT_SELF)!=GetArea(oNPC)) return;
    if (GetIsEnemy(oNPC, oPC)) return;
    if (GetObjectType(oNPC)!=OBJECT_TYPE_CREATURE) return;
    FadeToBlack(oPC, FADE_SPEED_FASTEST);
    AssignCommand(oPC, ClearAllActions());
    AssignCommand(oNPC, ClearAllActions());
    SetCutsceneMode(oPC);
    DelayCommand(0.8, AssignCommand(oPC, SetCameraFacing(fDir, 25.0, 60.0, CAMERA_TRANSITION_TYPE_SNAP)));
    AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    DelayCommand(1.2, FadeFromBlack(oPC, FADE_SPEED_FAST));
    DelayCommand(2.0, AssignCommand(oPC, SetCameraFacing(fDir+35.0, 8.0, 50.0, CAMERA_TRANSITION_TYPE_SLOW)));
    AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPosition(oNPC))));
    if (GetDeity(oNPC)!="")
      {
        int iAnim = StringToInt(GetDeity(oNPC));
        DelayCommand(3.0, AssignCommand(oNPC, ActionPlayAnimation(iAnim, 0.8, 2.0)));
      }
    DelayCommand(3.5, AssignCommand(oNPC, SpeakString(sSpeak)));
    DelayCommand(4.5, AssignCommand(oNPC, ActionForceMoveToObject(oPC, bRun)));
//  DelayCommand(5.5, AssignCommand(oNPC, ActionDoCommand(SetCutsceneMode(oPC, FALSE))));
    DelayCommand(6.0, AssignCommand(oNPC, ActionStartConversation(oPC)));
    SetLocalInt(oTrig, "HAS_OPERATED", TRUE);
}


На последнюю строку диалога пишешь такой скрипт:
NSS
//:://////////////////////////////////////////////
//:: Отключает РС режим катсцены
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 30.12.2005
//:://////////////////////////////////////////////

void main()
{
    object oPC = GetPCSpeaker();
    if(GetCutsceneMode(oPC)==TRUE)
    {
      SetCutsceneMode(oPC, FALSE);
    }
}

Автор: Dik Morris Jun 11 2006, 08:48

Aiwan

У него все это происходит в кутсцене, т.е тут триггер не понадобиться.

QUOTE
Как сделать так, чтобы во время кутсцены начался диалог, и когда он заканчивается, заканчивается и кутсцена? Это как в Кингмэйкере, после битвы (когда заходишь в город).

Автор: Aiwan Jun 11 2006, 09:16

*Шум падающего тела, которое соскребает со стола клавиатуру и матерится неприличными словам*
Я что то не видел, что бы было об этом написано конкретно... Придется заняться телепатией... scratch_one-s_head.gif
*Встал на пол, ноги поставил на ширине плеч. Чуть присел. Совершаю вращательные движения тазом.*
Раз два три четыре пять. Начинаю телепать!

Автор: Белатрис Jun 24 2006, 07:25

Как сделать, чтобы сначала на ПС наложилось заклинание "Цепь молний", а потом его убило, чтоб на части разлетелся?..

Автор: Dik Morris Jun 24 2006, 09:35

Белатрис

Скажи мне, а каким боком это относиться к этой темe...?

QUOTE
ПОСТРОЕНИЕ СКРИПТОВЫХ СЦЕН.
Основы написания Cutscene


PS: разлететься на части он никак не сможет, налаживай молнию через: ActionCastFakeSpellAtObject, потом добавляй виз. эффект, (скажем побольше крови), и после этого - EffectDeath();.

Автор: Белатрис Jun 24 2006, 23:42

bad.gif Не понял......

Автор: dumbo Jun 25 2006, 00:00

QUOTE(Lexicon)

effect EffectDeath(
int nSpectacularDeath = FALSE,
int nDisplayFeedback = TRUE
);

Parameters
nSpectacularDeath
If this is TRUE, the creature to which this effect is applied will die in an extraordinary fashion (Default: FALSE)

nDisplayFeedback
(Default: TRUE)

тот самый "разлет" на части...

а "взрывать" трупы - это как раз сюда в тему вроде... smile.gif

Автор: Aiwan Jun 25 2006, 07:53

Белатрис, устное предупреждение за то что вопросы не по теме. Иди в раздел вопросы новичков.

Автор: Noah Aug 30 2006, 10:18

Доброе утро!Айван,вопрос персонально тебе,так как этого я в этой теме не нашел,а в катсценах дока ты.Так вот,в тулсете есть классный инклюд"x1_?_cutscene"точное название не помню,но найти его в скриптах не проблема.Там очень удобная система cut+действие не надо писать все эти ассигн и делай(добавляешь только время между действиями,а не от начала скрипта)вообщем супер!Написал сценку, еще одну,еще.Первая играет,а вторая...На триге она не запускается,иду на тригер другой третей сценки: запускает 2 сцену!:-|

Автор: Waromon Aug 30 2006, 10:28

2 Noah

Дык та инклюда не простая wink3.gif, там нужно указывать номер сценки (что-то типа того) примеры кодов погляди в СоУ, там точно есть. wink3.gif


ЗЫ: вообще согласен, библиотечка оч удобная.

Автор: Noah Sep 3 2006, 16:36

[quote name='Waromon' date='Aug 30 2006, 10:28' post='90753']
2 Noah

Дык та инклюда не простая ;), там нужно указывать номер сценки (что-то типа того) примеры кодов погляди в СоУ, там точно есть. ;)
Иногда мозг встает и отказывается работать!Как работает этот инклюд?Кто работал подскажите,а то сейчас все сцены не корректно работают,а режим катсцены не работают.

Автор: shadowdweller Sep 14 2006, 21:43

Доброго времени суток всем!

Помогите, плз. опять у меня проблемы. sad.gif
Пытаюсь написать небольшую катсцену. Игрок сидит в камере. Сам выбраться не может - на двери флажок "plot", чтобы ее открыть, нужен ключ с тэгом "Cell_key". Приходит охранник. После разговора с ПС он должен открыть дверь ключом, выпустить ПС и отвести к коменданту. Ключ от двери у охранника в инвентаре (проверяла неоднократно - он там присутствует, тэги ключа и замка на двери совпадают).

Компилится. НО: охранник пытается открыть дверь, но не открывает. Пробовала через ActionUnlockObject(GetObjectByTag("MYCELL")) - результат тот же.

Сама катсцена ставится на ActionTaken в беседе с охранником. Выглядит так:

NSS
void main()
{
object oPC = GetPCSpeaker();
object oCap = GetObjectByTag("Cap_001"); // Охранник
object oWard = GetObjectByTag("Warden"); // Комендант тюрьмы
object oDoor = GetObjectByTag("MYCELL"); // Дверь камеры (заперта, нужен ключ)

SetCommandable(FALSE, oPC);
DelayCommand(20.0, SetCommandable(TRUE, oPC));
AssignCommand(oCap, ActionUnlockObject(oDoor));
AssignCommand(oCap, ActionOpenDoor(oDoor));
AssignCommand(oCap, ActionMoveToObject(oWard));
AssignCommand(oPC, ActionForceFollowObject(oCap));
AssignCommand(oCap, ActionSpeakString("Комендант, заключенный доставлен."));
AssignCommand(oPC, ClearAllActions());
}

Что я делаю неправильно? scratch_one-s_head.gif

ЗЫ: Только не смейтесь, пожалуйста, над этим шедевром очень громко - у меня тьюториал по катсценам для патчей ниже версии 1.30, а со статьей Aiwan'a мне пока трудно разобраться.

Автор: Aiwan Sep 14 2006, 22:49

Трудно судить что тебе надо. Ведь не вижу ни расстояний ни предметов рядом и прочее. Нужна очень подробная инфа: НПС подошел, повернулся, пукнул, ойкнул, повернулся, отошел. Сел, поковырял в носу... Как тольк оты составишь эти действия. Написать будет тебе проще.

NSS
AssignCommand(oPC, ClearAllActions());
SetLocked(oDoor, FALSE);
AssignCommand(oCap, ActionMoveToObject(oDoor));
AssignCommand(oCap, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 0.5, 3.0));
AssignCommand(oCap, ActionDoCommand(AssignCommand(oDoor, ActionOpenDoor(oDoor))));
AssignCommand(oCap, ActionMoveToObject(oWard));
AssignCommand(oCap, ActionDoCommand(AssignCommand(oPC, ActionForceFollowObject(oCap, 1.5))));
AssignCommand(oCap, ActionDoCommand(SetCommandable(FALSE, oPC)));
AssignCommand(oCap, ActionSpeakString("Комендант, заключенный доставлен."));
AssignCommand(oCap, ActionDoCommand(SetCommandable(TRUE, oPC)));

Автор: shadowdweller Sep 16 2006, 23:56

Спасибо!!! thank_you.gif
Надеюсь, не очень напрягла. Буду, все-таки, с твоей статьей разбираться.

Автор: Aiwan Sep 17 2006, 11:24

Когда все понятно как 2х2, то ответ не в напряг, было бы время и чувство что ответ не уйдет в песок... Изучай статью. biggrin.gif

Автор: shadowdweller Oct 1 2006, 00:00

Айв, а катсцена глючит... sad.gif
В общем, сначала добавила все как ты написал - у меня охранник стал открывать дверь, все нормально, но он почему-то идет не по коридору, а хочет пройти через стену, ПС - за ним. Оччень смешно... crazy.gif
Ну, подкорректировала я по мере возможности и вот что вышло:

NSS
void main()
{
object oPC = GetPCSpeaker();
object oCap = GetObjectByTag("Cap_001");
object oWard = GetObjectByTag("WARD");
object oDoor = GetObjectByTag("MYCELL");
object oLoc1 = GetObjectByTag("CAP_STAND1"); // Иначе выманить охранника 
object oLoc2 = GetObjectByTag("CAP_STAND2"); // из камеры не было никакой
object oLoc3 = GetObjectByTag("CAP_STAND3"); // возможности

AssignCommand(oPC,SetCutsceneMode(oPC));
AssignCommand(oPC, ClearAllActions());
AssignCommand(oCap, ClearAllActions());
ActionDoCommand(AssignCommand(oPC, SetCameraFacing(225.0, 20.0, 45.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
SetLocked(oDoor, FALSE);
ActionDoCommand(AssignCommand(oCap, SetFacingPoint(GetPosition(oPC)))); // Потому что когда  вносила первые изменения, мы почему-то открывали дверь, повернувшись к замку спиной
AssignCommand(oCap, ActionWait(1.0));
AssignCommand(oCap, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 0.5, 3.0));
AssignCommand(oCap, ActionWait(1.0));
AssignCommand(oCap, ActionDoCommand(AssignCommand(oDoor, ActionOpenDoor(oDoor))));
AssignCommand(oCap, ActionWait(1.0));
ActionDoCommand(AssignCommand(oCap, SetFacingPoint(GetPosition(oLoc1)))); // Это он развернулся к вэйпойнту, к которому сейчас пойдет, ПС  в противоположной стороне.
AssignCommand(oCap, ActionMoveToObject(oLoc1));
AssignCommand(oCap, ActionMoveToObject(oLoc2));
AssignCommand(oCap, ActionMoveToObject(oLoc3));
AssignCommand(oPC, ActionForceFollowObject(oCap, 1.5)); // Здесь ПС очень прикольно бежит вприпрыжку sad.gif
AssignCommand(oCap, ActionDoCommand(SetCommandable(FALSE, oPC)));
AssignCommand(oCap, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE));
AssignCommand(oCap, ActionWait(1.0));
AssignCommand(oCap, ActionDoCommand(SetCommandable(TRUE, oPC)));
AssignCommand(oCap, ActionSpeakString("Комендант, заключенный доставлен."));
AssignCommand(oCap, ActionWait(1.0));
AssignCommand(oCap, ActionMoveToObject(GetObjectByTag("PRISON_CAP")));
ActionDoCommand(AssignCommand(oCap, SetFacingPoint(GetPosition(oWard)))); // И никуда он не разворачивается
AssignCommand(oPC,SetCutsceneMode(oPC,FALSE));
}

Вообще, когда в последний раз тестировала в таком виде, получилось нормально так...
Но все равно возникает куча вопросов: scratch_one-s_head.gif
1. Почему камера устанавливается, но потом мышью вращается как угодно?
2. Почему из катсцены можно элементарно выйти, просто задав ПС мышью другой маршрут движения?
Правда, он потом пытается опомниться и идти все-таки за охранником, но весь шарм теряется...
3. И куда бы на время катсцены убрать эту самую мышь совсем?..
4. Как сделать, чтобы ПС шел на более медленной скорости? (Прикольно, конечно, что ПС прыгает, как отравленный страус, но, по-моему, это все-таки баг)
5. Как заставить охранника развернуться?
6. А еще, я хотела сделать так, чтобы комендант на реплику чего-нибудь ответил, но он упорно молчит, какую команду я бы ни добавляла... Но не все сразу.

Автор: Lex Oct 1 2006, 00:08

1,2,3 - ты сразу катсцену отрубаешь, ибо

NSS
AssignCommand(oPC,SetCutsceneMode(oPC,FALSE));
выполнится сразу. Тебе надо поставить снятие катсцены в очередь. Судя по тому, что у тебя главный персонаж - Охранник, имеет смысл привязать к нему. Например так:
NSS
AssignCommand(oCap, ActionDoCommand(SetCutsceneMode(oPC,FALSE)));


4. не баг. По умолчанию ПС бегает, ходить он может только если
- его замедлить (EffectSlow, EffectMovementDecrease)
- его направить в точку, а не к объкту (в принципе тут это можно устроить, у тебя по ходу движения поинты, их можно в точки превратить через GetLocation() и игрока направить не в след за стражником, а по точкам)
- включит режим Search (и то если игрок - эльф, все равно будет бегать).

5. поменяй
NSS
ActionDoCommand(AssignCommand(oCap, SetFacingPoint(GetPosition(oWard)))); // И никуда он не разворачивается

на вот это:
NSS
AssignCommand(oCap, ActionDoCommand(SetFacingPoint(GetPosition(oWard)))); // повернется как миленький


6. Без проблем можно, чтобы комендант ответил. Поставь это в очередь стражника.

Автор: shadowdweller Oct 1 2006, 00:44

Пасибо, Lex. thank_you.gif
С тем, где что поменять, понятно. И почему поменять, тоже.
Можно, еще спрошу:
4. По точкам уже пробовала отправить ПС, до того, как сюда зашла, так он вообще никуда не идет. Сложновато мне в точки превращать, лучше через эффект буду.
Это пойдет

NSS
AssignCommand(oPC,ApplyEffectToObject(oPC,EffectSlow()));
? Или опять не то?
6. Это будет так?
NSS
AssignCommand(oCap, ActionDoCommand(oWard,ActionSpeakString("Можете идти. я с ним поговорю.")));

Автор: Lex Oct 1 2006, 00:59

4 - попробуй разные варианрты (у слоу бяка есть: на персе будут шмотки с имуном к слоу и все обломается smile.gif)
ты хоть почитай описание ApplyEffectToObject. Там еще требуется длительность указать (INSTANCE, PERMANENT, TEMPORARY)

6 - нет. Посмотри описание ActionDoCommand - там 1 параметр, а ты передаешь 2. Теоретически там должно быть:

NSS
AssignCommand(oCap, ActionDoCommand(AssignCommand(oWard,SpeakString("Можете идти. я с ним поговорю."))));

а сработает такая конструкция или нет - черт его знает, я давно в таком ключе сценки делал, уже не помню. попробуй.

Автор: Aiwan Oct 1 2006, 12:40

1. Если это в диалоге, то идет инерция от него. Убери в свойствах диалога что бы камера приблежалась.
2,3 Лекс отвеил.
4. Недавно решал точно такую же проблему. Сперва парился как ты потом плюнул. И сделал по уму.
Вот весь код, хочешь смотри. Думаю разберешься.

NSS
//:://////////////////////////////////////////////
//:: Name:
//:: Copyright © 2006 WRG! Team
//:://////////////////////////////////////////////
/*

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 03.03.2006
//:://////////////////////////////////////////////
#include "am_inc_cutscene"
#include "am_inc_common"
void main()
{
    object oPC = GetPCSpeaker();
    object oNpc = OBJECT_SELF;
    object oWp01 = GetObjectByTag("AM_WP_KALIFGO_01");
    object oWp02 = GetObjectByTag("AM_WP_KALIFGO_02");
    object oWp03 = GetObjectByTag("AM_WP_KALIFGO_03");
    object oWp03PC = GetObjectByTag("AM_WP_KALIFGO_03_PC");
    object oWp04 = GetObjectByTag("AM_WP_KALIFGO_04");
    object oWp04PC = GetObjectByTag("AM_WP_KALIFGO_04_PC");
    object oWp05 = GetObjectByTag("AM_WP_KALIFGO_05");
    object oWp06 = GetObjectByTag("POST_AM_CR_KALIF");
    object oWpP = GetObjectByTag("AM_WP_CUT_KALIF_WP");
    effect eHaste = EffectHaste();

    AssignCommand(oNpc, ActionPauseConversation());
    AssignCommand(oPC, SetCameraFacing(155.0, 10.0, 45.0, CAMERA_TRANSITION_TYPE_VERY_SLOW));
//  AssignCommand(oPC, ActionForceFollowObject(oNpc, 2.0f));
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHaste, oNpc);
    AssignCommand(oNpc, ActionForceMoveToObject(oWp01, FALSE, 1.0));
    AssignCommand(oNpc, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oNpc, ActionSpeakString("Не отставайте."));
    AssignCommand(oNpc, ActionDoCommand(AssignCommand(oPC, ActionMoveToLocation(GetLocation(oWp01)))));
    AssignCommand(oNpc, ActionWait(2.0));
    AssignCommand(oNpc, ActionDoCommand(AssignCommand(oPC, ActionMoveToLocation(GetLocation(oWp02)))));
    AssignCommand(oNpc, ActionForceMoveToObject(oWp02, FALSE, 1.0));
    AssignCommand(oNpc, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oNpc, ActionWait(2.0));
    AssignCommand(oNpc, ActionDoCommand(AssignCommand(oPC, ActionMoveToLocation(GetLocation(oWp03PC)))));
    AssignCommand(oNpc, ActionDoCommand(AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPosition(oNpc))))));
    AssignCommand(oNpc, ActionForceMoveToObject(oWp03, FALSE, 1.0));
    AssignCommand(oNpc, ActionDoCommand(SetFacingPoint(GetPosition(GetNearestObjectByTag("AM_PLC_SPELLBOOK")))));
    AssignCommand(oNpc, ActionWait(1.0));
    AssignCommand(oNpc, ActionSpeakString("Это статуя знаниям."));
    AssignCommand(oNpc, ActionWait(3.0));
    AssignCommand(oNpc, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oNpc, ActionSpeakString("Она олицетворяет познания в магических учениях."));
    AssignCommand(oNpc, ActionWait(2.0));
    AssignCommand(oNpc, ActionDoCommand(AssignCommand(oPC, SetCameraFacing(25.0, 10.0, 60.0, CAMERA_TRANSITION_TYPE_SLOW))));
    AssignCommand(oNpc, ActionDoCommand(AssignCommand(oPC, ActionWait(1.0))));
    AssignCommand(oNpc, ActionDoCommand(AssignCommand(oPC, ActionMoveToLocation(GetLocation(oWp04PC)))));
    AssignCommand(oNpc, ActionForceMoveToObject(oWp04, FALSE, 1.0));
    AssignCommand(oNpc, ActionWait(2.0));
    AssignCommand(oNpc, ActionDoCommand(SetFacingPoint(GetPosition(oWp06))));
    AssignCommand(oNpc, ActionSpeakString("Мой господин, "+GetName(oPC)+" уже здесь."));
    AssignCommand(oNpc, ActionPlayAnimation(ANIMATION_FIREFORGET_BOW, 0.5, 3.0));
    AssignCommand(oNpc, ActionWait(4.0));
    AssignCommand(oNpc, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oNpc, ActionDoCommand(RemoveEffect(oNpc, eHaste)));
    AssignCommand(oNpc, ActionResumeConversation());
}

Автор: shadowdweller Oct 1 2006, 13:26

Сеньк. Я бы без вашей помощи просто плюнула бы на все уже давно. thank_you.gif
Lex, я просто вчера поспешила с постом, Инет все время вырубался. Потом только вспомнила, что есть же и длительность, и тип, и все прочее. Просто с эффектами почти не работала еще. Буду пробовать.
Ту строчку, которая пункт 6, счас попробую поставить.
Aiwan, если я правильно поняла, ты просто ускорил НПС? Класс! hi.gif Попробую и этот вариант.

Автор: Белатрис Feb 25 2007, 11:44

Кто-нибудь знает, как сделать так, чтобы при включении диалога позиция камеры не изменялась. А то она все портит!
Надеюсь, понятно изложился.

Автор: Aiwan Feb 25 2007, 22:26

В конце диалога в том месте где окно скриптов есть опция. Пощелкай увидишь. Отключить зум при начале диалога.

Автор: Белатрис Mar 8 2007, 13:15

Как сделать, чтоб НПС с тэгом, допустим, "1", стрелял с лука по НПСу с тэгом "2"?
И как прекратить стрельбу?
Заранее благодарен! thank_you.gif

Автор: Aiwan Mar 8 2007, 22:16

Создать две фракции нейтральные к РС и ненавидящие друг друга. Скриптом помещать НПС в эту фракцию. Из оружия оставить одни арбалеты. Дальше проявить смекалку.

Автор: Esidor Jun 18 2007, 05:30

Извините за то что не утруждал себя поиском данной сценке. Но поскольку я не умею сам писать скр. сценки то прошу вас уважаемые скриптеры спросить - Есть ли в этом разделе скрипт такой сценки:
После захода в Триггер ГГ начинается сценка:
Стоят вокруг платформы 4 НПС, за ними еще двое.
НПС 1 говорит НПС 2 *Тететете*, тот отвечает *Тетете*. После этого Из центра платформы (Точка маршрута?) исходит эффект как при Способности монстра "Рев, Смерть", умирают 4 НПС. НПС 2 говорит НПС 1 *Тетете* и бежит через открытую дверь-силовое поле к Точке маршрута и там исчезает. НПС 1 колдует как-будто заклинание "Луч негативной энергии" и силовое поле активизируется. После этого фракция НПС 1 становится "Вражденбый"

Автор: Lex Jun 18 2007, 08:32

тут готовых сценок всего пара штук, они для примера. Выкладывать готовые ролики нет никакого резона - они уникальны для каждого модуля, ибо в основном связаны или с сюжетом или с квестом. Ролики надо писать самому или искать скриптера. В этой теме можно посмотреть готовые работы для примера и задать вопросы.

Автор: Dik Morris Jun 18 2007, 08:42

Раз уж про это зашла речь, есть (была точнее) такая http://www.city-of-masters.ru/forums/index.php?showtopic=1005 (я всей душой люблю археологию и поиск).

Может быть, что нибуть, да и пригодится.

Автор: Esidor Jun 18 2007, 08:48

Хорошая тема, Но там нет нужной сценки

Автор: Lex Jun 18 2007, 09:26

Цитата(Esidor @ Jun 18 2007, 09:48) [snapback]109559[/snapback]
Хорошая тема, Но там нет нужной сценки

повторяю еще раз, надеюсь, что последний: сценки, которая нужна вам не существует в природе. Все сценки по вышеописанным причинам уникальный и создаются под ситуацию. Я слабо верю в то, что в мире у какого-либо человека кроме вас была идея о точно такой же сценке, которую он воплотил в НВН.
Чтобы получить желаемое, придется приложить усилия. Или написать сценку самому или в частном порядке попросить скриптера.

Автор: shadowdweller Aug 1 2007, 13:56

Попыталась тут недавно расписать катсцену, и вот что у меня вышло:

Neverwinter Script Source
// Арест

void main()
{
// ::::::::::::: ДЕЙСТВУЮЩИЕ ЛИЦА :::::::::::
object oPC = GetPCSpeaker();
object oAlmero = GetObjectByTag("ALMERO"); // Альмеро Гарра - закоренелый преступник и рецидивист biggrin.gif
object oGuard1 = GetObjectByTag("GUARD_1");
object oGuard2 = GetObjectByTag("GUARD_2");
object oRugo = GetObjectByTag("RUGO"); // Руго - один из наших возможных хенчей, которому тоже есть чего бояться

//:::::::::::::: СТАТИСТЫ :::::::::::
object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC);
object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED); 
object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR);
object oDarlan = GetObjectByTag("DARLAN"); // Дарлан, второй хенч - законопослушный. Если выбран именно он, будет стоять парализованный smile.gif
object oTard = GetObjectByTag("TARD");
object oCler1 = GetObjectByTag("TYR_CLERIC_1");
object oCler2 = GetObjectByTag("TYR_CLERIC_2");

// :::::::::::: ВЕЙПОЙНТЫ ::::::::::::::
object oWPC = GetObjectByTag("W_PC");
object oWPCRun = GetObjectByTag("W_PC_Run");
object oWAlmero = GetObjectByTag("W_Almero");
object oWAALeave = GetObjectByTag("W_Almero_Leave");
object oWGuard1 = GetObjectByTag("W_Guard1");
object oGuard12 = GetObjectByTag("W_Guard12");
object oWGuard2 = GetObjectByTag("W_Guard2");
object oGuard22 = GetObjectByTag("W_Guard22");
object oWRugo = GetObjectByTag("W_Rugo_Hide");
object oWRugofin = GetObjectByTag("W_Rugo_Fin");


// ::::::::::::: ЭФФЕКТЫ ::::::::::::
effect ePar  = EffectCutsceneParalyze();


// :::::::::::::: МИЗАНСЦЕНА ::::::::::::::

SetLocalInt(oPC, "CUT_1", 1);
BlackScreen (oPC);

AssignCommand(oPC, SetCutsceneMode(oPC));

SetAILevel(oGuard1, AI_LEVEL_HIGH);
SetAILevel(oGuard2, AI_LEVEL_HIGH);
SetAILevel(oAlmero, AI_LEVEL_HIGH);
SetAILevel(oRugo, AI_LEVEL_HIGH);

AssignCommand(oPC, ClearAllActions());
AssignCommand(oAlmero, ClearAllActions());
AssignCommand(oGuard1, ClearAllActions());
AssignCommand(oGuard1, ClearAllActions());
AssignCommand(oRugo, ClearAllActions());

AssignCommand(oPC, ActionJumpToObject (oWPC));
AssignCommand(oAlmero,ActionJumpToObject(oWAlmero)
;
AssignCommand(oGuard1, ActionJumpToObject(oWGuard1));
AssignCommand(oGuard2, ActionJumpToObject(oWGuard2));

AssignCommand(oCler1, ClearAllActions());
AssignCommand(oCler2, ClearAllActions());
AssignCommand(oTard, ClearAllActions());

AssignCommand(oCler1, ActionDoCommand(SetFacingPoint(GetPosition(oAlmero
)));
AssignCommand(oCler2, ActionDoCommand(SetFacingPoint(GetPosition(oAlmero
)));
AssignCommand(oTard, ActionDoCommand(SetFacingPoint(GetPosition(oAlmero
)));

ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oCler1, 18.0);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oCler2, 18.0);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oTard, 18.0);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oDarlan, 18.0);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oAnimal, 18.0);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oDominated, 18.0);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oSummoned, 18.0);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oFamiliar, 18.0);

DelayCommand(3.0, FadeFromBlack(oPC,FADE_SPEED_MEDIUM));

DelayCommand(3.5, AssignCommand(oPC, SetCameraFacing(30.0, 15.0, 40.0, CAMERA_TRANSITION_TYPE_SLOW)));

// ::::::::::::::::::::: НЕПОСРЕДСТВЕННО ДЕЙСТВИЕ :::::::::::::::::::::

DelayCommand(4.0, AssignCommand(oRugo, ActionDoCommand(SetFacingPoint(GetPosition(oGuard1
))));
DelayCommand(4.5, AssignCommand(oRugo, ActionPlayAnimation(ANIMATION_LOOPING_LOOK_FAR, 0.9, 0.5)));
DelayCommand(5.0, AssignCommand(oRugo, SpeakString("О, черт! Это за мной!")));
DelayCommand(5.5, AssignCommand(oPC, SetCameraFacing(225.0, 20.0, 40.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
DelayCommand(6.0, AssignCommand(oRugo, ActionForceMoveToObject(oWRugo)));
DelayCommand(6.5, AssignCommand(oRugo, ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 7.0)));
DelayCommand(7.0, AssignCommand(oPC, SetCameraFacing(30.0, 15.0, 40.0, CAMERA_TRANSITION_TYPE_SLOW)));


DelayCommand(7.5, AssignCommand(oGuard1, ActionMoveToObject(oGuard12)));
DelayCommand(7.5, AssignCommand(oGuard2, ActionMoveToObject(oGuard22)));

DelayCommand(9.0, AssignCommand(oGuard1, ActionDoCommand(SetFacingPoint(GetPosition(oAlmero
))));
DelayCommand(9.0, AssignCommand(oGuard2, ActionDoCommand(SetFacingPoint(GetPosition(oAlmero
))));
DelayCommand(9.5, AssignCommand(oPC, SpeakString("Альмеро, что происходит?")));
DelayCommand(10.0, AssignCommand(oGuard1, ActionPlayAnimation(ANIMATION_FIREFORGET_READ, 1.0)));

DelayCommand(11.0, AssignCommand(oGuard1, ActionSpeakString("Альмеро Гарра, ты обвиняешься в убийстве...")));
DelayCommand(12.0, AssignCommand(oGuard1, ActionSpeakString("...в побеге с места преступления, а также в воровстве и пиратстве.")));
DelayCommand(13.0, AssignCommand(oGuard1, ActionSpeakString("Ты будешь заключен в тюрьму, пока суд нашего милосердного правителя не решит твоей участи. Следуй за нами.")));
DelayCommand(14.0, AssignCommand(oAlmero, ActionSpeakString("Да, я иду.")));

DelayCommand(15.0, AssignCommand(oPC, SetCameraFacing(135.0, 20.0, 40.0, CAMERA_TRANSITION_TYPE_SLOW)));
DelayCommand(16.0, AssignCommand(oGuard1, ActionMoveToObject(oGuard1)));
DelayCommand(16.0, AssignCommand(oGuard2, ActionMoveToObject(oGuard2)));
DelayCommand(16.0, AssignCommand(oAlmero, ActionMoveToObject(oWAALeave)));

DelayCommand(17.0, AssignCommand(oPC, ActionForceMoveToObject(oWPCRun)));
DelayCommand(17.0, AssignCommand(oRugo, ActionForceMoveToObject(oWRugofin)));

DelayCommand(17.5, AssignCommand(oGuard1, ActionDoCommand(DestroyObject(oGuard1))));
DelayCommand(17.5, AssignCommand(oGuard2, ActionDoCommand(DestroyObject(oGuard2))));
DelayCommand(17.5, AssignCommand(oAlmero, ActionJumpToObject(GetObjectByTag("W_Almero_Prison"))));

DelayCommand(18.0, SetAILevel(oAlmero, AI_LEVEL_DEFAULT));
DelayCommand(18.0, SetAILevel(oRugo, AI_LEVEL_DEFAULT));
DelayCommand(18.5, AssignCommand(oPC, ClearAllActions()));
DelayCommand(18.5, AssignCommand(oRugo, ClearAllActions()));

DelayCommand(19.0, SetCutsceneMode(oPC, FALSE));
}


При тестировании обнаружилось, что:
1. Камера в первой части сцены вращается сама по себе, почти безо всяких задержек.
2. Руго послушно прячется там, куда я его направила, но никак не хочет потом идти на вейпойнт, который oWRugofin.
4. Охранник произносит только первую фразу, все остальные появляются только внизу.
5. Умный Альмеро ни в какую не хочет идти на последний вейпойнт (он в другой локации).

Что я делаю не так и как это исправить?

Автор: gennady Aug 1 2007, 17:58

Shadowdweller, есть небольшая ошибочка с анимацией, забыли проставить скорость…

Neverwinter Script Source
DelayCommand(6.5, AssignCommand(oRugo, ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 7.0)));

Остальное вроде правильно, только нужно ставить большую выдерку времени между фразами. Через секунду не годиться, нужно 5-7, поэтому и читаете все из панели отчета… Чем длинне фраза, тем нужно больше время, чтобы игрок смог это все прочитать. Небольшой совет: задайте общее время длительности катсценки
Neverwinter Script Source
float Time = 18.0;

Тогда будет легче настраивать время, например парализацию хенчей.
Что еще бросилось в глаза? Нужно выбирать или строй акций, или действия через счетчик времени на функции DelayCommand. На счетчике будет приоритет, и действие всегда произойдет, что может сбить стой акций… Так же функция дестроя имеет время, ее тоже в данном случае не нужно делать акцией и можно вообще обойтись без счетчика DelayCommand…
Цитата
5. Умный Альмеро ни в какую не хочет идти на последний вейпойнт (он в другой локации).

Почистете ему на всякий случай акции перед самым прыжком.


Автор: Aiwan Aug 1 2007, 21:11

shadowdweller, я ж сказал тебе не делать одинаковых таймингов. Бывает что не срабатывают сразу несколько секунда и доля секунды одинаковые. Сделай вместо двух 18.0, 18.0 и 18.1

1. Камера встанет так как ты ее задала. Если от старта до финиша координат много, то она и будет ее крутить пока не встанет. Ты собственно чего хотела от камеры? Поставить четко, плавно повести или еще что? Ты от балды влепили координаты и что то ждешь. Так не пойдет.
2. Ошибка вот де:

Neverwinter Script Source
DelayCommand(17.0, AssignCommand(oRugo, ActionForceMoveToObject(oWRugofin)));
DelayCommand(18.5, AssignCommand(oRugo, ClearAllActions()));

oRugo получил команду и через 1.5 секунд ты почистила его стек и он все забыл. Соотвественно встал тупо на месте.

3. Вот эта строка появится через 5 секунд.
Neverwinter Script Source
DelayCommand(5.0, AssignCommand(oRugo, SpeakString("О, черт! Это за мной!")));

А вот эти начнутся в 11 секунд и так как вместо простой команды SpeakString ты юзаешь ActionSpeakString то каждая фраза будет иметь свою задержку и они накопятся в стек. То есть каждая фраза будет строго после того как проиграется перед ней и задержка уже не имеет значения. Ты мою статью читала? Там это разобрано. Твой oGuard1 будет трепать эти фразы секунд 10.
Neverwinter Script Source
DelayCommand(11.0, AssignCommand(oGuard1, ActionSpeakString("Альмеро Гарра, ты обвиняешься в убийстве...")));
DelayCommand(12.0, AssignCommand(oGuard1, ActionSpeakString("...в побеге с места преступления, а также в воровстве и пиратстве.")));
DelayCommand(13.0, AssignCommand(oGuard1, ActionSpeakString("Ты будешь заключен в тюрьму, пока суд нашего милосердного правителя не решит твоей участи. Следуй за нами.")));

5. Альмеро может не уметь ходить в другие локи. Поставь поинт в ЭТОЙ локе и после того как он к нему дойдет то отправь его в нужное место.
ActionMoveToObject отличается от ActionForceMoveToObject тем, что если первое действо НПС делает делает делает и бац! Застрял зацепившись за угол. Все. Конец. Акция невыполнена до места он не дошел цепочка порвалась. То вторая функция его отправит туда в принудиловку если он не дошел за контролькное время. По умолчанию там 30 сек. Ясно?

Автор: shadowdweller Aug 1 2007, 23:43

Gennady, спасибо, обязательно учту. Правда, не совсем понятно со счетчиком. Что такое строй, а что такое счетчик? У меня, получается, все перепутано, что ли? Объясняйте мне на пальцах, плз, я не скриптер... sad.gif

Aiwan, я делала все так, как ты описал в статье.
1. Насчет камеры ты зря - я локацию сначала рисовала на бумаге со всеми вейпойнтами, плейсиблами и т.д., и прекрасно видела, как должна быть развернута камера. Другое дело - если проблема в скорости или в недостатке времени на разворот.
Мне нужно, чтобы участников сцены было видно всех по мере того, как они что-то делают. Вейп, куда бежит oRugo, находится от перса в совершенно противоположной стороне, если не вращать камеру, его элементарно не видно.
2. Про oRugo - спасибо. Исправлю. biggrin.gif
3. Т. е. задержку увеличить, я правильно поняла?
5. Ясно.
Спасибо.

Автор: gennady Aug 2 2007, 08:06

Цитата
Gennady, спасибо, обязательно учту. Правда, не совсем понятно со счетчиком. Что такое строй, а что такое счетчик? У меня, получается, все перепутано, что ли? Объясняйте мне на пальцах, плз, я не скриптер...

Shadowdweller, строй акций это имеются ввиду команды, которые мы задаем НПС или герою, записав их ему в стек. Счетчик же работает с того объекта на который мы записываем команды. В вашей сценки это по-видимому будет последний НПС, с которым говорил герой… При его смерти накроются все записи счетчика с командами DelayCommand().
Строй акций в стеке НПС применяем, когда у него на ХБ записано исполнение каких-либо функций, типа ходьбы по точкам и прочего… Очистив стек, записываем акции и блокируем стек функцией:
Neverwinter Script
SetCommandable(FALSE, oNPC); // заблокировать очередь

Для задержки времени, используем акцию:
Neverwinter Script
AssignCommand(oNPC, ActionWait(float fSeconds));

Если же у вас в сценке ничего не прописано на НПС и нет атаки со стороны монстров, то нужно просто использовать запись на счетчик, посредством функции DelayCommand().
И… ActionSpeakString(”…”) тут неуместны, как правильно заметил Айв, это только путает… Просто пишем SpeakString(”…”) и задаем время, когда эта надпись должна появиться. Я тут пытался объяснить начинающим, как строить акции в разделе http://remmgen.narod.ru/tmonster.htmlNPC. Не знаю, доходчиво ли написал…
Для примера, запись через строй акций и счетчик:
Neverwinter Script
void JumpNPC(object oNPC, object oWP)
{
AssignCommand(oNPC, ClearAllActions());
AssignCommand(oNPC, ActionJumpToObject(oWP));
}
void main()
{
object oPC = GetPCSpeaker();
object oDarlan = GetObjectByTag("DARLAN"); // Дарлан, второй хенч - законопослушный.
object oGuard1 = GetObjectByTag("GUARD_1");
object oWGuard1 = GetNearestObjectByTag("W_Guard1"); // лучше использовать в локе Nearest
object oWP = GetObjectByTag("W_Guard2"); // в другой локе
string sSt1, sSt2, sSt3;
float Time = 25.0;
effect ePar  = EffectCutsceneParalyze();

ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oDarlan, Time);
AssignCommand(oGuard1, ActionDoCommand(JumpNPC(oGuard1, oWGuard1)));
AssignCommand(oGuard1, ActionSpeakString(sSt1));
AssignCommand(oGuard1, ActionWait(7.0));
AssignCommand(oGuard1, ActionSpeakString(sSt2));
AssignCommand(oGuard1, ActionWait(7.0));
AssignCommand(oGuard1, ActionSpeakString(sSt3));
AssignCommand(oGuard1, ActionWait(7.0));
// разблокировать очередь
AssignCommand(oGuard1, ActionDoCommand(SetCommandable(TRUE, oGuard1)));
AssignCommand(oGuard1, ActionDoCommand(JumpNPC(oGuard1, oWP)));
DelayCommand(0.1, SetCommandable(FALSE, oGuard1)); // заблокировать очередь
}

Neverwinter Script
void JumpNPC(object oNPC, object oWP)
{
AssignCommand(oNPC, ClearAllActions());
AssignCommand(oNPC, ActionJumpToObject(oWP));
}
void main()
{
object oPC = GetPCSpeaker();
object oDarlan = GetObjectByTag("DARLAN"); // Дарлан, второй хенч - законопослушный.
object oGuard1 = GetObjectByTag("GUARD_1");
object oWGuard1 = GetNearestObjectByTag("W_Guard1"); // лучше использовать в локе Nearest
object oWP = GetObjectByTag("W_Guard2"); // в другой локе
string sSt1, sSt2, sSt3;
float Time = 25.0;
effect ePar  = EffectCutsceneParalyze();

ApplyEffectToObject (DURATION_TYPE_TEMPORARY, ePar, oDarlan, Time);
DelayCommand(0.1, JumpNPC(oGuard1, oWGuard1));
DelayCommand(1.0, AssignCommand(oGuard1, SpeakString(sSt1)));
DelayCommand(8.0, AssignCommand(oGuard1, SpeakString(sSt2)));
DelayCommand(15.0, AssignCommand(oGuard1, SpeakString(sSt3)));
DelayCommand(Time, JumpNPC(oGuard1, oWP));
}

Автор: Aiwan Aug 2 2007, 09:23

2 Ген, не путай ее. Пусть пока учится на задержках делать сценки.
2 Шад. Пришли мне свой модуль я тебе скажу где у тебя затык. На пальцах трудно объяснить и понять что и как.

Автор: shadowdweller Aug 2 2007, 22:56

2 gennady
Кажется, насчет строя и счетчика начинаю понимать, хоть и неясно, в чем у меня ошибка кроме того, что задержки слишком короткие. smile.gif
Ссылка очень полезная, спасиб. smile.gif

2 Aiwan
Ушло.

Автор: Aiwan Aug 10 2007, 17:33

Отправил тебе позавчера назад письмо со сценкой. Жду...

Автор: Topik Aug 30 2007, 19:08

Что сдеся не так?

Neverwinter Script Source
void main()
{
  object oPC = GetLastUsedBy();  // Это герой
  object oObject = ActionJumpToObject("ARMOIRE_01"); // A Jump
  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);

  if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1)
    return;
  {
  SetLocalInt(OBJECT_SELF, "TRIGGER", 1); // Сценка произошла
  SetCutsceneMode(oPC); // режим Cutscene
  AssignCommand(oPC, ClearAllActions()); // Почистим Action РС
  ActionDoCommand(AssignCommand(oPC, ActionMoveToObject(oObject)))
  ActionDoCommand(AssignCommand(oPC, SetCameraFacing(260.0, 19.0, 30.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
  ActionDoCommand(AssignCommand(oPC, ActionWait (3);
  ActionDoCommand(AssignCommand(oPC, SpeakString("Надо одеться!");
  ActionDoCommand(AssignCommand(oPC, ActionWait (4.5);
  ActionDoCommand(AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADIN
, 1.6,1.0)));
  ActionDoCommand(AssignCommand(oPC, SpeakString("Где мой трусы!");
  ActionDoCommand(AssignCommand(oNPC, ActionDoCommand(SetCutsceneMode(oPC, FALSE))))
{

Автор: Lex Aug 30 2007, 20:39

чтобы получить нормальный ответ, нужно задать нормально вопрос? Довольно простая истина, не кажется?
Где скрипт стоит?
Что в игре получается, когда запускается скрипт?
Что хотел автор, когда писал скрипт?
Наши форумные телепаты все в отпуске, так что придется (ах, какая досада) утрудить себя постановкой вопроса.

Навскидку могу только сказать, что
- Фразы тут все выдадутся разом, а не как надо бы, по мере выполнения анимации. Чтобы было как надо, надо использовать ActionSpeakString.
- ActionDoCommand тут не к месту
- нет синхронизации между действиями НПС и действиями ИГРОКА - они одновременно все делают.
- снятие эффекта катсцены не корректное. Те сниматься она по идее будет почти сразу (через 1 секунду, как закончится анимация)

Автор: gennady Aug 31 2007, 06:33

Neverwinter Script Source
void main()
{
  object oPC = GetLastUsedBy();  // Это герой
  /* Наверное, имелся в виду тэг объекта?
     Иначе просто бред…*/

  object oObject = GetObjectByTag("ARMOIRE_01"); // A Jump
  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);

  if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1)
    return;

  SetLocalInt(OBJECT_SELF, "TRIGGER", 1); // Сценка произошла
  SetCutsceneMode(oPC); // режим Cutscene
  AssignCommand(oPC, ClearAllActions()); // Почистим Action РС
  /* Лучше использовать прыжок, на случай зависания сценки
     По умолчанию прыжок будет через 30 секунд, но время можно и задать... */

  AssignCommand(oPC, ActionForceMoveToObject(oObject));
  AssignCommand(oPC, ActionDoCommand(SetCameraFacing(260.0,19.0,30.0,CAMERA_TRANSITION_TYPE_MEDIUM)));
  AssignCommand(oPC, ActionWait(3.0));
  AssignCommand(oPC, ActionSpeakString("Надо одеться!"));
  AssignCommand(oPC, ActionWait(4.5));
  AssignCommand(oPC, ActionPlayAnimation
  (ANIMATION_LOOPING_TALK_PLEADING, 1.0, 1.6));
  AssignCommand(oPC, ActionSpeakString("Где мой трусы!"));
  AssignCommand(oPC, ActionDoCommand(SetCutsceneMode(oPC, FALSE)));
}

P.S. Вообще то скрипты нужно компилировать, иначе они не будут работать. (Первая верхняя кнопочка в левом углу редактора или жми кнопку F7). При компиляции редактор выдает ошибки и показывает строку и комментарий ошибки. По всей видимости объект oNPC не участвует в сценке, и все действие прописано для ГГ… Обратите внимание на число скобок в строке, должно быть равное количество открывающихся и закрывающихся скобок.

2 P.S. Айв, Нео, что-то в IE невозможно отредактировать пост, выбивае полность браузер с запросом отправки сообщения об ошибке... Плюс режет знаки если длинная строка. Например пропала буква в инте анимации, пришлось править перенос строки...

3 P.S. Сразу не догнал. но строй акций нужно стоить на РС, т.к. он является исполнителем, а не изабельный плейс…Скрипт поправил…
Айв, плюс менюшка быстрая или полная редакция не вылазит…

Автор: Aiwan Aug 31 2007, 07:58

Цитата(gennady @ Aug 31 2007, 09:33) *
2 P.S. Айв, Нео, что-то в IE невозможможно отредактировать пост, выбивае полность браузер с запросом отправки сообщения об ошибке... Плюс режит знаки если длинная строка. Например пропала буква в инте анимации, пришлось править перенос строки...

Скорее всего это либо глюк IE либо привет IPS... nea.gif

Автор: ZipovUA Feb 9 2008, 12:05

знаю, что повторюсь но все-таки:

мне нужно было, чтобы один персонаж подошел к другому, они перебросились бы парой фраз и второй персонаж присоиденился бы к первому.

(первый - это само собой главный персонаж)


писал

Код
void main
{
  object oPC=GetFirstPC();
  object oNPC=GetObjectByTag('SomePerc');
  
  //виполняем движения и диалоги
----------------------------------------
// само присоединение функцией
// Add oPC to oPartyLeader's party.  This will only work on two PCs.
// - oPC: player to add to a party
// - oPartyLeader: player already in the party
//void AddToParty(object oPC, object oPartyLeader)

AddToPary(oNPC, oPC);// oNPC не присоединяеться :(
}


но NPC принципиально не присоединяется. Подскажите пожалуйста, что делать и как присоединить непися в команду?....

2ой вопрос:
мне нужно добавить ефектности в сцену. А именно: я бы хотел, чтобы когда наш персонаж стреляет из лука (в сцене, а не в игре), создался об"ект "стрела", к нему привязалась камера (чтобы зритель прочуствувал полёт стрелы smile.gif ) и когда стрела поразила бы цель камера вернулась бы к игроку.....

Так как привязать камеру к стреле напрямую невозможно, мы привязуем стрелу к персонажу и перемещаем персонаж

итак:
1) каким то образом нужно зделать об"ект "стрела" (уменьшеное копье ?)
2) надобно запомнить место, откуда мы взяли персонажа
3) зделать персонажа невидимым
4) привязать персонажа к "стреле"
5) камеру максимально приблизить к "стреле"
6) в цикле (или функцией) передвигать стрелу (и персонажа с камерой соответственно)
7) когда стрела попадает в противника, смотрим ефект падения и смерти.
8) "убиваем" об"ект "стрела"
9) персонажа и камеру возвращаем на предидущее место.


Умом я это понимаю, но не понимаю как это написать.... sad.gif

Подскажите пожалуйста....

Автор: ZipovUA Feb 22 2008, 13:28

Узнал ответ на первый вопрос. Оказывается для того, чтобы забросить NPC в команду к вашему персонажу необходимо писать команду не

AddToParty, а AddHenchman - и тогда всё работает отлично smile.gif

Автор: Aiwan Feb 22 2008, 20:53

1. Никак, только если есть стрела в виде объекта.
2. В начале катсцены запомни то место, где стоял РС так:

Neverwinter Script
SetLocalLocation(oPC, "CUTSCENE_START", GetLocation(oPC));
// тут катсцена

// Так его можно вернуть в исходную точку.
DelayCommand(161.2, AssignCommand(oPC, JumpToLocation(GetLocalLocation(oPC, "CUTSCENE_START"))));


3.
Neverwinter Script
object oCreature = GetObjectByTag("TAG_NPC");
      effect eInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
      ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInv, oCreature);


4. biggrin.gif
5. Функция SetCameraFacing. Почитай ее описание в редакторе скриптов или в Лексиконе.
6. Передвигать объект можно только такими способами: а) Если он плейсебл то удалил в точке А создал в точке Б. Либо, копируем его в точку Б удаляя из точки А. б) Если стрела == объект существо, то она идет по точкам от А до Б.
7. Простое поврежедение от лука. Другого нет и не может быть. Любая анимация вшита в движок. Рисовать в 3Дмаксе твою стрелу из за одной сценки утопия.
8. Ответил в первом пункте.

Автор: NorthWest Feb 22 2008, 22:00

Цитата
1) каким то образом нужно зделать об"ект "стрела" (уменьшеное копье ?)
2) надобно запомнить место, откуда мы взяли персонажа
3) зделать персонажа невидимым
4) привязать персонажа к "стреле"
5) камеру максимально приблизить к "стреле"
6) в цикле (или функцией) передвигать стрелу (и персонажа с камерой соответственно)
7) когда стрела попадает в противника, смотрим ефект падения и смерти.
8) "убиваем" об"ект "стрела"
9) персонажа и камеру возвращаем на предидущее место.


Самый простой вариант, какой приходит в голову - это сделать все с невидимыми объектами БЕЗ СТРЕЛЫ, а потом стрелу отдельно заанимировать и добавить через нелинейный монтаж, затем сам ролик внедрить как BIC файл.

Автор: azathoth Feb 23 2008, 08:11

затем сам ролик внедрить как BIC файл.
только после такого ролика прийдётся завершать модуль mosking.gif

а вообще пункты 3-6 можно заменить на "превратить персонажа в стрелу" (см. SetCreatureAppearance(...) или как-то так).

нарисовать и вставить стрелу не так уж сложно, но только если знать макс и техннику нвн.

вопщем лучше сделать выстрел из лука на красивой декорации с красивого ракурса чем маятся неделями над одной сценой, например из-за плеча героя неплохо выстрел выглядит.

Автор: Aiwan Feb 23 2008, 09:42

Подведу итог сказанному. Не парься с такими вещами, игрок не заметит ничего. Ты потратишь пару месяцев на ролик который идет 1 минута.
Самое простое сделать так - всплывающий текст или диалог. "Игрок нагнулся и увидел на земле лежащую стрелу. Внимательно изучив надписи на основании он прочитал текст: "Дружище, не парься, сделай все проще. Дядюшка Айван".

Автор: Leon PRO Feb 23 2008, 13:52

offtopic.gif Игрок опустил глаза и увидел в своём теле стрелу. Внимательно изучив надписи на основании он прочитал текст: "Дружище, не парься, сделай все проще. Дядюшка Айван" biggrin.gif

Автор: ZipovUA Mar 19 2008, 12:59

Добрый день

Пожалуйста, помогите розобраться с ситуацией.

У меня при использовании функции SetCameraFacing (Строка скопирована из первого примера), камера почему-то упирается в ноги игроку wacko.gif

Менял ростаяние. Без толку. Как думаете, что можна сделать?

Автор: Белатрис Mar 19 2008, 13:18

Я в своё время копировал отсюда же, не было никаких проблем!

Neverwinter Script
AssignCommand(GetFirstPC(), SetCameraFacing(x.x, x.x, x.x, CAMERA_TRANSITION_TYPE_MEDIUM));

Вместо x.x своё значение, естественно.

Автор: Raman Jun 24 2008, 23:07

У меня в ролике получился ляп, которыя я почему-то никак не могу устранить.
Задумка: Герой сидит в тюремной камере, открывается дверь. В дверь входит NPC, подходит к герою и начинается диалог.
Проблема: NPC всегда входит в дверь ЗАДОМ, разворачиваясь уже по дороге к герою. sad.gif

Neverwinter Script
void main()
{
object oPC = GetEnteringObject();
object oDoor = GetObjectByTag("AM_DOOR_START");
object oNPC = GetObjectByTag("NPC_01");
object oWPpc = GetWaypointByTag("WP_PC_01");
object oWPconv = GetWaypointByTag("WP_BARS");

  {
  SetCutsceneMode(oPC);
  AssignCommand(oNPC, ClearAllActions());
  AssignCommand(oPC, ClearAllActions());
  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(2.0);
  ActionDoCommand(AssignCommand(oNPC, ActionJumpToObject(oDoor)));
  ActionDoCommand(AssignCommand(oNPC, SetFacingPoint(GetPosition(oPC))));
  ActionWait(3.0);
  ActionDoCommand(AssignCommand(oNPC, PlayVoiceChat(VOICE_CHAT_HELLO)));
  ActionDoCommand(AssignCommand(oNPC, SpeakString("Приветствую!")));
  ActionWait(0.5);
  ActionDoCommand(AssignCommand(oPC, SetCameraFacing(280.0, 7.0, 45.0, CAMERA_TRANSITION_TYPE_VERY_SLOW)));
  ActionWait(0.5);
  ActionDoCommand(AssignCommand(oNPC, ActionMoveToObject(oWPconv)));
  ActionDoCommand(AssignCommand(oNPC, ActionDoCommand(SetCutsceneMode(oPC, FALSE))));
  ActionDoCommand(AssignCommand(oNPC, ActionStartConversation(oPC)));
  }

}


Как заставить его войти по-человечески? biggrin.gif

Автор: Aiwan Jun 25 2008, 09:58

Очень просто. Поставь поинт перед дверью и джампай его на поинт а не в дверь.

Neverwinter Script
object oWPspawn = GetWaypointByTag("WP_NPC_SPAWN");
ActionDoCommand(AssignCommand(oNPC, ActionJumpToObject(oWPspawn)));



Если опять жопой прыгнет, то разверни поинт. Если всеравно будет так же, то скорее всего у твоего НПС скрипты работают и заставляют его куда то идти. А он ищет выход, получив команды он все стирает и делате твой ролик дальше.

Автор: Raman Jun 25 2008, 17:10

Спасибо. Все встало на свои места. yahoo.gif Только он теперь приветствие не говорит. Или говорит, но еще до того как входит в комнату crazy.gif . Но это уже мелочи.

Автор: Raman Jun 27 2008, 20:02

Теперь и они устранены biggrin.gif

Автор: Ksanatos Oct 13 2008, 14:07

Я тут недавно , может это и не в тему , кто знает скрипт чтоб воскрешение отменить, что бы в модуле только загружаться можно было?

Автор: Xfans Nov 14 2008, 22:29

Спасибо всем, кто тут объяснял, что к чему! Единственная вещь, которая у нас так и не получается - это замедление РС swoon.gif Уже и так его, и сяк, а оно все свое толдычит "Immune to Slow"! Пытались уже даже убрать на время эффект иммунитета с РС, но такое чувство, что оно ваще не реагирует ни на что. Откуда например у визарда первого уровня взяться этому иммунитету? Получается, что это никак не возможно?! Вот мы тута пытались таким образом сделать:

Neverwinter Script
if (GetIsImmune(oPC,IMMUNITY_TYPE_MOVEMENT_SPEED_DECR
EASE))
        {
        CutRemoveEffects(0.1,oPC,TRUE);
        }

ну и там далее - наложить эффект торможения и все такое... Что тут можно сделать? scratch_one-s_head.gif

Автор: Aiwan Nov 27 2008, 22:50

Neverwinter Script
effect eSlow = EffectSlow();
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSlow, oPC);

Так мы с ДБом паравоз останавливали smile.gif Давно это было...

Автор: Xfans Jan 14 2009, 15:03

Пожалуйста, посмотрите скрипт и скажите в чем ошибка. Проблема в том, что некоторые НПС, которые должны атаковать невидимый объект, тормозят и вместо положенных 2-3 секунд на начало атаки, стоят, как пни в лесу, почти до конца катсцены. unsure.gif

Neverwinter Script
#include "x2_inc_cutscene"
#include "nw_i0_generic"
#include "x2_inc_globals"

int nCutsceneNumber = 1804;

void main()
{
object oPC = GetLastAttacker();
  object oMonk1 = GetObjectByTag("Monk1");
    object oMonk2 = GetObjectByTag("Monk2");
    object oMonk3 = GetObjectByTag("Monk3");
    object oMonk6 = GetObjectByTag("Monk6");
    object oMonk5 = GetObjectByTag("Monk5");
    object oMonk4 = GetObjectByTag("Monk4");


    object oInvis = GetObjectByTag("hit");

object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC);
object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC);
object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC);
object oHench = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
object oHench2 = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC,2);
object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC);

object oWP1 = GetObjectByTag("WP_PC");
object oWP2 = GetObjectByTag("WP_ACC");

effect eCutPar = EffectCutsceneParalyze();
effect eInvis = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);

if (GetIsPC(oPC))
{
    FadeToBlack(oPC, FADE_SPEED_FASTEST);

  AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC,ActionJumpToObject(oWP1,TRUE));

    SetCutsceneMode(oPC);

DelayCommand(0.1,AssignCommand(oAnimal,ActionJumpToObject(oWP2,TRUE)));
DelayCommand(0.2,AssignCommand(oDominated,ActionJumpToObject(oWP2,TRUE)));
DelayCommand(0.3,AssignCommand(oFamiliar,ActionJumpToObject(oWP2,TRUE)));
DelayCommand(0.4,AssignCommand(oHench,ActionJumpToObject(oWP2,TRUE)));
DelayCommand(0.5,AssignCommand(oHench2,ActionJumpToObject(oWP2,TRUE)));
DelayCommand(0.6,AssignCommand(oSummoned,ActionJumpToObject(oWP2,TRUE)));

        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCutPar, oAnimal);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCutPar, oHench);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCutPar, oHench2);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCutPar, oDominated);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCutPar, oFamiliar);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCutPar, oSummoned);

        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oAnimal);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oHench);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oHench2);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oDominated);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oFamiliar);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oSummoned);




    DelayCommand(1.4, AssignCommand(oPC, SetCameraFacing(270.0, 15.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP)));
    DelayCommand(1.6, FadeFromBlack(oPC, FADE_SPEED_FASTEST));
      CutActionAttack(1.7,oMonk1,oInvis,FALSE,FALSE);
    CutPlayAnimation(1.8, oPC,ANIMATION_FIREFORGET_DODGE_DUCK,0.4,FALSE);
      CutActionAttack(1.9,oMonk2,oInvis,FALSE,FALSE);
      CutPlayAnimation(2.0, oPC,ANIMATION_FIREFORGET_DODGE_SIDE,0.4,FALSE);
      CutActionAttack(2.1,oMonk3,oInvis,FALSE,FALSE);
      CutPlayAnimation(2.2, oPC,ANIMATION_FIREFORGET_DODGE_DUCK,0.4,FALSE);
      CutActionAttack(2.3,oMonk4,oInvis,FALSE,FALSE);
    CutPlayAnimation(2.5, oPC,ANIMATION_LOOPING_DEAD_FRONT,20.5,FALSE);
      CutActionAttack(2.6,oMonk5,oInvis,FALSE,FALSE);
      CutActionAttack(2.7,oMonk6,oInvis,FALSE,FALSE);


    DelayCommand(29.9,FadeToBlack(oPC, FADE_SPEED_MEDIUM));
    DelayCommand(30.9,EndGame(""));
}
}

Автор: Topik Mar 26 2009, 22:54

Здравствуйте! Подскажите пожалуйста, что здесь не так?

Neverwinter Script
void main()
{
object oPC = GetEnteringObject();
object oBoss = GetObjectByTag("gw_ninja_boss");
object oNpc1 = GetObjectByTag("gw_ninja");
object oNpc2 = GetObjectByTag("gw_ninja02");
object oWp1 = GetWaypointByTag("gw_waypoint01");
if(GetIsPC(oPC) && !GetLocalInt(OBJECT_SELF, "TRIGGER"))
{
     FadeToBlack(oPC, FADE_SPEED_FASTEST);
     SetCutsceneMode(oPC, TRUE);
     SetLocalInt(OBJECT_SELF, "TRIGGER", TRUE);
     SetLocalInt(oPC, "CUTSCENEMOD", TRUE);
     SetAILevel(oBoss, AI_LEVEL_HIGH);
     SetAILevel(oNpc1, AI_LEVEL_HIGH);
     SetAILevel(oNpc2, AI_LEVEL_HIGH);
     AddCutEffects(oBoss);
     AddCutEffects(oNpc1);
     AddCutEffects(oNpc2);

     DelayCommand(1.0, AssignCommand(oPC, SetCameraFacing(45.0, 25.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP)));
     DelayCommand(1.0, AssignCommand(oPC, ActionMoveToObject(oWp1, FALSE, 1.0)));
     DelayCommand(2.0, AssignCommand(oPC, SpeakString("Здесь что-то не так!")));
     DelayCommand(3.0, RemoveCutEffects(oBoss, TRUE));
     DelayCommand(3.0, RemoveCutEffects(oNpc1, TRUE));
     DelayCommand(3.0, RemoveCutEffects(oNpc2, TRUE));
     DelayCommand(3.10, AssignCommand(oPC, SpeakString("Что!?")));
     DelayCommand(3.10, AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPosition(oBoss))
)));
     DelayCommand(3.20, AssignCommand(oPC, SpeakString("Это он!")));
     DelayCommand(3.10, AssignCommand(oBoss, ActionDoCommand(SetFacingPoint(GetPosition(oPC))))
);
     DelayCommand(3.40, AssignCommand(oWolf3, ActionForceMoveToObject(oPC, TRUE, 3.0)));
     DelayCommand(4.0, AssignCommand(oBoss, ActionAttack(oPC)));
     DelayCommand(4.10, AssignCommand(oPC, PlayAnimation(ANIMATION_DEAD_BACK, 0.5, 30.0)));
     DelayCommand(4.50, AssignCommand(oBoss, PlayAnimation(ANIMATION_LOOPING_GET_LOW, 0.5, 30.0)));
     DelayCommand(5.0, AssignCommand(oPC, SpeakString("Берем его и уходим!")));
     DelayCommand(5.0, AssignCommand(oNpc1, ActionMoveToObject(oPC, FALSE, 1.0)));
     DelayCommand(5.0, AssignCommand(oNpc2, ActionMoveToObject(oPC, FALSE, 1.0)));
     DelayCommand(5.0, AssignCommand(oPC, ClearAllActions()));
     DelayCommand(5.50, AssignCommand(oPC, JumpToObject(GetWaypointByTag("gw_waypoint_iruko01"))));
     DelayCommand(5.53, SetXP(oPC, 10000));
     DelayCommand(6.0, DestroyObject(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC)));
     CreateQuest("gw_ninja_quest", TRUE);

}

Автор: Aiwan Mar 29 2009, 09:37

* Напрягаю свои телепатические свойства * *ПУК*

Парень, у тебя может быть ВСЕ не так. У тебя может быть 10 одинаковых вейпоинтов и НПС по ним не идут. У тебя может быть туева хуча разных МОЖЕТ БЫТЬ которые видно ТОЛЬКО у тебя при просмотре скриптовой сцены. Твое сообщение что-то типа куска кода на форуме: Чуваки пишу прогу, но что-то нихера не пашет. Че не так?

КАК МИНИМУМ мы должны знать, а что ты ВООБЩЕ хотел сделать? И ЧТО НЕ ТАК ВООБЩЕ?


Автор: wirTUS Jun 18 2010, 12:00

Здравствуйте, я тут новенький. Вчера нашёл эту тему и начал активно пытаться наклепать что-нибудь прямо работающее.
Первый скрипт получился и работает отлично

Neverwinter Script
void main()
{
object oPC = GetEnteringObject();
object oDoor = GetObjectByTag("toggm");
object oNPC = GetObjectByTag("Guardian");
object oWPpc = GetWaypointByTag("start_cut_scene");
object oWPnpc = GetWaypointByTag("cutscene1_01");

if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1)
    return;
   {
   SetLocalInt(OBJECT_SELF, "TRIGGER", 1);
   SetCutsceneMode(oPC);
   AssignCommand(oNPC, ClearAllActions());
   AssignCommand(oPC, ClearAllActions());

   ActionDoCommand(AssignCommand(oPC, ActionMoveToObject(oWPpc)));
   ActionDoCommand(AssignCommand(oPC, SetFacingPoint(GetPosition(oNPC))));
   ActionDoCommand(AssignCommand(oPC, SetCameraFacing(115.0f, 15.0, 50.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
   ActionWait(3.5);
   ActionDoCommand(AssignCommand(oNPC, ActionMoveToObject(oWPnpc)));
   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("Hey!")));
   ActionDoCommand(AssignCommand(oPC, SetCameraFacing(115.0f, 7.0, 50.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)));
   }
}


А во втором что-то барахлит. Во-первых, в 11 строчке при сохранении он пишет ошибку "ERROR: PARSING VARIABLE LIST"
Во-вторых, при входе в триггер ПК бежит задом (ну, смотря как войти) к oWPpc из первого скрипта.
Пытался исправить
Neverwinter Script
object oWPPC = GetWaypountByTag("PCP");
DelayCommand(0.0 ,AssignCommand(oPC, ActionMoveToObject(oWPPC)))

Непомогло.
Начальная задумка-ПК увидел дерущуюся толпу, проигрываются фразы, ПК убивает выбежавшего, оббирает, справа подходит чувак и начинается диалогю
Neverwinter Script
void main()
{
object oPC = GetEnteringObject();
object oNPCs1 = GetObjectByTag("Pervert");
object oNPCs2 = GetObjectByTag("Pervert2");
object oNPC1 = GetObjectByTag("Smartpervert");
object oSIR = GetObjectByTag("Sir");
object oITEM = GetObjectByTag("Ladyscloth");
object oWPnpc1 = GetWaypointByTag("SPwp");
object oWPSIR = GetWaypointByTag("sirWP");

  if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1)
    return;
   {
   SetLocalInt(OBJECT_SELF, "TRIGGER", 1);
   SetCutsceneMode(oPC);
   AssignCommand(oNPC, ClearAllActions());
   AssignCommand(oPC, ClearAllActions());
  DelayCommand(0.0 ,AssignCommand(oPC, SetCameraFacing(115.0f, 15.0, 50.0,

CAMERA_TRANSITION_TYPE_MEDIUM)));
PC, SpeakString("You see crowd of perverts that steal lady's cloth and fight for it now"));
   DelayCommand(3.0 ,AssignCommand(oNPCs1, SpeakString("It's my! It's my!")));
   DelayCommand(5.0 ,AssignCommand(oNPCs2, SpeakString("NO! It's my!")));
   DelayCommand(7.0 ,AssignCommand(oNPC1, SpeakString("I have it! Ow it smell awesome...")));
   DelayCommand(9.5 ,AssignCommand(oNPCs1, SpeakString("Catch him!")));
   DelayCommand(9.5 ,AssignCommand(oNPCs2, SpeakString("Catch him!")));
   DelayCommand(10.9 ,AssignCommand(oNPCs1, SetFacingPoint(GetPosition(oNPC1))));
   DelayCommand(10.9 ,AssignCommand(oNPCs2, SetFacingPoint(GetPosition(oNPC1))));
   DelayCommand(11.1 ,AssignCommand(oNPC1, SpeakString("AAAAAAAAAAAAAAAAAA!")));
   DelayCommand(12.0 ,AssignCommand(oNPC1, ActionMoveToObject(oWPnpc1)));
   DelayCommand(14.0 ,AssignCommand(oNPC1, SetFacingPoint(GetPosition(oPC))));
   DelayCommand(14.5 ,AssignCommand(oNPC1, SpeakString("What are you doing?!)));
   DelayCommand(15.0 ,AssignCommand(oPC, ActionAttack(oNPC1)
   DelayCommand(15.2 ,AssignCommand(oNPC1, EffectDeath(int nSpectacularDeath=TRUE))
   DelayCommand(16.5 ,AssignCommand(oPC, ActionPlayAnimation(Steal)
   ActionGiveItem(oItem, oPC)
   DelayCommand(14.0 ,AssignCommand(oSir, ActionMoveToObject(oWPSIR)));
   DelayCommand(17.0 ,AssignCommand(oNPCs2, SetFacingPoint(GetPosition(oPC))));
   ActionDoCommand(AssignCommand(oNPCs1, ActionDoCommand(SetCutsceneMode(oPC, FALSE))));
   ActionDoCommand(AssignCommand(oNPCs1, ActionStartConversation(oSIR)));
   }
}

Автор: Aiwan Jun 23 2010, 21:42

Цитата(wirTUS @ Jun 18 2010, 14:00) *
А во втором что-то барахлит. Во-первых, в 11 строчке при сохранении он пишет ошибку "ERROR: PARSING VARIABLE LIST"

И что там написано? Дай свою 11 строку из скрипта в тулсете.
Вот это что за высер мозга? PC, SpeakString("You see crowd of perverts that steal lady's cloth and fight for it now")); Замени на DelayCommand(2.0 ,AssignCommand(oPC, SpeakString("You see crowd of perverts that steal lady's cloth and fight for it now")));.
Что бы камера не скакала убери DelayCommand(0.0 ,AssignCommand(oPC, SetCameraFacing(115.0f, 15.0, 50.0, CAMERA_TRANSITION_TYPE_MEDIUM)));, а если хочется ей научиться пользоваться, то меняй значения в функции и так поймешь при каком раскладе в какую сторону она двигается.
Цитата(wirTUS @ Jun 18 2010, 14:00) *
Во-вторых, при входе в триггер ПК бежит задом (ну, смотря как войти) к oWPpc из первого скрипта.

Научись всем объектам давать уникальные теги в скриптовых сценах. Задом РС мог идти не только к вейпоинту, но и в другую локацию к другому объекту с таким тегом.
И кто такой ПК? Персональный компьютер?

Автор: Baal Jun 26 2010, 22:22

Neverwinter Script
DelayCommand(14.5 ,AssignCommand(oNPC1, SpeakString("What are you doing?!)));


[5kopeek]
declare.gif И еще кавычки пропущены rolleyes.gif
[/5kopeek]

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)