Помощь - Поиск - Пользователи - Календарь
Полная версия: Всякого рода фишки
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2
Tarre Talliorne
Тема создана главнм образом для новичков, но и более опытным товарищая почитать тоже не помешает. Итак. Минимум флейма. Максимум инфы. Начну я (кто бы сомневался :-) )

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;


т.е. все, что до '?' - условие, все, что после вопроса до двоеточия - присвоение в случае истинности утвержения в скобках, после двоеточия - в случае ложности.

Продолжение следует. Если у вас есть то, чем можно поделиться и что заслуживает всеобщего внимания , прошу.
_kaa_
Цитата(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
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);
    }
}


Айван: МОЛОДЕЦ! good.gif Давай дальше! yes3.gif
Shad
Вот ещё пара идентичных функций для работы с эффектами, ищет первый эффект по одному или комбинации признаков:
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
Простейшая вещь, но может, кому пригодится?

Когда в модуле надо обрабатывать много кастомных свойств объектов, скрипт 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
По-моему это лишнее: новые скрипты жрут размер модуля, и, кроме того, в одном скрипте все более компактно, что ли. В официальной кампании есть скрипты и по 5 тысяч строк...
DBColl
Tarre Talliorne
Если есть ХОРОШАЯ система именования скриптовых файлов, то этот способ весьма удобен, особенно, если над модулем трудится несколько скриптеров. ОБЩИЕ скрипты в таком случае получаются ВСЕ, которые стоят в свойствах мода.
Tarre Talliorne
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)
Дело в том, что эта функция, не смотря на ее название, работает не только с плэйсэйблами, но и с контейнерами (улавливаете мою мысль? smile.gif )
сделав вызов с действием PLACEABLE_ACTION_USE вы можете для игрока открыть любой контейнер.
А теперь наступают трудности. Надо сделать так, чтобы контейнер не был доступен пользователю и чтобы он и предметы из него не воровались.
Заманчиво сделать контейнер-шкурку (это решает проблему доступа и воровства), но, к сожалению, все шкурки на игроке пропадают при заходе на шард.
Поэтому пришлось сделать контэйнер размером 0Х0 (т.е. по нему нельзя щелкнуть мышкой, чтобы открыть) и делать в скрипте использования контейнера вещи, помещенные в контейнер плотовыми (как и сам контейнер),чтобы их нельзя было своровать.
Способ конечно извратный, но у него есть огромное преимущество: он не использует БД и поэтому не нагружает сервер.
Lex
так...не понял про
- 0x0. Это как? (не в смысле что это. это я знаю.)
- "сервер-ваултными" Те в сингле нельзя?
Тобур
0Х0 - это размер предмета - пришлось создать в файле baseitems.2da новый предмет-контейнер
В сингле использовать эту фишку я особого смысла не вижу, так в нем спокойно можно пользоваться стандартной базой данных

QUOTE
Я знаю, что 0х0 это размеры вещи. Просто не знал, что движок такие размеры позволяет. Эту вещь нельзя выделить, можно только скриптово обратиться, так?


Это, конечно, баг движка, но именно он позволяет сделать предмет, который нельзя выделить и использовать (только надо предупредить игрока, чтобы он очистил от предметов 4 ячейки в левом нижнем углу 1 страницы инвентаря, т.к. хотя размер нулевой, но 4 ячейки все таки используются и исли на этом месте лежат какие-то предметы, то доступ к ним может пропасть). Смысл в том, что технически игрок носит свой сейф с собой (чем достигается высокая надежность хранения вещей), но доступ к сейфу имеет только через специальное устройство (в виде плэйсэйбла в здании банка), к которому привязаны скрипты взаимодействия с контейнером. Если на шарде есть выпадение вещей после смерти (но обычно делается так, что плотовые вещи не выпадают), то наличие сейфа, в котором ироки могут хранить ценные неиспользуемые предметы, является очень ценной функцией для них.

Для сингла я бы рекомендовал использовать шкурку-контейнер, так как , по-моему , при восстановлении игры она не пропадает.
Lex
Я знаю, что 0х0 это размеры вещи. Просто не знал, что движок такие размеры позволяет. Эту вещь нельзя выделить, можно только скриптово обратиться, так?
Я не хочу БД юзать.
slavaz
По просьбе 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...

dumbo
почти все умозаключения далеки от реальности(кроме, пожалуй, дизассемблера) drag.gif
но как катализатор пригодились... -> http://dumbo.nm.ru

ps. на звание пионера не претендую, бо был я там - не понравилось...
Shad
Есть путь полегче. "я" можно назвать, например, объект, и вставлять GetName(...). Так было сделано на Сиале, ещё до моего прихода, и это работает. Если же мучить экзешник, это прийдётся делать после каждого патча...
dumbo
этот "путь полегче" относится к, можно сказать, азам. и он не зависит от версии. да. но это же жутко неудобно! хотя, понятное дело, можно привыкнуть и пальцами ног писать скрипты... wink.gif насчет обновлений - не проблема: если это кому-нибудь будет нужно, забацаю универсальный патчер.
Shad
Хм. Я с этим столкнулся недавно. Вообще как-то русский в скриптах не применял, при любой возможности использую язык оригинала.
slavaz
QUOTE (dumbo @ Feb 20 2005, 20:04)
почти все умозаключения далеки от реальности(кроме, пожалуй, дизассемблера)
но как катализатор пригодились... -> http://dumbo.nm.ru


