Показать сообщение отдельно
Старый 22.06.2006, 15:49   #1402
Finsernis

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: М: Скриптинг в Готике

Здравствуйте, уважаемые скриптеры. Я столкнулся с проблемой следующего рода: я создал новое боевое заклинание, но при его кастовании не уменьшается манна. Я думаю, что все дело в новом эффекте из 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 – за что отвечает каждое поле.

Заранее благодарен.
Ответить с цитированием