Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
134 страниц V  « < 132 133 134  
Ответить в эту темуОткрыть новую тему
> ОДИНОЧНЫЙ ВОПРОС, на любую тулсетовскую тему
Melisse
сообщение Dec 19 2017, 16:42
Сообщение #3326


Level 11
***

Класс: Волшебник
Характер: Neutral Good
Раса: Фея



хакпаки или оверрайд, если не хочется менять именно скрипты в модуле

Цитата
И в догонку. Можно ли скриптом поправить пенальти к экспе за большую команду? В оригинальной кампании нвн2 размер партии не влияет на количество получаемого опыта, в нвн1 же каждый хенч, саммон и фамильяр откушивает изрядный кусок. А при большой партии вообще достаются крохи. Это как то настраивается?

В оригинале используется стандартная система опыта по днд 3.0, но с пониженным процентом, она редактируется через свойства модуля в тулсете.
Если хочется вносить разные штуки - нужно писать свою систему опыта и запускать ее на смерть моба, но для этого придется менять скрипты и как-то их подгружать одним из способов выше, если нет желания менять именно скрипты модуля.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
lolic99
сообщение Dec 20 2017, 01:51
Сообщение #3327


Level 1


Класс: Обыватель
Характер: Lawful Good
Раса: Человек



Цитата(Melisse @ Dec 19 2017, 16:42) *
хакпаки или оверрайд, если не хочется менять именно скрипты в модуле

Так в том и вопрос, как это сделать не меняя сам модуль модуль. Хакпаки нужно натягивать в модуль через тулсет, а оверрайд вообще перекрывает только Core скрипты, не скрипты модуля.
Получается, собственно, что кроме как редактированием модуля кампании никак не обойтись. Обидно, потому что правок мало - только сохранение хенчей в базу данных компании при завершении чаптера и восстановление при начале нового. Бегаю с модом Henchman Inventory and Battle AI Mod, обвешивать хенчей хабаром приходится самому, потому терять его между чаптерами совсем не радует.
Сам скрипт, отвечающий за наем нескольких хенчей, относится к Core и оверрайдится без проблем. А вот скрипты начала/конца чаптеров, разумеется, оверрайдить не выходит.
Цитата
В оригинале используется стандартная система опыта по днд 3.0, но с пониженным процентом, она редактируется через свойства модуля в тулсете.
Если хочется вносить разные штуки - нужно писать свою систему опыта и запускать ее на смерть моба, но для этого придется менять скрипты и как-то их подгружать одним из способов выше, если нет желания менять именно скрипты модуля.

Да, так и сделал, повесил на смерть моба, только не свою систему опыта а пересчет Experience point scale (SetModuleXPScale) в зависимости от размера партии. Т.е. при размере группы 1 он равен 10, как и в дефолтной кампании, и увеличивается на 2 с каждым новым членом группы, включая саммонов. Не совсем точная замена, но разница там пренебрежительна. Поскольку евент генерится до того как фактически начисляется экспа - всегда имею достаточно скомпенсированное значение.
К сожалению, способ не самый изящный, надеялся что этот функционал просто можно отключить в настройках модуля, как в NWN2.

К счастью, по крайней мере скрипт, висящий на этом евенте, оверрайдится без проблем.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Dec 21 2017, 07:45
Сообщение #3328


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Приоритет овера наивысший. Либо это баг, либо какая-то непонятная фича. Я синглом никогда не занимался, не знаю.
Цитата
Не совсем точная замена, но разница там пренебрежительна.
Экспа менялась от патча к патчу ещё. Оригинальную кампанию можно было закончить от ~15 до 20-го уровня, смотря на каком патче проходить.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
lolic99
сообщение Dec 21 2017, 23:04
Сообщение #3329


Level 1


Класс: Обыватель
Характер: Lawful Good
Раса: Человек



Цитата(denis0k @ Dec 21 2017, 07:45) *
Приоритет овера наивысший. Либо это баг, либо какая-то непонятная фича. Я синглом никогда не занимался, не знаю.
Экспа менялась от патча к патчу ещё. Оригинальную кампанию можно было закончить от ~15 до 20-го уровня, смотря на каком патче проходить.

Это не TES, оверрайд папка не имеет наивысшего приоритета, модульные скрипты перекрывают.
Мнения патчей я менять не собираюсь, всего лишь хочу вернуть нормально начисление экспы на одного перса.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Dec 22 2017, 07:49
Сообщение #3330


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Ага, посмотрел вики, овер действительно в приоритете на 3-м месте из 4. Забавно, но я отчётливо помню, как через него в своё время менял шардовые ресурсы (IMG:style_emoticons/kolobok_light/smile.gif) Тогда да, вариант всего один - правка модулей.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Dec 22 2017, 11:24
Сообщение #3331


Level 11
***

Класс: Волшебник
Характер: Neutral Good
Раса: Фея



там какая-то кривая схема что-то типа того
хакпак -> оверрайд (частично) -> модуль -> биф
но при некоторых моментах оверрайд становится на первое место

Сообщение отредактировал Melisse - Dec 22 2017, 11:26
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
NocturN
сообщение Jul 9 2018, 20:24
Сообщение #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();
            }
    }
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jul 11 2018, 07:42
Сообщение #3333


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



GetFirstInPersistentObject/GetNextInPersistentObject используется для поиска существ внутри триггеров, вряд ли это то, что нужно для заклинания. Ну и чтобы оно точно искало этих существ, все равно функции нужны параметры.

Для спеллов обычно берут GetFirstObjectInShape.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
NocturN
сообщение Jul 11 2018, 10:40
Сообщение #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());
    }
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jul 11 2018, 18:31
Сообщение #3335


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Рекомендую вставить какой-то вывод в лог в цикле и посмотреть, сколько раз этот цикл срабатывает, на ком и почему. Что-то типа вывода GetName(oTarget) через SendMessage.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Desan
сообщение Jul 18 2018, 23:42
Сообщение #3336


Level 3
*

Класс: Клерик
Характер: Lawful Good
Раса: Дварф



Добрый вечер всем любителям нвн

Сообщение отредактировал Desan - Jul 18 2018, 23:48
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

134 страниц V  « < 132 133 134
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20th October 2018 - 22:49