Tarre Talliorne
Aug 11 2004, 19:36
Тема создана главнм образом для новичков, но и более опытным товарищая почитать тоже не помешает. Итак. Минимум флейма. Максимум инфы. Начну я (кто бы сомневался :-) )
1. LevelUpHenchman(). С помощью этой функции можно... повысить уровень ПС (применив ее к ПС, конечно) без распределения этим самым ПС всех плюшек. Действие фишки можно наблюдать в первой главе ХотУ. Когда в начальном диалоге (при заходе чаром малых уровней) выозникает выбор: повысить уровень самому или автомастически. Этот самый автоматический вариант и реализован с помощью LevelUpHenchman.
2. Тонкость конструкции if (condition) { . . . }.
Neverwinter Script Source |
if (1) { return TRUE; } |
вернет TRUE. Никогда не задумывались почему? Дело в том, что при "заявлении" условие автоматически приравнивается(==) к TRUE. TRUE в свою очередь численно равно 1 (FALSE = 0, в этом в можете убедиться, открыв nwscript.nss). Поэтому наше форма и возвращает 1. Посему
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")==1) |
можно с легкостью заменить на
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")) |
Не использовать в данном виде! См. пост _kaa_ и мой ответ.
3. Известно почти всем, но все же.
Neverwinter Script Source |
int n1 = 1; int n2 = 2; int n3 = 3; int n4 = 4; |
то же, что и
Neverwinter Script Source |
int n1 = 1, n2 = 2, n3 = 3, n4 = 4; |
Аналогично и с float, string, effect и другими типами данных.
4. Упрощенная модель if {} else {}
Допустим,
Neverwinter Script Source |
if (nA > 5) { nB = TRUE; } else { nB = FALSE; } |
то же, что
Neverwinter Script Source |
nB = (nA > 5) ? TRUE : FALSE; |
т.е. все, что до '?' - условие, все, что после вопроса до двоеточия - присвоение в случае истинности утвержения в скобках, после двоеточия - в случае ложности.
Продолжение следует. Если у вас есть то, чем можно поделиться и что заслуживает всеобщего внимания , прошу.
Цитата(Tarre Talliorne @ Aug 11 2004, 19:36)
2. Тонкость конструкции if (condition) { . . . }.
Neverwinter Script Source |
if (1) { return TRUE; } |
вернет TRUE. Никогда не задумывались почему? Дело в том, что при "заявлении" условие автоматически приравнивается(==) к TRUE. TRUE в свою очередь численно равно 1 (FALSE = 0, в этом в можете убедиться, открыв nwscript.nss). Поэтому наше форма и возвращает 1. Посему
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")==1) |
можно с легкостью заменить на
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")) |
Ты проверь что будет для if (2) {} и вообще любого числа кроме 0 (даже отрицательного). Вернёт TRUE.
Как ты и сказал, если выражение возвращает 0 - то это FALSE, иначе - TRUE.
Чтобы понять (тем кому еще не понятно) - проще рассмотреть логическую конструкцию вне скобок.
Скажем:
Neverwinter Script Source |
int i = k == 5; |
вернет 1 (TRUE), если k равен 5 и 0(FALSE) в любом другом случае. Т.е. сначала вычислится результат логической операции ==, и этот результат присвоится переменной i.
Так что условие
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")) |
используется для проверки на ненулевое значение локальной переменной.
Tarre Talliorne
Aug 11 2004, 22:09
Destinguo, _kaa_, destinguo! Сеньк :-)
5.Давным-давно был вопрос, как убирать эффекты... Вернее, как убрать одни, скажем, визуальные, и оставить другие визуальные. Прием довольно прост и активно юзается биоповарами.
В нижеприведенной функции эффекты сортируются не по типу, а по создателю. А создателем можно сделать локальный объект. Так они и снимаются. Итак:
Neverwinter Script Source |
// В ОТЛИЧАЕТСЯ ОТ СКРИИПТА В БАЗЕ ФИЛЬТРУЕТ ЭКЗЕМПЛЯР ЭФФЕКТА НЕ ПО // ЕГО ТИПУ, А ПО СОЗДАТЕЛЮ ЭФФЕКТА (РЕКОМЕНДУЮ ИСПОЛЬЗОВАТЬ SetLocalObject) // [SCRIPTED BY TARRE TALLIORNE from RAGE! ] void ActionRemoveEffects2(object oTarget, object oCreater);
void ActionRemoveEffects2(object oTarget, object oCreater) { effect eEffect = GetFirstEffect(oTarget); while (GetIsEffectValid(eEffect)) { if (GetEffectCreator(eEffect)==oCreater) { RemoveEffect(oTarget, eEffect); } eEffect = GetNextEffect(oTarget); } } |
Айван: МОЛОДЕЦ!
Давай дальше!
Вот ещё пара идентичных функций для работы с эффектами, ищет первый эффект по одному или комбинации признаков:
Neverwinter Script Source |
//Проверяем наличие эффекта на объекте. Если какой-либо из //признаков эффекта нас не интересует (тип, id спелла которым наложен //эффект, или объект-"автор" эффекта), передаём функции значение то //же, что и по-умолчанию int GetHasSpecificEffect(object oTarget, int nEffectType_ID=EFFECT_TYPE_INVALIDEFFECT, int nSpell_ID=-1, object oCaster = OBJECT_INVALID);
//То же что и предыдущая, но возвращает найденый эффект effect GetSpecificEffect(object oTarget, int nEffectType_ID=EFFECT_TYPE_INVALIDEFFECT, int nSpell_ID=-1, object oCaster = OBJECT_INVALID);
int GetHasSpecificEffect(object oTarget, int nEffectType_ID=EFFECT_TYPE_INVALIDEFFECT, int nSpell_ID=-1, object oCaster = OBJECT_INVALID) { effect eEffect = GetFirstEffect(oTarget); while (GetIsEffectValid(eEffect)) { if((nEffectType_ID== EFFECT_TYPE_INVALIDEFFECT|| GetEffectType(eEffect)==nEffectType_ID)&& (nSpell_ID == -1 || GetEffectSpellId(eEffect)==nSpell_ID)&& (oCaster == OBJECT_INVALID || GetEffectCreator(eEffect)==oCaster)) { return 1; } eEffect = GetNextEffect(oTarget); } return 0; }
effect GetSpecificEffect(object oTarget, int nEffectType_ID=EFFECT_TYPE_INVALIDEFFECT, int nSpell_ID=-1, object oCaster = OBJECT_INVALID) { effect eEffect = GetFirstEffect(oTarget); while (GetIsEffectValid(eEffect)) { if((nEffectType_ID== EFFECT_TYPE_INVALIDEFFECT|| GetEffectType(eEffect)==nEffectType_ID)&& (nSpell_ID == -1 || GetEffectSpellId(eEffect)==nSpell_ID)&& (oCaster == OBJECT_INVALID || GetEffectCreator(eEffect)==oCaster)) { return eEffect; } eEffect = GetNextEffect(oTarget); } return eEffect; } |
П.С. В редакторе, без видимого ограничения на длину строк, скрипт выглядел много лутше.
Lemegeton
Nov 22 2004, 20:14
Простейшая вещь, но может, кому пригодится?
Когда в модуле надо обрабатывать много кастомных свойств объектов, скрипт OnActivateItem разрастается до беспредела. Во избежание этого, в свойстве OnActivateItem пишется (примерно) следующее:
CODE |
void main() { object oItem = GetItemActivated(); string tgItem = GetTag(oItem); object oTarget = GetItemActivatedTarget(); ExecuteScript(tgItem, oTarget); } |
что позволяет вызвать скрипт с именем ТЭГА ПРЕДМЕТА.
Например, палка с тэгом dragon_stick вызовет (попытается вызвать) скрипт dragon_stick. Все просто. OBJECT_SELF будет указывать на того, на кого направлено свойство палки.
З.Ы. Мечтательно Пару проверочек бы влючить...
Tarre Talliorne
Dec 31 2004, 17:36
По-моему это лишнее: новые скрипты жрут размер модуля, и, кроме того, в одном скрипте все более компактно, что ли. В официальной кампании есть скрипты и по 5 тысяч строк...
Tarre Talliorne
Если есть ХОРОШАЯ система именования скриптовых файлов, то этот способ весьма удобен, особенно, если над модулем трудится несколько скриптеров. ОБЩИЕ скрипты в таком случае получаются ВСЕ, которые стоят в свойствах мода.
Tarre Talliorne
Jan 15 2005, 20:34
6.Вот как-то вот так... Помнится, с годик назад структуру switch {...} мне подробно объяснил Лекс (если я не ошибаюсь). Так вот. Тогда дело ограничилось только
Neverwinter Script Source |
switch (i) { case n1: action(); break; case n2: second_action(); break; } |
В то время как немногим (из моих НВН-знакомых) известна одна тонкость. Дело в том, что модель свич является упрощенной моделью иф-элс. И где же здесь элс -- задатите вы резонный вопрос.
а вот оно:
Neverwinter Script Source |
switch (i) { case n1: action1(); break; case n2: action2(); break; default: action3(); } |
Именно дефолт берет на себя инициативу в том, случае, если i не удовлетворяет ни n1, ни n2. Стоит отметить, что break; в конце действия дефолта факультативен.
QUOTE (Lemegeton @ Nov 22 2004, 20:14) |
что позволяет вызвать скрипт с именем ТЭГА ПРЕДМЕТА. |
Система тэговых скриптов включена в стандартные скрипты НВН (смотрите стандартные скрипты 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 (т.е. по нему нельзя щелкнуть мышкой, чтобы открыть) и делать в скрипте использования контейнера вещи, помещенные в контейнер плотовыми (как и сам контейнер),чтобы их нельзя было своровать.
Способ конечно извратный, но у него есть огромное преимущество: он не использует БД и поэтому не нагружает сервер.
так...не понял про
- 0x0. Это как? (не в смысле что это. это я знаю.)
- "сервер-ваултными" Те в сингле нельзя?
0Х0 - это размер предмета - пришлось создать в файле baseitems.2da новый предмет-контейнер
В сингле использовать эту фишку я особого смысла не вижу, так в нем спокойно можно пользоваться стандартной базой данных
QUOTE |
Я знаю, что 0х0 это размеры вещи. Просто не знал, что движок такие размеры позволяет. Эту вещь нельзя выделить, можно только скриптово обратиться, так? |
Это, конечно, баг движка, но именно он позволяет сделать предмет, который нельзя выделить и использовать (только надо предупредить игрока, чтобы он очистил от предметов 4 ячейки в левом нижнем углу 1 страницы инвентаря, т.к. хотя размер нулевой, но 4 ячейки все таки используются и исли на этом месте лежат какие-то предметы, то доступ к ним может пропасть). Смысл в том, что технически игрок носит свой сейф с собой (чем достигается высокая надежность хранения вещей), но доступ к сейфу имеет только через специальное устройство (в виде плэйсэйбла в здании банка), к которому привязаны скрипты взаимодействия с контейнером. Если на шарде есть выпадение вещей после смерти (но обычно делается так, что плотовые вещи не выпадают), то наличие сейфа, в котором ироки могут хранить ценные неиспользуемые предметы, является очень ценной функцией для них.
Для сингла я бы рекомендовал использовать шкурку-контейнер, так как , по-моему , при восстановлении игры она не пропадает.
Я знаю, что 0х0 это размеры вещи. Просто не знал, что движок такие размеры позволяет. Эту вещь нельзя выделить, можно только скриптово обратиться, так?
Я не хочу БД юзать.
slavaz
Feb 20 2005, 13:18
По просьбе 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...
почти все умозаключения далеки от реальности(кроме, пожалуй, дизассемблера)

но как катализатор пригодились... ->
http://dumbo.nm.rups. на звание пионера не претендую, бо был я там - не понравилось...
Есть путь полегче. "я" можно назвать, например, объект, и вставлять GetName(...). Так было сделано на Сиале, ещё до моего прихода, и это работает. Если же мучить экзешник, это прийдётся делать после каждого патча...
этот "путь полегче" относится к, можно сказать, азам. и он не зависит от версии. да. но это же жутко неудобно! хотя, понятное дело, можно привыкнуть и пальцами ног писать скрипты...

насчет обновлений - не проблема: если это кому-нибудь будет нужно, забацаю универсальный патчер.
Хм. Я с этим столкнулся недавно. Вообще как-то русский в скриптах не применял, при любой возможности использую язык оригинала.
slavaz
Feb 21 2005, 10:56
QUOTE (dumbo @ Feb 20 2005, 20:04) |
почти все умозаключения далеки от реальности(кроме, пожалуй, дизассемблера) но как катализатор пригодились... -> http://dumbo.nm.ru |
На то они и умозаключения, чтобы быть ошибочными. Если не влом отписать - кратко, каковы реалии?
QUOTE (dumbo @ Feb 20 2005, 20:04) |
ps. на звание пионера не претендую, бо был я там - не понравилось... |

Без обид.
Пионеры есть и сейчас. Но именно советским - и я был. В комсомол буквально на год не успел...
DBColl
Feb 21 2005, 12:29
QUOTE (dumbo @ Feb 20 2005, 22:55) |
насчет обновлений - не проблема: если это кому-нибудь будет нужно, забацаю универсальный патчер. |
НУЖНО!!!
slavaz
если вкратце, то примерно так - вычитывается весь файл в буфер, потом идет разбор:
CODE |
int i = 0, FLAG = 0; char ch; while (FLAG!=-1) { ch = buf[i++]; if i > filesize FLAG = -1; else FLAG = ch; ... }
|
соотв-но, когда встречается "я" (0xff), FLAG становится -1 за счет signed типов (mov
sx FLAG, ch) - так что это скорее косяк биоповаров.
ну а невозможность ввода русских букавок - это просто за счет проверки символов isgraph - вторая половина _ctype, как известно, пуста... так что либо заполнять _ctype значениями, скажем, _IS_PUN, либо заменить тельце isgraph на проверку char > 0x20.
DBCollок, как выкрою, так накатаю. только вот мне бы помогли старые версии nwtoolset.exe, clcompile(чем больше разных - тем лучше) - если есть у кого, было бы неплохо...
slavaz
Feb 21 2005, 14:06
2dumbo: МАМА родная моя!

Действительно примерно такой алгоритм? Моего уважения к биоваревцам как кодерам убавилось, ей Богу...
CODE |
int i; char *tmp_buf=buf; // прирост указателя быстрее вычисления индекса в каждой итерации цикла int FLAG=0; // хрен его знает, зачем... for (i=0; i<filesize;i++){ ch = *(tmp_buf++); FLAG = (unsigned int) ch; // это если уж очень надо FLAG ... bla-bla ... }
|
Я, блин, как всегда, занадто глубоко укопался... не учел человеческий фактор...

По поводу ранних версий тулсета - думаю, DBColl поможет...
В любом случае спасибо, вся общественность будет тебе благодарна.
DBColl
Feb 21 2005, 17:03
dumbo
Скажи, а возможно еще все-таки сделать, чтобы в редакторе скриптов было возможно печатать по-русски? Сможешь ли ты такое провернуть?
У меня есть тулсет СоУ 1.32. Дать?
DBCollты скачай и посмотри... я это сразу сделал...
dumbo э, что то я не понял! А мне ссылку?
Nokoll
Feb 22 2005, 00:45
Вот нахимичел в тулсете, и получилось я попробовал поставить вместо DestroyObject, DestroyEffect!
И усё получилось эффект удаляется.
DBColl
Feb 22 2005, 11:24
QUOTE (Nokoll @ Feb 21 2005, 23:45) |
Вот нахимичел в тулсете, и получилось я попробовал поставить вместо DestroyObject, DestroyEffect! |
Это что за новая функция такая???

QUOTE (dumbo @ Feb 21 2005, 22:42) |
DBColl ты скачай и посмотри... я это сразу сделал... |
Friedrich
Feb 22 2005, 22:11
[B]Прошу прошенья за флуд.
Это что, Думбо дизассемблировал nwtoolset.exe, исправил его и теперь можно русскиими буквами писать и "я" исползывать. Обалдеть!
//А вот я купил Си++ для чайников, сейчас вот изучаю, через сколько времени я также смогу?
А чего биовары, этого сами не сделали?! У них ведь вообще все исходники есть?
Кстати, можно мне тоже попрыбывать принести пользу?

Может быть это и так все знают. Скрипты можно легко и не принужденно (почти) писать и компилировать без тулсета. (Тулсет большой, на слабых машинах долго грузится, в общем иногда этот может быть полезно).
Для этого:
1. Качаем Адитор - текстовый редактор такой и устанавливаем его. (
отсюда, например, но не уверен что у меня последняя версия)
2. Прописываем в autoxec.bat путь к папке utils в каталоге nwn.
Что-то вроде
SET PATH=с:\games\nwn\utils;%PATH%
(Правильно написал? Вроде, усе работает? Кстати как в ХР/2К с autoxec'ом, все также? А то у меня 98-е.) Естественно, после этого нужно перезагрузить компьютер, чтобы настройки вступили в силу.
3. Запускаем адитор и идем в настройки: Edit -> Preferences
На вкладке, File types -> Еxecute в поле
File extension пишем: nss
В поле Command line: clcompile &f
Cтавим галочку Capture Output и нажимаем Add
4. На вкладке Interface -> Other убираем галочку Start in last visited directory. В противном случае скомпилированный файл будет появлятся в папке, где вы прошлый раз сохраняли файл (бага наверное).
5. По желанию и вкусу, настроить подсветку nss (файл подсветки нужно кинуть в папку с адитором) .
Усе!
Теперь можно открывать .nss-файлы aditor-ом и компилировать нажатием кнопочки Execute. Соббщения компилятуры пудут перехвачены и появятся в открывшемся снизу окошке самого aditor'a.
Может похожую штуку и другие редакторы умеют делать. Но я знаю только про этот. Надеюсь это будет хотя-бы кому-нибудь полезно.
Я вообще windows commander'ом пользуюсь и у меня nss в адиторе по F4 открываются.
Добавлено в [mergetime]1109099859[/mergetime] Соббщения компилятуры пудут перехвачены
мдя - это я видимо, обкурился, малость...
пользуясь случаем, поздравляю всех с праздником!

как и обещал, забацал универсальный
патчер
DBColl
Feb 23 2005, 14:17
dumbo РЕСПЕКТИЩЕ ТЕБЕ ОГРОМНЫЙ. Ты не смотри, что мало кто отреагировал. Просто еще никто нифига не понял вокруг, ЧТО произошло

. Так что действительно готовься ловить респекты

.
Хм, вот дела

Де ж ты раньше был? РЕСПЕКТ. Однозначно.
Lexey aka Hawk
Feb 23 2005, 14:47
Tiger Greyhawk
Feb 24 2005, 03:36
QUOTE (dumbo @ Feb 23 2005, 09:48) |
как и обещал, забацал универсальный патчер. устраняет попытки дискриминации по отношению к русским скриптерам |
dumbo, блин. Да за это не только памятник надо ставить! Молодец!

Спасибо за сделанное.

И огроменный РЕСПЕКТ!!!
Отдельное спасибо slavaz`у за то, что натолкнул МОЗГ на эту мысль.
QUOTE (DBColl @ Feb 23 2005, 14:17) |
dumbo РЕСПЕКТИЩЕ ТЕБЕ ОГРОМНЫЙ. Ты не смотри, что мало кто отреагировал. Просто еще никто нифига не понял вокруг, ЧТО произошло . Так что действительно готовься ловить респекты |
Действительно, народ революцию пропустил. И я вместе с ними. Я рад, что нахожусь на форуме с такими людьми.
Lemegeton
Feb 24 2005, 10:32
dumbo: Вот это да! Это и есть ВКЛАД в развитие! (Респект +1)
QUOTE |
Просто еще никто нифига не понял вокруг, ЧТО произошло . Так что действительно готовься ловить респекты. |
Да уж... Чертыре поста да еще и в "фишках про скрипты"... Народ же всю революцию пропустил! Срочно ссылку во все места!
З.Ы. Надеюсь, биоповара не сильно обидятся... Вообще-то дизассемблировать программные продукты не OpenSource (или любой GNU) низя (а OpenSource не нужно)...
Круто! Правда у меня сомнения по поводу возможных багов и использования модов в следующих версиях тулсета, но сделана действительно нужная вещь
MasterMage
Mar 7 2005, 18:51
DBColl ХМ, а у меня 1.32... На вашем 1.64 пойдут мои модули?
dumbo Молодец!! Скачал я патч... Попробую... Это ж действительно переворот! Никаких тебе больше ненужных точек с тегами "YA" и проч...!!!
Клемент Астилон
Mar 11 2005, 22:31
Присоединяюсь. Респект
MasterMage
Mar 11 2005, 22:38
А вы знаете, что можно запустить скрипт, дав его тег предмету, и когда он окажется в вашем рюкзаке, скрипт сработает. Следовательно не надо писать OnAcquiredItem.... Просто тег итема и скрипта одинаковые...
Lemegeton:"Да. Это делают дефолтные x2_mod_ - скрипты. Только они это скрипт будут запускать не только OnAcquiredItem но и OnUnAcquiredItem, onEqup, onUnEquip, onActivate..."
© by FriedrichБолее подробно о Tag-based скриптах можно узнать в
Lexicon'е
Lexicon > Lyceum > Tutorial > Beginning Scripting > Grimlar - Introduction To Tag Based Scripting"вообще, tag-based скрипты - правильная штука(все поведение предмета описывается в одном скрипте), особенно если сравнивать это с кучей "if(GetTag(oItem)){...}" обильно развешанных во всех модульных скриптах... "
(с) by dumboВсе остальные посты по обсуждению этой темы удалены.
2_advanced
Sep 12 2005, 03:54
древняя хреновинка. позволяет делать автопатчеры для хаков (хаков/модулей и т.п.)
нет времени на доработку =(
2_advanced
Sep 17 2005, 14:33
Очень аккуратно пользуйтесь функцией
Neverwinter Script Source |
void SetCutsceneMode( object oCreature, int nInCutscene = TRUE ); |
На днях лишний раз SetCutsceneMode FALSE привело к тому, что РС стал в режиме бога и не уязвим для повреждений. Промучался пол дня, пока нашел бяку...
NedWarN
Sep 20 2005, 02:31
Несложный но интересный способ установления камеры, без констант.
Задаём переменную.
[NSS]float x=0.0f; \\ Движение по оси Х
float y=0.0f; \\ Зум, по оси У
float z=0.0f;\\ и Конечноже ось Z [\NSS]
-----------------------------------------------
Осталось только применить Переменную, и камера установлена.
[NSS] x=13.9f;
y=14.9f;
z=15.9f;[\NSS]
Известно, что патчить сейвы низя... НО. Если компильнуть все скрипты модуля и впихнуть nss ncs в хак, то модуль будет работать на скриптах их хаков. Теперь достаточно исправить патем 5-10 скриптов, кинуть их исходники и компельнутые файлы в хак например аддонюхак и все. СЕЙВ БУДЕТ БРАТЬ УЖЕ ИСПРАВЛЕННЫЕ СКРИПТ. Проверял тока что. Это конечно по большей степени качается сингловиков... Но все же. ВОЗМОЖНО ЧТО ТО МОЖНО И С ЛОКАЦИЯМИ ТАК И С ДИАЛОГАМИ... Я пока не проверял. Кому нефик делать, проверьте и скажите.
можно. я те еще в начале года об этом говорил:
http://www.city-of-masters.ru/forums/index...?showtopic=2162можно все ресурсы в хак и сейвы соот. тоже содержать изменения будут.
Я мучался чтолько лет не зная, что РС в режиме катсцене может просто ходить пешком, раньше я налаживал эффект замедления. Оказалось при команде
NSS
// The action subject will move to lDestination.
// - lDestination: The object will move to this location. If the location is
// invalid or a path cannot be found to it, the command does nothing.
// - bRun: If this is TRUE, the action subject will run rather than walk
// * No return value, but if an error occurs the log file will contain
// "MoveToPoint failed."
void ActionMoveToLocation(location lDestination, int bRun=FALSE)
РС идет нормальным пешком... Смешно и обидно. Столько парился в катсценах
Lamonde
Dec 20 2008, 23:34
Сегодня заметил, что:
У PC появилась собственная шкурка. Раньше ее требовалось создавать в инвентаре и одевать на персонажа, теперь же она есть и носит гордое название "PC Properties".

А выяснилось это вот каким образом. Создал шкурку, решил ее нацепить на персонажа. Запускаю, одеваю шкурку и в логе читаю "Item swaped out". Открываю инвентарь, лежит "шкурка" игрока.
Ну, решили что хватит через зад использовать шкуры животных, вдруг гринписовцы заявят на разрабов и сделали шкуру для РС
Lamonde
Dec 21 2008, 18:03
Цитата(Aiwan @ Dec 21 2008, 15:46)

Ну, решили что хватит через зад использовать шкуры животных, вдруг гринписовцы заявят на разрабов и сделали шкуру для РС

Если бы они еще оставили опцию класть шкурку в инвентарь (через тулсет), было бы шикарно.
Ogneslav
Dec 21 2008, 19:51
Цитата
"PC Properties"
Тоже нашел эту шкурку)
оказывается она нужна для езды на лошадях(если я правильно понял)
Ilerien
Dec 22 2008, 00:45
Шкурка эта создана с единственной целью - чтобы чары, сделанные до 1.69, могли ездить на лошадях. Мерзавцы-биовари запихали её в спеллхук, так что не удивляйтесь, что она в инвентарь при касте спеллов падает

Причём она создаётся до 30 раз при касте любого спелла
Lamonde
Dec 22 2008, 13:19
Цитата(Ilerien @ Dec 22 2008, 01:45)

Шкурка эта создана с единственной целью - чтобы чары, сделанные до 1.69, могли ездить на лошадях. Мерзавцы-биовари запихали её в спеллхук, так что не удивляйтесь, что она в инвентарь при касте спеллов падает

Причём она создаётся до 30 раз при касте любого спелла

Получается, что вешать переменные на нее бессмысленно? (раз она уничтожается и дается по новой или, что то не так понял?)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.