Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопросы новичков
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Lex
можно поменять соотв. 2да (restduration) - время реста берется оттуда согласно уровню игрока.
Esidor
Что неверно в этом скрипте?
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Проверка харизмы игрока >= 16
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 18.09.2005
//:://////////////////////////////////////////////
int StartingConditional()
{
    if(GetAbilityScore(GetPCSpeaker(), ABILITY_WISDOM) >= 5)
        return TRUE;

    return FALSE;
}


Я проверял в игре, но 0 эффекта. Это в диалоге. НПС говорит.
Dik Morris
Что неверно? Ну, например, комментарии не соответствуют самому скрипту smile.gif.

Штатными средствами, очень трудно установить значение WIS до пяти и ниже. Эффекты или вещи.
Тогда при стандартном раскладе, текст у тебя будет появляться всегда, учти.

А по поводу "эффекта 0". Так ты, я думаю, не знаешь чего хочешь. Этот скрипт, проверят значение характеристики мудрость, у игрока. Если оно больше, или равно пяти, то NPC начинает диалог (появляется нужная строка). Ставится код, на эвент "Текст появляется при:", в диалоге. Рабочий (во всяком случае, никаких причин для того чтобы он не работал, я не вижу).
Lex
Цитата(Esidor @ Jun 23 2007, 07:52) [snapback]109839[/snapback]
Я проверял в игре, но 0 эффекта. Это в диалоге. НПС говорит.

конкретнее, где стоит и как. Накидай упрощенную схему диаплога типа так:
======
Фраза игрока
-- Фраза НПС 1 (с этим скриптом в "text appears when")
-- Фраза НПС 2 (без скрипта)
======
Ибо скорее всего ты банально ошибся в построении диалога.
gennady
Цитата(Esidor @ Jun 23 2007, 07:52) [snapback]109839[/snapback]
Что неверно в этом скрипте?


Esidor, чтобы написать банальный скрипт, достаточно просто запустить мастер скрипта, расположенный в редакторе диалога (такая кнопка с красной шляпой)... Выбрав нужные проверки или действия, достаточно просто скомпилировать полученный скрипт для его работы в игре. Вот пример скрипта составленного при помощи мастера скрипта:
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: FileName sc_001
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Script Wizard
//:: Created On: 24.06.2007 11:59:24
//:://////////////////////////////////////////////
int StartingConditional()
{
    if(!(GetAbilityScore(GetPCSpeaker(), ABILITY_WISDOM) > 15))
        return FALSE;

    return TRUE;
}

P.S. Мастер сприпта прост в управление, поэтому инструкций по его использованию я нигде не видел...
shadowdweller
Мучает меня вопрос - можно ли сделать в диалоге проверку на имя перса, чтобы определенная ветка запускалась в зависимости от имени героя? scratch_one-s_head.gif
Lex
Цитата(shadowdweller @ Jun 25 2007, 14:16) [snapback]109869[/snapback]
Мучает меня вопрос - можно ли сделать в диалоге проверку на имя перса, чтобы определенная ветка запускалась в зависимости от имени героя?

можно.
Neverwinter Script Source
int StartingConditional()
{
return GetName(GetPCSpeaker())=="Lex";
}

ставим скрипт на ту строку, на которой мне должны дать крутую плюшку:

= Фраза игрока
== Фраза НПС с бонусом для меня. (на эту строку скрипт в text appears when)
== Фраза НПС для остальных игроков-неудачников
Teranozavr_REX
QUOTE(Dik Morris @ Jun 22 2007, 17:55) [snapback]109825[/snapback]
2 Teranozavr_REX, ну можно это реализовать, используя солянку функций:
Первым делом, налаживать черный экран, затем ждать две секунды, и использовать ForceRest (мгновенный отдых), потом собственно снимать экран (не беру в учет анимацию и т.д, именно ядро).

Думаю такой вариант подойдет.


ForceRest я уже нашел проблема скорее в том что не могу найти слот для установки скрипта и\или определить object который отдыхает ибо юзал OBJECT_SELF
пробовал свойства модуля -> события -> OnPlayerRest ставить
Neverwinter Script Source
ForceRest (OBJECT_SELF);

предварительно убрав все чтотам есть
чар как спал так и спал и никаких изменений не произошло((


Aiwan
Ну конечно не произойдет ничего.
Neverwinter Script Source
object oPC = GetLastPCRested();
virusman
Напомню: OBJECT_SELF в любом эвенте - это тот объект, к которому этот эвент привязан. OnPlayerRest - модульный эвент, поэтому OBJECT_SELF в нём - модуль.
Teranozavr_REX
Пааасибо то чтонадо для тест модуля мгновенный сон
а то тесты 40 чаров кастеров очень утомительны тем чтоприходиться ждатьпока оно выспиться ))
gennady
Teranozavr_REX, ты все правильно делаешь, нужно прописать модульные свойства и то, что ты хочешь от отдыха… Вот тебе в помощь маленькая болванка скрипта отдыха:
Neverwinter Script Source
//::////////////////////////
//:: Слот: OnPlayerRest
//::////////////////////////
void main()
{
object oPC = GetFirstPC();
int iTH = GetTimeHour();

///////////////////////////    START      /////////////////////////////////////
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
{
  SetCommandable(FALSE, oPC); // заблокировать очередь
  DelayCommand(4.0, FadeToBlack(oPC, FADE_SPEED_SLOW)); // Занавес из черного экрана
  DelayCommand(18.0, FadeFromBlack(oPC, FADE_SPEED_SLOW)); // Уберем занавес
}
//////////////////////////////    FINISH    ///////////////////////////////////
if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED)
  {
  iTH = iTH+1;
  SetTime(iTH,0,0,0);
  SendMessageToPC(oPC, "Вы отдыхали 1 час.");
  SetCommandable(TRUE, oPC); // разблокировать очередь
  }
}


