Guest User

Untitled

a guest
Jan 21st, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.60 KB | None | 0 0
  1. void AIInterface::ExecuteType4(Skill *pSkill)
  2. {
  3.     SkillType4 *pType4 = NULL;
  4.     WorldPacket pkt;
  5.     UnitSet affectedUnitList;
  6.     uint16 sDuration;
  7.     int16 sAmount = 0;
  8.     uint16 sAdditionalAmount[6];
  9.     uint8 bAmount = 0, bResult = 1;
  10.     BuffState bBuffType;
  11.  
  12.     pType4 = SkillType4Storage.LookupEntry(pSkill->ID);
  13.     if (pType4 == NULL)
  14.         return;
  15.            
  16.     if (GetSkillTarget() == NULL)
  17.     {
  18.         for (std::set<Object*>::iterator itr = GetUnit()->GetInRangeSetBegin(); itr != GetUnit()->GetInRangeSetEnd(); itr++)
  19.         {
  20.             if (CheckUnitSkillRegion(pSkill, TO_UNIT(*itr), pType4->Radius) && TO_UNIT(*itr)->isAlive() && ((*itr)->isPlayer() && !TO_PLAYER(*itr)->isBlinking()))
  21.                 affectedUnitList.insert(TO_UNIT(*itr));
  22.         }
  23.  
  24.         if (affectedUnitList.size() == 0)
  25.         {
  26.             SendSkillFailed();
  27.             return;
  28.         }
  29.     }
  30.     else
  31.     {
  32.         affectedUnitList.insert(GetSkillTarget());
  33.     }
  34.  
  35.     if (pSkill->Mp != 0 && GetUnit()->GetMana() < pSkill->Mp)
  36.     {
  37.         SendSkillFailed();
  38.         return;
  39.     }
  40.  
  41.     if (GetUnit()->isPlayer() && pSkill->Mp > 0)
  42.         TO_PLAYER(GetUnit())->ChangeMana(-(pSkill->Mp));
  43.     else
  44.         GetUnit()->ChangeMana(-(pSkill->Mp));
  45.  
  46.     for (UnitSet::iterator itr = affectedUnitList.begin(); itr != affectedUnitList.end(); itr++)
  47.     {
  48.         if (m_pTarget == NULL && (*itr)->hasType4Buff(pType4->BuffType))
  49.         {
  50.             bResult = 0;
  51.             goto fail_return;
  52.         }
  53.        
  54.         sDuration = pType4->Duration;
  55.         memset(&sAdditionalAmount, NULL, 6*2);
  56.         bAmount = 0;
  57.  
  58.         switch (pType4->BuffType)
  59.         {
  60.             case BUFF_HP:
  61.                 sAmount = pType4->MaxHP;
  62.                 break;
  63.  
  64.             case BUFF_AC:
  65.                 sAmount = pType4->AC;
  66.                 break;
  67.  
  68.             case BUFF_SIZE:
  69.                 pkt << uint8(3);
  70.  
  71.                 // Bezoar
  72.                 if (pSkill->ID == 490034)
  73.                 {
  74.                     pkt << uint8(ABNORMAL_GIANT);
  75.                     if ((*itr)->isPlayer())
  76.                         TO_PLAYER(*itr)->GetSession()->HandleStateChange(pkt);
  77.                     else
  78.                         TO_NPC(*itr)->SetSize(200);
  79.                 }
  80.                 // Rice cake
  81.                 else if (pSkill->ID == 490034)
  82.                 {
  83.                     pkt << uint8(ABNORMAL_DWARF);
  84.                     TO_PLAYER(*itr)->GetSession()->HandleStateChange(pkt);
  85.                     if ((*itr)->isPlayer())
  86.                         TO_PLAYER(*itr)->GetSession()->HandleStateChange(pkt);
  87.                     else
  88.                         TO_PLAYER(*itr)->SetSize(50);
  89.                 }
  90.                 break;
  91.  
  92.             case BUFF_ATK:
  93.                 sAmount = pType4->Attack;
  94.                 break;
  95.  
  96.             case BUFF_ATK_SPEED:
  97.                 sAmount = pType4->AttackSpeed;
  98.                 break;
  99.  
  100.             case BUFF_SPEED:
  101.                 sAmount = pType4->Speed;
  102.                 break;
  103.  
  104.             case BUFF_STAT:
  105.                 sAdditionalAmount[STAT_STR] = pType4->Str;
  106.                 sAdditionalAmount[STAT_STA] = pType4->Sta;
  107.                 sAdditionalAmount[STAT_DEX] = pType4->Dex;
  108.                 sAdditionalAmount[STAT_INT] = pType4->Int;
  109.                 sAdditionalAmount[STAT_CHA] = pType4->Cha;
  110.                 bAmount = 5;
  111.                 break;
  112.  
  113.             case BUFF_RESIST:
  114.                 sAdditionalAmount[RESIST_FLAME-1] = pType4->FireR;
  115.                 sAdditionalAmount[RESIST_GLACIER-1] = pType4->ColdR;
  116.                 sAdditionalAmount[RESIST_LIGHTNING-1] = pType4->LightningR;
  117.                 sAdditionalAmount[RESIST_MAGIC-1] = pType4->MagicR;
  118.                 sAdditionalAmount[RESIST_CURSE-1] = pType4->DiseaseR;
  119.                 sAdditionalAmount[RESIST_POISON-1] = pType4->PoisonR;
  120.                 bAmount = 6;
  121.                 break;
  122.  
  123.             case BUFF_EVASION:
  124.                 sAmount = pType4->AvoidRate;
  125.                 sAdditionalAmount[0] = pType4->HitRate;
  126.                 bAmount = 1;
  127.                 break;
  128.  
  129.             case BUFF_UNK10:
  130.             case BUFF_XP:
  131.             case BUFF_UNK12:
  132.             case BUFF_WEAPON:
  133.             case BUFF_ARMOUR:
  134.                 // TO-DO
  135.                 break;
  136.         }
  137.  
  138.         bBuffType = (m_pSkillCaster == NULL ? BUFF_STATE_REMOVE : (m_pSkillCaster->GetNation() == (*itr)->GetNation() ? BUFF_STATE_CAST : BUFF_STATE_REMOVE));
  139.         (*itr)->AddType4Skill(pType4, sAmount, sAdditionalAmount, bAmount, bBuffType);
  140.        
  141.         //handle skill removal in unit
  142.         //sEventMgr.AddEvent(this, &Player::OnTimedRegen, 30, 0);
  143.         //((*itr),pType4->ID)
  144.         //void AddEvent(Class *obj, void (Class::*method)(P1,P2), P1 p1, P2 p2, uint32 time, uint32 repeats = 0)
  145.         //void AIInterface::RemoveType4Buff(Unit *pTarget, uint8 bBuff)
  146.         Log.Debug("AIInterface::ExecuteType4", "Adding callback to remove %u after %u seconds", pType4->BuffType, pType4->Duration);
  147.         sEventMgr.AddEvent(this, &AIInterface::RemoveType4Buff, (Unit*) *itr, (uint8)pType4->BuffType, pType4->Duration,0);
  148.        
  149.         if ((*itr)->isPlayer())
  150.         {
  151.             TO_PLAYER(*itr)->CalculateItemStats();
  152.             if (TO_PLAYER(*itr)->GetParty() != NULL && bBuffType    == BUFF_STATE_REMOVE)
  153.                 TO_PLAYER(*itr)->GetParty()->SendStatusChange((*itr), 2, 1);
  154.         }
  155.  
  156.         if (pSkill->Type2 == 0 || pSkill->Type2 == 4)
  157.             SendSkill((*itr), SKILL_EFFECT, pSkill->ID, m_sData1, 1);
  158.  
  159.         continue;
  160.  
  161. fail_return:
  162.         if (pSkill->Type2 == 4)
  163.             SendSkill((*itr));
  164.  
  165.         if (m_pSkillCaster != NULL)
  166.             SendSkill((*itr), SKILL_FAIL, m_nSkillID, 0, 0, 0, 0, 0, 0);
  167.  
  168.         bResult = 1;
  169.     }
  170.  
  171.     AddSkillDelay(pSkill);
  172. }
Add Comment
Please, Sign In to add comment