void UpdateAI(const uint32 uiDiff) { if (!m_pInstance || !UpdateVictim()) return; if (m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED) != 0) me->SetHealth(m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED)); else me->SetHealth(1); switch (m_uiStage) { case 0: break; case 1: // Vortex if (m_uiSpecialAbilityTimer <= uiDiff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_VORTEX); DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; case 2: // Shield+Pact if (m_uiSpecialAbilityTimer <= uiDiff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_PACT); DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); DoCast(me, m_uiShieldSpellId); DoCast(me, m_uiTwinPactSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; default: break; } if (m_uiSpikeTimer <= uiDiff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*IN_MILLISECONDS; } else m_uiSpikeTimer -= uiDiff; if (IsHeroic() && m_uiTouchTimer <= uiDiff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId)) if (pTarget->isAlive()) { me->AddAura(m_uiTouchSpellId,pTarget); m_uiTouchTimer = 20*IN_MILLISECONDS; } else m_uiTouchTimer = 0; else if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0,200,true)) if (pTarget->isAlive() && !pTarget->HasAura(m_uiMyEssenceSpellId)) { me->AddAura(m_uiTouchSpellId,pTarget); m_uiTouchTimer = 20*IN_MILLISECONDS; } else m_uiTouchTimer = 0; } else m_uiTouchTimer -= uiDiff; if (m_uiColorballsTimer <= uiDiff) { if (m_uiWaveCount >= 2) { SummonColorballs(12); m_uiWaveCount = 0; } else { SummonColorballs(2); m_uiWaveCount++; } m_uiColorballsTimer = 15*IN_MILLISECONDS; } else m_uiColorballsTimer -= uiDiff; if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } else m_uiBerserkTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!m_instance || !UpdateVictim()) return; if (m_instance->GetData(DATA_HEALTH_TWIN_SHARED) != 0) me->SetHealth(m_instance->GetData(DATA_HEALTH_TWIN_SHARED)); else if (me->getVictim()) { me->LowerPlayerDamageReq(me->GetMaxHealth()); me->getVictim()->Kill(me); return; } else me->SetHealth(1); if (m_uiSpecialAbilityTimer <= uiDiff) { me->InterruptNonMeleeSpells(false); if (urand(0, 1)) { DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); std::list<Unit*> targetList; SelectTargetList(targetList, 100, SELECT_TARGET_NEAREST, 150.0f, true, m_uiMyEssenceSpellId); if (!targetList.empty()) { for (std::list<Unit* >::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) { Unit* pUnit = (*itr); if (pUnit && pUnit->isAlive()) { if (!pUnit->HasAura(SPELL_POWER_UP)) pUnit->AddAura(SPELL_POWER_UP, pUnit); if (Aura* aur = pUnit->GetAura(SPELL_POWER_UP)) { if (aur->GetStackAmount() + 30 > 100) { pUnit->RemoveAurasDueToSpell(SPELL_POWER_UP); pUnit->CastSpell(pUnit, me->GetEntry() == NPC_LIGHTBANE ? SPELL_EMPOWERED_LIGHT : SPELL_EMPOWERED_DARK, true); } else { if (urand(0, 100) <= 15) pUnit->CastSpell(pUnit, SPELL_SPEED, true); aur->SetStackAmount(aur->GetStackAmount() + 30); } } } } } } else { DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); if (Creature* Sister = GetSister()) Sister->CastSpell(Sister, SPELL_TWIN_POWER, true); DoCast(me, m_uiShieldSpellId); me->CastCustomSpell(me, m_uiTwinPactSpellId, 0, 0, 0, false); } m_uiSpecialAbilityTimer = 80000; } else m_uiSpecialAbilityTimer -= uiDiff; if (m_uiSpikeTimer <= uiDiff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*1000; } else m_uiSpikeTimer -= uiDiff; if (IsHeroic()) { if (m_uiTouchTimer <= uiDiff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, m_uiOtherEssenceSpellId)) { if (!target->HasAura(m_uiTouchSpellId)) { target->AddAura(m_uiTouchSpellId, target); } } m_uiTouchTimer = urand(10, 15)*1000; } else m_uiTouchTimer -= uiDiff; } if (m_uiColorballsTimer <= uiDiff) { if (m_uiWaveCount >= 2) { SummonColorballs(15); m_uiWaveCount = 0; } else { SummonColorballs(2); m_uiWaveCount++; } m_uiColorballsTimer = 15*1000; } else m_uiColorballsTimer -= uiDiff; if (m_uiBerserkTimer <= uiDiff) { if (!m_bIsBerserk) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } } else m_uiBerserkTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!m_pInstance || !UpdateVictim()) return; switch (m_uiStage) { case 0: break; case 1: // Vortex if (m_uiSpecialAbilityTimer <= uiDiff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_VORTEX); DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; case 2: // Shield+Pact if (m_uiSpecialAbilityTimer <= uiDiff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_PACT); DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); DoCast(me, m_uiShieldSpellId); DoCast(me, m_uiTwinPactSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; default: break; } if (m_uiSpikeTimer <= uiDiff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*IN_MILLISECONDS; } else m_uiSpikeTimer -= uiDiff; if (IsHeroic() && m_uiTouchTimer <= uiDiff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId)) me->CastCustomSpell(m_uiTouchSpellId, SPELLVALUE_MAX_TARGETS, 1, pTarget, false); m_uiTouchTimer = urand(10, 15)*IN_MILLISECONDS; } else m_uiTouchTimer -= uiDiff; if (m_uiColorballsTimer <= uiDiff) { if (m_uiWaveCount >= 2) { SummonColorballs(12); m_uiWaveCount = 0; } else { SummonColorballs(2); m_uiWaveCount++; } m_uiColorballsTimer = 15*IN_MILLISECONDS; } else m_uiColorballsTimer -= uiDiff; if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } else m_uiBerserkTimer -= uiDiff; DoMeleeAttackIfReady(); }