![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#561
|
|
Level 5 ![]() Класс: Клерик Характер: Lawful Good Раса: Человек NWN: Контент ![]() |
А если добавить нужные строки в стандартный диалог.тлк и давать его игроку вместе с хаками будет результат? так значит речь про создание чара до захода в первую локацию? тогда только стандартный править, или тщательно подбирать строки из него (IMG:style_emoticons/kolobok_light/crazy.gif) |
![]()
Сообщение
#562
|
|
Level 3 ![]() Класс: Монах Характер: Lawful Neutral Раса: Человек ![]() |
можно ли редактировать фиты? (бонусы, которые они дают)
если да, то где? в feat.2da и cls_feat.2da ничего такого нет (нету самих характеристик фита) |
![]()
Сообщение
#563
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Фиты вшиты в движок. Для изменения делаются новые, а бонусы даются посредством разных скриптовых костылей.
|
![]()
Сообщение
#564
|
|
Level 3 ![]() Класс: Монах Характер: Lawful Neutral Раса: Человек ![]() |
к примеру есть фита:
FEAT_SPELL_POWER фита красного волшебника из второй части, увеличивающая nCasterLevel мага на 1,2,3,4,5 за каждые 2 лвла. (+5 на 10ом лвле красного волшебника) Какого типа должен быть скрипт, чтобы создать что то наподобие этого. Интересует реализации nCasterLevel как левельной структуры, чтобы кастерлвл(другими словами, число влияющее на дамаг кастера) рос с левельностью. Хотелось бы просто копию этого фита, только своими числами немного (IMG:style_emoticons/kolobok_light/rolleyes.gif) |
![]()
Сообщение
#565
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
1.Обычно делается инклюд, с необходимой функцией, который потом подрубается к необходимому скрипту
Тебе придется добавить инклюд и изменение в каждый скрипт спелла, в котором будет это использоваться 2. Может быть, можно сделать как-то через NWNX написав свой плагин. Сообщение отредактировал Laajin - Aug 28 2011, 18:43 |
![]()
Сообщение
#566
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата 1.Обычно делается инклюд, с необходимой функцией, который потом подрубается к необходимому скрипту Тебе придется добавить инклюд и изменение в каждый скрипт спелла, в котором будет это использоваться К каждому скрипту? Это же до старости ковыряться можно. Есть же спеллхук. |
![]()
Сообщение
#567
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Только спеллхук проблему не решает - как минимум нужна кастомная функция расчета кастерлевела, которую нужно пихнуть в скрипт каждого заклинания. А ещё есть скрипты на АОЕ, с которыми тоже нужно возиться. Собственно, таким образом в текущем модуле Гема сделана заплатка на кастерлевел ПМа.
|
![]()
Сообщение
#568
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Ilerien, если мне память не изменяет, спеллы в основном считают кастер левел по HD от OBJECT_SELF - зависят от него, во всяком случае. Не пробовали перехватывать спелл и вызывать его от имени невидимого NPC-заглушки с нужными бонусами? Просто менять каждый спелл вручную это как-то... слишком.
UPD: вспомнил про GetCasterLevel(), но принцип тот же. Цитата А ещё есть скрипты на АОЕ, с которыми тоже нужно возиться. А там какие тонкости? Сообщение отредактировал Talarasha - Aug 28 2011, 21:24 |
![]()
Сообщение
#569
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Проблема в том, что скрипт заклинания неявно принимает на вход не только собственно уровень заклинателя (а не хитдайс, к слову), но ещё и кучу других параметров, таких, как класс сложности, метамагия, наличие у кастера всяческих спелл пенетрейшенов и т. д.
На самом деле, правка делается несложно - простенькой программой, которая в каждом файле заменяет вхождения функции GetCasterLevel() на вхождения кастомной и добавляет директиву #include, если нужно. В новом модуле я писал кастомное спелловое ядро, где в спеллхуке определяются все параметры заклинания и вешаются локалкой на кастера, откуда их читает скрипт заклинания кастомными функциями-заменителями. |
![]()
Сообщение
#570
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата Проблема в том, что скрипт заклинания неявно принимает на вход не только собственно уровень заклинателя (а не хитдайс, к слову), но ещё и кучу других параметров, таких, как класс сложности, метамагия, наличие у кастера всяческих спелл пенетрейшенов и т. д. Хитдайс тоже берется, просто не везде. Я же не с потолка про него вспомнил, а открыв наугад спелл. (IMG:style_emoticons/kolobok_light/rolleyes.gif) А все эти параметры также можно в спеллхуке проверить и добавить заглушке через ItemProperty, какие проблемы? |
![]()
Сообщение
#571
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата А там какие тонкости? Если в скрипте мгновенного действия, скажем, для поднятия кастерлевела ПМу по 3.5 достаточно заменить функцию на такую:Neverwinter Script int FR_GetCasterLevel(object oCreature) { int nPMLevel = GetLevelByClass(CLASS_TYPE_PALE_MASTER, oCreature); int nCL = GetCasterLevel(oCreature); int nCasterClass = GetLastSpellCastClass(); if( !GetIsObjectValid(GetSpellCastItem()) && nPMLevel > 1 && (nCasterClass == CLASS_TYPE_WIZARD || nCasterClass == CLASS_TYPE_SORCERER || nCasterClass == CLASS_TYPE_BARD) ) nCL += nPMLevel - 1; return nCL; } , то в скриптах на АОЕ этот код будет работать правильно только до тех пор, пока валиден объект-кастер, создавший эту АОЕ. Решается установкой на АОЕ локалки при создании. Цитата Хитдайс тоже берется, просто не везде. Я же не с потолка про него вспомнил, а открыв наугад спелл. Хитдайс кастера? Возможно, я с ходу не могу назвать ни одного дефолтного заклинания, в котором он используется. (IMG:style_emoticons/kolobok_light/sad.gif) Впрочем, не суть, у меня в кастомных заклинаниях кое-где и другие параметры кастера используются, вроде элайнмента.Цитата А все эти параметры также можно в спеллхуке проверить и добавить заглушке через ItemProperty, какие проблемы? Хм, как именно? И как в таком случае предлагается вообще скрипт перехватывать? Если запускать его от имени другого объекта через ExecuteScript(), функции, которые определяют параметры заклинания, вернут всякую чушь. Если через ActionCastSpellAt*(), подставной непись должен быть как минимум в той же локе, что и кастер, и предвижу проблему с летящими из ниоткуда фаерболами.
|
![]()
Сообщение
#572
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата Хм, как именно? И как в таком случае предлагается вообще скрипт перехватывать? 1)Игрок кастует спелл, спеллхук перехватывает. 2)Скрипт делает проверку кастер-левела, ДЦ, фитов и всего такого прочего. 3)Создаем невидимую НПС-заглушку из шаблона по координатам того же PC со шкуркой, в которую записываем проверенные данные через итем-проперти. 4)В случае, если у игрока бонус к кастер левелу, добавляем левелов заглушке. 5)Вызываем спелл через ActionCastSpellAt* от имени созданной заглушки (с ExecuteScript() я не смог сходу придумать, как получать имя скрипта спелла) 6)Убиваем заглушку. |
![]()
Сообщение
#573
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата 2)Скрипт делает проверку кастер-левела, ДЦ, фитов и всего такого прочего. Допустим, добавить на шкурку фиты можно, если их предварительно прописать в iprp_feats.2da. А как добавлять уровней подставному неписю?3)Создаем невидимую НПС-заглушку из шаблона по координатам того же PC со шкуркой, в которую записываем проверенные данные через итем-проперти.4)В случае, если у игрока бонус к кастер левелу, добавляем левелов заглушке. В любом случае, это а) куча неписей разного уровня и разных классов в палитре; б) создание/удаление объекта-непися при касте каждого спелла игроком, что плохо с точки зрения производительности. Всякие projectile-заклинания вроде фаерболов будут визуально летать от кастера дважды. Соответственно, в 2 раза увеличится время достижения цели. Цитата с ExecuteScript() я не смог сходу придумать, как получать имя скрипта спелла Neverwinter Script Get2DAString("spells", "impactscript", GetSpellId())
Сообщение отредактировал Ilerien - Aug 28 2011, 22:28 |
![]()
Сообщение
#574
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата А как добавлять уровней подставному неписю? Хенчам в XP2 же как-то добавляли. Цитата В любом случае, это а) куча неписей разного уровня и разных классов в палитре; Это еще почему? Мы создаем заглушку по шаблону, а фиты и левелы ей даем динамически скриптом. В палитре будет один-единственный объект (крич). Цитата б) создание/удаление объекта-непися при касте каждого спелла игроком, что плохо с точки зрения производительности. Это будет зависеть от того, как способ будет действовать на практике. Производительность дело такое, вполне может быть так, что никакого заметного снижения не будет. За Get2DAString спасибо. Цитата Всякие projectile-заклинания вроде фаерболов будут визуально летать от кастера дважды. Тогда ExecuteScript() от имени заглушки. Сообщение отредактировал Talarasha - Aug 28 2011, 22:32 |
![]()
Сообщение
#575
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата Хенчам в XP2 же как-то добавляли. Там есть функция LevelUpHenchman, которая не обладает достаточной гибкостью - непись апается согласно прописанному пакаджу, а это означает, что придётся ещё и свой пакадж для каждого кастерского класса делать. И опять же - производительность, кроме создания/удаления имеем энное число левелапов.Цитата Тогда ExecuteScript() от имени заглушки. И возвращающие параметры заклинания функции скорее всего вернут чушь.Использование другого объекта в качестве кастера порождает кучу подводных камней. Например, заклинания Dominate Person/Monster/Animal внезапно будут добавлять контролируемое существо во фракцию подставного объекта, всякие вызывающие существ заклинания - тоже. Как себя поведет ResistSpell() - непонятно. Я уже не говорю о том, что придётся переписывать функцию, которая определяет, действует ли заклинание на конкретный объект (всякие там no-pvp локации). |
![]()
Сообщение
#576
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата Там есть функция LevelUpHenchman, которая не обладает достаточной гибкостью - непись апается согласно прописанному пакаджу, а это означает, что придётся ещё и свой пакадж для каждого кастерского класса делать. Зачем? Нас интересует только кастер левел, а он будет подниматься независимо от пакаджа. Подойдет любой из стандартных, на крайняк - отдельный пустой. Цитата И возвращающие параметры заклинания функции скорее всего вернут чушь. В чем принципиальное отличие ExecuteScript() от кастования спелла через экшн в этом случае? Обе функции вызывают скрипт от имени того объекта, который им указан. Скрипт, вызванный через ES и будет использовать в качестве OBJECT_SELF то, что ему передадут - заглушку, в данном случае, в которую все параметры мы записали. Возвращающие параметры функции вернут то, что надо. Цитата Например, заклинания Dominate Person/Monster/Animal внезапно будут добавлять контролируемое существо во фракцию подставного объекта, всякие вызывающие существ заклинания - тоже. Можно будет проверить после вызова заклинания и перенести, куда нужно. Подводные камни есть, конечно, их все надо будет прорабатывать на этапе разработки. Я говорю к тому, что использованию спеллхука нет принципиальных препятствий и если проблему предстоит решать с нуля, то лучше все-таки прикинуть и посмотреть, что будет в конкретном случае целесообразнее - делать чисто скриптовое решение или вносить изменения в файл каждого заклинания, не забывая также обновлять любой новый. Посмотреть, проверить, как это все будет работать, будут ли потери производительности в сингле/на шарде, какие. И решить. Сообщение отредактировал Talarasha - Aug 28 2011, 23:07 |
![]()
Сообщение
#577
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
Анимация заклинания происходит до взаимодействия со спелхуком и вообще скриптом спелла.
Любое изменение уже смотрится коряво, даже при использовании спелхука для компонентной магии, но люди идут на это, как на малое зло) |
![]()
Сообщение
#578
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата Анимация заклинания происходит до взаимодействия со спелхуком и вообще скриптом спелла. Это к чему? Спеллхук и не будет влиять на анимацию, если он вызывается через ExecuteScript(). Если строка была по поводу слов Ilerien'а, то он имел ввиду повторный вызов заклинания через экшн, тогда анимация действительно проигрывалась бы дважды. |
![]()
Сообщение
#579
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
Цитата 1)Игрок кастует спелл, спеллхук перехватывает. Это все произойдет после анимации заклинания (огненный шар, например, сначала пролетит в точку куда направлен, с другими так же) |
![]()
Сообщение
#580
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Хм. И что?
|
![]()
Сообщение
#581
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
Кривожопновыглядит, особенно если после этого будет еще одна анимация со стороны "НПС заглушки".
Через NWNX надо писать свой плагин на С иначе только через костыль со скриптами Сообщение отредактировал Laajin - Aug 28 2011, 23:35 |
![]()
Сообщение
#582
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
В чем кривожопность-то? Со стороны НПС заглушки еще одной анимации не будет.
|
![]()
Сообщение
#583
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата Зачем? Нас интересует только кастер левел, а он будет подниматься независимо от пакаджа. Подойдет любой из стандартных, на крайняк - отдельный пустой. Например, непись может взять тот же спелл пенетрейшн по стандартному пакаджу, так что как минимум отдельный пустой пакадж нужен.Цитата В чем принципиальное отличие ExecuteScript() от кастования спелла через экшн в этом случае? В том, что запущенный через ExecuteScript на другом объекте - это уже не скрипт заклинания, поскольку параметры живут в соответствующих полях структуры кастующего существа. Со всеми вытекающими последствиями вроде идентификатора заклинания -1 и невалидными результатами использования остальных функций, работающих непосредственно с параметрами заклинания - GetCasterLevel(), GetSpellSaveDC(), GetMetamagicFeat(), ResistSpell(), etc. И да, метамагию, скорее всего, перебросить не выйдет никак, даже через ActionCastSpellAt*().Цитата Можно будет проверить после вызова заклинания и перенести, куда нужно. Это был придуманный с ходу пример. Скорее всего, есть и другие эффекты, которые в этом случае отработают криво. И изрядной частью спеллхука станет огромный свич по идентификатору заклинания, который нарушает саму концепцию архитектуры системы спеллхук-заклинание (IMG:style_emoticons/kolobok_light/smile.gif) Цитата Подводные камни есть, конечно, их все надо будет прорабатывать на этапе разработки. Я говорю к тому, что использованию спеллхука нет принципиальных препятствий и если проблему предстоит решать с нуля, то лучше все-таки прикинуть и посмотреть, что будет в конкретном случае целесообразнее - делать чисто скриптовое решение или вносить изменения в файл каждого заклинания, не забывая также обновлять любой новый. Я пытаюсь сказать, что переписывание функции GetCasterLevel(), особенно с учётом того, что замена функции в скриптах заклинаний хорошо автоматизируется - куда меньшее зло, чем затыкание кучи дыр, образованных перекидыванием скрипта заклинания на другой объект.
Сообщение отредактировал Ilerien - Aug 28 2011, 23:47 |
![]()
Сообщение
#584
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
Задумка понятна: ты хочешь через левого НПС просто запускать скрипт, уже после анимации.
Куча всяких есть НО: -абилки требуется разные для разных классов -всякие фишки типа фитов спеллпенетратион -и еще куча всякой фигни -ты задолбишься делать НПС чаров заглушек на все случаи (кажется Ilerien уже все это объяснил =_=) Кроме того предвижу тормоза, во время боя и интересную реакцию мобов на НПС заглушку. Легче как мне кажется скрипты отредактировать, их всего там около 50...мне один раз пришлось переименовывать 1200 файлов NWNX вот, кстати, не знаю есть ли там перехват каста спелла (эвент), но через это было бы реально много чего сделать. Сообщение отредактировал Laajin - Aug 28 2011, 23:51 |
![]()
Сообщение
#585
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата ты задолбишься делать НПС чаров заглушек на все случаи (кажется Ilerien уже все это объяснил =_=) Кажется, ты невнимательно прочитал мои сообщения. Я уже говорил, что шаблон в палитре требуется один единственный. В предыдущих постах написано, как именно это реализовывается вместе со всеми бонусными фитами. Цитата Кроме того представь предвижу тормоза, во время боя и интересную реакцию мобов на НПС заглушку. Чтобы говорить о тормозах - надо посмотреть работу на практике. Теоретически даже запись локалки может тормоза вызвать. На практике, однако ж, так не происходит. Цитата Легче как мне кажется скрипты отредактировать, их всего там около 50... Хм. Откуда цифра? Так-то по скрипту на спелл, а их несколько сотен. Ilerien Цитата Это был придуманный с ходу пример. И придуманное с ходу решение. Наверняка и на другие найдется. Цитата В том, что запущенный через ExecuteScript на другом объекте - это уже не скрипт заклинания, поскольку параметры живут в соответствующих полях структуры кастующего существа. Понял, о чем ты. ActionCastSpell + ClearAllActions на заглушке должны с этим разобраться. Цитата Я пытаюсь сказать, что переписывание функции GetCasterLevel(), особенно с учётом того, что замена функции в скриптах заклинаний хорошо автоматизируется - куда меньшее зло, чем затыкание кучи дыр, образованных перекидыванием скрипта заклинания на другой объект. Может быть - я, когда говорил про спеллхук, не учитывал автоматическую прогонку файлов. Меня-то конкретно в таком способе неустраивает негибкость - ворох скриптов, которые надо таскать с собой, необходимость подправлять любые добавляемые/нестандартные скрипты, несовместимость с авторскими реализациями заклинаний в пользовательских модулях и так далее. От приоритетов зависит. Сообщение отредактировал Talarasha - Aug 29 2011, 00:01 |
![]() ![]() |
Текстовая версия | Сейчас: 24th July 2025 - 04:16 |