Азы скриптинга NWN/NWN2, Итак, начинаем с самого начала... |
Здравствуйте, гость ( Вход | Регистрация )
Азы скриптинга NWN/NWN2, Итак, начинаем с самого начала... |
Oct 6 2007, 19:38
Сообщение
#1
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
В данной теме разрешается писать только обучающимся. Если кто-то найдет в моих материалах грубую ошибку, то может сообщить мне или Лексу и мы поправим.
Во первых, забудьте что скрипты это трудно непонятно и сложно. Забудьте все то что бедный ваш мозг пытается обработать безуспешно и вы не можете понять простые вещи. Это нормально. Я буду говорить не по книгам а просто, описывая ситуацию или знания необходимые вам максимально понятно и по возможности проектировать это на бытовом уровне, оперируя образными картинками. Так как именно такие схемы будут работать в вашем случае. Ведь люди с математическим умом все схватывают сами и на лету. Итак начнем. Скрипт сам по себе это маленький файлик. Он работает как любой файл в программе. То что вы пишете в редакторе это NSS просто информация для компилятора, в игре то что написано вами не работает, а работает скомпилированный файл NSC. Поэтому написанное в редакторе и не компельнутое не работает. Как отличить код хорошего кодера от разгильдяя? По аккуратности и описаниям-комментариям. У тех, кто понимает скрипт все правильно, кто не понимает все кидает в кучу. Поэтому сразу учитесь писать красиво и понятно. Сделайте себе шапку для скриптов и пишите в ней, давая описания. В папке скриптов через пол года вы сможете понять кто и что сделал в скрипте и элементарно для чего вам он нужен. Это важно. Аккуратность. Пример шапки скрипта: Neverwinter Script Source //::////////////////////////////////////////////// //:: Name: //:: Copyright © 2006 WRG! Team //::////////////////////////////////////////////// /* Описание */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 06.10.2007 //::////////////////////////////////////////////// void main() { } Дальше. |
Oct 6 2007, 20:37
Сообщение
#2
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Все функции в движке, это какие-то действия и примерно такие же куски кода как пишете вы, но они вставлены в движок и работают когда вы ими пользуетесь: создаете предмет, дестроите его, раздаете команды и т.д. Соотвественно, движок это не идеал, а обыкновенная программа и она имеет много неучтенных, ненайденных или незапротоколированных особенностей в исполнении функций. Поэтому вы должны сразу понять, что ТО ЧТО КОМПЕЛИТСЯ НЕ ВСЕГДА РАБОТАЕТ.
В скриптинге есть определенные типы данных с которыми мы будем работать. Object - объект. Например, НПС, локация и т.д. Стринг String - то что пишем буквами и движок понимает это как надписи. Например в фразы, имена и т.д. Интеджер integer - это целое значение. может быть 1, 10, 25 и т.д. Флоат Float - НЕцелое значение может быть 1.0, 23.04 и т.д. Локация Location - это позиция, местоположение определенная точка. Вектор vector - вектор. Талант talent - я сам не знаю что это (IMG:style_emoticons/kolobok_light/prankster2.gif) Эффект effect - кто много курил и ел всякую гадость в виде наркоты в ПЛ тот знает что это. Когда вы пишите скрипт, то должны понимать что работать можно с данными одного типа, складывать числа или стринги а если вам нужно соеденить что то разное, то тут есть функции конвертирующие одни значения в другие. Но об этом позже. Для начала мы разберем самое простое - присвоене локальной переменной. Neverwinter Script Source // Set oObject's local integer variable sVarName to nValue void SetLocalInt(object oObject, string sVarName, int nValue) Итак, что это такое? Образно, локальная переменная это строка которая вписывается в служебное место любого объекта и состоит из буквенной строки и числового значения. Видите эта функция состоит из трех частей: Объект, Стринг, Число. Попросту вы метите объект и пишете на нем слово вашей переменной писваивая к нему знацение циферкой. Это вроде как повесить на спину Лекса бумажку и написать на ней ВАНЮЧКА, 1. А у Нео повесить бумажку ВАНЮЧКА, 2 и потом по этим данным работать с этимим объектами. Нужен вам ванючка со значением 2, смотрите на спинах у кого бумажка и делаете что вам надо. Так вот. Вы часто сталкивались с такими словами как TRUE и FALSE. Так вот, что бы вам было понятно вопрос КТО ИЗ АДМИНОВ ВАНЮЧКА будет выглядеть так: Лекс - TRUE, Нео TRUE, Айван - FALSE. Но. Движок НВН считает, что если на Айване нет бумажки с надписью ВАНЮЧКА или она есть, но выглядит так "ВАНЮЧКА, 0" то это FALSE. Попросту, если стереть на Лексе 1 и поставить там 0 то результат будет FALSE хоть и табличка будет висеть. Это надо учитывать в некоторых случаях. В виде кода это будет выглядеть так: Присвоим: Neverwinter Script Source void main() { object oAiwan = GetObjectByTag("Aiwan ROOT Boss"); object oLex = GetObjectByTag("LEX Administrator"); object oNeo = GetObjectByTag("NEO Ррразгильдяй"); SetLocalInt(oLex, "VANUCHKA", 1); SetLocalInt(oNeo, "VANUCHKA", 2); } Вот так в скрипте диалога проверить, то что я сказал. Neverwinter Script Source int StartingConditional() { object oLex = GetObjectByTag("LEX Administrator"); if (GetLocalInt(oLex, "VANUCHKA") == 1) { return TRUE; } return FALSE; } Объект может содержать только одно значение переменной. Либо не иметь ее вообще. Скриптом можно менять значение и результаты будут разные. К примеру, в модулях часто одному квесту присваивают одну локальную переменную. А вот от ее значения зависит разные концовки. Что непонятно спрашивайте. |
Oct 7 2007, 13:03
Сообщение
#3
|
|
Level 12 Класс: Вор Характер: Chaotic Good Раса: Полуэльф NWN: Тестер |
Кто такие Интеджер и Флоат? Почему oNeo, oLex, oAiwan? Что значит object oAiwan = GetObjectByTag("Aiwan ROOT Boss")? Что такое int StartingConditional()? Зачем скобки? void main - это что?
|
Oct 7 2007, 19:44
Сообщение
#4
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Ёжик, я могу дать все эти понятия, но то что ты поймешь что это я не уверен. Пока, мне нужно общее ваше представление. Как только ты поймешь что все то что я написал означает свою задачу я сочту выполненой. Но раз такой расклад то могу все объяснить:
void main - это что? NWScript использует 'функции', которые сообщают программе, что нужно делать. Некоторые функции уже написаны и нам остается только поставить их в скрипт. Тем не менее, когда мы пишем скрипт, мы, фактически, пишем свои собственные функции. Эта строка - своего рода 'установка' функции. void - Это слово сообщает скрипту, какого рода 'ответ' выдаст функция. Слово main сообщает, что это основная часть скрипта. Мы можем написать множество функций в нашем скрипте, но 'main' - эта та часть скрипта, которая будет непосредственно выполняться. Между '(' и ')' как правило пишут входящие данные, необходимые скрипту для корректного исполнения. Наш скрипт не требует никаких входных данных, и это значит, что между скобками ничего не пишется. Всегда необходимо ставить '(' и ')', даже если нет никаких входящих данных. Фигурные скобки необходимы, чтобы отделять блоки скрипта один от другого. В нашем случае это обозначает, что все то, что мы написали, является частью void main(). Каждая строка заканчивается знаком ';'. Про интеджер и флоат мне опять писать или что? Что непонятно? Тебе непоянтно что такое целое число а что нет? Так же, в скрипте все типы данных и объекты обычно представляются в начале скрипта например так: Neverwinter Script Source //::////////////////////////////////////////////// //:: OnEnter [CUT_FIN_1] am_cut_final_1 //:: Copyright © 2006 WRG! //::////////////////////////////////////////////// /* ФИНАЛЬНЫЙ РОЛИК ИСТОРИИ */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 23.03.2006 //::////////////////////////////////////////////// #include "am_inc_cutscene" #include "am_inc_common" void main() { //------------------------------- СОЗДАНИЯ ------------------------------------- object oPC = GetFirstPC(); // Игрок object oBoss = GetObjectByTag("AM_CUT1_BOSS"); // Главный object oNpc1 = GetObjectByTag("AM_CUT1_NPC_01"); // НПС 1 object oNpc2 = GetObjectByTag("AM_CUT1_NPC_02"); // НПС 2 object oDog = GetObjectByTag("AM_CUT1_DOG"); // Собака object oDeer = GetObjectByTag("AM_CUT1_DEER"); // Олень object oOx = GetObjectByTag("AM_CUT1_OX_01"); // Бык (живой) object oOxD = GetObjectByTag("AM_CUT1_OX_02"); // Бык (мертвый) object oArea = GetArea(oBoss); //-------------------------------- ОБЪЕКТЫ ------------------------------------- object oSound = GetObjectByTag("AM_CUT1_SOUND_WOLF"); // Звук воя волков object oSound1 = GetObjectByTag("AM_CUT1_SOUND_WOLF1"); // Звук воя волков object oFlame = GetObjectByTag("AM_CUT1_FLAME"); // Костер (потухший) object oGate = GetObjectByTag("AM_D_EXT_HUNT_GATE"); // Ворота во двор object oDoor = GetObjectByTag("AM_D_EXT_HUNT_H_IN"); // Дверь домика //------------------------ ТОЧКИ ДВИЖЕНИЯ И КАМЕРЫ ----------------------------- object oWpCamPC1 = GetWaypointByTag("AM_WP_CUT1_CAM_PC_01"); // Точки Игрока object oWpCamPC2 = GetWaypointByTag("AM_WP_CUT1_CAM_PC_02"); object oWpExit = GetWaypointByTag("AM_WP_CUT1_EXIT"); // Для ухода с карты object oWpIn = GetWaypointByTag("AM_WP_CUT1_IN"); // Эмитация входа в дом object oWpP1 = GetWaypointByTag("AM_WP_CUT1_POST_01"); // Точка НПС //-------------------------- ВИЗУАЛЬНЫЕ ЭФФЕКТЫ -------------------------------- effect eCutInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); effect eCutPar = EffectCutsceneParalyze(); effect eGhost = EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE); effect eParalyz = EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION); // Заставим застынуть effect eFreeze = EffectVisualEffect(VFX_DUR_ICESKIN); // Заморозим //-------------------------- Поврежедния --------------------------------------------- int iMax = GetMaxHitPoints(oPC); int iD = iMax-5; В таком виде мы обычно представляем все объекты и данные с которыми будем работать в скрипте. В скрипте мы обращаемся к объекту, но мы должны четко дать понять какой именно объект нам нужен. Самый простой способ это указать OBJECT_SELF. Это значит тот кто содержит или исполняет скрипт написаный вами будет взят в качестве объекта. К примеру, скрипт стоящий на НПС может взять object oNpc = OBJECT_SELF; Теперь вы заметили, что мы как то структурировали наши сокращения в описании объектов. Например, зачем нам постоянно писать одно и то же десятки раз типа: GetObjectByTag("AM_CUT1_BOSS") - тут мы говорим скрипту взять объект с тегом AM_CUT1_BOSS. Скрипт ищет в модуле у кого такой тег и берет его. Каждый раз это долго и неправильно. Мы попросту в начале найдем этого НПС и объявим его сократив до минимума oBoss. Вся строка будет выглядеть так: Neverwinter Script Source object oBoss = GetObjectByTag("AM_CUT1_BOSS"); // Главный в ней мы говорим, что наш object oBoss ЭТО ОБЪЕКТ это не число и не эффект. Соотвественно для удобства мы сократили и поставили впереди буковку "o" что бы мы знали, что это ОБЪЕКТ. У интеджер мы обычно ставим буковку "i" и встретив в большом скрипте такие данные oPC, iMax, fDel мы уже понимаем что первый это ОБЪЕКТ так как у него буковка о, второй это число так как у него буковка i, третий это флоат нецелое число так как перед ним буковка f. Но все это ДЛЯ УДОБСТВА и никак не влияеет на работу скриптов. Это ПРАВИЛЬНЫЙ И ХОРОШИЙ ТОН. Внизу простой пример как все правильно описав и сократив мы накладываем на OBJECT_SELF еффект. Neverwinter Script Source void main() { object oSelf = OBJECT_SELF; int iMax = GetMaxHitPoints(oSelf); int iD = iMax-5; effect eDamage = EffectDamage(iD); AssignCommand(oSelf, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage, Self)); } Neverwinter Script Source void main() { int iMax = GetMaxHitPoints(OBJECT_SELF); int iD = iMax-5; effect eDamage = EffectDamage(iD); AssignCommand(OBJECT_SELF, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,OBJECT_SELF)); } Neverwinter Script Source void main() { int iD = GetMaxHitPoints(OBJECT_SELF)-5; effect eDamage = EffectDamage(iD); AssignCommand(OBJECT_SELF, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,OBJECT_SELF)); } Neverwinter Script Source void main() { effect eDamage = EffectDamage(GetMaxHitPoints(OBJECT_SELF)-5); AssignCommand(OBJECT_SELF, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,OBJECT_SELF)); } Neverwinter Script Source void main() { AssignCommand(OBJECT_SELF, ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDa age(GetMaxHitPoints(OBJECT_SELF)-5,OBJECT_SELF))); } Сравните первый код и этот последний. Они идентичны, но в каждом последующем я убрал описание по одному объекту или эффекту. В результате кусок кода разобрать на порядок труднее. И это ОДНА СТРОКА! А что будет если у вас тысяча строк? Добавлено через 2 минуты 49 секунд Я не прошу понимать что делает этот скрипт мне важно что бы вы на каждом следующем примере видели какое изменение произошло. Добавлено через 11 минуту 31 секунду п.с. При переносе форум съедает одну букву в строке NSS кода. Не пинать мну, не моя вина. Нео обещал найти причину. |
Oct 8 2007, 05:31
Сообщение
#5
|
|
Level 12 Класс: Вор Характер: Chaotic Good Раса: Полуэльф NWN: Тестер |
|
Oct 8 2007, 10:21
Сообщение
#6
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
ну тогда вычеркни меня и всё ВЫЧЕРКИВАЮ. Добавлено через 9 минут 34 секунды п.с. основные понятия по объектам и прочему даны в переводах Лексикона. Кому что то неясно почитайте еще там. Перевод Лексикона Добавлено через 2056 секунд Я ХОЧУ ЧТО БЫ ВЫ ПОНЯЛИ. Мне не надо что бы вы поняли что сделал тот или иной скрипт. В тот самый момент, когда вы сможете ответить на это и на вопросы которые описала Ёжик в первом посте МОЖНО СЧИТАТЬ ЧТО ВЫ УЖЕ НАУЧИЛИСЬ ПОНИМАТЬ СКРИПТЫ. Я не могу за вас думать, вы должны напряч свой мозг и отогнать свою лень. Без этого не получится диалога здесь. Я ПРОШУ ПОНИМАТЬ ТО ЧТО ДАЮ Я. Если я дал описание чего то то и понимать осознавать надо ЭТО а не все, что содержит мой пример кода. |
Oct 8 2007, 11:11
Сообщение
#7
|
|
Level 18 Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D |
Между '(' и ')' как правило пишут входящие данные, необходимые скрипту для корректного исполнения. 1. Это ты про () после void main? Спрашиваю поскольку на примере твоего скрипта вот это же и есть данные Neverwinter Script Source object oSelf = OBJECT_SELF; int iMax = GetMaxHitPoints(oSelf); int iD = iMax-5; effect eDamage = EffectDamage(iD); 2. Зачем так сильно сокращать? Ведь в таком виде - понятно какие данные используются и как они прописаны в команде, разве нет? Neverwinter Script Source void main() { object oSelf = OBJECT_SELF; int iMax = GetMaxHitPoints(oSelf); int iD = iMax-5; effect eDamage = EffectDamage(iD); AssignCommand(OBJECT_SELF, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage-5,OBJECT_SELF)); } 3. DURATION_TYPE_INSTANT - вроде же есть цифровое значение соответствующее данной фразе? И если да, то в данных можно указать его через int, а в команде (AssignCommand) уже прописать саму цифру, или не так? Добавлено через 26 минут 36 секунд п.с. основные понятия по объектам и прочему даны в переводах Лексикона. Кому что то неясно почитайте еще там. Ссылка битаяПеревод Лексикона Добавлено через 6 минут 49 секунд P.S. А может сайт опять полег? |
Oct 8 2007, 12:33
Сообщение
#8
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Griffon, Я ПРОСТО ПОКАЗАЛ ЧТО ПОЛУЧИТСЯ если не описывать и не сокращать. и не забегай вперед. Все разберем (IMG:style_emoticons/kolobok_light/acute.gif) Я про константу.
Добавлено через 1 минуту 23 секунды Мне важно что бы вы УВИДЕЛИ что изменилось от шага к шагу. Добавлено через 1 час 44 секунды Уточнение. Что бы ыбло понятно. Представление объекта, можно сравнить с прозвищем. Мы же не говорим постоянно Иванов Иван Иванович, мы говорим просто Вано. Коротко и понятно. Вот это выглядит так: Neverwinter Script Source object oВано = GetObjectByTag("Иванов Иван Иванович");
|
Oct 8 2007, 12:52
Сообщение
#9
|
|
Класс: Пьяный Мастер Характер: Lawful Good Раса: Тварь MySQL, PHP, JavaScript Порядок Времени |
DURATION_TYPE_INSTANT есть константа, что означает - постоянно принятая величина для данного скрипта, обозначенная идентификатором в данном случае идентификатор - DURATION_TYPE_INSTANT, а величина описана в nwmain.nss костанты могут быть числовыми и текстовыми, да любого типа мастера, не пинайти сильна, объяснил как асилил Добавлено через 1 минуту 33 секунды ну тогда вычеркни меня и всё ВЫЧЕРКИВАЮ. ыххыыыыхыыыыыыы, ну вы ребята даете (IMG:style_emoticons/kolobok_light/smile.gif) а я не умею скриптить как лекс, вычеркивайте меня из БАНДЫ, что за детство, ей богу |
Oct 8 2007, 16:13
Сообщение
#10
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Не надо сложных понятий. Не надо пытаться понять что-то что я не прошу понять. Поймите то что даю. Пусть пока вам не понятны какие то слова в скрипте. Дойдем до этого.
Добавлено через 107 секунд Так первое домашнее задание. Откройте тулсет и из этого скрипта сделайте вот что: Neverwinter Script Source void main() { object oSelf = OBJECT_SELF; int iMax = GetMaxHitPoints(oSelf); int iD = iMax-5; effect eDamage = EffectDamage(iD); AssignCommand(oSelf, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage, Self)); } Каждый в скрипте имя oSelf сменит на свой ник, например oAiwan и напишет в этой теме СВОЙ КОД. ПИШИТЕ В РЕДАКТОРЕ И КОМПИЛИТЕ. ЗАТЕМ ПЕРЕНОСИТЕ СЮДА. п.с. ЕЖИК СНОВА В ТЕМЕ. Понедельник трудный день. Извини. Добавлено через 2 часа 45 минут 52 секунды ЕЩЕ РАЗ ПОВОРЯЮ ДЛЯ ВСЕХ. В ЭТОЙ ТЕМЕ ТОЛЬКО МОИ ПОСТЫ И ПОСТЫ ОБУЧАЮЩИХСЯ. |
Oct 8 2007, 19:49
Сообщение
#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' составление успешно |
Oct 8 2007, 21:28
Сообщение
#12
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Да ,все правильно. Но в следующий раз юзай тег NSS на форуме. (IMG:style_emoticons/kolobok_light/yes3.gif)
|
Oct 8 2007, 22:47
Сообщение
#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. |
Oct 9 2007, 02:22
Сообщение
#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 на другое определение объекта? |
Oct 9 2007, 09:08
Сообщение
#15
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Мне кажется, единственная ошибка, которая могла быть в этом скрипте, это если в какой-нибудь строке не поменять oSelf на другое определение объекта? Совершенно верно. Мне важно, что бы вы поняли что oSelf это просто имя описываемого объекта. И оно используется во многих местах. |
Oct 9 2007, 11:24
Сообщение
#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 Мы в каком пишем НВНе? |
Oct 9 2007, 12:48
Сообщение
#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)); } |
Oct 9 2007, 13:18
Сообщение
#18
|
|
Level 4 Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри |
Изменилась сама программа скрипта. Теперь он работает выборочно, то есть одному из объектов – в данном случае игроку будет явная выгода (лечение), а у всех прочих по-прежнему изымет по 5 хитов?
|
Oct 9 2007, 13:19
Сообщение
#19
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Самое главное что мы сделали? Мы ПОМЕНЯЛИ ефекты.
|
Oct 9 2007, 13:32
Сообщение
#20
|
|
Level 18 Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D |
а у всех прочих по-прежнему изымет по 5 хитов Эффекты конечно же сменились, но чуть поправлю предыдущее высказывание - оно будет верным, если скрипт не запускается единожды. В противном случае или пан или пропал. Причем оба и игрок и его соперни к на шарде (если для него) или нпс (он ведь тоже попадет под раздачу, если станет выпонять определенные действия. |
Oct 9 2007, 14:38
Сообщение
#21
|
|
Level 4 Класс: Маг Характер: Chaotic Neutral Раса: Танар'ри |
Если я правильно понимаю, то смысл в том, что скриптом можно определить любой, необходимый в конкретном случае объект (непись, игрок, плейс). И заставить этот объект выполнить действие (серию действий) или (в этом примере) наложить на него эффект, который нужен в определенной ситуации?
Смысл не в конкретном скрипте, а в том, как и что можно заставить работать? |
Oct 9 2007, 14:53
Сообщение
#22
|
|
Level 18 Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D |
Все верно, основной смысл кода в том - кто и что будет делать.
|
Oct 9 2007, 14:54
Сообщение
#23
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Griffon, не гони лошадей многим это будет не понять. (IMG:style_emoticons/kolobok_light/declare.gif) Сейчас важно видеть ПРОСТОЕ то что я говорю.
|
Oct 9 2007, 15:01
Сообщение
#24
|
|
Level 18 Класс: Страж Тьмы Характер: True Neutral Раса: Человек МАСТЕР D&D |
Все, передаю слово учителю. Хотя учащимся стоит понять, что такое код и что он может делать, ну конечно, при ограничениях по имеющимся функциям.
|
Oct 9 2007, 18:48
Сообщение
#25
|
|
Level 19 Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент |
|
Текстовая версия | Сейчас: 1st November 2024 - 03:11 |