![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3326
|
|
Level 11 ![]() ![]() ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея ![]() |
хакпаки или оверрайд, если не хочется менять именно скрипты в модуле
Цитата И в догонку. Можно ли скриптом поправить пенальти к экспе за большую команду? В оригинальной кампании нвн2 размер партии не влияет на количество получаемого опыта, в нвн1 же каждый хенч, саммон и фамильяр откушивает изрядный кусок. А при большой партии вообще достаются крохи. Это как то настраивается? В оригинале используется стандартная система опыта по днд 3.0, но с пониженным процентом, она редактируется через свойства модуля в тулсете. Если хочется вносить разные штуки - нужно писать свою систему опыта и запускать ее на смерть моба, но для этого придется менять скрипты и как-то их подгружать одним из способов выше, если нет желания менять именно скрипты модуля. |
![]()
Сообщение
#3327
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
хакпаки или оверрайд, если не хочется менять именно скрипты в модуле Так в том и вопрос, как это сделать не меняя сам модуль модуль. Хакпаки нужно натягивать в модуль через тулсет, а оверрайд вообще перекрывает только Core скрипты, не скрипты модуля. Получается, собственно, что кроме как редактированием модуля кампании никак не обойтись. Обидно, потому что правок мало - только сохранение хенчей в базу данных компании при завершении чаптера и восстановление при начале нового. Бегаю с модом Henchman Inventory and Battle AI Mod, обвешивать хенчей хабаром приходится самому, потому терять его между чаптерами совсем не радует. Сам скрипт, отвечающий за наем нескольких хенчей, относится к Core и оверрайдится без проблем. А вот скрипты начала/конца чаптеров, разумеется, оверрайдить не выходит. Цитата В оригинале используется стандартная система опыта по днд 3.0, но с пониженным процентом, она редактируется через свойства модуля в тулсете. Если хочется вносить разные штуки - нужно писать свою систему опыта и запускать ее на смерть моба, но для этого придется менять скрипты и как-то их подгружать одним из способов выше, если нет желания менять именно скрипты модуля. Да, так и сделал, повесил на смерть моба, только не свою систему опыта а пересчет Experience point scale (SetModuleXPScale) в зависимости от размера партии. Т.е. при размере группы 1 он равен 10, как и в дефолтной кампании, и увеличивается на 2 с каждым новым членом группы, включая саммонов. Не совсем точная замена, но разница там пренебрежительна. Поскольку евент генерится до того как фактически начисляется экспа - всегда имею достаточно скомпенсированное значение. К сожалению, способ не самый изящный, надеялся что этот функционал просто можно отключить в настройках модуля, как в NWN2. К счастью, по крайней мере скрипт, висящий на этом евенте, оверрайдится без проблем. |
![]()
Сообщение
#3328
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Приоритет овера наивысший. Либо это баг, либо какая-то непонятная фича. Я синглом никогда не занимался, не знаю.
Цитата Не совсем точная замена, но разница там пренебрежительна. Экспа менялась от патча к патчу ещё. Оригинальную кампанию можно было закончить от ~15 до 20-го уровня, смотря на каком патче проходить.
|
![]()
Сообщение
#3329
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Приоритет овера наивысший. Либо это баг, либо какая-то непонятная фича. Я синглом никогда не занимался, не знаю. Экспа менялась от патча к патчу ещё. Оригинальную кампанию можно было закончить от ~15 до 20-го уровня, смотря на каком патче проходить. Это не TES, оверрайд папка не имеет наивысшего приоритета, модульные скрипты перекрывают. Мнения патчей я менять не собираюсь, всего лишь хочу вернуть нормально начисление экспы на одного перса. |
![]()
Сообщение
#3330
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Ага, посмотрел вики, овер действительно в приоритете на 3-м месте из 4. Забавно, но я отчётливо помню, как через него в своё время менял шардовые ресурсы (IMG:style_emoticons/kolobok_light/smile.gif) Тогда да, вариант всего один - правка модулей.
|
![]()
Сообщение
#3331
|
|
Level 11 ![]() ![]() ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея ![]() |
там какая-то кривая схема что-то типа того
хакпак -> оверрайд (частично) -> модуль -> биф но при некоторых моментах оверрайд становится на первое место Сообщение отредактировал Melisse - Dec 22 2017, 11:26 |
![]()
Сообщение
#3332
|
|
Level 1 Класс: Волшебник Характер: Lawful Evil Раса: Человек ![]() |
Добрый день.. в полку новичков прибыло)
Попробовал переписать заклинание и при тестах столкнулся с парой проблем решить которые не получается, уверен что где то допустил банальные ошибки. Проблема в том что эффект Weird() срабатывет одновременно рандомное кол-во раз в одну и ту же цель. Т.е. появляется от 1го до 5-6 духов и на цель накладывается соответствующее кол-во эффектов. Собственно вот скрипт OnHeartbeat Код #include "NW_I0_SPELLS"
#include "x0_i0_spells" #include "x2_inc_spellhook" #include "x0_i0_position" #include "x0_i0_match" object oTarget; object oCaster = GetAreaOfEffectCreator(); location RandomLocation (object oTarget, float fRadius, int iLine = TRUE) { if (!iLine) fRadius = IntToFloat(Random(FloatToInt(fRadius))); float iXO = VectorMagnitude(GetPosition(oTarget)) * cos(VectorToAngle(GetPosition(oTarget))); float iYO = VectorMagnitude(GetPosition(oTarget)) * sin(VectorToAngle(GetPosition(oTarget))); float fRndomAngle = IntToFloat(Random(360)); location lNewLoc = Location(GetArea(oTarget),Vector(iXO + fRadius * cos(fRndomAngle),iYO + fRadius * sin(fRndomAngle)),360.0); return lNewLoc; } void CreatePhantom() { location lRandom = RandomLocation(oTarget, 8.0, TRUE); object oPhantom = CreateObject(OBJECT_TYPE_CREATURE, "nw_wraith", lRandom, FALSE, ""); ActionDoCommand(TurnToFaceObject(oTarget, oPhantom)); SetImmortal(oPhantom, TRUE); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectEntangle(), oPhantom); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHaste(), oPhantom); DelayCommand(1.0, AssignCommand(oPhantom, ActionCastFakeSpellAtObject(SPELL_PHANTASMAL_KILLER, oTarget, PROJECTILE_PATH_TYPE_DEFAULT))); DestroyObject(oPhantom, 2.0); } void ApplyEffect() { int nAbility = GetCasterAbilityModifier(oCaster); int nSpellFocus; if (GetHasFeat(FEAT_EPIC_SPELL_FOCUS_ILLUSION, oCaster)) { nSpellFocus = 6; } else if (GetHasFeat(FEAT_GREATER_SPELL_FOCUS_ILLUSION, oCaster)) { nSpellFocus = 4; } else if (GetHasFeat(FEAT_SPELL_FOCUS_ILLUSION, oCaster)) { nSpellFocus = 2; } else { nSpellFocus = 0; } int nSpellDC = 19 + nAbility + nSpellFocus; int fSchool; if (GetHasFeat(FEAT_EPIC_SPELL_FOCUS_ILLUSION, oCaster)) { fSchool = 3; } else if (GetHasFeat(FEAT_GREATER_SPELL_FOCUS_ILLUSION, oCaster)) { fSchool = 2; } else if (GetHasFeat(FEAT_SPELL_FOCUS_ILLUSION, oCaster)) { fSchool = 1; } else { fSchool = 1; } int nRounds = d2(fSchool); effect eFrightened = EffectFrightened(); effect eParalyzed = EffectParalyze(); effect ePetrified = EffectPetrify(); effect eVisFrightened = EffectVisualEffect(218); effect eVisParalyzed = EffectVisualEffect(232); effect eVisPetrified = EffectVisualEffect(351); effect elFrightened = EffectLinkEffects(eVisFrightened, eFrightened); effect elParalyzed = EffectLinkEffects(eVisParalyzed, eParalyzed); effect elPetrified = EffectLinkEffects(eVisPetrified, ePetrified); int nRandom = Random(3); if(!MySavingThrow(SAVING_THROW_WILL, oTarget, nSpellDC, SAVING_THROW_TYPE_NONE, oCaster)) { if(nRandom == 0) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, elFrightened, oTarget, RoundsToSeconds(nRounds)); } else if(nRandom == 1) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, elParalyzed, oTarget, RoundsToSeconds(nRounds)); } else { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, elPetrified, oTarget, RoundsToSeconds(nRounds)); } } } void Weird() { CreatePhantom(); DelayCommand(2.5, ApplyEffect()); } void main() { oTarget = GetFirstInPersistentObject(); while(GetIsObjectValid(oTarget)) { if(GetIsPC(oTarget)) { SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_WEIRD)); if(!GetHasSpellEffect(SPELL_WEIRD,oTarget)) { Weird(); } } oTarget = GetNextInPersistentObject(); } } |
![]()
Сообщение
#3333
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
GetFirstInPersistentObject/GetNextInPersistentObject используется для поиска существ внутри триггеров, вряд ли это то, что нужно для заклинания. Ну и чтобы оно точно искало этих существ, все равно функции нужны параметры.
Для спеллов обычно берут GetFirstObjectInShape. |
![]()
Сообщение
#3334
|
|
Level 1 Класс: Волшебник Характер: Lawful Evil Раса: Человек ![]() |
Дело в том что я делал по аналогии со стандартными заклинаниями Боиварей.. к примеру вот это заклинание http://nwn.wikia.com/wiki/Stonehold работает с такими же функциями.
Кроме того.. когда я сделал пару тестов и они меня вообще в тупик загнали. 1. Добавил для проверки еще один эффект ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); и он срабатывает такое же рандомное кол-во раз как и Weird()... но Код void main() { //float fDelay1 = GetRandomDelay(6.0, 12.0); oTarget = GetFirstInPersistentObject(); while(GetIsObjectValid(oTarget)) { if(GetIsPC(oTarget)) { SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_WEIRD)); if(!GetHasSpellEffect(SPELL_WEIRD, oTarget)) { //DelayCommand(fDelay1, Weird()); [b]ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); Weird();[/b] } } oTarget = GetNextInPersistentObject(); } } но если убрать эффект Weird(), то ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); работает как часы.. Код void main() { //float fDelay1 = GetRandomDelay(6.0, 12.0); oTarget = GetFirstInPersistentObject(); while(GetIsObjectValid(oTarget)) { if(GetIsPC(oTarget)) { SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_WEIRD)); if(!GetHasSpellEffect(SPELL_WEIRD, oTarget)) { //DelayCommand(fDelay1, Weird()); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); [b]//Weird();[/b] } } oTarget = GetNextInPersistentObject(); } } Вышло сузить область поиска ошибки.. Использовал все туже функцию ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); для проверки Сама по себе она работает правильно. В паре с void CreatePhantom() обе работают криво, а вот в паре с void ApplyEffect() обе работают отлично. Логично что конфликт где то в функции void CreatePhantom(), но не пойму что в ней может быть не так. Все.. извеняюсь за стену текста, проблема вроде решена, помогла минимальная задержка 0.2 перед функцией CreatePhantom() Код void Weird()
{ DelayCommand(0.2, CreatePhantom()); DelayCommand(2.7, ApplyEffect()); } |
![]()
Сообщение
#3335
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Рекомендую вставить какой-то вывод в лог в цикле и посмотреть, сколько раз этот цикл срабатывает, на ком и почему. Что-то типа вывода GetName(oTarget) через SendMessage.
|
![]()
Сообщение
#3336
|
|
Level 3 ![]() Класс: Клерик Характер: Lawful Good Раса: Дварф ![]() |
Добрый вечер всем любителям нвн
Сообщение отредактировал Desan - Jul 18 2018, 23:48 |
![]() ![]() |
Текстовая версия | Сейчас: 18th February 2019 - 00:09 |