Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форумы Gem of The North > NWN Toolset > ActionCastSpellAtObject


Автор: zergirl Dec 22 2004, 06:29 AM
Господа, помогите пожалуйста с проблемой.

Функция ActionCastSpellAtObject () имеет параметр nDomainLevel, который указывает CasterLevel спелла. Однако из внешних источников я узнала, что эта функция имеет такой баг, что данный параметр не учитывается при выполнении, а берется равным нулю.

Та вот, можно ли еще каким-либо способом наложить эффекты заклинаний определенного уровня на объект, с помощью или минуя эту функцию?

Автор: FenrIX_666 Dec 22 2004, 02:36 PM
CODE

// This action casts a spell at oTarget.
// - nSpell: SPELL_*
// - oTarget: Target for the spell
// - nMetamagic: METAMAGIC_*
// - bCheat: If this is TRUE, then the executor of the action doesn't have to be
//   able to cast the spell.
// - nDomainLevel: TBD - SS
// - nProjectilePathType: PROJECTILE_PATH_TYPE_*
// - bInstantSpell: If this is TRUE, the spell is cast immediately. This allows
//   the end-user to simulate a high-level magic-user having lots of advance
//   warning of impending trouble
void ActionCastSpellAtObject(int nSpell, object oTarget, int nMetaMagic=METAMAGIC_ANY, int bCheat=FALSE, int nDomainLevel=0, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT, int bInstantSpell=FALSE)


собственно он по дефолту 0. Да и и в большинстве случаев вообще не учитывается (если вообще не во всех).
Данынй параметр просто показывает в каком кругу доменных слотов данный спелл будет запомнен. Т.к. в НВНе нет четкого рзграничения где доменный, а где нет спелл, то и параметр не обязательный вооюще.

Смело используй данную функцию.

Автор: zergirl Dec 22 2004, 02:57 PM
Ммммм, тогда я вообще запуталась )
А как тогда наложить спелл с определенным Caster Level? Хочу просто проверить, как работает Holy Avenger. Хотя если кто знает точную формулу его работы, можно про спеллы и не отвечать тогда )

Автор: FenrIX_666 Dec 22 2004, 03:36 PM
ээ... у плейсебла никак. А у моба в тулсете подогнать уровень кастера под интерсующий.

А что конкретно интересует в холи авенжере?

Автор: zergirl Dec 22 2004, 04:40 PM
Меня интесует, какой именно диспел он кастует с удара, какой при этом берется уровень кастера (есть предположения что уровень паладина или уровень паладина/2), каков шанс кастования диспела.

Автор: FenrIX_666 Dec 23 2004, 12:21 AM
Там все гораздо хуже. Без процентажа, просто прибавляется такое ip как Holy Avenger. Без уровней и шансов....

А вот какой там чек идет - одним биотварям известно =)

Автор: DarkSet Dec 23 2004, 12:47 AM
Да, у него свойство разбивать чары, а не кастовать диспел на ударе. Очень неплохая вещь.. )


Меня в функции кастования спелов больше интересует как выбрать спел, он выбирается какимто хитрым номером, что это такое? Номер спела в 2да файле спелов? А по другому нельзя? smile.gif
И кстати если я 2да свой сменю для модуля то и спел другой функция кастанет?

Автор: Twin Dec 23 2004, 01:59 AM
DarkSet

"Выбрать спелл" это как? В процедуре ActionCastSpellAtObject () используются константы SPELL_* (о чём написано в описании процедуры). Список констант легко найти в редакторе скриптов Авроры. Разумеется, каждая эта константа соответствует какому-то обычно уникальному числу. Но для скриптера это значения, обычно, не имеет. Так что вопрос лично мне не понятен. Уточни? smile.gif
QUOTE
Номер спела в 2да файле спелов?

В spells.2da, если они тебе нужны.
QUOTE
И кстати если я 2да свой сменю для модуля то и спел другой функция кастанет?

Да.

Автор: DarkSet Dec 23 2004, 05:44 PM
объясняю
void ActionCastFakeSpellAtLocation(int nSpell, location lTarget, int nProjectilePathType=PROJECTILE_PATH_TYPE_DEFAULT)

int nSpell это никак не константа. Хотя наверное ее и тут можно использовать, но я про них не знал, думал что все по номерам только.. )

Автор: zergirl Dec 24 2004, 08:29 AM
А что подразумевается под словосочетанием "разбивает чары"?

