Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
4 страниц V  « < 2 3 4  
Ответить в эту темуОткрыть новую тему
> Азы скриптинга NWN/NWN2, Итак, начинаем с самого начала...
Aiwan
сообщение Dec 17 2007, 18:11
Сообщение #76


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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

Вот такая функция определяет кастомный токен.
Neverwinter Script Source

SetCustomToken( 100, "Строка для токена" );


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

Я приаттачил вам модуль, в нем два новых НПС. Один как заготовка, второй мой рабочий. Вы должны изменить ГОТОВЫЕ скрипты что бы ваш диалог работал как мой. Что бы у вас не было соблазна загляуть в мои скрипты исходники я вырезал и положил отдельно в папке. Вам надо всего то поправить три скрипта. В каждом добавляется коротенькая строка. Зато вы увидите как можно делать то что выглядело у нас чутким нагромождением диалоговых строк. Да, не забудьте посомтреть на журнал. Я сделал наподобие простого квеста. Но этот квест сделан полностью по схеме тулсета, без применения скриптовой части. Потом мы попробуем это же самое отскриптить. Но это позже. Так. Качайте, переименовывайте модули, локальные переменные и правьте диалог так, что бы он работал как у НПС "Образец". Что непонятно спрашивайте.

Прикрепленный файл  aiwan_modules.rar ( 12.05 килобайт ) Кол-во скачиваний: 13
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Dec 20 2007, 03:07
Сообщение #77


Level 4
**

Класс: Маг
Характер: Chaotic Neutral
Раса: Танар'ри



Вроде бы все получилось. По крайней мере оно работает… (IMG:style_emoticons/kolobok_light/yahoo.gif)
Рабочая строка непися должна появляться при условии, что переменная меньше или равна 5.
Строка + появляется при условии, что переменная равна 5.
Рабочая строка игрока наоборот появляется только при условии, что переменная меньше 5.
А в универсальном скрипте, необходимо было прописать условие, что если переменная меньше 5, то к ней прибавляется 1, при других условиях присваиваем переменную равную 0?

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

Модуль отправила.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Dec 20 2007, 09:37
Сообщение #78


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



достаточно в скрипте прописывать значение того токена, который будет отображен ЕСЛИ текущее значение токена не подходит. Все переприсваивать нет нужды.
Те например дали игроку кличку, записали мы ее в токен с номером 50000 и можем юзать дальше во всех диалогах до посинения, не трогая значения токена больше нигде.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jan 14 2008, 21:13
Сообщение #79


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Artlira, я получил твое письмо и написал ответ. Занятия я продолжу. Напиши мне в приват на что сделат ьупор. Не пойму, что то наши е-майлы не проходят видно друг к другу. Если ты осталась одна, я все равно продолжу.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jan 27 2008, 12:03
Сообщение #80


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Продолжаем разговор.

Так. В данном файле лежит модуль в котором есть один полный квест про книгу. Задача игрока принести книгу заказчику. На что я хочу обратить внимание. Я попытался сделать несколько свободных моментов в квесте, а именно. Можно принести книгу и еще не говорить с хозяйкой. Можно отказаться нести книгу но найдя отдать. Можно имея книгуна руках не отдать хозяйке прямо сказав ей об этом. Вот в сущности простой квест но он имеет много ньюансов. Я не думаю, что вы сможете сразу написать такой. Я хочу что бы вы попробовали все варианты диалога. И проследили что и как работает. Например. Если отказаться от задания и получить статус квеста с локалкой 1, то имея все же книгу на руках у нас шанс отдать ее и выполнить квест появляется.

