![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|||||||||||||||
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Тема создана главнм образом для новичков, но и более опытным товарищая почитать тоже не помешает. Итак. Минимум флейма. Максимум инфы. Начну я (кто бы сомневался :-) ) 1. LevelUpHenchman(). С помощью этой функции можно... повысить уровень ПС (применив ее к ПС, конечно) без распределения этим самым ПС всех плюшек. Действие фишки можно наблюдать в первой главе ХотУ. Когда в начальном диалоге (при заходе чаром малых уровней) выозникает выбор: повысить уровень самому или автомастически. Этот самый автоматический вариант и реализован с помощью LevelUpHenchman. 2. Тонкость конструкции if (condition) { . . . }.
вернет TRUE. Никогда не задумывались почему? Дело в том, что при "заявлении" условие автоматически приравнивается(==) к TRUE. TRUE в свою очередь численно равно 1 (FALSE = 0, в этом в можете убедиться, открыв nwscript.nss). Поэтому наше форма и возвращает 1. Посему
можно с легкостью заменить на
Не использовать в данном виде! См. пост _kaa_ и мой ответ. 3. Известно почти всем, но все же.
то же, что и
Аналогично и с float, string, effect и другими типами данных. 4. Упрощенная модель if {} else {} Допустим,
то же, что
т.е. все, что до '?' - условие, все, что после вопроса до двоеточия - присвоение в случае истинности утвержения в скобках, после двоеточия - в случае ложности. Продолжение следует. Если у вас есть то, чем можно поделиться и что заслуживает всеобщего внимания , прошу. |
||||||||||||||
![]()
Сообщение
#2
|
|||||||||||
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Цитата(Tarre Talliorne @ Aug 11 2004, 19:36) 2. Тонкость конструкции if (condition) { . . . }.
вернет TRUE. Никогда не задумывались почему? Дело в том, что при "заявлении" условие автоматически приравнивается(==) к TRUE. TRUE в свою очередь численно равно 1 (FALSE = 0, в этом в можете убедиться, открыв nwscript.nss). Поэтому наше форма и возвращает 1. Посему
можно с легкостью заменить на
Ты проверь что будет для if (2) {} и вообще любого числа кроме 0 (даже отрицательного). Вернёт TRUE. Как ты и сказал, если выражение возвращает 0 - то это FALSE, иначе - TRUE. Чтобы понять (тем кому еще не понятно) - проще рассмотреть логическую конструкцию вне скобок. Скажем:
вернет 1 (TRUE), если k равен 5 и 0(FALSE) в любом другом случае. Т.е. сначала вычислится результат логической операции ==, и этот результат присвоится переменной i. Так что условие
используется для проверки на ненулевое значение локальной переменной.
Сообщение отредактировал _kaa_ - Aug 11 2004, 21:46 |
||||||||||
![]()
Сообщение
#3
|
|||
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Destinguo, _kaa_, destinguo! Сеньк :-) 5.Давным-давно был вопрос, как убирать эффекты... Вернее, как убрать одни, скажем, визуальные, и оставить другие визуальные. Прием довольно прост и активно юзается биоповарами. В нижеприведенной функции эффекты сортируются не по типу, а по создателю. А создателем можно сделать локальный объект. Так они и снимаются. Итак:
Айван: МОЛОДЕЦ! (IMG:style_emoticons/kolobok_light/good.gif) Давай дальше! (IMG:style_emoticons/kolobok_light/yes3.gif) Сообщение отредактировал Aiwan - Aug 12 2004, 04:47 |
||
![]()
Сообщение
#4
|
|||
Level 3 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Вот ещё пара идентичных функций для работы с эффектами, ищет первый эффект по одному или комбинации признаков:
П.С. В редакторе, без видимого ограничения на длину строк, скрипт выглядел много лутше. |
||
![]()
Сообщение
#5
|
|||
Level 10 ![]() Класс: Монах Характер: Lawful Good Раса: Человек NWN: Контент ![]() |
Простейшая вещь, но может, кому пригодится? Когда в модуле надо обрабатывать много кастомных свойств объектов, скрипт OnActivateItem разрастается до беспредела. Во избежание этого, в свойстве OnActivateItem пишется (примерно) следующее:
что позволяет вызвать скрипт с именем ТЭГА ПРЕДМЕТА. Например, палка с тэгом dragon_stick вызовет (попытается вызвать) скрипт dragon_stick. Все просто. OBJECT_SELF будет указывать на того, на кого направлено свойство палки. З.Ы. Мечтательно Пару проверочек бы влючить... |
||
![]()
Сообщение
#6
|
|
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
По-моему это лишнее: новые скрипты жрут размер модуля, и, кроме того, в одном скрипте все более компактно, что ли. В официальной кампании есть скрипты и по 5 тысяч строк...
|
![]()
Сообщение
#7
|
|
4-х Кубовый ![]() Класс: Некромант Характер: Lawful Evil Раса: Человек NWN: Скриптинг [Sn] Проклятие Левора ![]() |
Tarre Talliorne
Если есть ХОРОШАЯ система именования скриптовых файлов, то этот способ весьма удобен, особенно, если над модулем трудится несколько скриптеров. ОБЩИЕ скрипты в таком случае получаются ВСЕ, которые стоят в свойствах мода. |
![]()
Сообщение
#8
|
|||||
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
6.Вот как-то вот так... Помнится, с годик назад структуру switch {...} мне подробно объяснил Лекс (если я не ошибаюсь). Так вот. Тогда дело ограничилось только
В то время как немногим (из моих НВН-знакомых) известна одна тонкость. Дело в том, что модель свич является упрощенной моделью иф-элс. И где же здесь элс -- задатите вы резонный вопрос. а вот оно:
Именно дефолт берет на себя инициативу в том, случае, если i не удовлетворяет ни n1, ни n2. Стоит отметить, что break; в конце действия дефолта факультативен. Сообщение отредактировал Tarre Talliorne - Jan 15 2005, 20:37 |
||||
![]()
Сообщение
#9
|
|||
Level 2 ![]() Класс: Монах Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] ![]() |
Система тэговых скриптов включена в стандартные скрипты НВН (смотрите стандартные скрипты x2_mod_def_load, x2_mod_def_unaqu, x2_mod_def_unequ, x2_mod_def_act, x2_mod_def_aqu, x2_mod_def_equ, а так же скрипт-пример x2_it_example.nss) Касательно моего вклада в копилку идей: поделюсь с вами тем, как на Сиале реализован банк вещей. Сразу скажу, что описанная ситуация работает только с сервер-ваултными персонажами. Идея основана на баге одно функции: void DoPlaceableObjectAction(object oPlaceable, int nPlaceableAction) Дело в том, что эта функция, не смотря на ее название, работает не только с плэйсэйблами, но и с контейнерами (улавливаете мою мысль? :) ) сделав вызов с действием PLACEABLE_ACTION_USE вы можете для игрока открыть любой контейнер. А теперь наступают трудности. Надо сделать так, чтобы контейнер не был доступен пользователю и чтобы он и предметы из него не воровались. Заманчиво сделать контейнер-шкурку (это решает проблему доступа и воровства), но, к сожалению, все шкурки на игроке пропадают при заходе на шард. Поэтому пришлось сделать контэйнер размером 0Х0 (т.е. по нему нельзя щелкнуть мышкой, чтобы открыть) и делать в скрипте использования контейнера вещи, помещенные в контейнер плотовыми (как и сам контейнер),чтобы их нельзя было своровать. Способ конечно извратный, но у него есть огромное преимущество: он не использует БД и поэтому не нагружает сервер. |
||
![]()
Сообщение
#10
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
так...не понял про
- 0x0. Это как? (не в смысле что это. это я знаю.) - "сервер-ваултными" Те в сингле нельзя? |
![]()
Сообщение
#11
|
|||
Level 2 ![]() Класс: Монах Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] ![]() |
0Х0 - это размер предмета - пришлось создать в файле baseitems.2da новый предмет-контейнер В сингле использовать эту фишку я особого смысла не вижу, так в нем спокойно можно пользоваться стандартной базой данных
Это, конечно, баг движка, но именно он позволяет сделать предмет, который нельзя выделить и использовать (только надо предупредить игрока, чтобы он очистил от предметов 4 ячейки в левом нижнем углу 1 страницы инвентаря, т.к. хотя размер нулевой, но 4 ячейки все таки используются и исли на этом месте лежат какие-то предметы, то доступ к ним может пропасть). Смысл в том, что технически игрок носит свой сейф с собой (чем достигается высокая надежность хранения вещей), но доступ к сейфу имеет только через специальное устройство (в виде плэйсэйбла в здании банка), к которому привязаны скрипты взаимодействия с контейнером. Если на шарде есть выпадение вещей после смерти (но обычно делается так, что плотовые вещи не выпадают), то наличие сейфа, в котором ироки могут хранить ценные неиспользуемые предметы, является очень ценной функцией для них. Для сингла я бы рекомендовал использовать шкурку-контейнер, так как , по-моему , при восстановлении игры она не пропадает. Сообщение отредактировал Тобур - Jan 26 2005, 00:04 |
||
![]()
Сообщение
#12
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Я знаю, что 0х0 это размеры вещи. Просто не знал, что движок такие размеры позволяет. Эту вещь нельзя выделить, можно только скриптово обратиться, так?
Я не хочу БД юзать. |
![]()
Сообщение
#13
|
|
Пингвиноид ![]() Класс: Обыватель Характер: True Neutral Раса: Человек ![]() |
По просьбе DBColl'a выкладываю свои умозаключения. Надеюсь, темой не обшибся...
К вопросу о букве "я" в тулсете Итак, есть проблема - при вводе буквы "я" в скриптах компилятор потом напрочь отказывается работать. Логически подумаем. Для начала несколько вводных: 1) Маленькая буква "я" имеет ASCII-код 255 (знающие уже догадались, остальным разжевываю) 2) Старые реализации сишной stdlib содержат функцию char fgetc(FILE *stream); 3) Есть глобальная переменная errno сишной библиотеки stdlib Проследим за компилятором. Считывая функцией fgetc очередной символ, он ожидает следующий символ или EOF при конце файла или ошибке. EOF принимает значение -1. Теперь возьмем букву "я", которая при выставленных всех битах имеет значение при signed char равным именно -1 (unsigned char(255) = signed char(-1)). То есть, получая из потока букву "я" компилятор считает, что достигнут конец файла или произошла какая-то ошибка. И ничтоже сумнявшися вываливается с сообщением об ошибке. При этом глобальная переменная errno остается равной 0 (нет ошибок, нет EOF). При написании компилятора разработчики проверяют только результат fgetc, не проверяя при этом errno. Отсюда и спотыкания компилятора. В новом тулсете и компиляторе такой проблемы уже не будет, потому что в современных реализациях stdlib fgetc возвращает уже тип int, а это четыре байта, а не один. Поэтому буква "я" будет распознаваться нормально. С причиной реакции компилятора на букву "я" разобрались. Как исправить? Дизасемблировать компилятор, вставить проверку errno, поменять заголовок исполняемого PE-файла. Заголовок нужно будет поменять, потому что проверка на errno займет, как минимум, дополнительно пару десятков байт. Поэтому в PE-заголовке нужно будет поменять размер сегмента кода. К сожалению я не знаю формат PE-заголовка (хоть он и берет начало от pure COFF формата, с которого начинался и линуксовый ELF-формат). Также я не знаю, как из ассемблера вызвать виндовый stdlib (достучаться к переменной errno в частности). Подытожим, что нужно для решения проблемы: 1) Дизассемблер (решаемо - ищется в Интернете) 2) Спецификация исполняемого PE-файла (решаемо - ищется в Интернете) 3) Вызов stdlib функций из ассемблера (с трудом, но решаемо - в Интернете или методом проб и ошибок) 4) Желание (не решаемо - мне по жизни лень. Профессия обязывает) Осталось найти на 4-й пункт пионера и проблема буквы "я" будет решена. P.S. Мечтательно так: вот был бы тулсет OpenSource... |
![]()
Сообщение
#14
|
|
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
почти все умозаключения далеки от реальности(кроме, пожалуй, дизассемблера) :drag:
но как катализатор пригодились... -> http://dumbo.nm.ru ps. на звание пионера не претендую, бо был я там - не понравилось... |
![]()
Сообщение
#15
|
|
Level 3 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Есть путь полегче. "я" можно назвать, например, объект, и вставлять GetName(...). Так было сделано на Сиале, ещё до моего прихода, и это работает. Если же мучить экзешник, это прийдётся делать после каждого патча...
|
![]()
Сообщение
#16
|
|
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
этот "путь полегче" относится к, можно сказать, азам. и он не зависит от версии. да. но это же жутко неудобно! хотя, понятное дело, можно привыкнуть и пальцами ног писать скрипты... ;) насчет обновлений - не проблема: если это кому-нибудь будет нужно, забацаю универсальный патчер.
|
![]()
Сообщение
#17
|
|
Level 3 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Хм. Я с этим столкнулся недавно. Вообще как-то русский в скриптах не применял, при любой возможности использую язык оригинала.
|
![]()
Сообщение
#18
|
|||||
Пингвиноид ![]() Класс: Обыватель Характер: True Neutral Раса: Человек ![]() |
На то они и умозаключения, чтобы быть ошибочными. Если не влом отписать - кратко, каковы реалии?
;) Без обид. Пионеры есть и сейчас. Но именно советским - и я был. В комсомол буквально на год не успел... :this: :D Сообщение отредактировал slavaz - Feb 21 2005, 10:58 |
||||
![]()
Сообщение
#19
|
|||
4-х Кубовый ![]() Класс: Некромант Характер: Lawful Evil Раса: Человек NWN: Скриптинг [Sn] Проклятие Левора ![]() |
НУЖНО!!! :good: |
||
![]()
Сообщение
#20
|
|||
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
slavaz если вкратце, то примерно так - вычитывается весь файл в буфер, потом идет разбор:
соотв-но, когда встречается "я" (0xff), FLAG становится -1 за счет signed типов (movsx FLAG, ch) - так что это скорее косяк биоповаров. ну а невозможность ввода русских букавок - это просто за счет проверки символов isgraph - вторая половина _ctype, как известно, пуста... так что либо заполнять _ctype значениями, скажем, _IS_PUN, либо заменить тельце isgraph на проверку char > 0x20. DBColl ок, как выкрою, так накатаю. только вот мне бы помогли старые версии nwtoolset.exe, clcompile(чем больше разных - тем лучше) - если есть у кого, было бы неплохо... ;) Сообщение отредактировал dumbo - Feb 21 2005, 13:28 |
||
![]()
Сообщение
#21
|
|||
Пингвиноид ![]() Класс: Обыватель Характер: True Neutral Раса: Человек ![]() |
2dumbo: МАМА родная моя! :shout: Действительно примерно такой алгоритм? Моего уважения к биоваревцам как кодерам убавилось, ей Богу...
Я, блин, как всегда, занадто глубоко укопался... не учел человеческий фактор... :swoon: По поводу ранних версий тулсета - думаю, DBColl поможет... :yes: В любом случае спасибо, вся общественность будет тебе благодарна. |
||
![]()
Сообщение
#22
|
|
4-х Кубовый ![]() Класс: Некромант Характер: Lawful Evil Раса: Человек NWN: Скриптинг [Sn] Проклятие Левора ![]() |
dumbo
Скажи, а возможно еще все-таки сделать, чтобы в редакторе скриптов было возможно печатать по-русски? Сможешь ли ты такое провернуть? У меня есть тулсет СоУ 1.32. Дать? |
![]()
Сообщение
#23
|
|
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
DBColl
ты скачай и посмотри... я это сразу сделал... :drag: |
![]()
Сообщение
#24
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
dumbo э, что то я не понял! А мне ссылку? :rolleyes:
|
![]()
Сообщение
#25
|
|
Level 10 ![]() Класс: Волшебник Характер: Neutral Evil Раса: Человек ![]() |
Вот нахимичел в тулсете, и получилось я попробовал поставить вместо DestroyObject, DestroyEffect!
И усё получилось эффект удаляется. |
![]() ![]() |
Текстовая версия | Сейчас: 29th March 2024 - 17:38 |