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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
205 страниц V  « < 200 201 202 203 204 > »   
Ответить в эту темуОткрыть новую тему
> Вопросы новичков, Абсолютные глупости
zmeylsdn
сообщение Jan 18 2019, 19:22
Сообщение #5026


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



-1- В скрипте nw_s0_summon первый вариант с OBJECT_SELF работает на перса, второй вариант с object oSummon не работает никак, в т.ч. и без DelayCommand(3.0). Использую одновременно только один из вариантов, тут объединил для наглядности.
CODE
else if(nSpellID == SPELL_SUMMON_CREATURE_III)
{
nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1;
sSummon = "NW_S_WOLFDIRE";
if(nCasterLevel >= 25)
{
sSummon = "z_s13qq";
}
if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION
))
{
object oTarget = OBJECT_SELF;
effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oTarget);

object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oSummon));
}
}

-2- В скрипте самона на onSpawn добавил это внутри void main(), никакого эффекта
CODE
object oMaster = GetMaster();
if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION
, oMaster))
{
object oTarget = OBJECT_SELF;
effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oTarget);
}

-3-Пытаюсь изменить ДЦ всех спеллов на эпик лвлах. Ищу в формуле спела GetSpellSaveDC() и меняю на nSpellDC. Докидываю код:
CODE
int nSpellDC;
int nCasterLevel = GetCasterLevel(OBJECT_SELF);
if(nCasterLevel <= 20)
{
nSpellDC = GetSpellSaveDC();
}
if((nCasterLevel >= 21) && (nCasterLevel <= 21))
{
nSpellDC = GetSpellSaveDC() + 10;
}
if(nCasterLevel >= 22)
{
nSpellDC = GetSpellSaveDC() + 20;
}

и все работает (проверено на NW_S0_WailBansh). Вопрос - возможно ли одним кодом охватить все спеллы? Каждый спелл зависит от
#include "X0_I0_SPELLS"
#include "x2_inc_spellhook"
так что видимо этот код нужно добавлять в один из этих скриптов. Но как этим одним кодом заменить GetSpellSaveDC() каждого спела на nSpellDC? Или может есть другой путь.

Сообщение отредактировал zmeylsdn - Jan 19 2019, 19:18
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jan 19 2019, 08:08
Сообщение #5027


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

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



Саммон уже вызван на момент применения эффекта? Я вижу вверху строчку с рефом, такое чувство, что эффект вызова саммона ещё не применён.

Все скрипты придётся менять вручную. Даже если поправить инклуд, всё равно все скрипты надо будет перекомпилировать, а этого не сделать, если предварительно не изменить хоть как-то (создать модульную версию).

Сообщение отредактировал denis0k - Jan 19 2019, 08:09
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Jan 23 2019, 20:28
Сообщение #5028


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



-1-Да самон вызван, добавил полный код. Плюс задержка в виде delay command (3.0).

-3-Возникли трудности с добавлением кода в x2_inc_spellhook. Если использую void nSpellDC() или int nSpellDC(), тогда пишет ERROR: NO LEFT BRACKET ON ARG LIST напротив строк "nSpellDC =". Через void main() сохраняет, но т.к. это есть и в каждом спеле, потом проблемы с ДЦ спелла на 21 и 22 лвле (0 или 1). Если вообще без первой строки и скобочек {} (c добавлением int nSpellDC;) пишет INVALID DECLARATION TYPE напротив строки "if" .
Neverwinter Script
void nSpellDC(){ // проблема в этой строке видимо
    int nCasterLevel = GetCasterLevel(OBJECT_SELF);

    if(nCasterLevel <= 20)
            {
            nSpellDC = GetSpellSaveDC();
            }
    if((nCasterLevel >= 21) && (nCasterLevel <= 21))
            {
            nSpellDC = GetSpellSaveDC() + 10;
            }
    if(nCasterLevel >= 22)
            {
            nSpellDC = GetSpellSaveDC() + 20;
            }
}

