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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
4 страниц V  < 1 2 3 4 >  
Ответить в эту темуОткрыть новую тему
> Азы скриптинга NWN/NWN2, Итак, начинаем с самого начала...
Griffon
сообщение Oct 10 2007, 15:35
Сообщение #26


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

Класс: Страж Тьмы
Характер: True Neutral
Раса: Человек
МАСТЕР D&D



Цитата(Griffon @ Oct 9 2007, 12:24) *
Neverwinter Script Source
void main()
{
object oGriffon = OBJECT_SELF;
int iMax = GetMaxHitPoints(oGriffon);
int iD = iMax-5;
effect eDamage = EffectDamage(iD);

AssignCommand(oGriffon, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage,oGriffon));
}


Результат - 0.85.nss(1): ERROR: ELLIPSIS IN IDENTIFIER


Почему же пишет что ошибка? И что это за ошибка?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 10 2007, 16:05
Сообщение #27


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

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



Цитата(Griffon @ Oct 10 2007, 18:35) *
Почему же пишет что ошибка? И что это за ошибка?

Может из за НВН2 функций. Я пока компилю на первом НВН так как второй еще не ставил, карту недавно купил и винду переставил. Попробуй в первом редакторе компильнуть. Не переживайте логика и все что в первом НВн то и во втором. Но в редакторе первого НВН легче и понятней. Так что рекомендую юзать пока его.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Oct 11 2007, 10:43
Сообщение #28


Лорд AxisTown'a
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Дварф
NWN: Маппинг



Цитата
Результат - 0.85.nss(1): ERROR: ELLIPSIS IN IDENTIFIER

Griffon у тебя имя файла "0.85" ?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Griffon
сообщение Oct 11 2007, 11:56
Сообщение #29


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

Класс: Страж Тьмы
Характер: True Neutral
Раса: Человек
МАСТЕР D&D



Цитата(mamuc @ Oct 11 2007, 11:43) *
Griffon у тебя имя файла "0.85" ?


Какого? Что за файл? Я не сохранял скрипт, написал и просто нажал скомпилировать. Может после перехода на след строку не нужно табуляцией сдвигать ее в право, он сам сдвинет?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Oct 11 2007, 12:12
Сообщение #30


Лорд AxisTown'a
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Дварф
NWN: Маппинг



в тулсете при компиляции обязательно создаеться файл (IMG:style_emoticons/kolobok_light/rolleyes.gif)

Цитата
Результат - 0.85.nss(1): ERROR: ELLIPSIS IN IDENTIFIER


сообщение о ошибке следует читать так
"0.85" имя файла меня здесь делает осторожным присутствие точки ( есть древнее правило неупотреблять в именах некоторые специальные симболы, в частности точка в имени файла должна отделять имя и тип файла и не использоваться никак иначе)
"nss" - это и есть тот тип файла про который я упоминал выше
"(1)" - номер строки в котором произошла ошибка
"ERROR: ...." что именно компилятору не нравиться
попробуй написать скрипт и сохранить его под каким то другим именем и потом прокопилировать

Сообщение отредактировал mamuc - Oct 11 2007, 12:13
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Griffon
сообщение Oct 11 2007, 13:26
Сообщение #31


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

Класс: Страж Тьмы
Характер: True Neutral
Раса: Человек
МАСТЕР D&D



Уфффф..... Пока разобрался (IMG:style_emoticons/kolobok_light/crazy.gif)

2mamuc, спасибо за подсказку, помогло найти что вызывало сбой.

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

