![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#36
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
советую так же, как и на внеклассных занятиях, прятать скрипты, чтобы другие участники случайно не увидели. (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#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 то НПС просто пойдет пешком... } } |
![]()
Сообщение
#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 |
![]()
Сообщение
#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)) должно быть любым другим способом описанным выше мной. Результаты публиковать, но главное что бы был ответ и понимание того что вы сделали. Отвечать в тему. Жду. |
![]()
Сообщение
#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 ) ); // Бежит к двери } } И сработать скрипт будет должен после того, как игрок сойдет с триггера, а не наступит на него.
Причины изменения: Отлично. ВСЕ ВЕРНО.
|
![]()
Сообщение
#41
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Господа и дамы. Так мы все позабываем...Давайте хотя бы перерывы большие не делать. Процесс обучения может быть только обоюдный я говорю, вы делаете простые задания. ТОЛЬКО я писать не буду, толку от этого без практики мало.
|
![]()
Сообщение
#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 |
![]()
Сообщение
#43
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Vhall, ты ошибся. В какой слот ты ставил скрипт? А каким образом определял игрока? Подумай внимательно.
Добавлено через 54 минуты 24 секунды п.с. Теперь верно. Понял что важно при условиях срабатывания скрипта, так же правильно указывать условия поиска объекта? |
![]()
Сообщение
#44
|
|
Level 19 ![]() Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент ![]() |
Ну как тебе сказать... -_-
Вроде бы. |
![]()
Сообщение
#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 ) ); // Бежит к двери } // ПЕВАЯ закрытая скобка } В этом скрипте, каждый раз наступая на триггер один НПС бежит к двери. Что бы вам было понятно какой кусок кода работает я работу скрипта пояснил дебаг сообщениями. Этот скрипт сработает ДВА раза. Ваша задача, сделать так, что бы все ТРИ нпс убежали, а попросту, сдобавить один блок внизу, что бы скрипт срабатывал постоянно. Название переменной содержит ВАШ ник. Для самых сообразительных задача посложнее. Сделать так, что бы каждый раз НПС говорили разные фразы. Что неясно спрашивайте. |
![]()
Сообщение
#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 блок? |
![]()
Сообщение
#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 секунду п.с. А скажи, как еще можно изменить скрипт и сделать все три блока рабочими? Даю подсказку. Ввести новую переменную... |
![]()
Сообщение
#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 ) ); // Бежит к двери } } Срабатывают все три блока по очереди, но по одному разу. Все попытки сделать так, что бы скрипт еще и работал постоянно на одних переменных не получается. |
![]()
Сообщение
#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) |
![]()
Сообщение
#50
|
|
Level 4 ![]() ![]() Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри ![]() |
Цитата Понятно? К тому же, я специально написал тебе три разных варианта проверки переменных. Спрашивай Ой… Понятно, не догадалась проверить сразу две переменные… Надо было не над скриптом издеваться, а прочесть еще раз тему о переменных… Двумя переменными сразу действительно легко создать такое условие, что бы оно не сработало ни на одном из блоков. Переменная WAIT при работе скрипта всегда становится равной 1? Такого условия нет ни для одного блока, и они не срабатывают, а “обнуляется” она уже тогда, когда все блоки пройдены и скрипт об нее уже не спотыкается? А при следующей работе – она уже равна 0 и не мешает работать тому из блоков, который должен сработать по условию переменной LIRA_PC_DO_IT? |
![]()
Сообщение
#51
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Да, все верно. Мы еще один вариант блоков рассмотрим. Подожденм остальных. (IMG:style_emoticons/kolobok_light/declare.gif)
|
![]()
Сообщение
#52
|
|
Level 19 ![]() Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент ![]() |
Что-то написал. Даже компилируется. Работает или нет - сказать не могу - не понятен нужный результат.
Для чего мы ставим и проверяем локалки? Откомментировал вопросами. [ OFFTOP ] 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 ТО: //почему "2"? не 1? { // ВТОРАЯ открытая скобка 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, "Сработал третий блок" ); } // ТРЕТЬЯ закрытая /* четвертый внутренний блок */ if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 0 ) //? { // четвертая открытая oNpc = GetNearestObjectByTag( "NPC_AIWAN" ); SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 3 ); //? SendMessageToPC( oPC, "Сработал четвертый блок" ); } // четвертая закрытая SendMessageToPC( oPC, "Сработал ОСНОВНОЙ блок" ); AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери } // ПЕРВАЯ закрытая скобка } |
![]()
Сообщение
#53
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Vhall, мы присваиваем локалки что бы блоки сработали ОДИН раз за проход скрипта сверху вниз. Посомтри внимательно.
В первом внутреннем блоке мы проверяем переменную AIWAN_PC_DO_IT равную 1. Внутри блока мы поставили эту локальную со значением 2. Тем самым мы сделали так, что бы второй раз наступив на триггер скрипт не сработал внутри этого блока. Neverwinter Script Source /* ВТОРОЙ ВНУТРЕННИЙ БЛОК */ if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" )== 1 ) // СРАБОТАЕТ ВО ВТОРОЙ РАЗ { // Ставим значение 2. Второй раз скрипт этот блок не запустит. Тут проверка на 1 SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 2 ); } /* ТРЕТИЙ ВНУТРЕННИЙ БЛОК */ if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 0 ) // ОН СРАБОТАЕТ В ПЕРВЫЙ РАЗ { // Этот блок сработает САМЫЙ первый, так как проверка переменной на ноль // Мы присвоим значение 1. Так как блок с проверкой на 1 вверху выше, то // скрипт не будет ее запускать в этот раз. Мы верх уже прошли и пошлди ниже. SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 1 ); } /* ТУТ НУЖНО ДОПИСАТЬ ЕЩЕ ОДИН БЛОК*/ if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 2 ) // СРАБОТАЕТ ВО ВТОРОЙ РАЗ { // Смотрим здесь. Проверка идет на значение 2. Т.е. он попросту ОБНУЛЯЕТ наши // переменные для замкнутого круга. SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 0 ); SendMessageToPC( oPC, "Сработал четвертый блок" ); } Ты предсталяешь наверное такой расклад: Neverwinter Script Source if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 0 ) { SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 1 ); } if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" )== 1 ) { SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 2 ); } if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 2 ) { SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 0 ); } Но он не верен, так как в скрипте ЗА ОДИН раз сработают все три блока а нам надо что бы каждый работал один раз за проход. Мы сделали так: Neverwinter Script Source if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" )== 1 ) { SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 2 ); } if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 0 ) { SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 1 ); } if ( GetLocalInt( oTrigger, "AIWAN_PC_DO_IT" ) == 2 ) { SetLocalInt( oTrigger, "AIWAN_PC_DO_IT", 0 ); } Соотвественно у нас работает первый раз средний блок. Второй раз верхний и нижний следом за ним ОБНУЛЯЯ локалку. В третий раз сработает средний и так далее. Понятно? Добавлено через 50 п.с. В комменте я ошибся там проверка на 1 а я написал 2. Вот ты мог и запутаться. Извини. |
![]()
Сообщение
#54
|
|
Level 19 ![]() Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент ![]() |
(IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) Вот так?
[ OFFTOP ] Neverwinter Script Source void main( ) { object oTrigger = OBJECT_SELF; // То на чем стоит скрипт object oDoor = GetObjectByTag( "PLC_DC_Slum01" ); // Наша дверь object oNpc; // Объявим НПС но не укажем, кто он именно object oPC = GetEnteringObject( ); // Тот кто НАСТУПИЛ на триггер string sSpeak = "Кто последний тот тухлый банан!"; if( GetIsPC( oPC ) == TRUE ) // Если это верно ТО выполняется то что между скобок { // ПЕРВАЯ открытая скобка /* ВТОРОЙ ВНУТРЕННИЙ БЛОК */ if ( GetLocalInt( oTrigger, "VHALL_PC_DO_IT" )== 1 ) // Если локалка РАВНА 2 ТО: { // ВТОРАЯ открытая скобка oNpc = GetNearestObjectByTag( "n_watchman" ); SetLocalInt( oTrigger, "VHALL_PC_DO_IT", 2 ); SendMessageToPC( oPC, "Сработал второй блок" ); } // ВТОРАЯ закрытая скобка /* ТРЕТИЙ ВНУТРЕННИЙ БЛОК */ if ( GetLocalInt( oTrigger, "VHALL_PC_DO_IT" ) == 0 ) { // ТРЕТЬЯ открытая oNpc = GetNearestObjectByTag( "n_watchman" ); SetLocalInt( oTrigger, "VHALL_PC_DO_IT", 1 ); SendMessageToPC( oPC, "Сработал третий блок" ); } // ТРЕТЬЯ закрытая /* четвертый внутренний блок */ if ( GetLocalInt( oTrigger, "VHALL_PC_DO_IT" ) == 2 ) { // четвертая открытая oNpc = GetNearestObjectByTag( "n_watchman" ); SetLocalInt( oTrigger, "VHALL_PC_DO_IT", 3 ); SendMessageToPC( oPC, "Сработал четвертый блок" ); } // четвертая закрытая SendMessageToPC( oPC, "Сработал ОСНОВНОЙ блок" ); AssignCommand( oNpc, ClearAllActions( ) ); // Чистим стек команд AssignCommand( oNpc, SpeakString( sSpeak ) ); // Говорит фразу AssignCommand( oNpc, ActionForceMoveToObject( oDoor, TRUE ) ); // Бежит к двери } // ПЕРВАЯ закрытая скобка } |
![]()
Сообщение
#55
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Нет не верно. Если ты хочешь сделать так, то тебе твой последний блок что ты нарисовал надо поместить в самый верх. Зачем понятно или нет? Посомтри внимательно. У нас первый блок проверяет 1, второй 0, третий 2. Скрипт идет сверху вниз. Единица у нас проверяется вверху, так как в блоке на проверку 0 мы присвоили 1. Если бы блок с проверкой на 1 стоял после блока проверки на ноль, то сразу бы сработал следом за блоком проверки на 0. Что в сущности происходит и у тебя. Первый блок проверка на 1 (увеличили до 2), следом проверка на 0, скрипт его пропустит но опятть зайдет в блок проверки на 2 и там снова твои данные. Он выполнит их и присвоится 3. Так что если ты хочешь все три блока выполнить, то должен учитывать условие: ЕСЛИ СРАБОТАЛ БЛОК, ТО НИЖНИЕ БЛОКИ НЕ ДОЛЖНЫ СРАБОТАТЬ ПОСЛЕ ЕГО УСЛОВИЙ ЕСЛИ ТЕБЕ ЭТО НЕ НАДО.
В общем тебе сложно это? Если да не заморачивайся. Я немного сложновато дал для новичков. Поймешь потом. |
![]()
Сообщение
#56
|
|
Level 19 ![]() Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент ![]() |
Да, может давай это... дальше?
|
![]()
Сообщение
#57
|
|
Level 4 ![]() ![]() Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри ![]() |
У меня вопрос. А занятия дальше будут? Очень хочется учиться... (IMG:style_emoticons/kolobok_light/unsure.gif)
|
![]()
Сообщение
#58
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Будут!
|
![]()
Сообщение
#59
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Продолжаем.
Создайте диалог в редакторе с четырмя корневыми строками: 1. Эта строка первого НПС. 2. Это строка второго НПС. 3. Это строка третьего НПС. 4. Я безымянный! Теперь у вас три НПС было, создайте еще пару. Вставьте диалог один на всех ваших НПС. Трем первым НПС измените теги на такие: NPC_ВАШ_НИК_01, NPC_ВАШ_НИК_02, NPC_ВАШ_НИК_03. Создайте три скрипта в редакторе где бы проверялся ТЕГ НПС который разговаривает. Три разных НПС три разных скрипта. Пример первого: Neverwinter Script Source int StartingConditional( ) { object oSelf = OBJECT_SELF; // Тот с кем начали разговор на ком стоит скрипт if ( GetTag( oSelf ) == "NPC_ВАШ_НИК_01" ) // Если тег объекта РАВЕН { return TRUE; // То начало диалога этой строкой } return FALSE; // Ничего не произойдет, строка не появится } У вас получится три скрипта на три строки. Теперь расставив ваших НПС и поговорив с ними вы получите три разных ответа и четвертый ответ самый последний общий для всех. Так можно определить какого-то одного уникального НПС даже используя один шаблон диалогов на всех. Добавлено через 2 минуты Прятать ответы не надо. Пишите получилось у вас или нет. |
![]()
Сообщение
#60
|
|
Level 4 ![]() ![]() Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри ![]() |
Все получилось. Каждый из заданных неписей произносит строку в зависимости от своего тега.
1. Эта строка первого НПС. Neverwinter Script Source int StartingConditional( ) { object oSelf = OBJECT_SELF; // Тот с кем начали разговор на ком стоит скрипт if ( GetTag( oSelf ) == "NPC_LIRA_01" ) // Если тег объекта РАВЕН NPC_LIRA_01 { return TRUE; // То начало диалога этой строкой } return FALSE; } 2. Это строка второго НПС. Neverwinter Script Source int StartingConditional( ) { object oSelf = OBJECT_SELF; // Тот с кем начали разговор на ком стоит скрипт if ( GetTag( oSelf ) == "NPC_LIRA_02" ) // Если тег объекта РАВЕН NPC_LIRA_02 { return TRUE; // То начало диалога этой строкой } return FALSE; } 3. Это строка третьего НПС. Neverwinter Script Source int StartingConditional( ) { object oSelf = OBJECT_SELF; // Тот с кем начали разговор на ком стоит скрипт if ( GetTag( oSelf ) == "NPC_LIRA_03" ) // Если тег объекта РАВЕН NPC_LIRA_03 { return TRUE; // То начало диалога этой строкой } return FALSE; } |
![]() ![]() |
Текстовая версия | Сейчас: 16th July 2025 - 18:46 |