На то они и умозаключения, чтобы быть ошибочными. Если не влом отписать - кратко, каковы реалии?


QUOTE (dumbo @ Feb 20 2005, 20:04)
ps. на звание пионера не претендую, бо был я там - не понравилось...


wink.gif Без обид.
Пионеры есть и сейчас. Но именно советским - и я был. В комсомол буквально на год не успел... this.gif biggrin.gif
DBColl
QUOTE (dumbo @ Feb 20 2005, 22:55)
насчет обновлений - не проблема: если это кому-нибудь будет нужно, забацаю универсальный патчер.

НУЖНО!!! good.gif
dumbo
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 типов (movsx FLAG, ch) - так что это скорее косяк биоповаров.
ну а невозможность ввода русских букавок - это просто за счет проверки символов isgraph - вторая половина _ctype, как известно, пуста... так что либо заполнять _ctype значениями, скажем, _IS_PUN, либо заменить тельце isgraph на проверку char > 0x20.

DBColl
ок, как выкрою, так накатаю. только вот мне бы помогли старые версии nwtoolset.exe, clcompile(чем больше разных - тем лучше) - если есть у кого, было бы неплохо... wink.gif
slavaz
2dumbo: МАМА родная моя! shout.gif Действительно примерно такой алгоритм? Моего уважения к биоваревцам как кодерам убавилось, ей Богу...

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
...
}


Я, блин, как всегда, занадто глубоко укопался... не учел человеческий фактор... swoon.gif

По поводу ранних версий тулсета - думаю, DBColl поможет... yes.gif

В любом случае спасибо, вся общественность будет тебе благодарна.
DBColl
dumbo
Скажи, а возможно еще все-таки сделать, чтобы в редакторе скриптов было возможно печатать по-русски? Сможешь ли ты такое провернуть?

У меня есть тулсет СоУ 1.32. Дать?
dumbo
DBColl
ты скачай и посмотри... я это сразу сделал... drag.gif
Aiwan
dumbo э, что то я не понял! А мне ссылку? rolleyes.gif
Nokoll
Вот нахимичел в тулсете, и получилось я попробовал поставить вместо DestroyObject, DestroyEffect!
И усё получилось эффект удаляется.
DBColl
QUOTE (Nokoll @ Feb 21 2005, 23:45)
Вот нахимичел в тулсете, и получилось я попробовал поставить вместо DestroyObject, DestroyEffect!

Это что за новая функция такая??? smile.gif
QUOTE (dumbo @ Feb 21 2005, 22:42)
DBColl ты скачай и посмотри... я это сразу сделал...

Ого! Я уже скачал, но еще не смотрел его просто... КУЛ! РЕСПЕКТИЩЕ! 3 года существования тулсета без русского языка и ответов новичкам, что НЕВОЗМОЖНО набирать русский текст в тулсете - копируйте через буфер, УШЛО В ПРОШЛОЕ! УРА, Товарищи! good.gif clapping.gif clapping.gif
Friedrich
[B]Прошу прошенья за флуд.
Это что, Думбо дизассемблировал nwtoolset.exe, исправил его и теперь можно русскиими буквами писать и "я" исползывать. Обалдеть! biggrin.gif good.gif biggrin.gif
//А вот я купил Си++ для чайников, сейчас вот изучаю, через сколько времени я также смогу? lol.gif

А чего биовары, этого сами не сделали?! У них ведь вообще все исходники есть?

Кстати, можно мне тоже попрыбывать принести пользу? smile.gif
Может быть это и так все знают. Скрипты можно легко и не принужденно (почти) писать и компилировать без тулсета. (Тулсет большой, на слабых машинах долго грузится, в общем иногда этот может быть полезно).
Для этого:
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 открываются. smile.gif
Добавлено в [mergetime]1109099859[/mergetime]
Соббщения компилятуры пудут перехвачены
мдя - это я видимо, обкурился, малость... drag.gif
dumbo
пользуясь случаем, поздравляю всех с праздником! hunter.gif

как и обещал, забацал универсальный патчер
DBColl
dumbo
РЕСПЕКТИЩЕ ТЕБЕ ОГРОМНЫЙ. Ты не смотри, что мало кто отреагировал. Просто еще никто нифига не понял вокруг, ЧТО произошло wink.gif. Так что действительно готовься ловить респекты wink.gif. good.gif
Aiwan
Хм, вот дела smile.gif Де ж ты раньше был? РЕСПЕКТ. Однозначно. yes.gif
Lexey aka Hawk
ОФИГЕННО!!! smile.gif ГДЕ ЖЕ ТЫ БЫЛ 2 ГОДА НАЗАД? РЕСПЕКТ!!! good.gif good.gif good.gif
Tiger Greyhawk
QUOTE (dumbo @ Feb 23 2005, 09:48)
как и обещал, забацал универсальный патчер. устраняет попытки дискриминации по отношению к русским скриптерам wink.gif 

