![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#11
|
|
Благородный Дон ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Тестер ![]() |
ну если я правильно понял задание, то справился с ним (IMG:style_emoticons/kolobok_light/yahoo.gif)
вот что получилось: Neverwinter Script Source void main() { object oSolo = OBJECT_SELF; int iMax = GetMaxHitPoints(oSolo); int iD = iMax - 5; effect eDamage = EffectDamage(iD); AssignCommand( oSolo, ApplyEffectToObject( DURATION_TYPE_INSTANT, eDamage, oSolo ) ); } вот что написал компилятор: 08.10.2007 20:40:08: 0 Ошибок. 'script1' составление успешно |
![]()
Сообщение
#12
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Да ,все правильно. Но в следующий раз юзай тег NSS на форуме. (IMG:style_emoticons/kolobok_light/yes3.gif)
|
![]()
Сообщение
#13
|
|
Level 19 ![]() Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент ![]() |
Neverwinter Script Source void main() { object oVhall = OBJECT_SELF; int iMax = GetMaxHitPoints(oVhall); int iD = iMax-5; effect eDamage = EffectDamage(iD); AssignCommand(oVhall, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage, oVhall)); } В итоге результатом стало понимание работы бажного nss. |
![]()
Сообщение
#14
|
|
Level 4 ![]() ![]() Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри ![]() |
Neverwinter Script Source void main() { object oLira = OBJECT_SELF; int iMax = GetMaxHitPoints(oLira); int iD = iMax-5; effect eDamage = EffectDamage(iD); AssignCommand(oLira, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage,oLira)); } Мне кажется, единственная ошибка, которая могла быть в этом скрипте, это если в какой-нибудь строке не поменять oSelf на другое определение объекта? |
![]()
Сообщение
#15
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Мне кажется, единственная ошибка, которая могла быть в этом скрипте, это если в какой-нибудь строке не поменять oSelf на другое определение объекта? Совершенно верно. Мне важно, что бы вы поняли что oSelf это просто имя описываемого объекта. И оно используется во многих местах. |
![]()
Сообщение
#16
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
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 Мы в каком пишем НВНе? |
![]()
Сообщение
#17
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Вы все поняли, что объект можно представить в любом обозначении. Вы верно проследили, что надо во всем скрипте изменить порядок. Что бы лучше понять что происходит, я вам опишу словами. Мы попросту скрипту представляем, что у нас есть объект и мы будем с ним работать дальше. Что бы каждый раз не икать его мы сразу, четко его определяем.
Neverwinter Script Source object oSelf = OBJECT_SELF; Дананя строка сосотит из двух важных частей они заключены между знаком равно. В этой строке ДВА ДЕЙСТВИЯ. Первым, мы объявили скрипту, что у нас есть объект object oSelf. Второым мы ПРИРОВНЯЛИ этот наш объявлленный объект к OBJECT_SELF. Тем самый четко дали понять скрипту кто есть ХУ. Верхний код можно написать и таким образом: Neverwinter Script Source void main() { object oSelf; // Объявляем скрипту, что у нас используется ОБЪЕКТ oSelf oSelf = OBJECT_SELF; // Определяем его прировняв к OBJECT_SELF } То же самое мы делаем и с двумя цифровыми данными в скрипте: Neverwinter Script Source int iMax = GetMaxHitPoints(oSelf); int iD = iMax-5; Мы их представляем скрипту и что сократить написание сразу же определяем с помощью каких либо функций. В данном случае это понимается так: Neverwinter Script Source void main() { object oSelf; // Объявляем скрипту, что у нас используется ОБЪЕКТ oSelf = OBJECT_SELF; // Определяем его прировняв int iMax; // Объявляем, что у нас будет использоваться интеджер с именем iMax iMax = GetMaxHitPoints(oSelf); // Он будет равен >> // Get Max Hit Points ВЗЯТЬ МАКСИМАЛЬНЫЕ ХИТ ПОИНТЫ объекта oSelf int iD; // объявляем, что у нас будет еще оно число iD = iMax-5; // Оно будет равно от максимального числа хитпоинов отнять 5 } В общем суть на пальцах такая. Мы говорим: "В нашей команде есть ИГРОКИ (object, int, float). У них есть своя специализация и ФАМИЛИЯ." Когда мы объявляем ИГРОК то это представление объекта. Когда говорим ИГРОК ПЕТРОВ, ВРАТАРЬ СИДОРОВ, ЗАЩИТНИК ИВАНОВ, то это представление и определение кто именно. Игроки могут меняться и наше определение объекта может меняться в скриптах тоже. ЗАЩИТНИКИ, НАПАДАЮЩИЕ могут смениться. Не важно кто защищает ворота и кто в нападении. Мы можем их сменить. Но прежде чем ввести их в игру судья объявляет что игроки поменялись! Так же можно менять в скрипте. Neverwinter Script Source void main() { object oSelf; // Объявляем скрипту, что у нас используется ОБЪЕКТ oSelf = OBJECT_SELF; // Определяем его прировняв int iMax; // Объявляем, что у нас будет использоваться интеджер с именем iMax iMax = GetMaxHitPoints(oSelf); // Он будет равен >> // Get Max Hit Points ВЗЯТЬ МАКСИМАЛЬНЫЕ ХИТ ПОИНТЫ объекта oSelf int iD; // объявляем, что у нас будет еще оно число iD = iMax-5; // Оно будет равно от максимального числа хитпоинов отнять 5 effect eDamage; // объявляем, что у нас используется эффект eDamage = EffectDamage(iD); // Эффект Effect Damage поврежедения равен числу iD if(GetIsPC(oSelf)==TRUE) // Если oSelf это РС { // Если это игрок то мы сменим определение еффекта и вылечим РС eDamage = EffectHeal(iMax); // на число iMax его максимальные хитпоинты } AssignCommand(oSelf, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage, Self)); } Если есть вопросы спрашивайте. Добавлено через 106 секунд Мне важно, что бы вы поняли описание объектов и их определение можно менять в скрипте. Добавлено через 54 секунды Скажите что изменилось в скрипте? Neverwinter Script Source void main()
{ object oSelf = OBJECT_SELF; int iMax = GetMaxHitPoints(oSelf); int iD = iMax-5; effect eDamage = EffectDamage(iD); if(GetIsPC(oSelf)==TRUE) { eDamage = EffectHeal(iMax); } AssignCommand(oSelf, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage, Self)); } |
![]()
Сообщение
#18
|
|
Level 4 ![]() ![]() Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри ![]() |
Изменилась сама программа скрипта. Теперь он работает выборочно, то есть одному из объектов – в данном случае игроку будет явная выгода (лечение), а у всех прочих по-прежнему изымет по 5 хитов?
|
![]()
Сообщение
#19
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Самое главное что мы сделали? Мы ПОМЕНЯЛИ ефекты.
|
![]()
Сообщение
#20
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
а у всех прочих по-прежнему изымет по 5 хитов Эффекты конечно же сменились, но чуть поправлю предыдущее высказывание - оно будет верным, если скрипт не запускается единожды. В противном случае или пан или пропал. Причем оба и игрок и его соперни к на шарде (если для него) или нпс (он ведь тоже попадет под раздачу, если станет выпонять определенные действия. |
![]()
Сообщение
#21
|
|
Level 4 ![]() ![]() Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри ![]() |
Если я правильно понимаю, то смысл в том, что скриптом можно определить любой, необходимый в конкретном случае объект (непись, игрок, плейс). И заставить этот объект выполнить действие (серию действий) или (в этом примере) наложить на него эффект, который нужен в определенной ситуации?
Смысл не в конкретном скрипте, а в том, как и что можно заставить работать? |
![]()
Сообщение
#22
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
Все верно, основной смысл кода в том - кто и что будет делать.
|
![]()
Сообщение
#23
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Griffon, не гони лошадей многим это будет не понять. (IMG:style_emoticons/kolobok_light/declare.gif) Сейчас важно видеть ПРОСТОЕ то что я говорю.
|
![]()
Сообщение
#24
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
Все, передаю слово учителю. Хотя учащимся стоит понять, что такое код и что он может делать, ну конечно, при ограничениях по имеющимся функциям.
|
![]()
Сообщение
#25
|
|
Level 19 ![]() Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент ![]() |
|
![]()
Сообщение
#26
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
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 Почему же пишет что ошибка? И что это за ошибка? |
![]()
Сообщение
#27
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Почему же пишет что ошибка? И что это за ошибка? Может из за НВН2 функций. Я пока компилю на первом НВН так как второй еще не ставил, карту недавно купил и винду переставил. Попробуй в первом редакторе компильнуть. Не переживайте логика и все что в первом НВн то и во втором. Но в редакторе первого НВН легче и понятней. Так что рекомендую юзать пока его. |
![]() ![]()
Сообщение
#28
|
|
Лорд AxisTown'a ![]() Класс: Монах Характер: Lawful Good Раса: Дварф NWN: Маппинг ![]() |
Цитата Результат - 0.85.nss(1): ERROR: ELLIPSIS IN IDENTIFIER Griffon у тебя имя файла "0.85" ? |
![]()
Сообщение
#29
|
|
Level 18 ![]() Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D ![]() |
|
![]() ![]()
Сообщение
#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 |
![]()
Сообщение
#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) |
![]()
Сообщение
#32
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
|
![]() ![]()
Сообщение
#33
|
|
Лорд AxisTown'a ![]() Класс: Монах Характер: Lawful Good Раса: Дварф NWN: Маппинг ![]() |
to Griffon только добавь в тобой приведенном примере еще одну закрывающую скобку плз (IMG:style_emoticons/kolobok_light/biggrin.gif)
|
![]()
Сообщение
#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"); // ЭТО Мы поменяли точку отсчета и теперь к двери побежит ближайший к ТРИГГЕРУ объект. У кого все получилось говорите. У кого что не получилось тоже. Жду... |
![]()
Сообщение
#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
Причины изменения: ОТЛИЧНО.
|
![]() ![]() |
Текстовая версия | Сейчас: 16th July 2025 - 18:51 |