-4-Добавление класса сложности к спеллам избранной школы волшебника-специалиста и увеличение уровней кастера для престиж-классов с чего начинать искать?

Сообщение отредактировал zmeylsdn - Jan 23 2019, 21:09
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jan 23 2019, 22:59
Сообщение #5029


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

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



Цитата
Да самон вызван, добавил полный код.
Не вижу (IMG:style_emoticons/kolobok_light/smile.gif) sSummon = "z_s13qq"; есть, а вот его создания - не вижу.


А вот с nSpellDC полная каша. Функция должна вернуть значение, значит, она должна быть int, а не void. Также скорее всего триггерит на одинаковое имя функции и переменной. В базе должно быть что-то типа:
CODE
int GetSpellDC() {
бла бла бла
spellDC = ххх;
бла бла бла
return spellDC;
}

Советую полистать книжки по программированию, самые простые (IMG:style_emoticons/kolobok_light/smile.gif)
Цитата
Добавление класса сложности к спеллам избранной школы волшебника-специалиста и увеличение уровней кастера для престиж-классов с чего начинать искать?
Не понял вопроса. Можно узнать этот уровень кастера и просто прибавить ДЦ. Не знаю, можно ли узнать специализацию, давно этим занимался, всё по памяти.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Jan 24 2019, 16:18
Сообщение #5030


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



-1- да в конце скрипта были строки
Neverwinter Script
effect eSummonedMonster = EffectSummonCreature(sSummon, nFNF_Effect);
    return eSummonedMonster;

я закинул между ними, в конце, в первой части скрипта (там было ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration))(IMG:style_emoticons/kolobok_light/wink3.gif) но ничего не произошло.
Neverwinter Script
effect eSummonedMonster = EffectSummonCreature(sSummon, nFNF_Effect);
   if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION))
{
  object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
  effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
  ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oSummon);
            }
    return eSummonedMonster;

-3-Сделал такой код в спелхук и в спеллах поменял "GetSpellSaveDC()" на "nDC()" - работает.
Neverwinter Script
int nDC() {
int nCasterLevel = GetCasterLevel(OBJECT_SELF);
    int nSpellDC;
    if(nCasterLevel <= 20)
            {
            nSpellDC = GetSpellSaveDC();
            }
    if((nCasterLevel >= 21) && (nCasterLevel <= 21))
            {
            nSpellDC = GetSpellSaveDC() + 10;
            }
    if(nCasterLevel >= 22)
            {
            nSpellDC = GetSpellSaveDC() + 20;
            }
    return nSpellDC;
}

-4-Сделал такой код для учета уровней ПМа в кастер лвл. Но для его работы придется во всех спелах изменить "nCasterLevel" на "nCasterLevel()" в т.ч. и в предыдущем скрипте.
Neverwinter Script
int nCasterLevel() {
int nCL = GetCasterLevel(OBJECT_SELF);
    int nEpicMod = GetLevelByClass(CLASS_TYPE_PALEMASTER,OBJECT_SELF);
    if (nEpicMod>0)
    {
        nCL += (nEpicMod/2);//missstorm1\2
    }
    return nCL;
}


Сообщение отредактировал zmeylsdn - Jan 24 2019, 17:41
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jan 24 2019, 18:34
Сообщение #5031


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

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



Можно всё-таки полный скрипт саммона, а не куски? От начала до конца.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
StasMokos
сообщение Jan 27 2019, 22:20
Сообщение #5032


Level 3
*

Класс: Воин
Характер: True Neutral
Раса: Эльф



Приветствую всех!
Обращаюсь к вам за помощью со следующей проблемой: не работает функция FadeFromBlack (ну или мы что-то неправильно делаем). Всегда с ней отлично работалось, а тут...
Суть вот в чем: ГГ разговаривает с объектом и спутником, в конце диалога они телепортируются на другие точки. Во время телепортации как раз таки нужен черный занавес.
Прикрепляю код. Скрипт стоит на разговоре с объектом.
Надеюсь на ваш совет!

