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

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


NocturN
Отправлено: Jul 11 2018, 10:40


Level 1


Группа: Newbie
Сообщений: 2
Регистрация: 11.06.2018
Пользователь №: 6,746


Дело в том что я делал по аналогии со стандартными заклинаниями Боиварей.. к примеру вот это заклинание 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());
    }
  Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #146661 · Ответов: 3359 · Просмотров: 638,916

NocturN
Отправлено: Jul 9 2018, 20:24


Level 1


Группа: Newbie
Сообщений: 2
Регистрация: 11.06.2018
Пользователь №: 6,746


Добрый день.. в полку новичков прибыло)
Попробовал переписать заклинание и при тестах столкнулся с парой проблем решить которые не получается, уверен что где то допустил банальные ошибки.
Проблема в том что эффект 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();
            }
    }
  Форум: Neverwinter Nights Aurora Toolset · Просмотр сообщения: #146659 · Ответов: 3359 · Просмотров: 638,916


Есть новые сообщения  Открытая тема (есть новые ответы)
Нет новых сообщений  Открытая тема (нет новых ответов)
Горячая тема (есть новые сообщения)  Горячая тема (есть новые ответы)
Горячая тема (нет новых сообщений)  Горячая тема (нет новых ответов)
Опрос (есть новые голоса)  Опрос (есть новые голоса)
Опрос (нет новых голосов)  Опрос (нет новых голосов)
Тема закрыта  Закрытая тема
Тема перемещена  Тема перемещена
 

Текстовая версия Сейчас: 19th April 2024 - 23:12