void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // This needs to be checked only on heroic if (!m_bIsRegularMode && m_uiCheckPermafrostTimer) { if (m_uiCheckPermafrostTimer <= uiDiff) { ThreatList playerList = m_creature->getThreatManager().getThreatList(); for (ThreatList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) { if (Player* pTarget = m_creature->GetMap()->GetPlayer((*itr)->getUnitGuid())) { Aura* pAuraIntenseCold = pTarget->GetAura(SPELL_PERMAFROST_AURA_H, EFFECT_INDEX_2); if (pAuraIntenseCold) { if (pAuraIntenseCold->GetStackAmount() > MAX_PERMAFROST_STACK) { if (m_pInstance) m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_DOESNT_GO_ELEVEN, false); m_uiCheckPermafrostTimer = 0; return; } } } } m_uiCheckPermafrostTimer = 1000; } else m_uiCheckPermafrostTimer -= uiDiff; } // Do nothing more while moving if (m_uiPhase == PHASE_MOVEMENT) return; // Casted in every phase if (m_uiThrowSaroniteTimer < uiDiff) { // TODO - only target players? if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { if (DoCastSpellIfCan(pTarget, SPELL_THROW_SARONITE) == CAST_OK) { DoScriptText(EMOTE_THROW_SARONITE, m_creature, pTarget); m_uiThrowSaroniteTimer = 16000; } } } else m_uiThrowSaroniteTimer -= uiDiff; switch (m_uiPhase) { case PHASE_NO_ENCHANTMENT: { if (m_creature->GetHealthPercent() < 66.0f) { DoCastSpellIfCan(m_creature, SPELL_THUNDERING_STOMP, CAST_INTERRUPT_PREVIOUS); SetCombatMovement(false); m_creature->GetMotionMaster()->MoveJump(aGarfrostMoveLocs[0][0], aGarfrostMoveLocs[0][1], aGarfrostMoveLocs[0][2], 3 * m_creature->GetSpeed(MOVE_RUN), 10.0f, PHASE_BLADE_ENCHANTMENT); m_uiPhase = PHASE_MOVEMENT; // Stop further action return; } break; } case PHASE_BLADE_ENCHANTMENT: { if (m_creature->GetHealthPercent() < 33.0f) { DoCastSpellIfCan(m_creature, SPELL_THUNDERING_STOMP, CAST_INTERRUPT_PREVIOUS); SetCombatMovement(false); m_creature->GetMotionMaster()->MoveJump(aGarfrostMoveLocs[1][0], aGarfrostMoveLocs[1][1], aGarfrostMoveLocs[1][2], 3 * m_creature->GetSpeed(MOVE_RUN), 10.0f, PHASE_MACE_ENCHANTMENT); m_uiPhase = PHASE_MOVEMENT; // Stop further action return; } if (m_uiChillingWaveTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CHILLING_WAVE) == CAST_OK) m_uiChillingWaveTimer = 14000; } else m_uiChillingWaveTimer -= uiDiff; break; } case PHASE_MACE_ENCHANTMENT: { if (m_uiDeepFreezeTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { if (DoCastSpellIfCan(pTarget, SPELL_DEEP_FREEZE) == CAST_OK) { DoScriptText(EMOTE_DEEP_FREEZE, m_creature, pTarget); m_uiDeepFreezeTimer = 20000; } } } else m_uiDeepFreezeTimer -= uiDiff; break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // This needs to be checked only on heroic if (!m_bIsRegularMode) { if (uiCheckIntenseColdTimer < uiDiff) { ThreatList playerList = m_creature->GetThreatManager().getThreatList(); for (ThreatList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) { if (Player* pTarget = m_creature->GetMap()->GetPlayer((*itr)->getUnitGuid())) { Aura* pAuraIntenseCold = pTarget->GetAura(SPELL_INTENSE_COLD_AURA, EFFECT_INDEX_0); if (pAuraIntenseCold) { if (pAuraIntenseCold->GetStackAmount() > MAX_INTENSE_COLD_STACK) { if (m_pInstance) m_pInstance->SetData(TYPE_INTENSE_COLD_FAILED, pTarget->GetGUIDLow()); } } } } uiCheckIntenseColdTimer = 1000; } else uiCheckIntenseColdTimer -= uiDiff; } if (!m_bIsEnraged && m_creature->GetHealthPercent() < 25.0f) { if (!m_creature->IsNonMeleeSpellCasted(false)) { m_bIsEnraged = true; DoScriptText(SAY_ENRAGE, m_creature); DoCastSpellIfCan(m_creature, SPELL_ENRAGE); } } if (uiCrystalChainTimer < uiDiff) { if (!m_creature->IsNonMeleeSpellCasted(false)) { if (m_bIsRegularMode) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1)) { if (Player* pPlayer = pTarget->GetCharmerOrOwnerPlayerOrPlayerItself()) DoCastSpellIfCan(pPlayer, SPELL_CRYSTAL_CHAINS); uiCrystalChainTimer = 30000; } } else { if (Unit* pSource = m_creature->getVictim()) { uiCrystalChainTimer = 15000; Player* pPlayer = pSource->GetCharmerOrOwnerPlayerOrPlayerItself(); if (!pPlayer) return; if (Group* pGroup = pPlayer->GetGroup()) { for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next()) { if (Player* pMember = pRef->getSource()) { if (pMember->IsAlive() && pMember->IsWithinDistInMap(m_creature, 50.0f)) m_creature->CastSpell(pMember, SPELL_CRYSTAL_CHAINS, true); } } } else m_creature->CastSpell(pPlayer, SPELL_CRYSTAL_CHAINS, false); } } } } else uiCrystalChainTimer -= uiDiff; if (uiTailSweepTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TAIL_SWEEP) == CAST_OK) uiTailSweepTimer = urand(2500, 7500); } else uiCrystalChainTimer -= uiDiff; if (uiCrystalfireBreathTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_CRYSTALFIRE_BREATH : SPELL_CRYSTALFIRE_BREATH_H) == CAST_OK) uiCrystalfireBreathTimer = urand(15000, 20000); } else uiCrystalfireBreathTimer -= uiDiff; if (!m_bIsRegularMode) { if (uiCrystallizeTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_CRYSTALLIZE) == CAST_OK) { uiCrystallizeTimer = urand(15000, 25000); DoScriptText(SAY_CRYSTAL_NOVA, m_creature); } } else uiCrystallizeTimer -= uiDiff; } DoMeleeAttackIfReady(); }