Затем создал локацию -> затем новый скрипт -> написал, причем именно так без отступлений
Neverwinter Script Source
void main()
{
object oChest = OBJECT_SELF;
object oItem = GetFirstItemInInventory(oChest);
while (GetIsObjectValid(oItem))
{
DestroyObject(oItem);
oItem = GetNextItemInInventory(oChest);
}


Получил ошибку - None.nss(1): ERROR: INVALID DECLARATION TYPE □

После этого переименовал локацию с зона1 на zone1 и Скрипт1 на script1 и еще раз -> компилировать. И, о чудо! выдал ответ, что компиляция успешна, файл находится там-то и там-то. Спасибо.



Добавлено через 23 минуты 13 секунды

P.S. Сменил язык на английский и компилит без проблем file -> new -> script (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Oct 11 2007, 13:46
Сообщение #32


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

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



Цитата(Griffon @ Oct 11 2007, 14:26) *
Скрипт1 на script1

самое важное. На русском названия скриптов низя писать. Поэтому от русификаторов в работе с тулсетом лучше держаться подальше - русские дефолтовые названия порождают проблемы.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Oct 12 2007, 08:58
Сообщение #33


Лорд AxisTown'a
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Дварф
NWN: Маппинг



to Griffon только добавь в тобой приведенном примере еще одну закрывающую скобку плз (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 12 2007, 10:14
Сообщение #34


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

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



Такс... Продолжаем разговор (с) Карлсон который живет на крыше.

Мы с вами уже изучили то, что объекты, еффекты и прочие данные можно и НУЖНО описывать заранее. Теперь мы немного разберем то, как определить объект? Мы взяли очень простую схему OBJECT_SELF. попросту говорим что oSelf это ты сам. Но не всегда так просто можно найти нужный объект. В тулсете полно функций, которые определяют объект, например по тегу.

Neverwinter Script Source
object oNpc = GetObjectByTag("NPC_AIWAN");


Функция Get Objec tBy Tag говорит Взять Объект С Тегом. Но вы должны учитывать, что такой объект должен быть с уникальным тегом, что бы ваш скрипт работал нормально. Либо вы должны будете описать еще условия которые позволят найти вам ваш нужный объект. К примеру, если у вас несколько одинаковых НПС и вам нужен один из них то омжно воспользоваться функцией Get Nearest Object By Tag которая говорит Взять Ближайший Объект с Тегом. Эта функция имеет несколько параметров, в ней можно задать условие ближайший объект от кого? Ведь надо точно указать точку отсчета ближайшего объекта от, например двери. По умолчанию у скрипт будет брать ближайший объект от того кто запустил скрипт. Если скрипт стоял на триггере то возьмет ближайший от него. Дети ктороые играют в салочки кричат: "Кто последний тот тухлый банан! Кто первый тот чемпион!" и бегут в дверь. Так вот, чемпион будет именно тот, кто первым добежит и он скорее всего самый ближайший объект у двери. А зачастую он и кричит такую фразу. Всем задание. Создайте в редакторе модуль. Поставьте одну внутреннюю локацию. В ней три нпс с тегами NPC_ВАШ_НИК, поставьте дверь с тегом DOOR_ВАШ_НИК. Начертите подальше от двери триггер и на сло OnEnter поставьте скрипт и настройте его в соответсвии с вашими тегами.

Neverwinter Script Source
// Поиск чемпиона канады
void main()
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag("DOOR_AIWAN_01"); // Наша дверь
  object oNpc = GetNearestObjectByTag("NPC_AIWAN", oDoor);
  object oPC = GetEnteringObject(); // Тот кто НАСТУПИЛ на триггер
  string sSpeak = "Кто последний тот тухлый банан!"; // Фраза

  if(GetIsPC(oPC)) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
    AssignCommand(oNpc, ClearAllActions()); // Чистим стек команд
    AssignCommand(oNpc, SpeakString(sSpeak)); // Говорит фразу
    AssignCommand(oNpc, ActionForceMoveToObject(oDoor, TRUE)); // Бежит к двери
    // Если убрать TRUE то НПС просто пойдет пешком...
  }
}


В этом скрипте мы находим объекты как то: по тегу (Двери), по действию (Тот кто наступил на триггер), и берем ближайший с тегом. Мне важно что бы вы хотя бы попробовали и поняли как это все работает.

Для того что бы понять что я дал поставьте НПС в линейку между триггером и дверью. Потом посомтрев что происходит вы удалите в строке:
Neverwinter Script Source
object oNpc = GetNearestObjectByTag("NPC_AIWAN", oDoor); // Измените на
  object oNpc = GetNearestObjectByTag("NPC_AIWAN"); // ЭТО


Мы поменяли точку отсчета и теперь к двери побежит ближайший к ТРИГГЕРУ объект. У кого все получилось говорите. У кого что не получилось тоже. Жду...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Oct 13 2007, 02:58
Сообщение #35


Level 4
**

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



[ OFFTOP ]
В первом варианте к определение объекта (oNpc) было указано, как объект с заданным тагом, ближайший к двери (oDoor). Тот из трех неписей, который был ближе всех к двери к ней и побежал и произнес фразу.
Neverwinter Script Source
void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "DOOR_LIRA_01" ); // Наша дверь
  object oNpc = GetNearestObjectByTag( "NPC_LIRA", oDoor ); //Ближайший к двери объект
  object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
  string sSpeak = "Кто последний тот тухлый банан!"; // Фраза

  if( GetIsPC( oPC )) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
    AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
    AssignCommand( oNpc, SpeakString( sSpeak )); // Говорит фразу
    AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE )); // Бежит к двери
    // Если убрать TRUE то НПС просто пойдет пешком...
  }
}