Neverwinter Script
//:://////////////////////////////////////////////
//:: Проверим взяли мы квест или нет
//:: Copyright © 2007 WRG!
//:://////////////////////////////////////////////
/*
     Вернуть книгу девушке
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 10.12.2007
//:://////////////////////////////////////////////
#include "nw_i0_tool"

int StartingConditional( )
{
    object oPC = GetPCSpeaker( );
    int iQuest = GetLocalInt( oPC, "QUEST_BOOK" );

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

//-------------------------------------------------------

// Если локалка равна 1 И в сумке нет книги.
    if ( iQuest == 1 && !HasItem( oPC, "AM_IT_BOOK001" ) )
    {
        return TRUE; // Возврат ИСТИНА, т.е. старт диалога
    }
    return FALSE; // В противном случае отбой
}


Я воспользовался инклюдой биовар на проверку предмета в рюкзаке !HasItem(oPC, "AM_IT_BOOK001"). Восклицательный знак впереди говорит о том что это отрицание, т.е. НЕТ книги в рюкзаке. Вот во втором случае книга уже есть при проверке. Тут можно дать шанс игроку вернуть:
Neverwinter Script
#include "nw_i0_tool"

int StartingConditional( )
{
    object oPC = GetPCSpeaker( );
    int iQuest = GetLocalInt( oPC, "QUEST_BOOK" );

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

//-------------------------------------------------------

// Если локалка равна 1 И в сумке книга.
    if ( iQuest == 1 && HasItem( oPC, "AM_IT_BOOK001" ) )
    {
        return TRUE; // Возврат ИСТИНА, т.е. старт диалога
    }
    return FALSE; // В противном случае отбой
}


Обратити внимание на структуру названия скриптов. Вы можете придумать свою, но рекомендую определиться с этим ло начала работ. Например: am_sc_q01_01 АйванМодуль_StartingConditional_Quest01_переменная01. Вот примерная расстановка.

Еще. Я не использовал журнальные записи в диалогах опционально. Я все присваивал в скриптах. Почему? Дело в том, что если квесту присвоить финальную ветку, то с помощью диалога он уже не вернется на статус не выполненых. Поэтому мы можем процесс держат ьпод контролем. Сработал скрипт, сработал журнал.

В квесте, я сделал одну запись в журнале, когда мы берем книгу в свой рюкзак. Вот такой скрипт am_mod_acquired на свойствах модуля для взятия предмета в инвентарь:
Neverwinter Script
#include "nw_i0_generic"
#include "x2_inc_switches"

void main( )
{
  object oMod = GetModule( ); // Это мы определили модуль
  object oItem = GetModuleItemAcquired( ); // Сам Item объект который попал в рюкзак
  object oPC = GetModuleItemAcquiredBy( ); // Тот кто взял
  string sTagItem = GetTag( oItem ); // Таг Item-a

  if( !GetIsPC( oPC ) ) return; // Если тот кто поднял предмет не РС то возврат.

  // Для теста. Все предметы что попали в сумку опознаем атоматически.
  if( !GetIdentified( oItem ) )
  {
    SetIdentified( oItem, TRUE ); // Если предмет неопределен мы его определяем
    SendMessageToPC( oPC, ( GetName( oItem )+" - неизвестный предмет опознан." ) );
  }

//==================================================
//                               ЖУРНАЛЬНЫЕ ЗАПИСИ
//==================================================

    // -------------------------------------------------------------------------
    //                      КНИГА
    // -------------------------------------------------------------------------
    if ( sTagItem =="AM_IT_BOOK001" ) // Искомый предмет
    {
      // Если на модуле нет локалки равной тегу нашего предмета sTagItem ( см выше как он определяется )
      if( !GetLocalInt( oMod, sTagItem ) ) // Если нет на модуле то..
      {
         // Сразу присвоим модулю, что мы подняли один раз предмет
         SetLocalInt( oMod, sTagItem, TRUE );

/*
   Пометим в журнале у игрока, что мы нашли предмет. Но. Если на нашем игроке нет
   ни одной переменной  QUEST_BOOK. значит он нашел книгу случайно. Значит в журнале
   мы присвоим другую запись, о том что у нас какая то странная книга, хрен знает чья.

*/

         if( !GetLocalInt( oPC, "QUEST_BOOK" ) ) // если нет локалки то
         {
             // Добавим запись в журнал тег квеста J_QUEST_BOOK 3 - номер записи
             AddJournalQuestEntry( "J_QUEST_BOOK", 3, oPC );
         }
          else // else - ЕЩЕ выполянется если условие перед скобкой не сработало
              {
                AddJournalQuestEntry( "J_QUEST_BOOK", 4, oPC );
              }
      }
    }


//==================================================
//     СТАНДАРТНАЯ СИСТЕМА item tag - ЗАПУСК СКРИПТА равного item tag
//==================================================

     // * object oItem = GetModuleItemAcquired( );
     // * Generic Item Script Execution Code
     // * If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module,
     // * it will execute a script that has the same name as the item's tag
     // * inside this script you can manage scripts for all events by checking against
     // * GetUserDefinedItemEventNumber( ). See x2_it_example.nss
     if ( GetModuleSwitchValue( MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS ) == TRUE )
     {
        SetUserDefinedItemEventNumber( X2_ITEM_EVENT_ACQUIRE );
        int nRet =   ExecuteScriptAndReturnInt( GetUserDefinedItemEventScriptName( oItem ), OBJECT_SELF );
        if ( nRet == X2_EXECUTE_SCRIPT_END )
        {
           return;
        }

     }
}


