Здравствуйте, уважаемые скриптеры. Я столкнулся с проблемой следующего рода: я создал новое боевое заклинание, но при его кастовании не уменьшается манна. Я думаю, что все дело в новом эффекте из VisualFX.dat. Вот код скрипта эффекта:
AbraxysFX.d:
Код:
instance SPELLFX_My(CFX_BASE_PROTO){ visname_s = "MFX_ArmyOfDarkness_INIT"; emtrjmode_s = "FIXED"; emtrjoriginnode = "ZS_RIGHTHAND"; emtrjtargetnode = "BIP01 FIRE"; emtrjloopmode_s = "NONE"; emtrjeasefunc_s = "LINEAR"; emactioncollstat_s = "COLLIDE CREATE"; emactioncolldyn_s = "COLLIDE CREATEONCE CREATEQUAD"; emfxcollstat_s = "spellFX_My_COLLIDE"; emtrjtargetrange = 20; emtrjtargetelev = 0; emtrjdynupdatedelay = 20000; lightpresetname = "REDAMBIENCE";};instance SPELLFX_My_KEY_OPEN(C_PARTICLEFXEMITKEY){ lightrange = 2;};instance SPELLFX_My_KEY_INIT(C_PARTICLEFXEMITKEY){ visname_s = "MFX_ArmyOfDarkness_INIT"; lightrange = 2; scaleduration = 0.5;};instance SPELLFX_My_KEY_CAST(C_PARTICLEFXEMITKEY){ visname_s = "MFX_ArmyOfDarkness_INIT"; emtrjmode_s = "TARGET"; emtrjeasevel = 1000; emcheckcollision = 1; sfxid = "Dementhor_Talk"; sfxisambient = 1; lightrange = 100;};instance SPELLFX_My_KEY_COLLIDE(C_PARTICLEFXEMITKEY){ emtrjeasevel = 1e-006;};instance SPELLFX_My_COLLIDE(CFX_BASE_PROTO){ visname_s = "MFX_ArmyOfDarkness_INIT"; visalpha = 1; emtrjmode_s = "FIXED"; sfxid = "MFX_My_COLLIDE";};
Далее на всякий случай распишу как делал заклинание:
1) Сначала в скипте
constants.d описал константу
const int SPL_AbraxysSpell = 65; 2) Затем в том же скрипте в массиве
const string spellFxInstanceNames[100] значение элемента под номером 65 «Light» заменил на «My» и в массиве
const string spellFxAniLetters[100] значение элемента под номером 65 «XXX» заменил на «FBT».
3) В скрипте
text.d в массиве
const string TXT_SPELLS[100] значение элемента под номером 65 « TXT_SPL_RESERVED_65» заменил на « Заклинание светлого Князя» и описал константу
const string NAME_SPL_AbraxysSpell = "Заклинание светлого Князя"; 4) В скрипте
Spell_ProcessMana.d добавил следующий код
Код:
if(activeSpell == SPL_AbraxysSpell) { return spell_Logic_AbraxysSpell(manaInvested); };
5) Создал скрипт
Spell_Abraxys.d со следующим содержанием:
Код:
const int SPL_Cost_AbraxysSpell = 10;const int SPL_Damage_AbraxysSpell = 200;instance Spell_AbraxysSpell(C_Spell_Proto){ time_per_mana = 0; damage_per_level = SPL_Damage_AbraxysSpell; targetCollectRange = 1000;};func int Spell_Logic_AbraxysSpell(var int manaInvested){ if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll)) { return SPL_SENDCAST; } else if(self.attribute[ATR_MANA] >= SPL_Cost_AbraxysSpell) { return SPL_SENDCAST; } else { return SPL_SENDSTOP; };};func void Spell_Cast_AbraxysSpell(){ if(Npc_GetActiveSpellIsScroll(self)) { self.attribute[ATR_MANA] -= SPL_Cost_Scroll; } else { self.attribute[ATR_MANA] -= SPL_Cost_AbraxysSpell; }; self.aivar[AIV_SelectSpell] += 1;};
6) В скрипте
C_CanNpcCollideWithSpell.d вставил вот что
Код:
if(spellType == SPL_AbraxysSpell) { if (C_NpcIsEvil(self)) { return COLL_APPLYDOUBLEDAMAGE; } else { return COLL_APPLYDAMAGE; }; };
7) И в заключение в скрипте
IT_Runen.d написал вот что:
Код:
const int Value_Ru_AbraxysSpell = 3000;instance ItRu_AbraxysSpell(C_Item){ name = NAME_Rune; mainflag = ITEM_KAT_RUNE; flags = 0; value = Value_Ru_AbraxysSpell; visual = "ItRu_BreathOfDeath.3ds"; material = MAT_STONE; spell = SPL_AbraxysSpell; mag_circle = 0; wear = WEAR_EFFECT; effect = "SPELLFX_WEAKGLIMMER_RED"; description = "Красный огонь светлого Князя"; text[0] = NAME_Mag_Circle; count[0] = mag_circle; text[1] = NAME_Manakosten; count[1] = SPL_Cost_AbraxysSpell; text[2] = NAME_Dam_Magic; count[2] = SPL_Damage_AbraxysSpell; text[5] = NAME_Value; count[5] = value;};
Уважаемые скриптеры, подскажите, пожалуйста, что я сделал не так? Почему при кастовании не уменьшается манна? В остальном заклинание работает нормально, урон наносится, NPC на магию реагируют.
И еще вопрос. Кто-нибудь знает описание классов
C_PARTICLEFXEMITKEY и
CFX_BASE – за что отвечает каждое поле.
Заранее благодарен.