Dik Morris
2 Teranozavr_REX, на будущее. Что бы знать какую использовать функцию в той или иной ситуации, будь то инициализация игрока, аль просто нужная операция, проще всего - заглянуть в Лексикон. Там они подробно рассортированы, каждая функция, к каждому эвенту. Можно так же прописать в фильтре, непосредственно в самом тулсете. Скажем, нужна операция с дверью, прописываешь Door, выдаст список ф-ций с таким элементом в своем названии.

PS: gennady еще бы знать для чего? ForceRest(GetLastPCRested()); - а для тестового модуля, ничего больше и не нужно.
Teranozavr_REX
Я могу запустить скрипт что висит на обжекте на заданом слоте если не знаю его имя (имя скрипта)???
Lex
все что ты можешь - запустить скрипт, зная его имя
ExecuteScript функция называется. Причем там можно указать объект, для которого он будет запущен.
Teranozavr_REX
QUOTE(Lex @ Jul 5 2007, 13:25) [snapback]110284[/snapback]
все что ты можешь - запустить скрипт, зная его имя
ExecuteScript функция называется. Причем там можно указать объект, для которого он будет запущен.

Этоя знаю
Этим и пользуюсь только приходиться еще несколько строчек кода добалятьчто бы тем или иным способов выяснитьимя скрипта думал может что естьчто бы на прямую запустить
сам не нашел вот вас решил спросить
нет так нет значит буду через ExecuteScript запускать
Teranozavr_REX
Neverwinter Script Source
SummonAnimalCompanion();


Вызывает барсучка(, если в биолде есть друид.
Как вызвать паука или мишку ???
Loki87
Если верить описанию форума здесь мне ответят на любой вопрос. Вобщем я в создании модулей полный чайник. не могу разобраться со скриптами. мне просто надо было чтоб после определенного диалога в кое каком месте появлялся определенный НПС, нашел вроде как делается мол через effect appear а вот только че писать в саму строку редактора скриптов - понял. и почему некоторые надписи синие? Люди вы уж извините если вопросы тупые, просто я читал все эти мануалы - нифига там ненаписано. а в теме про скрипты все на непонятном мне языке. все таки тема для тупых вопросов. вобщем помогите разобраться.
Lex
мдя.. излагайте вопросы более структурировано, будет проще.
- в редакторе синим подсвечиваются зарезервированные слова (типы данных, логические операторы и тд)
- нужный вам скрипт состоит из пары сток. Поможет если его тут напишут, или таки хотите сами разобраться?
- если с английским нет проблем, советую почитать мануалы по скриптам, которые есть в Lexicon'е. Если с английским туго, на www.wrg.ru в разделе файлов есть частичные переводы лексикона, где как раз общие положения по скриптам и данным переведены.
Aiwan
Loki87, дружище. Скрипты это язык. Не зная иностранного языка петь песенки и сочинять стихи довольно сложновато.

Вот примерный расклад как должно быть, если РС разговаривает и хочешь ты что бы к ним неожиданно вошел другой НПС и подключился к разшговору. Все не проверял но сама идея должна быть такой.
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 22.04.2005
//:://////////////////////////////////////////////

void main()
{
    object oPC = GetPCSpeaker(); // Берем РС ведущего диалог

    object oNPC = GetObjectByTag("ТАГ_ТВОЕГО_НПС");
    //Берем ближайшего НПС с Тегом "ТАГ_ТВОЕГО_НПС", он должен быть в другой локации.

    object oWp = GetWaypointByTag("WP_SPAWN_NPC_01");
    // Это мы ставим вейпоинт недалеко от двери, что бы НПС появился как бы из нее.

    if (!GetIsObjectValid(oNPC)) return; // Если НПС не существует такого то тоже
    if (GetIsEnemy(oNPC, oPC)) return; // Если РС и НПС враги то ничего не будет

    if (GetObjectType(oNPC)!=OBJECT_TYPE_CREATURE) return;
    // Если таг НПСты спутал и он не существо, а например дверь...

    AssignCommand(oPC, ClearAllActions()); // говорим РС забудь все что хотел делать
    AssignCommand(oPC, ActionPauseConversation()); // Ставим паузу в разговоре
    AssignCommand(oNPC, ClearAllActions()); // Чистим стек команд у НПС

    AssignCommand(oNPC, JumpToLocation(GetLocation(oWp)));
    // Отправляем его в точку появления в таверне у двери

    AssignCommand(oNPC, ActionForceMoveToObject(oPC, FALSE)); // Направляем ПЕШКОМ к РС

    AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oPC)))); // Поворачиваем его лицом к игроку

    AssignCommand(oNPC, ActionDoCommand(AssignCommand(oPC, ActionResumeConversation())));
    // Говорим РС продолжить диалог
}
Dik Morris
2 Teranozavr_REX, эта функция вызывает то существо что выбрал сам игрок. А так как у тебя это NPC, у него по умолчанию и стоит этот звирь. Посмотрев фит, непосредственно в тулсете, понял что изменить там что-либо, по моему нельзя. Может стоит копнуть в направление 2DA таблиц. Но игра стоит свеч? ИМХО, совсем не стоит, так что используй вместо "SummonAnimalCompanion", что-нибуть другое, благо не одной ей ограничены, и вариантов много.
Loki87
Если быть более точным, то я просто не знаю самой системы создания скриптов. Не понимаю как она работает.
Английский мой второй родной язык, так что проблем не будет. Просто "живые люди" объяснят лучше любой инструкции. В любом случае спасибо.
Neo
offtopic.gif
Цитата(Loki87 @ Jul 11 2007, 13:33) [snapback]110459[/snapback]
Если быть более точным, то я просто не знаю самой системы создания скриптов. Не понимаю как она работает.Английский мой второй родной язык, так что проблем не будет.