Во втором варианте изменилось определение объекта, то есть не было указано, ближайший к чему. Наверно, поэтому, к двери побежал тот непись, который был ближе к триггеру. Сменился приоритет объекта – по отношению к которому выбирался ближайший. Еще я убрала TRUE – непись действительно не побежал, а пошел!
Neverwinter Script Source
void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "DOOR_LIRA_01" ); // Наша дверь
  object oNpc = GetNearestObjectByTag( "NPC_LIRA" ); //Ближайший к триггеру объект
  object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
  string sSpeak = "Кто последний тот тухлый банан!"; // Фраза

  if( GetIsPC( oPC )) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
    AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
    AssignCommand( oNpc, SpeakString( sSpeak )); // Говорит фразу
    AssignCommand( oNpc, ActionForceMoveToObject( oDoor )); // Идет к двери
  }
}

Вроде все получилось.

Сообщение отредактировал Aiwan - Oct 13 2007, 20:12
Причины изменения: ОТЛИЧНО.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Oct 13 2007, 09:58
Сообщение #36


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

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



советую так же, как и на внеклассных занятиях, прятать скрипты, чтобы другие участники случайно не увидели. (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Vhall
сообщение Oct 13 2007, 17:45
Сообщение #37


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

Класс: Обыватель
Характер: True Neutral
Раса: Дварф
NWN: Контент



О! Побежал. -_-
[ OFFTOP ]
Neverwinter Script Source
// Поиск чемпиона канады
void main()
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag("PLC_DC_Slum01"); // Наша дверь
  object oNpc = GetNearestObjectByTag("n_watchman", oDoor);
  object oPC = GetEnteringObject(); // Тот кто НАСТУПИЛ на триггер
  string sSpeak = "Кто последний тот тухлый банан!"; // Фраза

  if(GetIsPC(oPC)) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
    AssignCommand(oNpc, ClearAllActions()); // Чистим стек команд
    AssignCommand(oNpc, SpeakString(sSpeak)); // Говорит фразу
    AssignCommand(oNpc, ActionForceMoveToObject(oDoor, TRUE)); // Бежит к двери
    // Если убрать TRUE то НПС просто пойдет пешком...
  }
}


Neverwinter Script Source
// Поиск чемпиона канады
void main()
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag("PLC_DC_Slum01"); // Наша дверь
  object oNpc = GetNearestObjectByTag("n_watchman", oDoor);
  object oPC = GetEnteringObject(); // Тот кто НАСТУПИЛ на триггер
  string sSpeak = "Кто последний тот тухлый банан!"; // Фраза

  if(GetIsPC(oPC)) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
    AssignCommand(oNpc, ClearAllActions()); // Чистим стек команд
    AssignCommand(oNpc, SpeakString(sSpeak)); // Говорит фразу
    AssignCommand(oNpc, ActionForceMoveToObject(oDoor)); // Идет к двери
    // Если убрать TRUE то НПС просто пойдет пешком...
  }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
shadowdweller
сообщение Oct 16 2007, 23:01
Сообщение #38


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

Класс: Вор
Характер: Chaotic Good
Раса: Эльф
МАСТЕР Переводов



Бежит!
[ OFFTOP ]
Neverwinter Script Source
// Поиск чемпиона канады
void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "DOOR_KOSHIKO" ); // Наша дверь
  object oNpc = GetNearestObjectByTag( "KOSHIKO", oDoor );
  object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
  string sSpeak = "Кто последним прибежит, тот прибежит последним!!"; // Фраза ( (С ) Тигра )

  if( GetIsPC( oPC ) ) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
    AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
    AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
    AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери
    // Если убрать TRUE то НПС просто пойдет пешком...
  }
}

