void UpdateAI(const uint32 uiDiff) override { // Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // spell will target dragons, if they are still alive at 35% if (!m_bIsBerserk && m_creature->GetHealthPercent() < 35.0f) { if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK) { DoScriptText(SAY_SARTHARION_BERSERK, m_creature); m_bIsBerserk = true; } } // soft enrage if (!m_bIsSoftEnraged && m_creature->GetHealthPercent() <= 10.0f) { // TODO m_bIsSoftEnraged = true; } // hard enrage if (!m_bIsHardEnraged) { if (m_uiEnrageTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_PYROBUFFET, CAST_TRIGGERED) == CAST_OK) m_bIsHardEnraged = true; } else m_uiEnrageTimer -= uiDiff; } // flame tsunami if (m_uiFlameTsunamiTimer < uiDiff) { SendFlameTsunami(); m_uiFlameTsunamiTimer = 30000; } else m_uiFlameTsunamiTimer -= uiDiff; // flame breath if (m_uiFlameBreathTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_FLAME_BREATH : SPELL_FLAME_BREATH_H) == CAST_OK) { DoScriptText(SAY_SARTHARION_BREATH, m_creature); m_uiFlameBreathTimer = urand(25000, 35000); } } else m_uiFlameBreathTimer -= uiDiff; // Tail Sweep if (m_uiTailSweepTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_TAIL_LASH : SPELL_TAIL_LASH_H) == CAST_OK) m_uiTailSweepTimer = urand(15000, 20000); } else m_uiTailSweepTimer -= uiDiff; // Cleave if (m_uiCleaveTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE) == CAST_OK) m_uiCleaveTimer = urand(7000, 10000); } else m_uiCleaveTimer -= uiDiff; // Lavas Strike if (m_uiLavaStrikeTimer < uiDiff) { if (m_pInstance) { if (Creature* pCyclone = m_creature->GetMap()->GetCreature(m_pInstance->SelectRandomFireCycloneGuid())) pCyclone->CastSpell(pCyclone, SPELL_CYCLONE_AURA_STRIKE, true); switch (urand(0, 5)) { case 0: DoScriptText(SAY_SARTHARION_SPECIAL_1, m_creature); break; case 1: DoScriptText(SAY_SARTHARION_SPECIAL_2, m_creature); break; case 2: DoScriptText(SAY_SARTHARION_SPECIAL_3, m_creature); break; case 3: DoScriptText(SAY_SARTHARION_SPECIAL_4, m_creature); break; } } m_uiLavaStrikeTimer = 30000; } else m_uiLavaStrikeTimer -= uiDiff; // call tenebron if (!m_bHasCalledTenebron) { if (m_uiTenebronTimer < uiDiff) { CallDragon(NPC_TENEBRON); m_bHasCalledTenebron = true; } else m_uiTenebronTimer -= uiDiff; } // call shadron if (!m_bHasCalledShadron) { if (m_uiShadronTimer < uiDiff) { CallDragon(NPC_SHADRON); m_bHasCalledShadron = true; } else m_uiShadronTimer -= uiDiff; } // call vesperon if (!m_bHasCalledVesperon) { if (m_uiVesperonTimer < uiDiff) { CallDragon(NPC_VESPERON); m_bHasCalledVesperon = true; } else m_uiVesperonTimer -= uiDiff; } DoMeleeAttackIfReady(); EnterEvadeIfOutOfCombatArea(uiDiff); }
void UpdateAI(const uint32 uiDiff) { //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; //spell will target dragons, if they are still alive at 35% if (!m_bIsBerserk && m_creature->GetHealthPercent() < 35.0f) { DoScriptText(SAY_SARTHARION_BERSERK, m_creature); DoCastSpellIfCan(m_creature, SPELL_BERSERK); m_bIsBerserk = true; } //soft enrage if (!m_bIsSoftEnraged && m_creature->GetHealthPercent() <= 10.0f) { // TODO m_bIsSoftEnraged = true; } // hard enrage if (!m_bIsHardEnraged) { if (m_uiEnrageTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_PYROBUFFET, CAST_TRIGGERED); m_bIsHardEnraged = true; } else m_uiEnrageTimer -= uiDiff; } // flame tsunami if (m_uiFlameTsunamiTimer < uiDiff) { SendFlameTsunami(); m_uiFlameTsunamiTimer = 30000; } else m_uiFlameTsunamiTimer -= uiDiff; // flame breath if (m_uiFlameBreathTimer < uiDiff) { DoScriptText(SAY_SARTHARION_BREATH, m_creature); DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_FLAME_BREATH : SPELL_FLAME_BREATH_H); m_uiFlameBreathTimer = urand(25000, 35000); } else m_uiFlameBreathTimer -= uiDiff; // Tail Sweep if (m_uiTailSweepTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_TAIL_LASH : SPELL_TAIL_LASH_H); m_uiTailSweepTimer = urand(15000, 20000); } else m_uiTailSweepTimer -= uiDiff; // Cleave if (m_uiCleaveTimer < uiDiff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE); m_uiCleaveTimer = urand(7000, 10000); } else m_uiCleaveTimer -= uiDiff; // Lavas Strike if (m_uiLavaStrikeTimer < uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { DoCastSpellIfCan(pTarget, SPELL_LAVA_STRIKE); switch(urand(0, 15)) { case 0: DoScriptText(SAY_SARTHARION_SPECIAL_1, m_creature); break; case 1: DoScriptText(SAY_SARTHARION_SPECIAL_2, m_creature); break; case 2: DoScriptText(SAY_SARTHARION_SPECIAL_3, m_creature); break; } } m_uiLavaStrikeTimer = urand(5000, 20000); } else m_uiLavaStrikeTimer -= uiDiff; // call tenebron if (!m_bHasCalledTenebron && m_uiTenebronTimer < uiDiff) { CallDragon(DATA_TENEBRON); m_bHasCalledTenebron = true; } else m_uiTenebronTimer -= uiDiff; // call shadron if (!m_bHasCalledShadron && m_uiShadronTimer < uiDiff) { CallDragon(DATA_SHADRON); m_bHasCalledShadron = true; } else m_uiShadronTimer -= uiDiff; // call vesperon if (!m_bHasCalledVesperon && m_uiVesperonTimer < uiDiff) { CallDragon(DATA_VESPERON); m_bHasCalledVesperon = true; } else m_uiVesperonTimer -= uiDiff; DoMeleeAttackIfReady(); EnterEvadeIfOutOfCombatArea(uiDiff); }