dumbo, блин. Да за это не только памятник надо ставить! Молодец! good.gif Спасибо за сделанное. yes.gif И огроменный РЕСПЕКТ!!!
Отдельное спасибо slavaz`у за то, что натолкнул МОЗГ на эту мысль.
QUOTE (DBColl @ Feb 23 2005, 14:17)
dumbo
РЕСПЕКТИЩЕ ТЕБЕ ОГРОМНЫЙ. Ты не смотри, что мало кто отреагировал. Просто еще никто нифига не понял вокруг, ЧТО произошло . Так что действительно готовься ловить респекты

Действительно, народ революцию пропустил. И я вместе с ними. Я рад, что нахожусь на форуме с такими людьми.
Lemegeton
dumbo: Вот это да! Это и есть ВКЛАД в развитие! (Респект +1) biggrin.gif

QUOTE
Просто еще никто нифига не понял вокруг, ЧТО произошло . Так что действительно готовься ловить респекты.

Да уж... Чертыре поста да еще и в "фишках про скрипты"... Народ же всю революцию пропустил! Срочно ссылку во все места!

З.Ы. Надеюсь, биоповара не сильно обидятся... Вообще-то дизассемблировать программные продукты не OpenSource (или любой GNU) низя (а OpenSource не нужно)...
Тобур
Круто! Правда у меня сомнения по поводу возможных багов и использования модов в следующих версиях тулсета, но сделана действительно нужная вещь
MasterMage
DBColl ХМ, а у меня 1.32... На вашем 1.64 пойдут мои модули?
dumbo Молодец!! Скачал я патч... Попробую... Это ж действительно переворот! Никаких тебе больше ненужных точек с тегами "YA" и проч...!!! clapping.gif clapping.gif yahoo.gif
Клемент Астилон
Присоединяюсь. Респект good.gif
MasterMage
А вы знаете, что можно запустить скрипт, дав его тег предмету, и когда он окажется в вашем рюкзаке, скрипт сработает. Следовательно не надо писать OnAcquiredItem.... Просто тег итема и скрипта одинаковые... smile.gif


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
древняя хреновинка. позволяет делать автопатчеры для хаков (хаков/модулей и т.п.)
нет времени на доработку =(
2_advanced
обновлено..
Aiwan
Очень аккуратно пользуйтесь функцией
Neverwinter Script Source
void SetCutsceneMode(
    object oCreature,
    int nInCutscene = TRUE
);

На днях лишний раз SetCutsceneMode FALSE привело к тому, что РС стал в режиме бога и не уязвим для повреждений. Промучался пол дня, пока нашел бяку...
NedWarN
Несложный но интересный способ установления камеры, без констант.
Задаём переменную.
[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]
Aiwan
Известно, что патчить сейвы низя... НО. Если компильнуть все скрипты модуля и впихнуть nss ncs в хак, то модуль будет работать на скриптах их хаков. Теперь достаточно исправить патем 5-10 скриптов, кинуть их исходники и компельнутые файлы в хак например аддонюхак и все. СЕЙВ БУДЕТ БРАТЬ УЖЕ ИСПРАВЛЕННЫЕ СКРИПТ. Проверял тока что. Это конечно по большей степени качается сингловиков... Но все же. ВОЗМОЖНО ЧТО ТО МОЖНО И С ЛОКАЦИЯМИ ТАК И С ДИАЛОГАМИ... Я пока не проверял. Кому нефик делать, проверьте и скажите. smile.gif
Lex
можно. я те еще в начале года об этом говорил:
http://www.city-of-masters.ru/forums/index...?showtopic=2162
можно все ресурсы в хак и сейвы соот. тоже содержать изменения будут.
Aiwan
Я мучался чтолько лет не зная, что РС в режиме катсцене может просто ходить пешком, раньше я налаживал эффект замедления. Оказалось при команде
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)

РС идет нормальным пешком... Смешно и обидно. Столько парился в катсценах smile.gif
Lamonde
Сегодня заметил, что:

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


Тоже нашел эту шкурку)
оказывается она нужна для езды на лошадях(если я правильно понял)
Ilerien
Шкурка эта создана с единственной целью - чтобы чары, сделанные до 1.69, могли ездить на лошадях. Мерзавцы-биовари запихали её в спеллхук, так что не удивляйтесь, что она в инвентарь при касте спеллов падает smile.gif Причём она создаётся до 30 раз при касте любого спелла wacko.gif
Lamonde
Цитата(Ilerien @ Dec 22 2008, 01:45) *
Шкурка эта создана с единственной целью - чтобы чары, сделанные до 1.69, могли ездить на лошадях. Мерзавцы-биовари запихали её в спеллхук, так что не удивляйтесь, что она в инвентарь при касте спеллов падает smile.gif Причём она создаётся до 30 раз при касте любого спелла wacko.gif
Получается, что вешать переменные на нее бессмысленно? (раз она уничтожается и дается по новой или, что то не так понял?)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.