Neverwinter Script
void main()
{
  object oPC = GetFirstPC();
  object oSarg = GetObjectByTag ("sargu_olu");
  int iECHO = GetLocalInt (oPC, "snov_echo_n");

//всякое не относящееся к сути вопроса
  int iECHOn = iECHO + 1;
  SetLocalInt (oPC, "snov_echo_n", iECHOn);
  DelayCommand (1.0, DestroyObject (OBJECT_SELF));
  GiveXPToCreature(oPC, 15);
  AddJournalQuestEntry ("DN_snov_echo", iECHOn+1, oPC);
  CreateObject(OBJECT_TYPE_PLACEABLE, "sno_echo", GetLocation(GetObjectByTag ("snov_krup")));

//удаление спутника, чтобы прыгнуть на разные точки с ГГ
  RemoveHenchman(oPC, oSarg);

//телепортация
  DelayCommand (1.0, AssignCommand(oPC, JumpToObject(GetObjectByTag("WP_sno_spawn1"))));
  DelayCommand (1.0, AssignCommand(oSarg, JumpToObject(GetObjectByTag("WP_sno_spawn2"))));
  SetLocalInt(oPC, "di_sargu_1", 2);

//экран
  AssignCommand(oPC, FadeToBlack(oPC, FADE_SPEED_FAST));
  DelayCommand (2.0, ClearAllActions());
  DelayCommand (4.0, FadeFromBlack(oPC, FADE_SPEED_FAST));
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jan 28 2019, 07:40
Сообщение #5033


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

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



Просто догадка. В катсценах фейдят как действие, мб объект надо разрушать не через секунду, а через пять, чтобы он последнюю строку успел сделать? (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Jan 28 2019, 10:37
Сообщение #5034


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

Класс: Волшебник
Характер: Neutral Good
Раса: Фея
NWN: Скриптинг [PW]
Край Лесов



сделайте так

Neverwinter Script
//экран
  AssignCommand(oPC, FadeToBlack(oPC, FADE_SPEED_FAST));
  AssignCommand(oPC, DelayCommand (4.0, FadeFromBlack(oPC, FADE_SPEED_FAST)));


как и сказал dens0k вы разрушаете объект и DelayCommand не срабатывает из-за этого, так как она не привязана к герою, а висит на хенче. Поэтому лучше вешать или на модуль или на PC
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
StasMokos
сообщение Jan 28 2019, 21:01
Сообщение #5035


Level 3
*

Класс: Воин
Характер: True Neutral
Раса: Эльф



Спасибо большое, все получилось!
И заодно стала понятнее логика при работе с DelayCommand (IMG:style_emoticons/kolobok_light/good.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 2 2019, 22:18
Сообщение #5036


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



-1- Задумал я бонус к ДЦ спелла брать из мейн стата кастера:
Neverwinter Script
int nDC() { // replace GetSpellSaveDC() to nDC() in all spells with DC .
int nCasterLevel = GetCasterLevel(OBJECT_SELF);
    int nSpellDC;

    if(nCasterLevel <= 39)
            {
            nSpellDC = GetSpellSaveDC() + (GetCasterAbMod())/2;
            }
    if(nCasterLevel >= 40)
            {
            nSpellDC = GetSpellSaveDC() + GetCasterAbMod();
            }
    return nSpellDC;
}

В x0_i0_spells есть подобное, но там проверка только для виза и сорка что меня смутило:
Neverwinter Script
/*
    Returns the modifier from the ability
    score that matters for this caster
*/

int GetCasterAbilityModifier(object oCaster)
{
    int nClass = GetLevelByClass(CLASS_TYPE_WIZARD, oCaster);
    int nAbility;
    if (nClass > 0)
    {
        nAbility = ABILITY_INTELLIGENCE;
    }
    else
        nAbility = ABILITY_CHARISMA;

    return GetAbilityModifier(nAbility, oCaster);
}

Я решил написать проверку для всех кастеров:
Neverwinter Script
int GetCasterAbMod(object oCaster)
{
    int nAbility;
    int nClass = GetLastSpellCastClass();
    if (nClass = CLASS_TYPE_WIZARD)
    {
        nAbility = ABILITY_INTELLIGENCE;
    }
    if (nClass == CLASS_TYPE_CLERIC || nClass == CLASS_TYPE_DRUID ||
        nClass == CLASS_TYPE_RANGER || nClass == CLASS_TYPE_PALADIN)
    {
        nAbility = ABILITY_WISDOM;
    }
    if (nClass == CLASS_TYPE_SORCERER || nClass == CLASS_TYPE_BARD)
    {
        nAbility = ABILITY_CHARISMA;
    }
    return GetAbilityModifier(nAbility, oCaster);
}

int nDC() { // replace GetSpellSaveDC() to nDC() in all spells with DC .
int nCasterLevel = GetCasterLevel(OBJECT_SELF);
    int nDiff = GetCasterAbMod(OBJECT_SELF);
    int nSpellDC;

    if(nCasterLevel <= 39)
            {
            nSpellDC = GetSpellSaveDC() + nDiff/2;
            }
    if(nCasterLevel >= 40)
            {
            nSpellDC = GetSpellSaveDC() + nDiff;
            }
    return nSpellDC;
}

Компилится но работает странно, не сходятся цифры и разный эффект для цепной молнии и крика баньши. Думаю проблема в функции "GetLastSpellCastClass()", но GetLevelByClass и GetClassByPosition единственное что нашел по этому поводу и выглядит неподходяще.

-2- Полный скрипт самона
Neverwinter Script
//::///////////////////////////////////////////////
//:: Summon Creature Series
//:: NW_S0_Summon
//:: Copyright © 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Carries out the summoning of the appropriate
    creature for the Summon Monster Series of spells
    1 to 9
*/

//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Jan 8, 2002
//:://////////////////////////////////////////////

effect SetSummonEffect(int nSpellID);

#include "x2_inc_spellhook"

void main()
{

/*
  Spellcast Hook Code
  Added 2003-06-23 by GeorgZ
  If you want to make changes to all spells,
  check x2_inc_spellhook.nss to find out more

*/


    if (!X2PreSpellCastCode())
    {
    // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
        return;
    }

// End of Spell Cast Hook


    //Declare major variables
    int nSpellID = GetSpellId();
    int nDuration = GetCasterLevel(OBJECT_SELF);
    nDuration = 24;
    if(nDuration == 1)
    {
        nDuration = 2;
    }
    effect eSummon = SetSummonEffect(nSpellID);

    //Make metamagic check for extend
    int nMetaMagic = GetMetaMagicFeat();
    if (nMetaMagic == METAMAGIC_EXTEND)
    {
        nDuration = nDuration *2;   //Duration is +100%
    }
    //Apply the VFX impact and summon effect

    ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration));
//добавленные строки
    if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION))
    {
    object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
    effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 12);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oSummon);
    }
}


