![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#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 |
![]()
Сообщение
#5027
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Саммон уже вызван на момент применения эффекта? Я вижу вверху строчку с рефом, такое чувство, что эффект вызова саммона ещё не применён.
Все скрипты придётся менять вручную. Даже если поправить инклуд, всё равно все скрипты надо будет перекомпилировать, а этого не сделать, если предварительно не изменить хоть как-то (создать модульную версию). Сообщение отредактировал denis0k - Jan 19 2019, 08:09 |
![]()
Сообщение
#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 |
![]()
Сообщение
#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) Цитата Добавление класса сложности к спеллам избранной школы волшебника-специалиста и увеличение уровней кастера для престиж-классов с чего начинать искать? Не понял вопроса. Можно узнать этот уровень кастера и просто прибавить ДЦ. Не знаю, можно ли узнать специализацию, давно этим занимался, всё по памяти.
|
![]()
Сообщение
#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 |
![]()
Сообщение
#5031
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Можно всё-таки полный скрипт саммона, а не куски? От начала до конца.
|
![]()
Сообщение
#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)); } |
![]()
Сообщение
#5033
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Просто догадка. В катсценах фейдят как действие, мб объект надо разрушать не через секунду, а через пять, чтобы он последнюю строку успел сделать? (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#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 |
![]()
Сообщение
#5035
|
|
Level 3 ![]() Класс: Воин Характер: True Neutral Раса: Эльф ![]() |
Спасибо большое, все получилось!
И заодно стала понятнее логика при работе с DelayCommand (IMG:style_emoticons/kolobok_light/good.gif) |
![]()
Сообщение
#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 |
![]()
Сообщение
#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 с выводом в лог значений переменных и проходов по условиям/циклам. |
![]()
Сообщение
#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 |
![]()
Сообщение
#5039
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
В таких случаях только дебаг (IMG:style_emoticons/kolobok_light/smile.gif) Выводить все этапы в лог и смотреть, где начинают идти не те цифры.
|
![]()
Сообщение
#5040
|
|
Level 3 ![]() Класс: Бледный Мастер Характер: Chaotic Neutral Раса: Человек ![]() |
А как вообще делать дебаг и смотреть цифры?
|
![]()
Сообщение
#5041
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Поскольку дебагера в нвн нет, приходится тупо делать sendmessagetopc(getfirstpc(), ***) в разных местах кода. Так можно выводить переменные, показывать, что скрипт вошёл в условие/цикл и т.п. Потом эти строки можно закомментить, пока снова баг не вылезет (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#5042
|
|
Level 3 ![]() Класс: Бледный Мастер Характер: Chaotic Neutral Раса: Человек ![]() |
Как сделать ограничение по уровню для предмета? И задать свою стоимость например
|
![]()
Сообщение
#5043
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Ограничение по уровню вроде бы работает только для серверной части - шардов.
Задать свою стоимость предмета вы не можете обычными для игры способами, т.к. она зависит от кол-ва свойств, можно разве что дополнить через строчку в свойствах - "дополнительная" или как-то так на русском. Есть несколько вариантов шаманства с 2да файлами, но это все костыль. Там в *.ini надо что-то настроить - и можно выводить ошибки скриптов и функций, но ограничено, в основном пользуются SendMessageToPC(GetFirstPC(), "бла-бла"); Сообщение отредактировал Melisse - Feb 5 2019, 20:55 |
![]()
Сообщение
#5044
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Как сделать ограничение по уровню для предмета? И задать свою стоимость например Стоимость можно только увеличивать, если без гемора. Ограничение можно сделать скриптово - на одевание вставить проверку и снимать, если не дорос.Иначе там адъ и израиль (IMG:style_emoticons/kolobok_light/smile.gif) На цену влияют коэффициенты свойств из 2да-таблиц, я даже не рисковал пытаться в них разбираться. |
![]()
Сообщение
#5045
|
|
Level 3 ![]() Класс: Бледный Мастер Характер: Chaotic Neutral Раса: Человек ![]() |
Большой спасибо за помощь
|
![]()
Сообщение
#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 идей нет. |
![]()
Сообщение
#5047
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Тогда предлагаю сделать отдельный скрипт и запускать его из спавна как delaycommand(executescript).
|
![]()
Сообщение
#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 |
![]()
Сообщение
#5049
|
|
Level 3 ![]() Класс: Бард Характер: Neutral Evil Раса: Человек ![]() |
Оба варианта, и 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 |
![]()
Сообщение
#5050
|
|
Level 3 ![]() Класс: Бледный Мастер Характер: Chaotic Neutral Раса: Человек ![]() |
Спасибо, работает.
Существует ли способ определить школу волшебника-специалиста и применить к ней же какие либо бонусы, например +2 spellDC? |
![]() ![]() |
Текстовая версия | Сейчас: 28th April 2025 - 19:53 |