Neverwinter Script Source
void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "DOOR_KOSHIKO" ); // Наша дверь
  object oNpc = GetNearestObjectByTag( "NPC_KOSHIKO" ); //Ближайший к триггеру объект
  object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
  string sSpeak = "Кто последним прибежит, тот прибежит последним!!"; // Фраза  ( (С ) Тигра )

  if( GetIsPC( oPC ) ) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
    AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
    AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
    AssignCommand( oNpc, ActionForceMoveToObject( oDoor ) ); // Идет к двери
  }
}



Сообщение отредактировал shadowdweller - Oct 16 2007, 23:11
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 17 2007, 10:12
Сообщение #39


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

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



Продолжаем.
Итак, мы уже говорили о том, что объект мало описать и представить, его надо точно ОПРЕДЕЛИТЬ. В нашем скрипте про трех НПС мы находили игрока взяв любого, кто наступил на триггер, потом мы поставили условие, что только тот если он представляет из себя РС выполнить следующее.

Neverwinter Script Source

  if( GetIsPC( oPC ) ) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
  {
      // ТУТ ЛЮБОЕ ДЕЙСТВИЕ
  }


Этот кусок кода содержит функцию, которая вовращает результат в виде TRUE или FALSE. Вы напряглись и начали дико соображать. О как все сложно! Никапельки. Объясняю. Все функции в тулсете выдают какой то результат, производят действия и т.д. Результат может быть в виде любый знакомых нам данных (integer, object, string, vector и т.д.) либо ИСТИНА/ЛОЖЬ. Мы в нашей скрипте проверяли истино ли то, что тот кто наступил на триггер игрок? Но я написал эту строку сокращенно, по всем правилам она будет выглядеть так:

Neverwinter Script Source

   if( GetIsPC( oPC )==TRUE ) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ
   {
      // ТУТ ЛЮБОЕ ДЕЙСТВИЕ ЕСЛИ НАСТУПИВШИЙ == ИСТИНА
   }


Вот так правильно описать, но в написании скриптов есть свои сокращений и вам их надо будет знать. Функция GetIsPC проверяет объект на то, игрок он или нет (может он ДМ или НПС). И выдает результат в виде TRUE (ИСТИНА) FALSE (ЛОЖЬ). Если не ставить знак проверки результата что делают многие в описании своих скриптов, то результат ИСТИНА будет внутри скобок а ЛОЖЬ дальше. Теперь смотрите как выглядит сама функция:

Neverwinter Script Source

// * Returns TRUE if oCreature is a Player Controlled character.
int GetIsPC( object oCreature )


Видите, она в самом начале показывает, что результатом будет ЧИСЛОВОЕ значение в нашем случае FALSE это НОЛЬ 0 либо TRUE ЭТО ЕДИНИЦА 1. В компьютере все данные представлены именно в таком виде либо да либо нет (IMG:style_emoticons/kolobok_light/smile.gif) Если разобрать подробно, то функция будет выглядеть так:

Neverwinter Script Source

int GetIsPC( object oCreature )
// Результат либо FALSE либо TRUE ИГРОК_ЛИ( Объект, который мы проверяем )


Еще я употребил ДВА занка равенства вместе. Это проверка равенства. Вот если я употребляю один знак равно, как в описании объектов, то я ПРИРАВНИВАЮ а не проверяю. Понимаете разницу? Написав "ЛЕКС = ВАНЮЧКА" будет звучать как Лекс ЭТО ВАНЮЧКА! А "ЛЕКС == ВАНЮЧКА" будет означать "Лекс ВАНЮЧКА или нет?" Утверждение "ЛЕКС != ВАНЮЧКА" будет звучать как "Лекс НЕ ВАНЮЧКА!"

Код
= =    Тест равенства ("равняется").
!=    Тест не равенства ("не равняется").
<    Меньше чем, тест равенства
>    Больше чем, тест равенства
<=    Меньше или равно, тест равенства
>=    Больше или равно, тест равенства
&&    Логическое И.
&    Битовое И.
||    Логическое ИЛИ.
|    Битовое ИЛИ.
!    Логическое НЕ.


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

Я сейчас покажу как можно записать один и тот же результат разными способами:

Neverwinter Script Source
   if( GetIsPC( oPC ) ) // ЕСЛИ тот кто наступил ИГРОК ТО ВЫПОЛНЯЕМ

   if( GetIsPC( oPC )==TRUE ) // ЕСЛИ тот кто наступил ИГРОК равено TRUE

   if( GetIsPC( oPC )==1 ) // ЕСЛИ тот кто наступил ИГРОК равно 1

   if( GetIsPC( oPC )!=FALSE ) // ЕСЛИ тот кто наступил ИГРОК НЕ равно ЛОЖЬ

   if( GetIsPC( oPC )!=0 ) // ЕСЛИ тот кто наступил ИГРОК НЕ равно 0


Так вот, вернемся в начало. Мы в скрипте брали того, кто наступит на триггер и проверяли это ли игрок? Это очень важно правильно задать вопрос, что бы получить на него правильны и нужный нам ответ для скрипта. В тулсете много функций которые помогают найти объект по действиям последнего: кто наступил, кто сошел, кто ближе, кто получил урон, кто умер и т.д. Естественно на слоте триггера OnEnter трудно получить результат GetLastOpenedBy() (кто последний открыл). Это одна из первых основных ошибок. Учитывайте где утсановлен скрипт и если вы взяли кусок кода из скрипта на сундуке то он может не подойти в описании РС для триггера.

Теперь задание. Ваш рабочий скрипт про трех НПС поместите в слот OnExit триггера и опишите игрока правильно при этом условие if(GetIsPC(oPC)) должно быть любым другим способом описанным выше мной. Результаты публиковать, но главное что бы был ответ и понимание того что вы сделали. Отвечать в тему. Жду.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Oct 19 2007, 11:35
Сообщение #40


Level 4
**

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



Вот что получилось:
[ OFFTOP ]
В первом варианте скрипт стоял на OnEnter, поэтому игрок определялся как объект, наступивший на триггер.
Если скрипт поставить на OnExit, то надо будет поменять определение объекта, с ”того кто наступил”(GetEnteringObject()), на ”того кто сошел с триггера”(GetExitingObject())?
То есть object oPC = GetExitingObject()
И сам скрипт в таком случае будет выглядеть так:
Neverwinter Script Source
void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "DOOR_LIRA_01" ); // Наша дверь
  object oNpc = GetNearestObjectByTag( "NPC_LIRA", oDoor ); //Ближайший к двери объект
  object oPC = GetExitingObject( ); // Тот кто сошел с триггера
  string sSpeak = "Кто последний тот тухлый банан!"; // Фраза

  if( GetIsPC( oPC )==TRUE ) // ЕСЛИ тот кто наступил ИГРОК равно Истина( TRUE )
  {
    AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
    AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
    AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери
  }
}

И сработать скрипт будет должен после того, как игрок сойдет с триггера, а не наступит на него.
Причины изменения: Отлично. ВСЕ ВЕРНО.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 20 2007, 12:02
Сообщение #41


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

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



Господа и дамы. Так мы все позабываем...Давайте хотя бы перерывы большие не делать. Процесс обучения может быть только обоюдный я говорю, вы делаете простые задания. ТОЛЬКО я писать не буду, толку от этого без практики мало.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Vhall
сообщение Oct 22 2007, 08:51
Сообщение #42


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

Класс: Обыватель
Характер: True Neutral
Раса: Дварф
NWN: Контент



[ OFFTOP ]
Neverwinter Script Source
// Поиск чемпиона канады
void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "PLC_DC_Slum01" ); // Наша дверь
  object oNpc = GetNearestObjectByTag( "n_watchman", oDoor );
  object oPC = GetExitingObject( ); // Тот кто СОШЕЛ с триггера
  string sSpeak = "Кто последний тот тухлый банан!"; // Фраза

if( GetIsPC( oPC )==1 ) // ЕСЛИ тот кто наступил ИГРОК равно 1
  {
    AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
    AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
    AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери
    // Если убрать TRUE то НПС просто пойдет пешком...
  }
}

Edited

Сообщение отредактировал Vhall - Oct 22 2007, 09:12
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 22 2007, 10:02
Сообщение #43


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

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



Vhall, ты ошибся. В какой слот ты ставил скрипт? А каким образом определял игрока? Подумай внимательно.

Добавлено через 54 минуты 24 секунды

