Тема создана главнм образом для новичков, но и более опытным товарищая почитать тоже не помешает. Итак. Минимум флейма. Максимум инфы. Начну я (кто бы сомневался :-) )
1. LevelUpHenchman(). С помощью этой функции можно... повысить уровень ПС (применив ее к ПС, конечно) без распределения этим самым ПС всех плюшек. Действие фишки можно наблюдать в первой главе ХотУ. Когда в начальном диалоге (при заходе чаром малых уровней) выозникает выбор: повысить уровень самому или автомастически. Этот самый автоматический вариант и реализован с помощью LevelUpHenchman.
2. Тонкость конструкции if (condition) { . . . }.
Neverwinter Script Source |
if (1) { return TRUE; } |
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")==1) |
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")) |
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; |
Neverwinter Script Source |
if (nA > 5) { nB = TRUE; } else { nB = FALSE; } |
Neverwinter Script Source |
nB = (nA > 5) ? TRUE : FALSE; |
Neverwinter Script Source |
if (1) { return TRUE; } |
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")==1) |
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")) |
Neverwinter Script Source |
int i = k == 5; |
Neverwinter Script Source |
if (GetLocalInt(oPC, "localInt")) |
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; } |
Простейшая вещь, но может, кому пригодится?
Когда в модуле надо обрабатывать много кастомных свойств объектов, скрипт OnActivateItem разрастается до беспредела. Во избежание этого, в свойстве OnActivateItem пишется (примерно) следующее:
CODE |
void main() { object oItem = GetItemActivated(); string tgItem = GetTag(oItem); object oTarget = GetItemActivatedTarget(); ExecuteScript(tgItem, oTarget); } |
По-моему это лишнее: новые скрипты жрут размер модуля, и, кроме того, в одном скрипте все более компактно, что ли. В официальной кампании есть скрипты и по 5 тысяч строк...
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(); } |
QUOTE (Lemegeton @ Nov 22 2004, 20:14) |
что позволяет вызвать скрипт с именем ТЭГА ПРЕДМЕТА. |
так...не понял про
- 0x0. Это как? (не в смысле что это. это я знаю.)
- "сервер-ваултными" Те в сингле нельзя?
0Х0 - это размер предмета - пришлось создать в файле baseitems.2da новый предмет-контейнер
В сингле использовать эту фишку я особого смысла не вижу, так в нем спокойно можно пользоваться стандартной базой данных
QUOTE |
Я знаю, что 0х0 это размеры вещи. Просто не знал, что движок такие размеры позволяет. Эту вещь нельзя выделить, можно только скриптово обратиться, так? |
Я знаю, что 0х0 это размеры вещи. Просто не знал, что движок такие размеры позволяет. Эту вещь нельзя выделить, можно только скриптово обратиться, так?
Я не хочу БД юзать.
По просьбе 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.ru
ps. на звание пионера не претендую, бо был я там - не понравилось...
Есть путь полегче. "я" можно назвать, например, объект, и вставлять GetName(...). Так было сделано на Сиале, ещё до моего прихода, и это работает. Если же мучить экзешник, это прийдётся делать после каждого патча...
этот "путь полегче" относится к, можно сказать, азам. и он не зависит от версии. да. но это же жутко неудобно! хотя, понятное дело, можно привыкнуть и пальцами ног писать скрипты... насчет обновлений - не проблема: если это кому-нибудь будет нужно, забацаю универсальный патчер.
Хм. Я с этим столкнулся недавно. Вообще как-то русский в скриптах не применял, при любой возможности использую язык оригинала.
QUOTE (dumbo @ Feb 20 2005, 20:04) |
почти все умозаключения далеки от реальности(кроме, пожалуй, дизассемблера) но как катализатор пригодились... -> http://dumbo.nm.ru |
QUOTE (dumbo @ Feb 20 2005, 20:04) |
ps. на звание пионера не претендую, бо был я там - не понравилось... |
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; ... } |
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 ... } |
dumbo
Скажи, а возможно еще все-таки сделать, чтобы в редакторе скриптов было возможно печатать по-русски? Сможешь ли ты такое провернуть?
У меня есть тулсет СоУ 1.32. Дать?
DBColl
ты скачай и посмотри... я это сразу сделал...
dumbo э, что то я не понял! А мне ссылку?
Вот нахимичел в тулсете, и получилось я попробовал поставить вместо DestroyObject, DestroyEffect!
И усё получилось эффект удаляется.
QUOTE (Nokoll @ Feb 21 2005, 23:45) |
Вот нахимичел в тулсете, и получилось я попробовал поставить вместо DestroyObject, DestroyEffect! |
QUOTE (dumbo @ Feb 21 2005, 22:42) |
DBColl ты скачай и посмотри... я это сразу сделал... |
[B]Прошу прошенья за флуд.
Это что, Думбо дизассемблировал nwtoolset.exe, исправил его и теперь можно русскиими буквами писать и "я" исползывать. Обалдеть!
//А вот я купил Си++ для чайников, сейчас вот изучаю, через сколько времени я также смогу?
А чего биовары, этого сами не сделали?! У них ведь вообще все исходники есть?
Кстати, можно мне тоже попрыбывать принести пользу?
Может быть это и так все знают. Скрипты можно легко и не принужденно (почти) писать и компилировать без тулсета. (Тулсет большой, на слабых машинах долго грузится, в общем иногда этот может быть полезно).
Для этого:
1. Качаем Адитор - текстовый редактор такой и устанавливаем его. (http://vlut401.narod.ru/progs/index.html, например, но не уверен что у меня последняя версия)
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]
Соббщения компилятуры пудут перехвачены
мдя - это я видимо, обкурился, малость...
пользуясь случаем, поздравляю всех с праздником!
как и обещал, забацал универсальный http://dumbo.nm.ru
dumbo
РЕСПЕКТИЩЕ ТЕБЕ ОГРОМНЫЙ. Ты не смотри, что мало кто отреагировал. Просто еще никто нифига не понял вокруг, ЧТО произошло . Так что действительно готовься ловить респекты .
Хм, вот дела Де ж ты раньше был? РЕСПЕКТ. Однозначно.
ОФИГЕННО!!! ГДЕ ЖЕ ТЫ БЫЛ 2 ГОДА НАЗАД? РЕСПЕКТ!!!
QUOTE (dumbo @ Feb 23 2005, 09:48) |
как и обещал, забацал универсальный патчер. устраняет попытки дискриминации по отношению к русским скриптерам |
QUOTE (DBColl @ Feb 23 2005, 14:17) |
dumbo РЕСПЕКТИЩЕ ТЕБЕ ОГРОМНЫЙ. Ты не смотри, что мало кто отреагировал. Просто еще никто нифига не понял вокруг, ЧТО произошло . Так что действительно готовься ловить респекты |
dumbo: Вот это да! Это и есть ВКЛАД в развитие! (Респект +1)
QUOTE |
Просто еще никто нифига не понял вокруг, ЧТО произошло . Так что действительно готовься ловить респекты. |
Круто! Правда у меня сомнения по поводу возможных багов и использования модов в следующих версиях тулсета, но сделана действительно нужная вещь
DBColl ХМ, а у меня 1.32... На вашем 1.64 пойдут мои модули?
dumbo Молодец!! Скачал я патч... Попробую... Это ж действительно переворот! Никаких тебе больше ненужных точек с тегами "YA" и проч...!!!
Присоединяюсь. Респект
А вы знаете, что можно запустить скрипт, дав его тег предмету, и когда он окажется в вашем рюкзаке, скрипт сработает. Следовательно не надо писать 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
Все остальные посты по обсуждению этой темы удалены.
http://nwvault.ign.com/View.php?view=other.Detail&id=942. позволяет делать автопатчеры для хаков (хаков/модулей и т.п.)
нет времени на доработку =(
http://nwvault.ign.com/View.php?view=Other.Detail&id=54344&id=942
Очень аккуратно пользуйтесь функцией
Neverwinter Script Source |
void SetCutsceneMode( object oCreature, int nInCutscene = TRUE ); |
Несложный но интересный способ установления камеры, без констант.
Задаём переменную.
[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.php?showtopic=2162
можно все ресурсы в хак и сейвы соот. тоже содержать изменения будут.
Я мучался чтолько лет не зная, что РС в режиме катсцене может просто ходить пешком, раньше я налаживал эффект замедления. Оказалось при команде
Сегодня заметил, что:
У PC появилась собственная шкурка. Раньше ее требовалось создавать в инвентаре и одевать на персонажа, теперь же она есть и носит гордое название "PC Properties".
А выяснилось это вот каким образом. Создал шкурку, решил ее нацепить на персонажа. Запускаю, одеваю шкурку и в логе читаю "Item swaped out". Открываю инвентарь, лежит "шкурка" игрока.
Ну, решили что хватит через зад использовать шкуры животных, вдруг гринписовцы заявят на разрабов и сделали шкуру для РС
Шкурка эта создана с единственной целью - чтобы чары, сделанные до 1.69, могли ездить на лошадях. Мерзавцы-биовари запихали её в спеллхук, так что не удивляйтесь, что она в инвентарь при касте спеллов падает Причём она создаётся до 30 раз при касте любого спелла
Может я ошибаюсь конечно, но помоему скриптом можно шкурку повесить и на место "укуса"??
Да можно хоть саму шкурку изменить в 2да, чтобы налезала, только надо учесть, что итемы в этим слотах используются в качестве природного оружия существа. Сам никогда не пробовал этим заниматься, надо тестить
Народ, никто не подбросит идею, как сделать расписание по часам для мобов? Я знаю, что эта тема уже поднималась, но найти не смог...
http://nwnmod.narod.ru/stat_anim_npc2.htm
вместо рандомного выбора ActionSet будет функция, которая на основе времени и каких-либо еще параметров будет этот ActionSet выбирать. Собсна эта функция и будет расписанием.
совет: Если все действия выполняет на 1 локации - проблем нет. Если же нужно чтобы ночью ходил домой и тд - советую не заморачиваться с "честным" движением домой, ибо в последних версиях НВН этот механизм переработали и он стал какой-то кривой. Лучше этот эффект эмулировать, телепортируя домой нужных НПС, когда игрока нет на карте. Если игрок в этот момент дома у НПС, можно НПС кидать к двери, имитируя приход. Если же игрок в другом месте - смело кидай НПС куда нужно.
Спасибо!=)
Забавная вещь, при использовании действия ActionMoveToObject, если персонаж начинает движение без присутствия игрока на локации, он не ищет путь от точки а к точке б, а идет... Оо... напролом. Потом застревает, судя по логам и минусовой координате по оси высоты в его векторе, к примеру, в тайле с деревом. Сначала хотел использовать проверку, есть ли игрок на локации, потом телепортировать NPC, вместо того, чтобы его двигать. Но потом решил просто модифицировать скрипт WalkToWaypoint. Не буду его выкладывать, по скольку модифицирован он для моих нужд
Так будет полезно знать, что если вы захотите, чтобы внезапно какой нить нписюшник, далеко от игрока, захотел сходить за пивом, нужно либо немножко поломать голову, либо сделать так, чтобы на его пути не было препятствий)
А ActionForceMoveToObject не спасает?
Зачем что-то делать без игрока на локации? В этой ситуации все скрипты должны останавливаться, иначе это напрасная трата ресурсов и, при расширении модуля, кандидат на лаги. Либо запоминать позицию, либо сразу телепортировать, но без игрока аи должен быть выключен, ибо десяток таких "живых" локаций - и привет тормозам.
Вирусман говорит что вырубается аи в локах, где нет игрока.
А, кстати, нпс и вправду плохо ищут путь, если в пределах экрана нет игрока, грубо говоря игрок на них не смотрит)
Мне кажется тут происходит глюк с тайлсетовской walkmesh и pwk у плэйсов, по идеи они должны накладыватсья и общитываться, где не проходимые, а на самом деле часто очень глючат.
Поясняя мысль greye, могу добавить, что для этого достаточно скорость умножить на время.
Об этом тоже думал. А если координата попадет на, например, воду? Или нписюшник в доме застрянет?
Ну не, рандомно - это не наш метод)
В общем, вычисляю путь виртуально, если падает под землю - смещаю на соседний тайл и вытаскиваю. Сойдет -___-
Если падает при респауне*
Если хочется так уж подробно смоделировать. В каждом доступном тайле на пути поставить по вейпоинту, пронумеровав их по порядку и примерно соблюдая дистанцию. Засечь, сколько времени нпс идёт между точками. Посчитать, сколько в локации не было игрока и при его заходе высчитать, сколько тайлов прошёл нпс и, стало быть, куда его кидать.
У одного меня так работает или это известная фича? Нет ли в ней известных багов?
Для некоторых видов кравта использую "врЕменные" айтемы, созданные копиобджектом на инвалид локейшен, а затем этим же скриптом дестроятся. И не нужно придумывать каких-нибудь невидимых, недоступнтых или расположенных в скрытых областях контейнеров.
Ну работает, значит работает Просто лично мне не приходила в голову идея крафта, где надо применять временные итемы. Только при смене внешнего вида доспеха, но там для наглядности его всё равно надо было на персонаже держать, невидимых контейнеров а-ля фоллаут не было.
Может быть, знакомая многим, но все же
string stext = "Я упала с самосвала\n";
+stext = "Тормозила\n";
+stext = "Головой\n";
Выглядеть будет визуально в чате или в описание вещи так:
Я упала с самосвала
Тормозила
Головой
т.е. \n - это перенос строки типа Enter при печати в блокноте
мне долго была не известна эта фишка =)
А еще помойму в нвнСкрипт есть регулярные выражения но я правда, как не старался в этом не разобрался - и забил.
Это стандартный символ переноса строки. У меня в нвн он кстати не работал, по крайней мере в районе патча этак 1.64.
Ну как бы даже профессионалы в области лингвистики ещё не изобрели бота, которого человек в разговоре воспринимал бы как настоящего человека. Была однажды статья на хабре, что некие студенты спутали некого супербота с человеком, но, во-первых, то были программеры, а подобные задроты и переписываются по алгоритмам, сами напоминая ботов, а во-вторых, случай был единичный и стабильного повторения не вызвал (т.е. эксперимент провален).
Варианты создания более менее свободных диалогов в играх тоже как-то не увенчались успехом. Наверно потому, что работают такие системы на базах данных, содержащих тысячи слов и бессчётное множество вариантов их применения, и такая бд будет больше самой игры имхо По крайней мере в плане трудозатрат точно. К тому же, такую игру уже не локализуешь, отдельный язык - отдельная полноценная база. Максимум, что видел - это возможность ввести слово-два в заранее заготовленных диалогах (вроде в фоллауте было) и слова-теги, которые добавляются в базу знаний персонажа и на которые у неписей есть реплики (система диалогов морровинда).
Самое амбициозное на эту тему, что я слышал в кругах нвн, - парсер чата, автоматически определяющий отыгрыш и выдающий за каждую "ролевую" фразу опыт. Какое счастье, что это не реализовали, когда я играл.
Вообще еще подобная система (гибридная по сравнению с мором (хотя и там втречались варианты диалогов)) была в Wizardry 8
По-моему она просто считала отношение времени проведенного персонажем в игре к режиму боя.
Галка Left Lootable Corpse очень странно влияет на набор опций SetIsDestroyble(). Изначально у непися срабатывают выставленные опции, но стоит загрузить сейв модуля (!), и все декоративно-умершие NPC превращаются в ограбляемые трупы. Причем у меня еще и перестали работать скрипты оживления этих декоративно-умерших. Целый час времени убил, пока нашел проблему =/
Доброго времени суток, подскажите пожалуйста, очень нужна помощь по вопросу.
При играх на шардах при отмене превращения формы или сразу переход из одной формы в другую (класс оборотень) появляется микролаг (вся игра фризится). Длительностью от 0.5 до 2 сек. Можете пожалуйста сказать, с чем это может быть связано? Записал видео даже - https://youtu.be/XHa12SvMI4U.
Почему я думаю, что дело в скриптах, потому что на одном из шардов такое не наблюдается вообще (на всех остальных всегда есть микролаг, в одиночной, разумеется лага нету). Вне зависимоти от пинга. Есть доступ к модулю, но не знаю куда копать. Помогите плиз, куда копать.
Это не совсем скрипты, скрипты на сервере, а это клиент виснет. Графический лаг на смене формы - это недозагруженные анимации как правило, но лагать должно всего один раз для каждой новой формы. Должно по крайней мере, кажется кони не у всех работали гладко, а там тот же полиморф.
Если есть возможность сравнить модули, то надо смотреть:
- скрипт входа игрока (лошади из 1.69 там как раз делают прелоад анимации) - он в свойствах модуля
- скрипт полиморфа (его придётся поискать в ресурсах, он скорее всего шаблона x1_s?_*, x1 - первый аддон, шифтер вроде оттуда, s0/s1/s2 - спеллы и абилки)
- хаки, может там кастомные модели или кастомные анимации
Большое спасибо, что ответили. Шард без хаков. Теперь понятно. На том шарде где раньше играл, там лошадей не было. А на этом есть. Получается прикол в них. А можно как-нибудь обмануть систему эту?
Чтобы на шарде не лагало (доступа к модулю нет, где лошади работают), т.е. что-нибудь сделать с клиентом, с анимациями? Получается, если логически думать, если лагает, то анимация с сервера каждый раз грузится? И клиент не при чём? Подскажите пожалуйста, есть ли какие-нибудь идеи, что можно сделать с клиентом?
На том шарде, где нет лошадей, от них админы отказывались, говорили, что много проблем с ними. Теперь ясно. Благодарю за помощь.
Хм... Сайт иногда перестаёт грузиться, мог ответить на пару дней раньше.
Загрузка имеется в виду в память с диска, а не с сервера. Там с лошадьми хак простой - на входе (пока ещё не отрисовалась первая локация) скрипт быстро ставит вид лошади, а потом обычный. С полиморфом такой фокус вряд ли сработает, т.к. все формы перебрать мне не представляется возможным. Да и лагать должно только один раз на форму даже без дозагрузки, а не постоянно.
Рекомендую опросить других игроков, мб проблема чисто на клиенте. Насколько я помню, лошади у некоторых всё равно лагали, от компа зависит. Нвн вообще сильно от железа зависим. А ещё раньше была беда с вылетами при атаке из невидимости, и тоже проблема была в анимации, лечилось заменой на старую, до 2-го аддона.
Интересно, что админ шарда не смог вообще никак воспроизвести мою проблему и закрыл тикет, заявиви что это не баг нвн. При чем у него на лаптопе древней чем мой комп (п4) идёт вообще без лагов. У него лицензия на нвн. Получается проблема не в железе, и не в скриптах нвн или анимациях. Но, почему эе тогда когда рядом со мной лошадь, то лага вообще нет. Упоротый админ. Я ему всё расписал, а он всё равно говорит, что не при делах.
К сожалению, это реально, в нвн - в особенности. Я играл с 2004-го на куче железа и с кучей людей, проблемы были постоянно, и проблемы часто разные у разных людей.
- Было время, когда у части владельцев карт нвидиа вместо меню был чёрный экран.
- До сих пор у некоторых (вообще непонятны критерии) игра падает при атаке персонажа из инвиза.
- До сих пор у меня на ноуте игра не запускается с первого раза.
- До сих пор у некоторых (снова нет локализации бага) игра падает, если на входе в локацию есть вода. А если тут ещё и автосейв кампании - вообще швах. Половина комментов стима к версии ЕЕ этим завалена.
- Всё известное мне время игра у 99% лагала при включении звука Rad 3d. И все 7 лет официальной поддержки никто не почесался.
И таких фишек навалом, просто вам не повезло иметь комбинацию железа и софта, от которых полиморф лагает. В случае с нвн, кстати, старый комп лучше нового - какой-нить п3-п4 + жефорс4 + вин хр.
Честно говоря, биовари так себе программисты. Оптимизаций нет, юникода нет (даже в более новых играх его не было), вечные проблемы с новым железом. Это не только в нвн, и котор стал падать прямо с вин7 (но фанаты запатчили), и первый ведьмак (движок нвн1) на вин10 стал глючить. ДЭ2 до первого патча у половины игроков не сохранялся, а Инквизиция вообще выдавала чёрный экран, в первый день были тысячи возвратов (я лично возвращал деньги, т.к. был в числе неудачников). А что творилось на релизе Андромеды... Это словами не передать, я на пс4 начал играть после месяца патчей, и то нарывался на баги.
Причина-то понятна. Не понятно, почему у некоторых падает, у некоторых - нет. По моим старым наблюдениям это даже не было связано с производителем видеокарты - (не) падало и у нвидиа, и у ати/амд.
По-моему тогда проще играть другим классом где нет шифтинга форм. Интересно также посмотреть будет ли этот баг если превратиться в кого-нибудь с пмощью заклинания 9 круга.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)