Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты: Все вопросы
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights 2 Obsidian Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7
Lex
Обсуждение каки-то непонятных моментов в алгоритме, вариантов использования функций, оптимизация скриптов. Тут можно обсудить алгоритмы и особености скриптинга.

>> просьбы написать скрипт не в эту тему, а сюда: Напишите пожалуйста скрипт
>> выкладывать готовые и отлаженные скрипты не в эту тему, а сюда: Готовые скрипты
Тут только вопросы и обсуждение проблем и методов их решения, а так же все непонятки с "должно работать, но не работает".


___

База скриптов (NWN)
Скрипты для новичков (NWN)
Вопросы по скриптам (NWN)
Построение скриптовых сцен (NWN)
Так как скриптинг не сильно изменился, то большая часть вещей, написаная под НВН1 нормально работает и в НВН2. Посмотрите в этих темах, вполне возможно вы найдете интересующую вас информацию.
Gloom
Нужно найти игрока по имени в определенной локации...
И еще интересно почему не работает такая
NSS
object oPlayer = GetFirstObjectInArea(GetArea(GetObjectByTag("gds_wpt")));
  icheck=0;
  while(icheck==0)
    { 
      string sCName = GetName(oPlayer);
      if (sCName == sName)
      {
        oTarget=oPlayer;
        icheck=1;
      }
    object oPlayer = GetNextObjectInArea(GetArea(GetObjectByTag("gds_wpt")));
    }

sName - имя игрока
Vanes
предпоследняя строка
object oPlayer = GetNextObjectInArea(GetArea(GetObjectByTag("gds_wpt")));

замени на
oPlayer = GetNextObjectInArea(GetArea(GetObjectByTag("gds_wpt")));
dumbo
QUOTE(Gloom @ Nov 29 2006, 07:28) [snapback]99455[/snapback]
Нужно найти игрока по имени в определенной локации...