Я так предполагаю, что например если на персонаже висит обкаст из пятнадцати спеллов, и я попадаю по нему Авенгером, то для каждого спелла кидается двадцатигранный кубик, и если прокидывается ДЦ Авенгера (Глосс что-то упоминал вскользь про ДЦ 16), то спелл убирается.

Это так или нет?

Автор: zergirl Dec 24 2004, 10:59 PM
Сейчас наконец-то проверила работу Авенгера в модуле. Для этого я создала персонажа-паладина 12-го уровня, дала ему в руки Авенгер, а противником выставила гоблина класса Wizard 1-го уровня. На событие OnSpawn этого гоблина я вешаю на него 15 различных спеллов обкаста. Результат - весь обкаст слетает либо с первого попадания, либо с первого не слетает ничего, а все слетает со второго. При увеличении уровня Wizard'а до 20 обкаст стал слетать порциями по 4-5 спеллов за первые несколько ударов, потом по 1-2 спелла на каждую пару последующих ударов. При увеличении уровня гоблина до 40 мне так и не удалось сбить хотя бы один спелл.

У меня возник вопрос: в бою на шарде будет ли Авенгер работать так же эффективно против мага или клира 20 уровня, как он работал против гоблина с уровнем Wizard'а 20? Ибо если будет - то это очень весело владельцу меча и очень грустно остальным )

Автор: zergirl Feb 22 2005, 06:33 AM
В принципе можно было бы сделать настоящее снятие чар, т.е. не просто повесить диспел на оружие, а при каждом ударе делать чек на снятие каждого спелла (например с шансом 10-15%) в независимости от левела кастера.

Автор: FenrIX_666 Feb 24 2005, 02:49 AM
Из стандартных вешаемых IP в мою раздувшуюся голову приходят только три(4) варианта:
1) OnHit: (lesser,Greater) Dispell, Mordenkainen's Disjuncion с премнным DC в зависимости от уровня паладина и его визды.
2) OnHitCastSpell: -||- с варициями заданных уровней кастера, зависящих от уровня/визды паладина.

3) 4) Вариации первых двух пунктов.

Автор: zergirl Feb 25 2005, 10:00 AM
А вот такую фишку можно сделать? Напишу в общих чертах, потому что не знаю нвн-скрипта.

CODE

// oTarget - тот, кого мы бьем
// oPC - мы сами

nWIS = GetWISMod ( oPC );
nLevel = GetClassLevel ( oPC, CLASS_PALADIN );
dChance = CalcDispellChance ( nWIS, nLevel );

aSpellEffects = GetSpellEffects ( oTarget );
foreach ( oSpellEffect in aSpellEffects )
{
  dRand = randDouble ();
  if ( dRand <= dChance )
  {
    RemoveSpellEffect ( oTarget, oSpellEffect );
  }
}


Функция расчета шанса на диспел может быть примерно такой:
CODE

double CalcDispellChance ( int nWIS, int nLevel )
{
  int nEffectiveLevel = nLevel + nWIS;
  double dChance = ((double)nEffectiveLevel)*DISPELL_K/MAX_EFFECTIVE_LEVEL;
  return ( dChance );
}


CODE
MAX_EFFECTIVE_LEVEL

для капа 20 примерно 30 (20 левелов пала + 10 мод. мудрости), для капа 40 примерно 60 (40 левелов пала + 20 мод. мудрости).
CODE
DISPELL_K

показывает шанс диспела при максимальном эффективном левеле (т.е. если он равен 1, то 100%; если 0.5 - то 50%).

Автор: FenrIX_666 Feb 28 2005, 12:34 AM
CODE
void main()
{

object oTarget = GetSpellTargetObject();
object oSelf = GetItemPossessor(OBJECT_SELF);

int nWis = GetAbilityModifier(oSelf, ABILITY_WISDOM);
int nLevel = GetLevelByClass(CLASS_TYPE_PALADIN, oSelf);
float fChance =


effect eSpell = GetFirstEffect(oTarget);
while (GetIsObjectValid(eSpell))
{
  //A дальше сплошная неразбериха. скажи хоть что именно ты имела ввиду на пальцах

}
}



С функцией все более ли менее ясно

Автор: zergirl Feb 28 2005, 06:42 AM
CODE

dRand = randDouble ();


Получаем случайное число от 0.0 до 1.0

CODE

if ( dRand <= dChance )
{


Если оно оказалось меньше шанса диспелла, то будет диспелл:

CODE

 RemoveSpellEffect ( oTarget, oSpellEffect );
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)