Цитата(Aiwan @ Jul 11 2007, 09:42) [snapback]110450[/snapback]
Скрипты это язык. Не зная иностранного языка петь песенки и сочинять стихи довольно сложновато.

secret.gif скрипты == c, delphi и иже с ними, не английский, английский нужен для мануалов wink3.gif
Lex
Цитата(Loki87 @ Jul 11 2007, 13:33) [snapback]110459[/snapback]
росто "живые люди" объяснят лучше любой инструкции.

не совсем так.. точнее совсем не так. Рассказывать базу и общие принципы на пальцах на форуме - это на самом деле крайне неэффективно. (на досуге попробуйте изложить все принципы программирования в 1-2 постах. Словите неимоверный кайф.)
Базу надо набирать самому по мануалам и статьям. Когда она будет, тогда и разговор с живыми людьми по этой теме будет и интересен и продуктивен.
Loki87
Lex - я понял. Как было выше замечено, мне следует быть более конструктивным. Так вот. я вроде как понемногу въезжать начал. Попробовал написать первый скрипт и тут же сел на пятую точку. Вобщем идея такова, что начинается диалог с НПС, в таверне. В этом диалоге есть 4 концовки, из которых 3 по смыслу одинаковые и четвертая отличная от первых трех. то есть при первых трех НПС просит героя сходить на встречу со вторым НПС (который уже не в таверне, а должен появиться снаружи в лесу) и тот соглашается, а в четвертом варианте герой посылает НПС так сказать на три буквы.
Я хочу зделать чтобы после первых трех "правильных" концовок диалога, тут же в лесу в определенной точке извне спавнился НПС 2. то есть чтобы он там появился только после удачного диалога с НПС 1.
А при плохом, четвертом раскладе диалога, хочу чтобы НПС 1 атаковал героя, а НПС 2 снаружи не спавнился.

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