Он присваивает две разные записи в журнал, в зависимости от того, общались мы с девушкой или нет. Я написал скртипт в нутри главноого, но НВН позволяет делать так. Создать скрипт с именем предмета, в нашем случае am_it_book001 и в него уже вписать все действия. Но мне удобнее когда все под рукой. Как вам удобнее решать самим.

Задачи: вам надо изучить все мои скрипты. Внимательно простмотреть все ветки диалогов и написать простой квест. У вас есть 2 НПС, один НПС просит игрока отдать другому НПС кольцо. Диалоги обоих НПС должны быть автономны. Все прописать в журнале, на поднятие предмета тоже.
Прикрепленные файлы
Прикрепленный файл  modules_lesson_02.rar ( 13.42 килобайт ) Кол-во скачиваний: 3
 
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Feb 7 2008, 02:09
Сообщение #81


Level 4
**

Класс: Маг
Характер: Chaotic Neutral
Раса: Танар'ри



Вроде все получилось, хотя есть пара вопросов. Вопрос первый наверно нужно было сначала задать, а потом уже делать квест. (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif)
1. Действия должны быть следующими: 1 непись отправляет на поиски кольца (раз его нужно поднять с земли), после того как ему кольцо принесли – не забирает, а просит передать другому неписю? Ну и + все варианты? Я так сделала…
2. Обязательно ли нужно вешать на строку диалога локалку о том, что квест еще не брали, с неписем не видились? Если эту ветку кинуть в самый низ и оставить без проверок, она и должна бы 1 сработать?
3. На какой адрес отправлять задание?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Feb 7 2008, 09:05
Сообщение #82


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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

Если не можешь пришли на aiwan[злая собака]wrg.ru
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Feb 15 2008, 12:58
Сообщение #83


Level 4
**

Класс: Маг
Характер: Chaotic Neutral
Раса: Танар'ри



Aiwan вроде все отправила несколько дней назад. Может опять, не прошло где-то письмо? На какой еще адрес можно отправить?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Feb 16 2008, 10:39
Сообщение #84


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Почта работает. Не пойму, почему от тебя не приходят письма. Дай мне свой е-майл я отправлю с него тебе а ты ответишь.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
2_advanced
сообщение Mar 1 2008, 10:40
Сообщение #85


Level 9
Иконки Групп

Класс: Вор
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]



злостный оффтоп:
в нвн2 если чар находится вне локи (грузит еще, только что зашел на шард),
то действия через AssignCommand вешать на него нет смысла (IMG:style_emoticons/kolobok_light/ph34r.gif)

фикс:
Neverwinter Script
void Delayed_OnEnter(object oPC)
{
    if(!GetIsObjectValid(oPC))
        return;

    if(!GetIsObjectValid(GetArea(oPC)))
    {
        DelayCommand(0.4, Delayed_OnEnter(oPC));
        return;
    }

    AssignCommand(oPC, JumpToLocation(...));
}


в нвн1 такого не было..
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Merkuta
сообщение Feb 24 2010, 23:27
Сообщение #86


Level 3
*

Класс: Воин
Характер: Chaotic Good
Раса: Человек



Я понимаю, что просьба довольно наглая, учитывая сколько времени прошло, но нельзя ли возобновить уроки? Я прочитал всю тему, разобрал примеры, выполнил задания. Хочется двигаться дальше, но английским к сожалению владею не достаточно, чтобы учиться на других сайтах.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Feb 25 2010, 04:35
Сообщение #87


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Merkuta, боюсь, что английский придется учить в любом случае. Уроки возобновлять уже не будем.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Feb 25 2010, 08:55
Сообщение #88


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



Merkuta, перейди к реальным задачам, а если возникнут вопросы - задавай их на этом форуме. (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Merkuta
сообщение Mar 31 2010, 22:29
Сообщение #89


Level 3
*

Класс: Воин
Характер: Chaotic Good
Раса: Человек



Такой вопрос. Можно ли сделать несколько глобальных карт (не интерактивных как в SoZ, а рисованных как в оригинале и Маске). Например нужно сделать карту мира, на которой город обозначен как одна локация, но при переходе в город открывается карта города, и можно выбрать район, куда пойти.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Apr 2 2010, 04:29
Сообщение #90


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Merkuta, можно сделать кастомный UI
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Orochi
сообщение May 1 2011, 14:20
Сообщение #91


Level 3
*

Класс: Маг
Характер: True Neutral
Раса: Нежить



Ну тут Merkuta немного про другое говорит. Как я понял, это по типу карты из Dragon age 2. Тут, я думаю, вполне можно сделать вторуб карту ( с городом), а в основной при нажатии на иконку повесить скрипт на переход к карте города. (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

4 страниц V  « < 2 3 4
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 17th July 2018 - 22:01