п.с. Теперь верно. Понял что важно при условиях срабатывания скрипта, так же правильно указывать условия поиска объекта?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Vhall
сообщение Oct 22 2007, 10:13
Сообщение #44


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

Класс: Обыватель
Характер: True Neutral
Раса: Дварф
NWN: Контент



Ну как тебе сказать... -_-
Вроде бы.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 26 2007, 12:12
Сообщение #45


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

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



Так. Продолжаем.

Я уже разбирал в начале, что такое переменная. Теперь самое время применить знания на практике. Но мыдолжны сперва с вами изучить структуру постороения скрипта. Так вот, внутри скрипта все делится на блоки со своими условиями. Естественно можно обойтись простым действием без блоков, но мы разберем сложный скрипт в котором четыре блока. Вот они:

Neverwinter Script Source
void main( )
{
      if ( TRUE ) // это ПЕРВЫЙ БЛОК
      {
            if ( TRUE ) // это ВНУТРИПЕРВЫЙ БЛОК относится к первому блоку он ВЛОЖЕН в него
            {
                // выполняем какое то действие для ВНУТРИПЕРВОГО БЛОКА
            }

            // тут выполняется то что мы хотим для ПЕРВОГО БЛОКА
      }

      if ( TRUE ) // это ВТОРОЙ БЛОК
      {
            // тут выполняется то что мы хотим для ВТОРОГО БЛОКА
      }

      if ( TRUE ) // это ТРЕТИЙ БЛОК
      {
            // тут выполняется то что мы хотим для ТРЕТЬЕГО БЛОКА
      }
}


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

Neverwinter Script Source

void main( )
{
   object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
   object oDoor = GetObjectByTag( "DOOR_AIWAN_01" ); // Наша дверь
   object oNpc; // Объявим НПС но не укажем, кто он именно
   object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
   string sSpeak = "Кто последний тот тухлый банан!";

   if( GetIsPC( oPC ) == TRUE ) // Если это верно ТО выполняется то что между скобок
   { // ПЕРВАЯ открытая скобка

     /* ВТОРОЙ ВНУТРЕННИЙ БЛОК */

     if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" )== 1 ) // Если локалка РАВНА 2 ТО:
     { // ВТОРАЯ открытая скобка

        oNpc = GetNearestObjectByTag( "NPC_AIWAN" );
        SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 2 );
        SendMessageToPC( oPC, "Сработал второй блок" );

     } // ВТОРАЯ закрытая скбка

     /* ТРЕТИЙ ВНУТРЕННИЙ БЛОК */

     if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 0 )
     { // ТРЕТЬЯ открытая

        oNpc = GetNearestObjectByTag( "NPC_AIWAN" );
        SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 1 );
        SendMessageToPC( oPC, "Сработал третий блок" );
     }  // ТРЕТЬЯ закрытая

     /* ТУТ НУЖНО ДОПИСАТЬ ЕЩЕ ОДИН БЛОК*/

      SendMessageToPC( oPC, "Сработал ОСНОВНОЙ блок" );
      AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
      AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
      AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери

   } // ПЕВАЯ закрытая скобка

}


В этом скрипте, каждый раз наступая на триггер один НПС бежит к двери. Что бы вам было понятно какой кусок кода работает я работу скрипта пояснил дебаг сообщениями. Этот скрипт сработает ДВА раза. Ваша задача, сделать так, что бы все ТРИ нпс убежали, а попросту, сдобавить один блок внизу, что бы скрипт срабатывал постоянно. Название переменной содержит ВАШ ник. Для самых сообразительных задача посложнее. Сделать так, что бы каждый раз НПС говорили разные фразы.

Что неясно спрашивайте.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Oct 27 2007, 08:50
Сообщение #46


Level 4
**

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



Что-то у меня не все получается…

Сделать так, что бы неписи говорили разные фразы у меня получилось. Просто скопировала вариант с определением object oNpc;
То есть string sSpeak; указала, что фраза будет, но не писала какая именно.
А потом в каждом блоке добавила строчку:
sSpeak = ”фраза”; (фраза_1, фраза_2)

А вот с четвертым блоком у меня почему-то не получается. Вроде, если рассуждать логически, то в 4 блоке необходимо сделать проверку на переменную LIRA_PC_DO_IT, 2 и дальше просто ”обнулить” ее. В этом случае скрипт должен будет постоянно работать, присваивая переменные триггеру, затем, обнуляя последнюю, возвращаться снова к 0, то есть к отсутствию переменной.
Записала так:
[ OFFTOP ]