Neverwinter Script Source
void main()
{
object oNPC=GetObjectByTag("NW_DROWROGUE001");
object oWp=GetWaypointByTag("furyspawn01");


дальше вроде надо написать - AssignCommand (oNPC, и какую тут функцию впихнуть??? типа надо effect EffectAppear () тока у меня не сработало.

Aiwan
Цитата(Loki87 @ Jul 11 2007, 21:46) [snapback]110464[/snapback]
effect EffectAppear ()

Та нафик тебе этот эффект? Это типа потрясти экран. Толку то мало. Тебе надо отпраивть НПС в точку или на локальный объект. Я написал скрипт и там есть описание каждого шага. Если ты напряжешь серое вещество то все твои задачи можно решить моими командами.
gennady
Цитата
дальше вроде надо написать - AssignCommand (oNPC, и какую тут функцию впихнуть??? типа надо effect EffectAppear () тока у меня не сработало.


Тут два варианта появления NPC на точке: или прыжок или вызов из палитры.
Neverwinter Script
AssignCommand(oNPC, ActionJumpToObject(oPoint)); // Прыжок

// ВЫЗОВ ИЗ ПАЛИТРЫ
object oWP = GetWaypointByTag("furyspawn01");
location Loc = GetLocation(oWP);
CreateObject(OBJECT_TYPE_CREATURE,"ResRef",Loc,FALSE,"newTag"); // Существо из палитры


EffectAppear () накладывает на существо эффект падения с неба, т.е. существо уже должно быть!

P.S. Я тут почти закончил писать мануал для чайников, можно найти в шпаргалке все часто используемые функции, плюс набор некоторых скриптов для модуля, ну и описание что откуда растет… Рекомендую ознакомиться, ну и конечно мануал Айва окажет большую помощь в модостроительстве.
Игроделу: http://remmgen.narod.ru/shpora.html

Цитата
за вот это - location Loc = GetLocation(oWP);
вылезла ошибка - ERROR: VARIABLE DEFINED WITHOUT TYPE

короче или я дурак, или аврора

Помедетировав, обнаружил ошибку в обозначение точки. (У тебя было oWp)...
Loki87
Вот как раз из палитры самое то. но я зделал все как было сказано и в итоге вот что получил:

за вот это - location Loc = GetLocation(oWP);
вылезла ошибка - ERROR: VARIABLE DEFINED WITHOUT TYPE

короче или я дурак, или аврора
Lex
Цитата(Loki87 @ Jul 12 2007, 13:01) [snapback]110490[/snapback]
короче или я дурак, или аврора

не аврора.
oWP определен выше? как? Приводите или целиком скрипты, или рабочие кусочки (+ определения используемых переменных.)
Loki87
Цитата(Lex @ Jul 12 2007, 11:47) [snapback]110497[/snapback]
не аврора.
oWP определен выше? как? Приводите или целиком скрипты, или рабочие кусочки (+ определения используемых переменных.)


Neverwinter Script Source
void main()
{
object oWp=GetWaypointByTag("furyspawn01");
object oNPC = GetObjectByTag("NW_DROWROGUE001");

location Loc = GetLocation(oWP);
CreateObject(OBJECT_TYPE_CREATURE,"ResRef",Loc,FALSE,"NW_DROWROGUE001");

}


по-моему я просто от незнания забыл что то добавить.
gennady
Цитата(Loki87 @ Jul 12 2007, 14:29) [snapback]110500[/snapback]
по-моему я просто от незнания забыл что то добавить.

Короче, пиши так:
Neverwinter Script Source
// ВЫЗОВ ИЗ ПАЛИТРЫ
void main()
{
object oWP = GetWaypointByTag("furyspawn01");
location Loc = GetLocation(oWP);
string ResRef = "РесРеф твоего перса в палитре, не путать с тэгом!!!";

CreateObject(OBJECT_TYPE_CREATURE, ResRef, Loc, FALSE, "NW_DROWROGUE001"); // Существо из палитры
}

Скрипт видит различие между большой и малой буквой в обозначении точки (P - p). Здесь и крылась ошибка! Кстати, РесРеф в скрипте можно писать как малыми, так и дольшими буквами, ошибки не будет. А вот тэг нет, будет ошибка! biggrin.gif
Loki87
Зделал все так все равно ошибка.

Neverwinter Script Source
void main()
{
object oWP = GetWaypointByTag("furyspawn01");
location Loc = GetLocation(oWP);
string ResRef = "fury";

CreateObject (OBJECT_TYPE_CREATURE, "ResRef", Loc, FALSE, "NW_DROWROGUE001");
}


ERROR: DECLARATION DOES NOT MATCH PARAMETERS - это относилось к последней строчке - CreateObject и т.д.
Lex
Цитата(Loki87 @ Jul 12 2007, 15:42) [snapback]110507[/snapback]
"ResRef"

там надо без ковычек
Loki87
без ковычек сначало было, но все равно не сработало. я поставил их - тоже не работает.
Dik Morris
2 Loki87, ты точно делаешь все так?

Третья строка: точное указание тэга вайпоинта;

Пятая строка: указание ResRef'a того NPC которого нужно создать;

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


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


PS: вот тебе небольшой модуль в помощь (версия для игры, максимальная, на данный момент).
Loki87
Большое всем спасибо за помощь и потраченное время.

Dik Morris - да я все именно так написал как было сказано в постах выше.

сейчас детально изучу твой модуль и попробую разобраться. я так понял при нажатии происходит тот же спавн, просто все выглядит по другому. спасибо кстати за это.
плохо быть чайником... scratch_one-s_head.gif unsure.gif
Worldowner
Цитата(Dik Morris @ Jun 25 2007, 15:30) [snapback]109877[/snapback]
2 Teranozavr_REX, на будущее. Что бы знать какую использовать функцию в той или иной ситуации, будь то инициализация игрока, аль просто нужная операция, проще всего - заглянуть в Лексикон. Там они подробно рассортированы, каждая функция, к каждому эвенту. Можно так же прописать в фильтре, непосредственно в самом тулсете.

Лексикон, Лексикон, Лексикон... Все говорят о лексиконе, но что-то не разу не видел что-нить конкретное. Прямо как снежный человек- все о нём знают, но никто не видел вживую. Может мне кто-нибудь разьяснить, где прячется этот чёртов лексикон?!
Dik Morris
2 Worldowner, он прячется в этих краях, и найти его, можно набрав в поиске слово: Lexicon.
Loki87
Почитал я лексикон - довольно таки понятно там написано. Даже первый "go fetch" квест зделал. работает. однако тут же появилась проблемка. дело в том ято я хотел зделать, чтобы НПС подходил и просил о помощи (то есть давал этот квест самый) именно тогда когда ПС наступит на триггер вокруг НПС. как в самом начале Кампании, где после наступления на триггер подходит Павел и начинает трындеть.

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

вот как выглядит скрипт который я повесил на onEnter триггера:
Neverwinter Script Source
void ActionStartConversation (
object oObjectToConverseWith = "NW_COMFEMALE001",
string sDialogResRef = "janethmeet",
int bPrivateConversation = FALSE,
    int bPlayHello = TRUE
);

{
    string sTag = "NW_COMFEMALE001";
    object oNPC = GetLocalObject(GetArea(OBJECT_SELF),"NW_G_" + sTag);
    object oPC = GetEnteringObject();
    if(GetIsPC(oPC) &&
      GetLocalInt(oPC,"NW_L_Init" + GetTag(oNPC)) == FALSE &&
      IsInConversation(oNPC) == FALSE)
    {
        AssignCommand(oPC,ClearAllActions());
        AssignCommand(oNPC,ClearAllActions());
        AssignCommand(oNPC,ActionMoveToObject(oPC));
        AssignCommand(oNPC,ActionStartConversation(oPC));
    }
}


если верить лексикону и самим АТАРИ которые написали скрипт начинающий болтовню с Павлом, то у меня все верно. (а мож пропустил что, все таки 7 часов скриптинга, да еще и чайниковского - напрягают мозг).

вобщем нажимаю save, а он ругается и пишет - ERROR: NON CONSTANT IN FUNCTION DECLARATION - относя это к шестой строке, то есть к скобке и точке с запятой! не знаю как в двух значках всего, может прятаться ошибка. помогите, люди добрые. swoon.gif
gennady
Для ошибки хватит и одного символа… Хорошо, функцию ActionStartConversation написал, а кто ее будет запускать? Нужно через void main() {} или через int StartingConditional() {}

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

Neverwinter Script Source
//:://////////////////////////////////////////////////
//:: Герой подходит к НПС и начинает диалог
//:: File name: camera_dialog
//:://////////////////////////////////////////////////
void main()
{
   object oPC = GetEnteringObject();
   object oSP = GetHenchman(oPC);
   string sName = GetLockKeyTag(OBJECT_SELF);
   object oDL = GetObjectByTag(sName);
   vector vFace = GetPosition(oPC);
   float fTime = GetDistanceBetween(oPC, oDL);
if(fTime < 5.0) fTime = 5.5;
if (!GetIsPC(oPC)) return;
DelayCommand(0.1, AssignCommand(oDL, ClearAllActions()));
DelayCommand(0.2, SetCutsceneMode(oPC, TRUE));
DelayCommand(0.3, AssignCommand(oPC, ClearAllActions(TRUE)));
DelayCommand(0.4, AssignCommand(oSP, ClearAllActions(TRUE)));
DelayCommand(1.3, AssignCommand(oDL, SetFacingPoint(vFace)));
DelayCommand(1.5, AssignCommand(oPC,ActionForceMoveToObject(oDL, FALSE, 0.0)));
DelayCommand(1.5, AssignCommand(oSP,ActionForceMoveToObject(oPC, FALSE, 0.0)));
DelayCommand(1.5, AssignCommand(oDL, SpeakString("Подойдите ко мне. Это очень важно!")));
DelayCommand(fTime-4.0, AssignCommand(oDL, ActionPlayAnimation(ANIMATION_FIREFORGET_GREETING)));
DelayCommand(fTime-3.5, AssignCommand(oPC, SpeakString("Уже иду! Что там у вас случилось?")));
// диалог персонажа
DelayCommand(fTime-0.5, AssignCommand(oDL, ActionStartConversation(oPC)));
DelayCommand(fTime, SetCutsceneMode(oPC, FALSE));
DestroyObject(OBJECT_SELF, fTime+1.0);
}
Lex
Цитата(gennady @ Jul 16 2007, 08:08) [snapback]110621[/snapback]
string sName = GetLockKeyTag(OBJECT_SELF);
object oDL = GetObjectByTag(sName);

1. тэг НПС начиная с ХОТУ можно писать в локалкку триггера. Вариант с кей-тэгом оправдан только если НВН или НВН+СОУ.
2. в данном случае (да и вообще везде где возможно) лучше использовать GetNearestObjectByTag()
3.
Цитата(gennady @ Jul 16 2007, 08:08) [snapback]110621[/snapback]
DelayCommand(1.5, AssignCommand(oDL, SpeakString("Подойдите ко мне. Это очень важно!")));
DelayCommand(fTime-4.0, AssignCommand(oDL, ActionPlayAnimation(ANIMATION_FIREFORGET_GREETING)
));
DelayCommand(fTime-3.5, AssignCommand(oPC, SpeakString("Уже иду! Что там у вас случилось?")));

анимация это гут, а вот текст имхо делать не нужно. Лучше начать диалог и там для уже все разговоры вести.
(ну не сказал бы мой хаотик-злой некромант вот так "Уже иду! Что там у вас случилось?".)
Loki87
ну я не всегда хаотик ивел сорсами играю. иногда можно попозориться и пройти кампанию палладином. но в наших кругах РПГшников это не серьезно!

ну и скрипт! зачем там строка про хенчмана?
Teranozavr_REX
Подскажите название скрипта Большогосвятилища

ПОдскажите названия скрипта Большогосвятилища
Dik Morris
NW_S0_Sanctuary.
Когда будешь открывать, не забуть поставить пометку, на то, что этот скрипт глобальный, а не ограниченный рамками модуля, иначе ничего не получится.

На будущее. Что бы узнать название того или иного скрипта, например кода отвечающего за заклинания - стоит не забывать про 2DA таблицы. В данном случае, это 2DA таблица: spells.2DA, в ней, помимо различных других установок и параметров, обязательно присутствует название скрипта, который отвечает за выполнение и работу заклинания. Это так же относится и, например, к фитам.

Ну, или самый простой вариант. Включаешь галочку глобального поиска, и вперед. По названию непосредственного сабжа. Я так и нашел, т.е. просто набрал в поиске san smile.gif.
Lex
Цитата(Dik Morris @ Jul 18 2007, 20:42) [snapback]110720[/snapback]
Ну, или самый простой вариант. Включаешь галочку глобального поиска, и вперед. По названию непосредственного сабжа. Я так и нашел, т.е. просто набрал в поиске san

самый основной вариант. С первой-второй попытки "найдется все".
Цитата(Loki87 @ Jul 16 2007, 13:40) [snapback]110630[/snapback]
ну и скрипт! зачем там строка про хенчмана?

страховка. Иногда хенч может и не подойти (или ты специально оставил его в стороне). Все бы ничего но если в диалоге с НПС есть фразы хенча (как третьего в разговоре например), а сам хенч далеко - разговор просто прервется, что не гут. Можно конечно в скриптах диалога это предусматривать, но имхо самый надежный вариант просто обеспечить наличие Хенча рядом с игроком.
gennady
Лекс, спасибо за критику! Чуть модернизировал скрипт, может кому пригодится…

Бывает необходимость привлечь внимание игрока к определенному персонажу, тогда вам поможет такой небольшой универсальный скрипт подхода на вход триггера, и старт диалога героя с НПС. Нужно очертить триггер вокруг НПС, и проставить в поле ключа триггера, тэг нашего НПС Сам скрипт:
Neverwinter Script Source
/////////////////////////////////////////////////
//:: Герой подходит к NPC и начинает диалог
//:: File name: camera_dialog
//:://////////////////////////////////////////////////
void main()
{
  object oPC = GetEnteringObject();
  object oSP = GetHenchman(oPC);
  vector vFace = GetPosition(oPC);
  string sName = GetLockKeyTag(OBJECT_SELF);
  int i = 1;
  float fTime;
  object oDL = GetNearestObjectByTag(sName, oPC, i);
  int iA = GetGoodEvilValue(oPC);

if (!GetIsPC(oPC)) return;
while (GetIsObjectValid(oDL))
{
  if (!GetIsInCombat(oPC)&&!GetIsInCombat(oDL)&&!GetIsEnemy(oPC, oDL)&&
      !GetIsDead(oDL) && GetObjectType(oDL) == OBJECT_TYPE_CREATURE)
  {
    fTime = GetDistanceBetween(oPC, oDL);
    SetLocalInt(OBJECT_SELF,"VALID",1);
    break;
  }
  i++;
  oDL = GetNearestObjectByTag(sName, oPC, i);
}
if (GetLocalInt(OBJECT_SELF, "VALID") != 1) return; // Проверить
if(fTime < 5.0) fTime = 7.5;
string sPC = "Заткнись! Если что не то - порву!";
if (iA>30 && iA<70) sPC = "Не кричи! Иду, иду...";
if (iA>=70 && iA<100) sPC = "Уже иду... Что случилось?";
if (iA==100) sPC = "Уже иду! Что там у вас случилось?";

AssignCommand(oDL, ClearAllActions());
AssignCommand(oDL, SetFacingPoint(vFace));
AssignCommand(oDL, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE, 1.0, 2.5));
AssignCommand(oDL, ActionPlayAnimation(ANIMATION_FIREFORGET_GREETING));
AssignCommand(oDL, ActionWait(fTime-3.0));
AssignCommand(oDL, ActionStartConversation(oPC)); // диалог персонажа
AssignCommand(oDL, ActionDoCommand(SetCommandable(TRUE, oDL))); // разблокировать очередь
DelayCommand(0.1, SetCommandable(FALSE, oDL)); // заблокировать очередь
DelayCommand(0.2, SetCutsceneMode(oPC, TRUE));
DelayCommand(0.3, AssignCommand(oPC, ClearAllActions(TRUE)));
DelayCommand(0.4, AssignCommand(oSP, ClearAllActions(TRUE)));
DelayCommand(1.5, AssignCommand(oPC, ActionForceMoveToObject(oDL, FALSE, 1.0, fTime-2.0)));
DelayCommand(1.5, AssignCommand(oSP, ActionForceMoveToObject(oPC, FALSE, 1.0, fTime-2.0)));
DelayCommand(2.0, AssignCommand(oDL, SpeakString("<c у >Подойдите ко мне! Это очень важно!</c>")));
DelayCommand(fTime-3.5, AssignCommand(oPC, SpeakString(sPC)));
DelayCommand(fTime, SetCutsceneMode(oPC, FALSE));
DelayCommand(fTime, SetCommandable(TRUE, oDL)); // разблокировать очередь
DelayCommand(fTime+0.1, AssignCommand(oPC, ActionStartConversation(oDL))); // диалог персонажа
DestroyObject(OBJECT_SELF, fTime+1.0);
}
Teranozavr_REX
QUOTE(Dik Morris @ Jul 18 2007, 19:42) [snapback]110720[/snapback]
NW_S0_Sanctuary.
Когда будешь открывать, не забуть поставить пометку, на то, что этот скрипт глобальный, а не ограниченный рамками модуля, иначе ничего не получится.

На будущее. Что бы узнать название того или иного скрипта, например кода отвечающего за заклинания - стоит не забывать про 2DA таблицы. В данном случае, это 2DA таблица: spells.2DA, в ней, помимо различных других установок и параметров, обязательно присутствует название скрипта, который отвечает за выполнение и работу заклинания. Это так же относится и, например, к фитам.

Ну, или самый простой вариант. Включаешь галочку глобального поиска, и вперед. По названию непосредственного сабжа. Я так и нашел, т.е. просто набрал в поиске san smile.gif.


Про 2da пасибо совсем про них забыл ))
сейчас поду гляну