effect SetSummonEffect(int nSpellID)
{
    int nFNF_Effect;
    int nRoll = d3();
    int nCasterLevel = GetCasterLevel(OBJECT_SELF);   //21+ caster lvl +20lvls to each mob
    string sSummon;
        if(nSpellID == SPELL_SUMMON_CREATURE_I)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1;
            sSummon = "NW_S_badgerdire"//NW_S_badgerdire
            if(nCasterLevel >= 21)
            {
            sSummon = "z_s11";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_II)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1;
            sSummon = "z_s2"//NW_S_BOARDIRE
            if(nCasterLevel >= 23)
            {
            sSummon = "z_s12";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_III)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_1;
            sSummon = "z_s3"//NW_S_WOLFDIRE
            if(nCasterLevel >= 25)
            {
            sSummon = "z_s13";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_IV)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2;
            sSummon = "z_s4"//NW_S_SPIDDIRE
            if(nCasterLevel >= 27)
            {
            sSummon = "z_s14";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_V)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2;
            sSummon = "z_s5"//NW_S_beardire
            if(nCasterLevel >= 29)
            {
            sSummon = "z_s15";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_VI)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_2;
            sSummon = "z_s6"//NW_S_diretiger
            if(nCasterLevel >= 31)
            {
            sSummon = "z_s16";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_VII)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3;
            switch (nRoll)
            {
                case 1:
                    sSummon = "NW_S_AIRHUGE";   //NW_S_AIRHUGE
                break;

                case 2:
                    sSummon = "NW_S_WATERHUGE"; //NW_S_WATERHUGE
                break;

                case 3:
                    sSummon = "NW_S_FIREHUGE"//W_S_FIREHUGE
                break;
            }
            if(nCasterLevel >= 33)
            {
            sSummon = "z_s17";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_VIII)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3;
            switch (nRoll)
            {
                case 1:
                    sSummon = "NW_S_AIRGREAT";   //NW_S_AIRGREAT
                break;

                case 2:
                    sSummon = "NW_S_WATERGREAT"//NW_S_WATERGREAT
                break;

                case 3:
                    sSummon = "NW_S_FIREGREAT"; //NW_S_FIREGREAT
                break;
            }
            if(nCasterLevel >= 35)
            {
            sSummon = "z_s18";
            }
        }
        else if(nSpellID == SPELL_SUMMON_CREATURE_IX)
        {
            nFNF_Effect = VFX_FNF_SUMMON_MONSTER_3;
            switch (nRoll)
            {
                case 1:
                    sSummon = "NW_S_AIRELDER"//NW_S_AIRELDER
                break;

                case 2:
                    sSummon = "NW_S_WATERELDER";    //NW_S_WATERELDER
                break;

                case 3:
                    sSummon = "NW_S_FIREELDER"; //NW_S_FIREELDER
                break;
            }
            if(nCasterLevel >= 37)
            {
            sSummon = "z_s19";
            }
        }
    //effect eVis = EffectVisualEffect(nFNF_Effect);
    //ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation());
    effect eSummonedMonster = EffectSummonCreature(sSummon, nFNF_Effect);
    return eSummonedMonster;
}