Neverwinter Script Source
void main( )
{
   object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
   object oDoor = GetObjectByTag( "DOOR_LIRA_01" ); // Наша дверь
   object oNpc;
   object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
   string sSpeak;

   if( GetIsPC( oPC ) == TRUE )
   {

  /* ВТОРОЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" )== 1 )
     {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Тухлый банан будет следующий!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 2 );
        SendMessageToPC( oPC, "Сработал второй блок" );

     }

  /* ТРЕТИЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" ) == 0 )
     {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Кто последний тот тухлый банан!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 1 );
        SendMessageToPC( oPC, "Сработал третий блок" );
     }

     /* ЧЕТВЕРТЫЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" ) == 2 )
     {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Сам ты тухлый банан!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 0 );
        SendMessageToPC( oPC, "Сработал четвертый блок" );
     }

      SendMessageToPC( oPC, "Сработал ОСНОВНОЙ блок" );
      AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
      AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
      AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери

   }

}



Скрипт действительно срабатывает постоянно, но сам 4 блок не работает… Нет фразы из этого блока и неписи бегут только по условиям блока 2 и 3…
Когда присваивается переменная LIRA_PC_DO_IT, 2, скрипт продолжая считывать условие, автоматически ее проверяет и тут же обнуляет в 4 блоке. Поэтому в следующий раз, когда игрок наступает на триггер, у триггера уже нет переменной LIRA_PC_DO_IT, 2 и он срабатывает при условии, что LIRA_PC_DO_IT ==0…
В модуле это хорошо видно по сообщениям:
”Сработал второй блок”
”Сработал четвертый блок”
”Сработал ОСНОВНОЙ блок”
Получается, что задание вроде бы выполнено, все три непися уходят, скрипт работает постоянно, за счет переменных на триггере, а вот с фразами не могу разобраться.
Не могу понять, как заставить работать и 4 блок?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 27 2007, 09:21
Сообщение #47


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

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



Ты написала все верно, молодец. Я не просил, что бы в блоке что то делали. Мне важно было что бы вы поняли как изменить переменную. (IMG:style_emoticons/kolobok_light/smile.gif) Молодец (IMG:style_emoticons/kolobok_light/good.gif) Что бы все блоки работали как ты говоришь, надо просто сделать задержку DelayCommand типа:

Neverwinter Script Source

    if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" )== 1 ) // Если локалка РАВНА 2 ТО:
    { // ВТОРАЯ открытая скобка

        oNpc = GetNearestObjectByTag( "NPC_AIWAN" );
        DelayCommand( 0.3, SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 2 ));
        SendMessageToPC( oPC, "Сработал второй блок" );

    } // ВТОРАЯ закрытая скбка


Что бы переменная присваивалась уже тогда, когда скрипт сработал. 0.3 секунды обчно хватает. В этом скрипте и 0.1 секунды хватит, он короткий. А у тебя блоки срабатывают, просто два блока вместе. Все верно. (IMG:style_emoticons/kolobok_light/wink3.gif) И фраза берется из того блока, который сработал последним.

Добавлено через 2 минуты 1 секунду

п.с. А скажи, как еще можно изменить скрипт и сделать все три блока рабочими? Даю подсказку. Ввести новую переменную...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Oct 29 2007, 04:38
Сообщение #48


Level 4
**

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



Цитата
Что бы все блоки работали как ты говоришь, надо просто сделать задержку DelayCommand типа:

Понятно. Сделала через DelayCommand() - все заработало! (IMG:style_emoticons/kolobok_light/yahoo.gif)

Цитата
п.с. А скажи, как еще можно изменить скрипт и сделать все три блока рабочими? Даю подсказку. Ввести новую переменную...


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

[ OFFTOP ]
Neverwinter Script Source
void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "DOOR_LIRA_01" ); // Наша дверь
  object oNpc;
  object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
  string sSpeak;

  if( GetIsPC( oPC ) == TRUE )
  {
/* ЧЕТВЕРТЫЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IS" ) == 1 ) // Проверяю вторую переменную
    {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Сам ты тухлый банан!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IS", 2 );
        SendMessageToPC( oPC, "Сработал четвертый блок" );
    }
  /* ВТОРОЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" )== 1 )
    {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Тухлый банан будет следующий!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IS", 1 );  //Другая переменная
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 2 );
        SendMessageToPC( oPC, "Сработал второй блок" );

    }

  /* ТРЕТИЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" ) == 0 )
    {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Кто последний тот тухлый банан!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 1 );
        SendMessageToPC( oPC, "Сработал третий блок" );
    }

      SendMessageToPC( oPC, "Сработал ОСНОВНОЙ блок" );
      AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
      AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
      AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери

  }

}


Срабатывают все три блока по очереди, но по одному разу. Все попытки сделать так, что бы скрипт еще и работал постоянно на одних переменных не получается.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 29 2007, 06:56
Сообщение #49


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

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



Neverwinter Script Source

void main( )
{
  object oTrigger = OBJECT_SELF; // То на чем стоит скрипт
  object oDoor = GetObjectByTag( "DOOR_LIRA_01" ); // Наша дверь
  object oNpc;
  object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер
  string sSpeak;

  if( GetIsPC( oPC ) == TRUE )
  {

  /* ВТОРОЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" )== 1 && GetLocalInt( oTrigger, "WAIT" )==FALSE )
    {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Тухлый банан будет следующий!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 2 );
        SendMessageToPC( oPC, "Сработал второй блок" );
        SetLocalInt( oTrigger, "WAIT", TRUE );
    }

  /* ТРЕТИЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" ) == 0  && GetLocalInt( oTrigger, "WAIT" )==0 )
    {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Кто последний тот тухлый банан!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 1 );
        SendMessageToPC( oPC, "Сработал третий блок" );
        SetLocalInt( oTrigger, "WAIT", 1 );
    }

    /* ЧЕТВЕРТЫЙ ВНУТРЕННИЙ БЛОК */

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" ) == 2  && !GetLocalInt( oTrigger, "WAIT" ))
    {

        oNpc = GetNearestObjectByTag( "NPC_LIRA" );
        sSpeak = "Сам ты тухлый банан!";
        SetLocalInt( oTrigger, "LIRA_PC_DO_IT", 0 );
        SendMessageToPC( oPC, "Сработал четвертый блок" );
        SetLocalInt( oTrigger, "WAIT", TRUE );
    }

      SetLocalInt( oTrigger, "WAIT", FALSE ); // SetLocalInt( oTrigger, "WAIT", 0 );
      SendMessageToPC( oPC, "Сработал ОСНОВНОЙ блок" );
      AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд
      AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу
      AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери

  }

}


