![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#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? |
![]()
Сообщение
#5051
|
|
Level 3 ![]() Класс: Бард Характер: Neutral Evil Раса: Человек ![]() |
Спасибо, работает. Существует ли способ определить школу волшебника-специалиста и применить к ней же какие либо бонусы, например +2 spellDC? Можно с nwnx, в 1.69 плагин nwnx_funcs, в NWN EE эта функция в плагине nwnx_creature. 1.69 /* Gets whether or not oCreature has a specialist school of wizardry. */ int GetWizardSpecialization (object oCreature); NWN EE // Gets whether or not creature has a specialist school of wizardry. int NWNX_Creature_GetWizardSpecialization(object creature); |
![]()
Сообщение
#5052
|
|
Level 3 ![]() Класс: Бледный Мастер Характер: Chaotic Neutral Раса: Человек ![]() |
задумал улучшить эпик самонов blackguard and shadowdancer. За это отвечает скрипт "X2_inc_summscale", который является инклюдом для NW_CH_AC1.
На родном существе x2_s_vrock (из x0_s2_fiend) у меня получилось изменить формулу: int nLevelTo = GetLevelByClass(CLASS_TYPE_BLACKGUARD, GetMaster(oServant))+10;//-4 (из X2_inc_summscale) Т.е. стало новый уровень врока = уровень БГ+10 (было уровень БГ-4). Но вот если заменить x2_s_vrock (из x0_s2_fiend) на собственное существо, скалирование не работает вообще. Стандартный моб со скриптами для призванного существа, в т.ч. и NW_CH_AC1. Может у этих самонов (врок и тень) какой из скриптов уникальный. Итого, как лучше реализовать скалирование самонов от уровня мастера? Как вариант нашел такой способ, основа из предыдущего сообщения: void main() { object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED); EmpowerMySummon(GetHitDice(OBJECT_SELF)-20,oSummon); } |
![]()
Сообщение
#5053
|
|
Level 3 ![]() Класс: Бард Характер: Neutral Evil Раса: Человек ![]() |
задумал улучшить эпик самонов blackguard and shadowdancer. За это отвечает скрипт "X2_inc_summscale", который является инклюдом для NW_CH_AC1. На родном существе x2_s_vrock (из x0_s2_fiend) у меня получилось изменить формулу: int nLevelTo = GetLevelByClass(CLASS_TYPE_BLACKGUARD, GetMaster(oServant))+10;//-4 (из X2_inc_summscale) Т.е. стало новый уровень врока = уровень БГ+10 (было уровень БГ-4). Но вот если заменить x2_s_vrock (из x0_s2_fiend) на собственное существо, скалирование не работает вообще. Стандартный моб со скриптами для призванного существа, в т.ч. и NW_CH_AC1. Может у этих самонов (врок и тень) какой из скриптов уникальный. Итого, как лучше реализовать скалирование самонов от уровня мастера? Как вариант нашел такой способ, основа из предыдущего сообщения: void main() { object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED); EmpowerMySummon(GetHitDice(OBJECT_SELF)-20,oSummon); } а той же функцией для левелапа хенчмана из X2_inc_summscale воспользоваться не пробовал? int SSMLevelUpCreature(object oCreature, int nLevelUpTo, int nClass = CLASS_TYPE_INVALID, int bReadySpells =TRUE) ____________ #include "X2_inc_summscale" void main() { object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED); SSMLevelUpCreature(oSummon,GetHitDice(OBJECT_SELF) ); } |
![]()
Сообщение
#5054
|
|
Level 3 ![]() Класс: Бледный Мастер Характер: Chaotic Neutral Раса: Человек ![]() |
В x0_s2_fiend меняю стандартного врока на своего, докидываю DelayCommand(4.0, ExecuteScript("z_sbuff_scale", OBJECT_SELF)); после ApplyEffectAtLocation...
CODE //z_sbuff_scale #include "X2_inc_summscale" void main() { object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED); SSMLevelUpCreature(oSummon,GetLevelByClass(CLASS_T YPE_BLACKGUARD, OBJECT_SELF)+10); SendMessageToPC(GetFirstPC(), "oSummon: " + GetName(oSummon)); //в игре oSummon: Самон Эпик Врок SendMessageToPC(GetFirstPC(), "oSummonlvl: " + IntToString(GetHitDice(oSummon)));//в игре oSummonlvl: 25 SendMessageToPC(GetFirstPC(), "BG+10lvl: " + IntToString(GetLevelByClass(CLASS_TYPE_BLACKGUARD, OBJECT_SELF)+10));//в игре BG+10lvl: 39 } Но Врок остается 25й лвл как и был. У него стандартный набор скриптов "nw_ch_ac%" |
![]()
Сообщение
#5055
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
SSMLevelUpCreature возвращает 0 на ошибку, это стоит проверить.
Второй момент - чудеса внутри самой функции: Neverwinter Script int nLevel = LevelUpHenchman(oCreature,nClass,bReadySpells); // <-- первый ап oCreature // level me up until I the same level as my master (or something fails) <-- коммент врёт, нет проверки на уровень мастера (либо эта проверка вшита и её не обойти) while (nLevel < (nLevelUpTo) && nLevel != 0) { // level up to thenext level //PrintString(GetName(oCreature) + " is now level "+ IntToString(nLevel)); nLevel = LevelUpHenchman(OBJECT_SELF,nClass,bReadySpells); // <-- а тут внезапно в цикле OBJECT_SELF } Ещё он не просто так апает. У каждого класса есть пакет стандартных настроек, кажется, это всё в 2да. Тут тоже стоит проверить. |
![]()
Сообщение
#5056
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Привет всем!
Уважаемые мастера, не могли бы вы подсказать, как правильно похоронить слона? В смысле, уничтожить одного очень упертого и несговорчивого непися. Непись так и называется "Мертвый слон". У него нет никаких скриптов, кроме единственного несложного, стоит на порождении (спавне): Neverwinter Script void main() { //object oNpc = OBJECT_SELF; SetIsDestroyable(FALSE,FALSE,FALSE); // ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(TRUE),oNpc); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(),OBJECT_SELF); SetCommandable(FALSE); } Собственно, и метода, и сам скрипт повзаимстовован с покойников Верхнего Хаспура, крушиморд и стражников, их там много. А проблема в том, что слон уничтожаться не желает. Джамповаться куда-нибудь на... на вейп в закрытой локе тоже не хочет. Вообще никаких команд не признает. Если я правильно понял, дестрою мешает строка: Neverwinter Script SetIsDestroyable(FALSE,FALSE,FALSE); Но именно эта строка держит чертову тварь в мире! Пробовал ее отключить - так слон исчезает мгновенно, без всяких команд на дестрой. Стоит только персонажу его просто увидеть. Пробовал чередовать FALSE и TRUE, перебрал все варианты - не помогает. В любых сочетаниях если первой стоит TRUE - слон исчезает сам, если FALSE - не выжжешь каленым железом! Пробовал вернуть все дефолтные скрипты на модельку - эффект нулевой. Собрался уже применить способ, который советовал уважаемый denis0k, то есть скопировать локацию, в одной - мертвый слон, в копии - евонная могила. И джамповать туда персонажа. Но есть причины, по которым этого делать очень не хотелось бы. Может, кто-то вспомнит какой-нибудь более другой способ? Или удержать модельку до команды "дестрой" в диалоге, без строки "SetIsDestroyable..." или все-таки уничтожить тварь невзирая на целых три FALSE-а? Заранее спасибо и прошу простить за многабукафф. Привет всем! Уважаемые мастера, не могли бы вы подсказать, как правильно похоронить слона? В смысле, уничтожить одного очень упертого и несговорчивого непися. Непись так и называется "Мертвый слон". У него нет никаких скриптов, кроме единственного несложного, стоит на порождении (спавне): Neverwinter Script void main() { //object oNpc = OBJECT_SELF; SetIsDestroyable(FALSE,FALSE,FALSE); // ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(TRUE),oNpc); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(),OBJECT_SELF); SetCommandable(FALSE); } Собственно, и метода, и сам скрипт повзаимстовован с покойников Верхнего Хаспура, крушиморд и стражников, их там много. А проблема в том, что слон уничтожаться не желает. Джамповаться куда-нибудь на... на вейп в закрытой локе тоже не хочет. Вообще никаких команд не признает. Если я правильно понял, дестрою мешает строка: Neverwinter Script SetIsDestroyable(FALSE,FALSE,FALSE); Но именно эта строка держит чертову тварь в мире! Пробовал ее отключить - так слон исчезает мгновенно, без всяких команд на дестрой. Стоит только персонажу его просто увидеть. Пробовал чередовать FALSE и TRUE, перебрал все варианты - не помогает. В любых сочетаниях если первой стоит TRUE - слон исчезает сам, если FALSE - не выжжешь каленым железом! Пробовал вернуть все дефолтные скрипты на модельку - эффект нулевой. Собрался уже применить способ, который советовал уважаемый denis0k, то есть скопировать локацию, в одной - мертвый слон, в копии - евонная могила. И джамповать туда персонажа. Но есть причины, по которым этого делать очень не хотелось бы. Может, кто-то вспомнит какой-нибудь более другой способ? Или удержать модельку до команды "дестрой" в диалоге, без строки "SetIsDestroyable..." или все-таки уничтожить тварь невзирая на целых три FALSE-а? Заранее спасибо и прошу простить за многабукафф. |
![]()
Сообщение
#5057
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Можно одной строкой, что именно нужно сделать? (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#5058
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Можно одной строкой, что именно нужно сделать? (IMG:style_emoticons/kolobok_light/smile.gif) Нужно уничтожить непися. Команда " DestroyObject(GetObjectByTag("ELEFANT_DEATH"));" не срабатывает. Причины, как я их понял, описаны в предыдущем посту. Можно было бы еще убрать этого непися в закрытую локу. Но команда "JumpToObject" также игнорируется. Полагаю, по тем же причинам. То есть из-за строчки " SetIsDestroyable(FALSE,FALSE,FALSE);" в графе "Порожден" (спавн) тела непися. Но без этой строки непись исчезает сама, не дожидаясь команды. |
![]()
Сообщение
#5059
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Может перед дестроем сделать SetIsDestroyable(true)?
|
![]()
Сообщение
#5060
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Может перед дестроем сделать SetIsDestroyable(true)? Пробовал в разных вариантах. Весь вечер и половину ночи. Исчезает невидимый плейс, с которым, собственно, и ведется диалог. (На саму непись нельзя кликнуть, как и задумано.) Но плейс-то легко уничтожить одной строчкой без всяких танцев с бубнами. А вот объяснить компилятору что применять SetIsDestroyable(true) надо не к плейсу, к этой чертовой неписи, я не сумел... Пробовал и другой путь: привязать SetIsDestroyable к переменным. Есть переменная - TRUE, а пока ее нет - FALSE. Если не трудно, взгляни на скрипт. Может, поймешь, в чем моя ошибка. На мой взгляд, ошибаться там просто нечему, но это взгляд дилетанта, не знающего английского. Neverwinter Script void main() { object oNpc = GetObjectByTag("ELEFANT_DEATH"); // Этот чертов слон ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(TRUE),oNpc); // Слон мертв. Лежит и не рыпается, кликнуть нельзя. SetCommandable(FALSE); if (GetLocalInt(oNpc, "SLON") != 1) // Переменной еще нет. SetIsDestroyable(FALSE,FALSE,FALSE); // Слона не расшибешь ядрен-батоном. if (GetLocalInt(oNpc, "SLON") == 1) // Переменная присвоена SetIsDestroyable(TRUE,TRUE,TRUE); // Слон должен исчезнуть сам или по команда скрипта - не важно. } Не исчезает, зараза! Плевал он на переменные. И что интересно, если строчку " ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(TRUE),oNpc);" переставить в любое другое место вниз, компилятор считает, что все правильно, а вот непись "оживает". Стоит на ножках, крутит башкой, кликнуть можно. Получаются не "похороны", а цирк какой-то. Скрипт стоит на порождении (OnSpawn) непися. Спасибо. |
![]() ![]() |
Текстовая версия | Сейчас: 20th August 2025 - 08:02 |