странное желание...
NSS
object oArea = GetArea(GetObjectByTag("gds_wpt"));
  object oPC = GetFirstPC();
  while (GetIsObjectValid(oPC))
  {
      if ((oArea == GetArea(oPC) && (sName == GetName(oPC))
        break;
      oPC = GetNextPC();
  }
  if (GetIsObjectValid(oPC))
  {
    // требуемый игрок найден...
  }
  else
  {
    // не найден...
  }


QUOTE(Gloom @ Nov 29 2006, 07:28) [snapback]99455[/snapback]
И еще интересно почему не работает такая

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


и так, между прочим, для поиска игроков перебирать все объекты в локации - это, я вам скажу...
Gloom
Спасибо за помощь good.gif
QUOTE
и так, между прочим, для поиска игроков перебирать все объекты в локации - это, я вам скажу...

это было промежуточное решение, проверка самой возможности...
Plut
CODE
object oPC = GetLastUsedBy();

if(GetIsPC(oPC) )
{
    ActionStartConversation(oPC);
}


Так if теперь не работает?

Выдает INVALID DECLARATION TYPE на if

СОРИ, ИЗВИНИТЕ ЗА ВОПРОС...
Не обратил внимания, что имя функции void main() надо писать руками...
Plut
Вопрос такой: можно ли на Event плэйсибла, например On Used, навесить скрипт с параметром, т.е. я хочу, чтоб запускалась одна из ветвей, имеющихся в скрипте. Пример:
CODE

void main(int iAction)
{
    switch(iAction)
    {
    case 1:
         object oPC = GetPCSpeaker();
         ActionStartConversation(oPC);
         break;
    case 2:
         .....
         .....
    }
}

Ну а в On Used, понятно, хочется иметь что-то вроде ИмяСкрипта(1)
Sleeper
Где брать скрипт на открытие магазина через диалог?biggrin.gif
-fenix-
QUOTE(Plut @ Dec 4 2006, 12:29) [snapback]99761[/snapback]
можно ли на Event плэйсибла, например On Used, навесить скрипт с параметром, т.е. я хочу, чтоб запускалась одна из ветвей, имеющихся в скрипте. Пример:

А что тебя останавливает? smile.gif

QUOTE(Sleeper @ Dec 4 2006, 12:53) [snapback]99766[/snapback]
Где брать скрипт на открытие магазина через диалог?

Чтобы не повторяться: http://www.city-of-masters.ru/forums/index...ost&p=31712 .
Там для НВН, но так как скрипты поддаются переносу, то должно работать, может тока какие параметры новые у функций появились.
Plut
QUOTE
А что тебя останавливает? smile.gif

То что оно не отрабатывает. Может там синтаксис какой хитрый...
-fenix-
Ну, если компилица, но не работает, то вот что может быть:
NSS
void main(int iAction)
{
    switch(iAction)
    {
    case 1:
        object oPC = GetPCSpeaker(); //Это тут откудавы? smile.gif Надо GetLastUsedBy()!
        ActionStartConversation(oPC);
        break;
    case 2:
        .....
        .....
    }
}
Plut
QUOTE
Ну, если компилица, но не работает, то вот что может быть:

Не, это я пример набирал - ошибся... там у меня через свои функции сделано, но смысл (вернее принцип такой). Судя по всему не отрабатывает запуск скрипта из листа свойств плэйсибла. Т.е. если я пишу там ИмяСкрипта(параметр), то оно не работает, а если я убиваю параметры и скрипте и при его вызове, то все нормально.
Lex
Plut, передавать параметр таким образом в скрипт нельзя. Делай через локальные переменные на игроке/объекте или модуле.
Plut
QUOTE
Plut, передавать параметр таким образом в скрипт нельзя. Делай через локальные переменные на игроке/объекте или модуле.

Спасибо за кратки и содержательный ответ. А жаль, все-таки...
-fenix-
Эээ, ну это, не мешало бы увидеть пациента целиком. smile.gif А на теории я хз че там как отрабатывает, я в НВН 2 не играл и Обсидиановский Тулсет не видел.
Но есть еще момент. В case низя объявлять или инициализировать переменные, делай это до него.

QUOTE(Lex @ Dec 4 2006, 13:38) [snapback]99775[/snapback]
Plut, передавать параметр таким образом в скрипт нельзя. Делай через локальные переменные на игроке/объекте или модуле.

Ой, так вот в чем суть вопроса была. smile.gif
Lex
QUOTE(Plut @ Dec 4 2006, 13:44) [snapback]99777[/snapback]
пасибо за кратки и содержательный ответ. А жаль, все-таки...

не знаю, чего тебе жаль то. Там и нет возможности вписать, да и как? Если переменная статичная, то нафиг она тебе не нужна, а если динамическая, то на каком этапе ты собираешься ее формировать? Непосредственно перед запуском эвента ? Никак pardon.gif Единственное место, где параметры бы пригодились - диалоги, чтобы передавать например номер ответа и от него плясать.. но насколько я знаю в новом тулсете что-то по этому поводу сделано.. посмотреть тока не могу.

QUOTE(Plut @ Dec 4 2006, 12:29) [snapback]99761[/snapback]
Вопрос такой: можно ли на Event плэйсибла, например On Used, навесить скрипт с параметром

можно по другому. В локалку плейса вгоняешь параметр. Например "BLOCK" и разные значения туда, а в скрипте
NSS
..
int nBLOCK = GetLocalInt(OBJECT_SELF,"BLOCK");
switch (nBLOCK)
{
case 1: // ---- //
    break;
case 2: // ---- //
    break;
// И так далее
}
...
Plut
CODE
Единственное место, где параметры бы пригодились - диалоги, чтобы передавать например номер ответа и от него плясать.. но насколько я знаю в новом тулсете что-то по этому поводу сделано.. посмотреть тока не могу.

Да, по этому поводу там усе сделано. Даже можно строку выводить или в экшн писать по несколько скриптов... Тут все ок. Можно теперь вообще всю обработку диалогов в 1 скрипт запихать... Чтоб не рыть потом тоннами.

QUOTE
В case низя объявлять или инициализировать переменные, делай это до него.

А я в нем и не пытался инициализировать. Я в него пытался передавать входящий параметр...

Согласен, можно и так написать. Идея была сделать скрипт, в котором хранятся On Used, например, всех плэйсиблов или всех дверей... разных... в зависимости, например, от тега... ну и т.д. Это все к сокращению количества скриптов.
Lex
QUOTE(Plut @ Dec 4 2006, 17:30) [snapback]99809[/snapback]
А я в нем и не пытался инициализировать.

пытаешься:
QUOTE(Plut @ Dec 4 2006, 12:29) [snapback]99761[/snapback]
case 1:
object oPC = GetPCSpeaker();

так ни нада. Объявляй object oPC в начале, а в кейсах уже работай с ней.
Plut
QUOTE
так ни нада. Объявляй object oPC в начале, а в кейсах уже работай с ней.

Ну нормально! Ты хочешь сказать, что внутри ветвления нельзя объявлять переменные?!?! Это - бред! 8 лет занимаюсь написанием программ - такого еще не видел... Не знаю, видел ли ты второй тулс, но багов с этим пока не замечено...

Господа... Есть проблема. Проблема в файлике http://www.hotfile.ru/30533/ (1,2Мб - модуль для НВН2)
Там есть диалог с лежаком. Если при первом подходе нажать отдохнуть, то следующая фраза этого лежака не выводится... Не понимаю...
azathoth
Если очень хочется, то можно:
NSS
...
case 0:
{
      object oPC = GetPCSpeaker();
}
case 1:
...
Lex
посмотрел еще раз.. можно в НВН так делать. А затык у меня когда-то был из-за попытки в разных ветках объявить переменную с одним именем.. поэтому я ее и до свича ставлю smile.gif Но тебе в данном случае все равно лучше сделать как я написал, ибо игрок у тебя во всех ветках одинаковый smile.gif

зы: но вот что-то в свичах нельзя делать точно.. а что, я уже и забыл.
dumbo
QUOTE(Lex @ Dec 5 2006, 00:56) [snapback]99838[/snapback]
зы: но вот что-то в свичах нельзя делать точно.. а что, я уже и забыл.

переменные объявленные в свитчах глючили испокон веков, поддавались неоднократной правке, но не факт что залечились до конца. поэтому, во избежание, так сказать, их лучше не использовать вообще.
Plut
QUOTE
Господа... Есть проблема. Проблема в файлике http://www.hotfile.ru/30533/ (1,2Мб - модуль для НВН2) Там есть диалог с лежаком. Если при первом подходе нажать отдохнуть, то следующая фраза этого лежака не выводится... Не понимаю...

Поставил патч 1.03 - все исправилось. Так что - это глюк тулса.... был.
-fenix-
Хз, как там во втором тулсете, но в первом и правда переменные объявленные в свичах глючили, да и инфа о том, что их объявлять там низя, из Лексекона взята.
mamuc
QUOTE
Да, по этому поводу там усе сделано. Даже можно строку выводить или в экшн писать по несколько скриптов... Тут все ок. Можно теперь вообще всю обработку диалогов в 1 скрипт запихать... Чтоб не рыть потом тоннами.

...ммм а пгодробнее об этом можно и в деталях как именно...для тех, кто пока в обсидиановском тулсете не работает....
насколько все удобней.. итд итп ...плз biggrin.gif

azathoth
QUOTE(mamuc @ Dec 5 2006, 12:48) [snapback]99860[/snapback]
QUOTE
Да, по этому поводу там усе сделано. Даже можно строку выводить или в экшн писать по несколько скриптов... Тут все ок. Можно теперь вообще всю обработку диалогов в 1 скрипт запихать... Чтоб не рыть потом тоннами.

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


Берешь ветку диалога, выбираешь Экшн -> Добавить и суешь туды скрипт (ну пока как обычно), далее впечатываешь в появившиеся поля переменные для этого скрипта (появляются если он их поддерживает). Если мало - добававить еще таких скриптов к той же ветке, выполнятся они будут по очереди. В игре уже есть пачка простеньких кирпичиков типа "Заставить (таг1) напасть на объект (таг2)", "Забрать итем (таг)" и т.п. Так что можно выстроить комбинацию из них вместо написания отдельного скрипта для каждой ветки.
mamuc
azathoth большое спасибо за информацию.... hi.gif
меня больше всего заинтересовал вот такой нюанс
QUOTE
Даже можно строку выводить

это что-то действительно новое и больше не надо будет с SetCustomToken() работать? или это и есть то самое...

...или я чего-то не так понял... pardon.gif
Vhall
Мамук, я не в теме, но думаю, строка это "string". Т.е. можно выводить строку в фразу из тлк.
Gloom
Вопрос косвенно связанный со скриптами... а сколько спелов(spells) в NWN2?

Griffon: Открой spells.2da и посчитай.
Plut
QUOTE
это что-то действительно новое и больше не надо будет с SetCustomToken() работать? или это и есть то самое...

Этого я делать пока не пробовал... попробуем возвращать строку....
ShadowKeeper
Народ, а не кто не знает, как поменять расу, пол и класс игрока при входе в локацию и желательно при этом и внешний вид?
Lex
если не урезали это в НВН2, то по идее SetCreatureAppearance или что-нить в этом роде. А если урезали - полиморфом тока наверное unknw.gif
ShadowKeeper
NSS
void SetCreatureAppearanceType(object oCreature, int nAppearanceType);

Только меняет внешний вид, при этом, если игрок менял при создании персонажа лицо прическу и из-за некоторой одежды персонаж просто исчезает, но все равно спасибо.
Будим исследовать дальше.
azathoth
Класс не поменять точно, максимум, что можно сделать - это сбить уровни до 1, а затем пролевелять РС обратно до того уровня, на котором он был нужным классом(см функции SetXP() и LevelUpHenchman()). Т.е, к примеру, если меняем на файтера, то Маг(20) превратится в Маг(1)-Воин(19). Если игрок 1го уровня, то этот трюк, конечно, не даст вообще никаких результатов.
ShadowKeeper
Просто по ходу сюжета игрок вспоминает свои прошлые жизни, где он был воином магом и творил великие дела. Попробую обойтись только внешним видом и Cut-Сценами вместо боев sad.gif . Отсюда следует следующая проблема, как запретить ему просмотр персонажа?
Waromon
ShadowKeeper, ну для кутсцены ничего делать и не нужно, игроку и так доступен только внешний вид. smile.gif Посему, SetCreatureAppearanceType, будет в самый раз. wink3.gif
Gloom
Вопрос следующий
Нужен таг локации в которой находится игрок
и еще интересно почему не работает
NSS
string sCheckTag = GetTag(GetArea(oPC));

он возвращает пустоту
Lex
QUOTE(Gloom @ Jan 5 2007, 19:07) [snapback]101568[/snapback]
он возвращает пустоту

хм.. попробуй для начала определить, получается ли там локация. Типа так:
NSS
void main()
{
object oPC = GetFirstPC();
SendMessageToPC(oPC,"Имя: "+GetName(oPC));
object oArea = GetArea(oPC);
SendMessageToPC(oPC,"Локация: "+GetName(oArea));
}

Короче суть в том, чтобы дебажить на всех этапах (определение игрока, определение локации), чтобы понять где именно косяк.
Так как игра только вышла, ни у кого еще нет достаточных знаний об ошибках и подводных камней, так что ищем smile.gif
Gloom
Не получается sad.gif
только у меня
NSS
object oPC = GetEnteringObject();

потомучто скрипт oncliententer
-fenix-
Что не получается-то?
Возможно возвращается пустота, так как стоит скрипт на КлиентЭнтер. Попробуй проверить на тригере или на ОнЭнтер локи.
Gloom
Не получается = возвращает "Локация - " т.е пустоту
он_энтер локи тоже не работает

С он_ентер тригера ситуация та же...
Пустота

Ах да, во всех трех случаях имя игрока показывается правильно
Narruin
QUOTE(Gloom @ Jan 5 2007, 20:53) [snapback]101575[/snapback]

Не получается = возвращает "Локация - " т.е пустоту
он_энтер локи тоже не работает

С он_ентер тригера ситуация та же...
Пустота

Предположу, что название локи на русском.
На OnClientEnter не советую вешать. Слабо срабатывает. Лучше на эвенты локации или уж на PC Loaded.
Попробовал у себя только что. Версия 1.03. Работает.
Кинул вещь на землю в локе и дописал этот код в On Acquire Item (чиста ради срабатывания smile.gif )
NSS
object oPC = GetFirstPC ();
object oArea = GetArea (oPC);
string sName = GetName (oArea);
FloatingTextStringOnCreature (sName, oPC);
Gloom
Имя локи на английском, версия 1.3, повесил ваш скрипт он_ентер тригера...
NSS
object oArea = GetArea ();

ругается дебагер
NSS
FloatingTextStringOnCreature (sName, oPC);

текст не показывает

Моя ошибка, тепрь показывает имя... у меня DisplayName было пусто
Lex
ну потому что там не скрипт в полном понимании, а набросок (с синтаксическими и прочими ошибками типа лишних пробелов)

Если бы глюк был только в onClientEnter, можно было бы списать на то что не успевает грузиться.. но если такая же петрушка на триггере, то похоже возможно не определяет.. возможное те банально GetArea не работает. Эх,, был бы тулс под рукой, поэкспериментировал бы.
зы: попробуй взять локу по тэгу и вывести ее название.
зыы: попробуй взять локу не по oPC, а по триггеру, те oArea = GetArea(OBJECT_SELF).

--------------

э.. а теперь помедленнее, что показывает и где? smile.gif
Narruin
QUOTE(Lex @ Jan 5 2007, 22:02) [snapback]101587[/snapback]

те банально GetArea не работает. Эх,, был бы тулс под рукой, поэкспериментировал бы.

GetArea работает.
Gloom
Показывает название локации
Тот скрипт который выше
NSS
object oArea = GetArea ();

кстати работает хоть и ругается дебагер
остальные варианты тоже работают

на он_ентер локации проверял

NSS
string sName = GetTag(GetArea(OBJECT_SELF));
FloatingTextStringOnCreature (sName, oPC);

на on_enter локации работает
на oncliententer -нет
-fenix-
Ну вот, знач работает. smile.gif
А если на oncliententer не пашет, значит, как гооврил Лекс, не успевает грузиться. Тут вообще многа чего не будет срабатывать. Операции с игроком должны проходить, по идее с вещами на нем, в общем смотреть надо.
azathoth
OnClientEnter запускается еще до того, как персонаж попал в какую-либо локацию.
Gloom
Всем спасибо за помощь angel.gif
webkent
Пытаюсь сделать так: При получении предмета такого-то предмет удаляется и появляется рядом волк и становится хенчманом. При попытке удалить предмет вылетает из игры (НВН2). Сдается мне это изза того что не успевает что-то сделать, да? Профи, подскажите как лучше поправить. Вот мой код в OnAcquireItem:

NSS
int nObjectType = OBJECT_TYPE_CREATURE;
    object oTaker = GetModuleItemAcquiredBy(); 
    object oItem = GetModuleItemAcquired();
    location lLocationOfTaker = GetLocation(GetModuleItemAcquiredBy());
    if (GetResRef(oItem) == "it_dw10") {
    ActionTakeItem(oItem, oTaker); //тут вылетает с ошибкой
    CreateObject(nObjectType, "c_dogwolfdire",lLocationOfTaker, FALSE, "c_dogwolfdire1");
    object oHench = GetObjectByTag("c_dogwolfdire1");
    AddHenchman(oTaker, oHench);
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.