В каждом блоке надо сделать проверку двух переменных сразу вот так как на скрипте:

Neverwinter Script Source

if ( GetLocalInt( oTrigger, "LIRA_PC_DO_IT" ) == 0  && GetLocalInt( oTrigger, "WAIT" )==0 )


Если есть одна переменная и (&&) нет воторй ТО. Сразу же в сработавшем блоке ставим еще ту переменную WAIT какую мы проверяем для одного раза. Теперь любой другой блок не сработает так как мы уже пометили что блок выполнен первый. Дальше скрипт идет вниз и после всех выполнений он присваивает локалку 0. Что бы наступив в следующи раз выполнился блок с переменной 1.

Neverwinter Script Source
SetLocalInt( oTrigger, "WAIT", FALSE ); // SetLocalInt( oTrigger, "WAIT", 0 );


Понятно? К тому же, я специально написал тебе три разных варианта проверки переменных. Спрашивай (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Artlira
сообщение Oct 31 2007, 09:27
Сообщение #50


Level 4
**

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



Цитата
Понятно? К тому же, я специально написал тебе три разных варианта проверки переменных. Спрашивай


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

Двумя переменными сразу действительно легко создать такое условие, что бы оно не сработало ни на одном из блоков. Переменная WAIT при работе скрипта всегда становится равной 1? Такого условия нет ни для одного блока, и они не срабатывают, а “обнуляется” она уже тогда, когда все блоки пройдены и скрипт об нее уже не спотыкается? А при следующей работе – она уже равна 0 и не мешает работать тому из блоков, который должен сработать по условию переменной LIRA_PC_DO_IT?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

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

 



Текстовая версия Сейчас: 28th March 2024 - 20:36