а вот нащет "просто набрал в поиске san" к сожалению не все так просто
NW_S0_Sanctuary - это скрипт насколько я понял именно для простогоили малого или как атм его еще святилища
а вот то что кастит сорка на 8 круге как то по другому называеться (((
Хоть может я дето и ошибаюсь
Но думаю что таки прав ибо уже десятка полтора заклов исправил что бы наступать на такие нюбские грабли )) хотя скем не бывает
Loki87
Ну нафига такой огромный скрипт для одного малюсенького действа. (жаль визард не все типы скриптов помогает делать).
Neo
Код
Create_Undead    780    is_CrUndead    N    S    vs    0x3a    0x2C    NW_S0_CrUndead    ****    6    ****    ****    ****    8    6    1500    head    ****    ****    vco_grndskul    sco_grndskul    vs_chant_necr_hm    vs_chant_necr_hf    out    1000    ****    vca_outneg    ****    sca_outneg    0    ****    ****    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    15    ****    1    6126    1    0    ****    0    ****    ****    ****    1
Greater_Planar_Binding    819    is_GrPlanar    C    S    vs    0x3a    0x2E    NW_S0_GrPlanar    ****    ****    ****    ****    ****    8    8    1500    head    ****    ****    vco_lgsprodd01    sco_lgsprodd01    vs_chant_conj_hm    vs_chant_conj_hf    up    1000    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    15    ****    1    6166    1    0    ****    0    ****    ****    ****    0
Incendiary_Cloud    839    is_IncCloud    V    L    vs    0x3f    0x2E    NW_S0_IncCloud    ****    ****    ****    ****    ****    8    8    1500    head    ****    ****    vco_lgsprfire01    sco_lgsprfire01    vs_chant_evoc_hm    vs_chant_evoc_hf    area    1000    ****    ****    ****    ****    1    vpr_ectofire01    homing    hand    spr_ectofire01    path    Fire    1    ****    ****    ****    ****    ****    11    ****    1    6186    1    0    ****    1    ****    ****    ****    1
Mass_Blindness_and_Deafness    860    is_MassBlDf    I    M    vs    0x3a    0x2E    NW_S0_MassBlDf    ****    ****    ****    ****    ****    8    8    1500    hand    ****    ****    vco_lgrinodd01    sco_lgrinodd01    vs_chant_illu_hm    vs_chant_illu_hf    area    1000    ****    ****    ****    ****    1    vpr_los    accelerating    hand    spr_los    path    ****    1    ****    ****    ****    ****    ****    1    ****    1    6207    1    0    ****    1    ****    ****    ****    1
Mass_Charm    861    is_MsCharm    E    S    v    0x1a    0x2E    NW_S0_MsCharm    ****    ****    ****    ****    ****    8    8    1500    hand    ****    ****    vco_lgrinmind01    sco_lgrinmind01    vs_chant_ench_hm    vs_chant_ench_hf    touch    1000    ****    ****    ****    ****    1    vpr_los    accelerating    hand    spr_los    path    Mind_Affecting    1    ****    ****    ****    ****    ****    1    ****    1    6208    1    0    ****    1    ****    ****    ****    1
Mind_Blank    867    is_MindBlk    A    S    vs    0x3a    0x2F    NW_S0_MindBlk    ****    ****    ****    ****    ****    8    8    1500    head    vco_mehanmind01    ****    ****    sco_mehanmind01    vs_chant_conj_hm    vs_chant_conj_hf    touch    1000    ****    ****    ****    ****    1    vpr_los    accelerating    hand    spr_los    path    ****    0    ****    ****    ****    ****    ****    9    ****    1    6214    1    0    ****    0    ****    ****    ****    1
Premonition    884    is_Premo    D    T    vs    0x3a    0x09    NW_S0_Premo    ****    ****    8    ****    ****    8    8    1500    head    vco_mehanelec03    ****    vco_lgrinmind01    sco_lgrinmind01    vs_chant_illu_lm    vs_chant_illu_lf    self    1000    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    12    ****    1    6228    1    0    ****    0    ****    ****    ****    0
Summon_Creature_VIII    931    is_Summon8    C    S    vs    0x3a    0x2C    NW_S0_Summon    ****    8    8    ****    ****    8    8    1500    hand    ****    vco_mehanodd02    vco_lgrinodd01    sco_lgrinodd01    vs_chant_conj_hm    vs_chant_conj_hf    out    1000    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    15    ****    1    6512    1    0    ****    0    ****    ****    ****    0
Horrid_Wilting    6333    is_HorrWilt    N    M    vs    0x3d    0x2E    NW_S0_HorrWilt    ****    ****    ****    ****    ****    8    8    1500    head    ****    ****    vco_lgupodd01    sco_lgupodd01    vs_chant_necr_hm    vs_chant_necr_hf    out    1000    ****    ****    ****    ****    1    vpr_los    homing    hand    spr_los    path    ****    0    ****    ****    ****    ****    ****    1    ****    1    6533    1    0    ****    1    ****    ****    ****    1
Sunburst    385    is_X1Sunbur    V    M    vs    0x3d    0x3E    x0_s0_sunburst    ****    ****    8    ****    ****    8    8    1500    head    vco_mehedholy01    ****    ****    sco_mehedholy01    vs_chant_evoc_hm    vs_chant_evoc_hf    up    1000    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    Divine    1    ****    ****    ****    ****    ****    1    ****    1    1537    1    0    ****    1    ****    ****    ****    0
Etherealness    2364    is_X1Ether    T    T    v    0x3a    0x09    x0_s0_ether    ****    6    ****    ****    ****    8    7    1500    head    vco_smhanholy01    ****    ****    sco_mehanholy01    vs_chant_evoc_lm    vs_chant_evoc_lf    up    1000    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    ****    ****    1    2371    1    0    ****    0    ****    ****    ****    0
Bigbys_Clenched_Fist    2686    is_X1Bigby4    V    L    vs    0x3f    0x3A    x0_s0_bigby4    ****    ****    ****    ****    ****    8    8    1500    hand    ****    vco_mehanacid03    ****    sco_mehanacid03    vs_chant_conj_hm    vs_chant_conj_hf    out    1000    ****    ****    ****    ****    1    vpr_bigby_c    homing    hand    spr_aroacid    path    ****    1    ****    ****    ****    ****    ****    2    ****    1    2691    1    0    ****    1    ****    ****    ****    1
Blackstaff    3761    is_X2Blckstff    T    T    vs    0x3a    0x0B    X2_S0_Blckstff    ****    ****    ****    ****    ****    8    8    1500    hand    ****    vco_atomgren    ****    sco_atomgren    vs_chant_ench_hm    vs_chant_ench_lf    self    1000    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    ****    0    ****    ****    ****    ****    ****    9    ****    1    3762    1    0    ****    0    ****    ****    ****    0

таблица каста сорка/визарда 8го уровня

offtopic.gif
Цитата(Loki87 @ Jul 19 2007, 13:02) [snapback]110747[/snapback]
Ну нафига такой огромный скрипт для одного малюсенького действа. (жаль визард не все типы скриптов помогает делать).

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

Loki, не все так просто, как кажется на первый взгляд… Диалог это ответственная функция, к тому же у меня она идет через мультик, тут вдвойне нужно быть осторожным. К тому же скрипт универсальный, а значит нужно учесть много игровых ситуаций (проверить идет ли бой, жив ли перс, не враг ли он…). Если у тебя будет перс занят, чем-то, как-то ходит или сидит на стуле или еще что, то нужно почистить ему акции, заблокировать очередь, чтобы он не сбил код. Обычно управление идет с ХБ перса, там цикл в 6 секунд… почистил это скрипт акции, и все привет – диалога нет!

Тут даже в этом скрипте есть вероятность 1/60, что произойдет чистка акций во время исполнения скрипта, поэтому и сделаны блокировки, через DelayCommand. Да…, когда идет диалог, то герой переходит в режим бога, поэтому нужно знать, что он не притащил на хвосте врагов, а то получится некрасиво… Порой просто диву даешься на что способны игроки!

Скрипт учитывает также и дистанцию до перса, и сделает прыжок герою, если тот где-то застрял, плюс диалог запускается как героем, так и персом (на всякий пожарный), ну и пробил разные фразы в зависимости от злобности героя biggrin.gif… это для того если все же чтой-то пойдет не так, то хоть по фразам игрок сориентируется. У меня к тому же есть плейсы одним тэгом с НПС…

Так что если не хочешь ловить баги, то нужно всегда делать страховки и блокировки в скрипте. Вспоминаю, как в Невере и в ХоТу за моим героем долго бегали персы со своими диалогами с триггера biggrin.gif… Про висяки начала диалога с камеры в Леворе, вообще промолчу, т.к. ребятам на форуме за эти баги плешь проели…
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.