П.С. Мне кажется через OnSpawn реалиация была бы более экономичной, так что вопрос остается открытым, что же здесь не так:
Neverwinter Script
object oMaster = GetMaster(); //в OnSpawn
if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION, oMaster))
{
  object oTarget = OBJECT_SELF;
  effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
  ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oTarget);
  }


Сообщение отредактировал zmeylsdn - Feb 3 2019, 10:11
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Feb 3 2019, 11:24
Сообщение #5037


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

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



Neverwinter Script
if (nClass = CLASS_TYPE_WIZARD)
Это баг, условие всегда возвращает 1, т.к. одно "=" (IMG:style_emoticons/kolobok_light/smile.gif)
Цитата
Компилится но работает странно, не сходятся цифры и разный эффект для цепной молнии и крика баньши. Думаю проблема в функции "GetLastSpellCastClass()", но GetLevelByClass и GetClassByPosition единственное что нашел по этому поводу и выглядит неподходяще.
Ну не зная всех условий и имея гадалку в отпуске, помочь вряд ли чем-то можно (IMG:style_emoticons/kolobok_light/smile.gif)

По саммону непонятно. Я в таких случаях начинаю усиленно дебажить - ставлю по коду кучу sendmessage с выводом в лог значений переменных и проходов по условиям/циклам.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 3 2019, 18:36
Сообщение #5038


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



-1- По бонусу к ДЦ спела от основной кастерской характеристики.
Добавил "=", теперь определяет мейн стат верно, проверено на сорке и визе.
Условия: оба (сорк и виз) имеют базу мейнстата 18, все апы в мейнстат, итого на 40м 50 мейнстата = +20 модификатор. Взяты ЭпикФокусы на Разрушении и некромантии.

Согласно добавленному коду, до 39го уровня включительно к ДЦ спелла должен добавлятся 150% мейнстата: 100% согласно оригиналу и 50% от кода (+ (GetCasterAbMod())/2).
С 40го - 200% мейнстата: 100% согласно оригиналу и 100% от кода (+ (GetCasterAbMod())).

