Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void AIInterface::ExecuteType4(Skill *pSkill)
- {
- SkillType4 *pType4 = NULL;
- WorldPacket pkt;
- UnitSet affectedUnitList;
- uint16 sDuration;
- int16 sAmount = 0;
- uint16 sAdditionalAmount[6];
- uint8 bAmount = 0, bResult = 1;
- BuffState bBuffType;
- pType4 = SkillType4Storage.LookupEntry(pSkill->ID);
- if (pType4 == NULL)
- return;
- if (GetSkillTarget() == NULL)
- {
- for (std::set<Object*>::iterator itr = GetUnit()->GetInRangeSetBegin(); itr != GetUnit()->GetInRangeSetEnd(); itr++)
- {
- if (CheckUnitSkillRegion(pSkill, TO_UNIT(*itr), pType4->Radius) && TO_UNIT(*itr)->isAlive() && ((*itr)->isPlayer() && !TO_PLAYER(*itr)->isBlinking()))
- affectedUnitList.insert(TO_UNIT(*itr));
- }
- if (affectedUnitList.size() == 0)
- {
- SendSkillFailed();
- return;
- }
- }
- else
- {
- affectedUnitList.insert(GetSkillTarget());
- }
- if (pSkill->Mp != 0 && GetUnit()->GetMana() < pSkill->Mp)
- {
- SendSkillFailed();
- return;
- }
- if (GetUnit()->isPlayer() && pSkill->Mp > 0)
- TO_PLAYER(GetUnit())->ChangeMana(-(pSkill->Mp));
- else
- GetUnit()->ChangeMana(-(pSkill->Mp));
- for (UnitSet::iterator itr = affectedUnitList.begin(); itr != affectedUnitList.end(); itr++)
- {
- if (m_pTarget == NULL && (*itr)->hasType4Buff(pType4->BuffType))
- {
- bResult = 0;
- goto fail_return;
- }
- sDuration = pType4->Duration;
- memset(&sAdditionalAmount, NULL, 6*2);
- bAmount = 0;
- switch (pType4->BuffType)
- {
- case BUFF_HP:
- sAmount = pType4->MaxHP;
- break;
- case BUFF_AC:
- sAmount = pType4->AC;
- break;
- case BUFF_SIZE:
- pkt << uint8(3);
- // Bezoar
- if (pSkill->ID == 490034)
- {
- pkt << uint8(ABNORMAL_GIANT);
- if ((*itr)->isPlayer())
- TO_PLAYER(*itr)->GetSession()->HandleStateChange(pkt);
- else
- TO_NPC(*itr)->SetSize(200);
- }
- // Rice cake
- else if (pSkill->ID == 490034)
- {
- pkt << uint8(ABNORMAL_DWARF);
- TO_PLAYER(*itr)->GetSession()->HandleStateChange(pkt);
- if ((*itr)->isPlayer())
- TO_PLAYER(*itr)->GetSession()->HandleStateChange(pkt);
- else
- TO_PLAYER(*itr)->SetSize(50);
- }
- break;
- case BUFF_ATK:
- sAmount = pType4->Attack;
- break;
- case BUFF_ATK_SPEED:
- sAmount = pType4->AttackSpeed;
- break;
- case BUFF_SPEED:
- sAmount = pType4->Speed;
- break;
- case BUFF_STAT:
- sAdditionalAmount[STAT_STR] = pType4->Str;
- sAdditionalAmount[STAT_STA] = pType4->Sta;
- sAdditionalAmount[STAT_DEX] = pType4->Dex;
- sAdditionalAmount[STAT_INT] = pType4->Int;
- sAdditionalAmount[STAT_CHA] = pType4->Cha;
- bAmount = 5;
- break;
- case BUFF_RESIST:
- sAdditionalAmount[RESIST_FLAME-1] = pType4->FireR;
- sAdditionalAmount[RESIST_GLACIER-1] = pType4->ColdR;
- sAdditionalAmount[RESIST_LIGHTNING-1] = pType4->LightningR;
- sAdditionalAmount[RESIST_MAGIC-1] = pType4->MagicR;
- sAdditionalAmount[RESIST_CURSE-1] = pType4->DiseaseR;
- sAdditionalAmount[RESIST_POISON-1] = pType4->PoisonR;
- bAmount = 6;
- break;
- case BUFF_EVASION:
- sAmount = pType4->AvoidRate;
- sAdditionalAmount[0] = pType4->HitRate;
- bAmount = 1;
- break;
- case BUFF_UNK10:
- case BUFF_XP:
- case BUFF_UNK12:
- case BUFF_WEAPON:
- case BUFF_ARMOUR:
- // TO-DO
- break;
- }
- bBuffType = (m_pSkillCaster == NULL ? BUFF_STATE_REMOVE : (m_pSkillCaster->GetNation() == (*itr)->GetNation() ? BUFF_STATE_CAST : BUFF_STATE_REMOVE));
- (*itr)->AddType4Skill(pType4, sAmount, sAdditionalAmount, bAmount, bBuffType);
- //handle skill removal in unit
- //sEventMgr.AddEvent(this, &Player::OnTimedRegen, 30, 0);
- //((*itr),pType4->ID)
- //void AddEvent(Class *obj, void (Class::*method)(P1,P2), P1 p1, P2 p2, uint32 time, uint32 repeats = 0)
- //void AIInterface::RemoveType4Buff(Unit *pTarget, uint8 bBuff)
- Log.Debug("AIInterface::ExecuteType4", "Adding callback to remove %u after %u seconds", pType4->BuffType, pType4->Duration);
- sEventMgr.AddEvent(this, &AIInterface::RemoveType4Buff, (Unit*) *itr, (uint8)pType4->BuffType, pType4->Duration,0);
- if ((*itr)->isPlayer())
- {
- TO_PLAYER(*itr)->CalculateItemStats();
- if (TO_PLAYER(*itr)->GetParty() != NULL && bBuffType == BUFF_STATE_REMOVE)
- TO_PLAYER(*itr)->GetParty()->SendStatusChange((*itr), 2, 1);
- }
- if (pSkill->Type2 == 0 || pSkill->Type2 == 4)
- SendSkill((*itr), SKILL_EFFECT, pSkill->ID, m_sData1, 1);
- continue;
- fail_return:
- if (pSkill->Type2 == 4)
- SendSkill((*itr));
- if (m_pSkillCaster != NULL)
- SendSkill((*itr), SKILL_FAIL, m_nSkillID, 0, 0, 0, 0, 0, 0);
- bResult = 1;
- }
- AddSkillDelay(pSkill);
- }
Add Comment
Please, Sign In to add comment