Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> диспелы
Vanes
сообщение Jan 30 2006, 13:37
Сообщение #1


Level 11
Иконки Групп

Класс: Вор
Характер: Neutral Evil
Раса: Эльф
NWN: Скриптинг [PW]
Validor2



что-то в последнее время слишком часто мне этот вопрос задается...
выкладываю последнюю версию нашего (валидоровского) диспела...
зы кроме шардовиков это мало кому нужно, потому постил не в базе скриптов...

Neverwinter Script Source
void DispelMagic (object oTarget, int nDispelDC)
{
    int nCntA, nCntR, nRoll;
    int nCount = nDispelDC;
    string sSpellID, sSpellFind="", sSpellToRemove="", sMessage;

    effect eLook = GetFirstEffect(oTarget);
    object oEffectCaster;

    int nTempBase;
    int nAvgBase = 0;
    int nBase = 15;
    int nCasterLevel = GetCasterLevel(OBJECT_SELF);
    if(nCasterLevel < 1) nCasterLevel = 1;

    // Bard's Section
    int nBardFocus;
    int nBardLevel;
    if(GetLastSpellCastClass()==CLASS_TYPE_BARD){
        nBardLevel = GetLevelByClass(CLASS_TYPE_BARD, OBJECT_SELF);
        nBardFocus = 0;
        if(nBardLevel>=21){
            nBardFocus = 3;
        }else if(nBardLevel>=14){
            nBardFocus = 2;
        }else if(nBardLevel>=7){
            nBardFocus = 1;
        }
    }
    // End Bard's Section

    if(GetClassByPosition(2)!=CLASS_TYPE_INVALID &&
      GetClassByPosition(2)!=CLASS_TYPE_PALE_MASTER )
        nBase -= 8;

    if(GetClassByPosition(2, oTarget)!=CLASS_TYPE_INVALID &&
      GetClassByPosition(2, oTarget)!=CLASS_TYPE_PALE_MASTER )
      {
          nAvgBase += 8;
          if (GetHasFeat (FEAT_ARCANE_DEFENSE_CONJURATION, oTarget)) nAvgBase -= 4;
          if (GetHasFeat (FEAT_ARCANE_DEFENSE_DIVINATION, oTarget)) nAvgBase -= 4;
          if (GetHasFeat (FEAT_ARCANE_DEFENSE_ENCHANTMENT, oTarget)) nAvgBase -= 4;
          if (GetHasFeat (FEAT_ARCANE_DEFENSE_EVOCATION, oTarget)) nAvgBase -= 4;
          if (GetHasFeat (FEAT_ARCANE_DEFENSE_ILLUSION, oTarget)) nAvgBase -= 4;
          if (GetHasFeat (FEAT_ARCANE_DEFENSE_NECROMANCY, oTarget)) nAvgBase -= 4;
          if (GetHasFeat (FEAT_ARCANE_DEFENSE_TRANSMUTATION, oTarget)) nAvgBase -= 4;

          if (nAvgBase > 0) nBase += nAvgBase;
      }

  if (GetHasFeat (FEAT_SPELL_FOCUS_ABJURATION)|| nBardFocus>0) nBase += 4;
  if (GetHasFeat (FEAT_GREATER_SPELL_FOCUS_ABJURATION)|| nBardFocus>1) nBase += 4;
  if (GetHasFeat (FEAT_EPIC_SPELL_FOCUS_ABJURATION)|| nBardFocus>2) nBase += 4;

  if (GetHasFeat (FEAT_ARCANE_DEFENSE_ABJURATION, oTarget)) nBase -= 8;

  int nDefLevel;

  while (GetIsEffectValid(eLook))
  {
    if (GetEffectSubType(eLook) == SUBTYPE_MAGICAL)
    {
        sSpellID = "T" + IntToString (GetEffectSpellId (eLook)) + "T";
        if (FindSubString (sSpellFind,sSpellID) == -1)
        {
            sSpellFind += sSpellID;

            if (GetEffectSubType(eLook) == SUBTYPE_MAGICAL)
            {

            nTempBase = nBase;
            nRoll = d100(1);

            oEffectCaster = GetEffectCreator(eLook);
            nDefLevel = GetCasterLevel(oEffectCaster);

            if (oEffectCaster != oTarget)
            {
              nTempBase += 40;
            }

            if(nDefLevel < 0) nDefLevel = 0;

            nTempBase += (nCasterLevel-nDefLevel)*2;
            if(nTempBase > 100) nTempBase = 100;
            if(nTempBase < 0) nTempBase = 0;

            nAvgBase += nTempBase;
            nCntA ++;

            if(nRoll < nTempBase)
            {
              if(nCount > 0){
                sSpellToRemove += sSpellID;
                nCntR ++;
              }
              nCount--;
            }
            }
        }
    }

    eLook = GetNextEffect(oTarget);
  }

  eLook = GetFirstEffect (oTarget);

  while (GetIsEffectValid (eLook))
  {
    if (GetEffectSubType (eLook) == SUBTYPE_MAGICAL)
    {
        sSpellID = "T" + IntToString (GetEffectSpellId (eLook)) + "T";
        if (FindSubString (sSpellToRemove,sSpellID) != -1)
        {
            RemoveEffect (oTarget,eLook);
        }
    }

    eLook = GetNextEffect(oTarget);
  }

  if (nCntA > 0)
  {
    nAvgBase = nAvgBase / nCntA;

    sMessage = "Dispel: " + IntToString(nCntR)+" / "+IntToString(nCntA)+" spells remove from " + GetName(oTarget) + " spells with DC " + IntToString (nAvgBase);
    SendMessageToPC (OBJECT_SELF, sMessage);

    sMessage = GetName(OBJECT_SELF) + " remove "+IntToString(nCntR)+" / "+IntToString(nCntA) + " spells with DC " + IntToString (nAvgBase);
    SendMessageToPC (oTarget, sMessage);
  }
  else
  {
    SendMessageToPC (OBJECT_SELF, "Target hasn't spells.");
  }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29th March 2024 - 10:21