ДЦ оригинального нвн:
ЦепьМолний, ЦМ (6круг) = (10 база +6 ЭпикФокус +6 круг =22) +20 мод стата =42 (22+20*2=62 на 40м с бонусом либо 22+19*1,5=50 на 39м с бонусом)
Баньша, Б (9круг) = (10 база +6 ЭпикФокус +9 круг =25) +20 мод стата =45 (25+20*2=65 на 40м с бонусом либо 25+19*1,5=53 на 39м с бонусом)

Тесты показали следующие ДЦ спелов:
40й сорк\виз 20 мод хари\инты: ЦМ-62 (правильно), Б-62 (меньше, должно быть 65 =25+20*2)
40й сорк\виз 14 мод хари\инты: ЦМ-50 (правильно), Б-56 (больше, должно быть 53 =25+14*2)

39й сорк 19 мод хари: ЦМ-50 (правильно), Б-54 (больше, должно быть 53 =25+19*1,5)
39й сорк 13 мод хари: ЦМ-41(правильно), Б-48 (больше, должно быть 44 =25+13*1,5)

Проверил так же Перст Смерти и обычную Молнию, их ДЦ работает правильно. В спеллах менялось только GetSpellSaveDC() на nDC(). С предыдущей формулой где давался фиксированный бонус или в зависимости от уровня ((nCasterLevel - 19)/2), оба спела работали корректно.

Сообщение отредактировал zmeylsdn - Feb 3 2019, 19:02
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Feb 4 2019, 00:39
Сообщение #5039


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

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



В таких случаях только дебаг (IMG:style_emoticons/kolobok_light/smile.gif) Выводить все этапы в лог и смотреть, где начинают идти не те цифры.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 4 2019, 19:53
Сообщение #5040


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



А как вообще делать дебаг и смотреть цифры?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Feb 4 2019, 23:09
Сообщение #5041


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

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



Поскольку дебагера в нвн нет, приходится тупо делать sendmessagetopc(getfirstpc(), ***) в разных местах кода. Так можно выводить переменные, показывать, что скрипт вошёл в условие/цикл и т.п. Потом эти строки можно закомментить, пока снова баг не вылезет (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 5 2019, 17:25
Сообщение #5042


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



Как сделать ограничение по уровню для предмета? И задать свою стоимость например
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Feb 5 2019, 20:49
Сообщение #5043


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

Класс: Волшебник
Характер: Neutral Good
Раса: Фея
NWN: Скриптинг [PW]
Край Лесов



Ограничение по уровню вроде бы работает только для серверной части - шардов.
Задать свою стоимость предмета вы не можете обычными для игры способами, т.к. она зависит от кол-ва свойств, можно разве что дополнить через строчку в свойствах - "дополнительная" или как-то так на русском. Есть несколько вариантов шаманства с 2да файлами, но это все костыль.


Там в *.ini надо что-то настроить - и можно выводить ошибки скриптов и функций, но ограничено, в основном пользуются SendMessageToPC(GetFirstPC(), "бла-бла");

Сообщение отредактировал Melisse - Feb 5 2019, 20:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Feb 5 2019, 21:11
Сообщение #5044


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

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



Цитата(zmeylsdn @ Feb 5 2019, 17:25) *
Как сделать ограничение по уровню для предмета? И задать свою стоимость например
Стоимость можно только увеличивать, если без гемора. Ограничение можно сделать скриптово - на одевание вставить проверку и снимать, если не дорос.

Иначе там адъ и израиль (IMG:style_emoticons/kolobok_light/smile.gif) На цену влияют коэффициенты свойств из 2да-таблиц, я даже не рисковал пытаться в них разбираться.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 5 2019, 22:48
Сообщение #5045


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



Большой спасибо за помощь
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 21 2019, 20:52
Сообщение #5046


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



-1- в NW_S0_Summon
CODE
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 10);
if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION
))
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oSummon);
}
SendMessageToPC(GetFirstPC(), "oSummon: " + GetName(oSummon)); //в игре "oSummon: " или "oSummon: Ужасный барсук"
(имя предыдущего вызванного существа).

}

Видимо не успевает найти самона.
-2- в OnSpawn существа
CODE
object oMaster = GetMaster(OBJECT_SELF);
if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION
, oMaster))
{
object oTarget = OBJECT_SELF;
effect eBonus = EffectAbilityIncrease(ABILITY_STRENGTH, 10);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oTarget);
}
SendMessageToPC(GetFirstPC(), "oMaster: " + GetName(oMaster)); //в игре "oMaster: "
//SendMessageToPC(GetFirstPC(), "I`m: " + GetName(OBJECT_SELF)); в игре "I`m: Ужасный барсук"
}

видимо не находит мастера. нашел в nwn lexicon такую инфу: "Known bugs. This function (GetMaster()) always returns OBJECT_INVALID when used in creature OnSpawn event. To get correct results, use this function with slight delay or in signal event."
Вопрос теперь как эту строку "object oMaster = GetMaster(OBJECT_SELF);" выполнить с задержкой?
//ActionWait(2.0);
//AssignCommand(OBJECT_SELF, ActionWait(2.0));
не оказали эффекта, а как применить DelayCommand(2.0)); с сохранением привязки к переменной oMaster идей нет.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Feb 22 2019, 07:47
Сообщение #5047


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

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



Тогда предлагаю сделать отдельный скрипт и запускать его из спавна как delaycommand(executescript).
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 22 2019, 10:53
Сообщение #5048


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



Оба варианта, и OnSpawn, и внутри скрипта вызова, работают с DelayCommand(1.0, ExecuteScript("z_sbuff_onspawn", OBJECT_SELF));
Биг, биг спс.
Нашел как применить несколько эффектов сразу. Но не получается оптимизировать код.
CODE
void main()
{
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
if(GetHasFeat(FEAT_EPIC_SPELL_FOCUS_CONJURATION))
{
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, 6);
effect eCon = EffectAbilityIncrease(ABILITY_CONSTITUTION, 6);
effect eDam = EffectDamageIncrease(DAMAGE_BONUS_6, DAMAGE_TYPE_BLUDGEONING);
effect eAtt = EffectAttackIncrease(6);
effect eAC = EffectACIncrease(6, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStr, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCon, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDam, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAtt, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAC, oSummon);
}
else if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION
))
{
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
effect eCon = EffectAbilityIncrease(ABILITY_CONSTITUTION, 4);
effect eDam = EffectDamageIncrease(DAMAGE_BONUS_4, DAMAGE_TYPE_BLUDGEONING);
effect eAtt = EffectAttackIncrease(4);
effect eAC = EffectACIncrease(4, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStr, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCon, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDam, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAtt, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAC, oSummon);
}
else if(GetHasFeat(FEAT_SPELL_FOCUS_CONJURATION))
{
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, 2);
effect eCon = EffectAbilityIncrease(ABILITY_CONSTITUTION, 2);
effect eDam = EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_BLUDGEONING);
effect eAtt = EffectAttackIncrease(2);
effect eAC = EffectACIncrease(2, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStr, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCon, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDam, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAtt, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAC, oSummon);
}
}

Например, такой вариант не срабатывает:
CODE
void main()
{
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
int eBonus;
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, eBonus);
effect eCon = EffectAbilityIncrease(ABILITY_CONSTITUTION, eBonus);
effect eDam = EffectDamageIncrease(eBonus, DAMAGE_TYPE_BLUDGEONING);
effect eAtt = EffectAttackIncrease(eBonus);
effect eAC = EffectACIncrease(eBonus, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL);
if(GetHasFeat(FEAT_EPIC_SPELL_FOCUS_CONJURATION))
{
eBonus = 6;
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStr, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCon, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDam, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAtt, oSummon);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAC, oSummon);
}
}


Сообщение отредактировал zmeylsdn - Feb 22 2019, 18:05
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ud4ever
сообщение Feb 25 2019, 16:33
Сообщение #5049


Level 3
*

Класс: Бард
Характер: Neutral Evil
Раса: Человек



Цитата(zmeylsdn @ Feb 22 2019, 11:53) *
Оба варианта, и OnSpawn, и внутри скрипта вызова, работают с DelayCommand(1.0, ExecuteScript("z_sbuff_onspawn", OBJECT_SELF));
Биг, биг спс.
Нашел как применить несколько эффектов сразу. Но не получается оптимизировать код.


как-то так, все, что закомментировано, само собой можно удалить, добавил для лучшего понимания

CODE

// в подключаемом стандартном инклюде NWN содержится нужный скрипт который привожу ниже закомментированным на всякий случай
#include "x2_inc_itemprop"

/*

int IPGetDamageBonusConstantFromNumber(int nNumber)
{
switch (nNumber)
{
case 1: return DAMAGE_BONUS_1;
case 2: return DAMAGE_BONUS_2;
case 3: return DAMAGE_BONUS_3;
case 4: return DAMAGE_BONUS_4;
case 5: return DAMAGE_BONUS_5;
case 6: return DAMAGE_BONUS_6;
case 7: return DAMAGE_BONUS_7;
case 8: return DAMAGE_BONUS_8;
case 9: return DAMAGE_BONUS_9;
case 10: return DAMAGE_BONUS_10;
case 11: return DAMAGE_BONUS_11;
case 12: return DAMAGE_BONUS_12;
case 13: return DAMAGE_BONUS_13;
case 14: return DAMAGE_BONUS_14;
case 15: return DAMAGE_BONUS_15;
case 16: return DAMAGE_BONUS_16;
case 17: return DAMAGE_BONUS_17;
case 18: return DAMAGE_BONUS_18;
case 19: return DAMAGE_BONUS_19;
case 20: return DAMAGE_BONUS_20;

}

if (nNumber>20)
{
return DAMAGE_BONUS_20;
}
else
{
return -1;
}
}

*/

void EmpowerMySummon(int iBonus, object oSummon)
{
effect eSummonBonuses=EffectAbilityIncrease(ABILITY_STREN
GTH, iBonus);
eSummonBonuses= EffectLinkEffects(EffectAbilityIncrease(ABILITY_CO
NSTITUTION, iBonus),eSummonBonuses);
eSummonBonuses = EffectLinkEffects(EffectDamageIncrease(IPGetDamage
BonusConstantFromNumber(iBonus), DAMAGE_TYPE_BLUDGEONING),eSummonBonuses);
eSummonBonuses = EffectLinkEffects(EffectAttackIncrease(iBonus),eSu
mmonBonuses);
eSummonBonuses = EffectLinkEffects(EffectACIncrease(iBonus, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL),eSummonBonuses);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSummonBonuses, oSummon);
}

void main()
{
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED);
if(GetHasFeat(FEAT_EPIC_SPELL_FOCUS_CONJURATION))
{
EmpowerMySummon(6,oSummon);
}
else if(GetHasFeat(FEAT_GREATER_SPELL_FOCUS_CONJURATION
))
{
EmpowerMySummon(4,oSummon);
}
else if(GetHasFeat(FEAT_SPELL_FOCUS_CONJURATION))
{
EmpowerMySummon(2,oSummon);
}
}


Сообщение отредактировал ud4ever - Feb 25 2019, 16:47
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmeylsdn
сообщение Feb 25 2019, 22:30
Сообщение #5050


Level 3
*

Класс: Бледный Мастер
Характер: Chaotic Neutral
Раса: Человек



Спасибо, работает.
Существует ли способ определить школу волшебника-специалиста и применить к ней же какие либо бонусы, например +2 spellDC?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

205 страниц V  « < 200 201 202 203 204 > » 
Ответить в эту темуОткрыть новую тему
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2024 - 19:08