void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Berserk if (m_uiBerserkTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK) { DoScriptText(SAY_BERSERK, m_creature); m_uiBerserkTimer = 10 * MINUTE * IN_MILLISECONDS; } } else m_uiBerserkTimer -= uiDiff; switch(m_uiPhase) { case PHASE_GROUND: { // Health Check if (m_creature->GetHealthPercent() <= 30.0f) { m_creature->CastSpell(m_creature, SPELL_MYSTIC_BUFFET, true); m_uiPhase = PHASE_THREE; DoScriptText(SAY_PHASE_3, m_creature); m_uiFrostBeaconTimer = 10000; m_uiIceTombTimer = 15000; return; } // Cleave if (m_uiCleaveTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE) == CAST_OK) m_uiCleaveTimer = urand(5000, 15000); } else m_uiCleaveTimer -= uiDiff; // Tail Smash if (m_uiTailSmashTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TAIL_SMASH) == CAST_OK) m_uiTailSmashTimer = urand(10000, 20000); } else m_uiTailSmashTimer -= uiDiff; // Frost Breath if (m_uiFrostBreathTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_FROST_BREATH) == CAST_OK) m_uiFrostBreathTimer = urand(15000, 20000); } else m_uiFrostBreathTimer -= uiDiff; // Unchained Magic if (m_uiUnchainedMagicTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_UNCHAINED_MAGIC) == CAST_OK) { m_uiUnchainedMagicTimer = urand(40000, 60000); DoScriptText(SAY_UNCHAINED_MAGIC, m_creature); } } else m_uiUnchainedMagicTimer -= uiDiff; // Icy Grip if (m_uiIcyGripTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_ICY_GRIP) == CAST_OK) { m_uiIcyGripTimer = 35000; DoScriptText(SAY_BLISTERING_COLD, m_creature); } } else m_uiIcyGripTimer -= uiDiff; // Blistering Cold if (m_uiBlisteringColdTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BLISTERING_COLD) == CAST_OK) m_uiBlisteringColdTimer = 35000; } else m_uiBlisteringColdTimer -= uiDiff; // Phase 2 (air) if (m_uiPhaseTimer <= uiDiff) { m_uiPhaseTimer = 35000; m_uiPhase = PHASE_FLYING; DoScriptText(SAY_TAKEOFF, m_creature); // fly to the air point SetCombatMovement(false); m_creature->SetLevitate(true); m_creature->SetByteValue(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_UNK_2); m_creature->GetMotionMaster()->MovePoint(POINT_AIR, SindragosaLoc[1].x, SindragosaLoc[1].y, SindragosaLoc[1].z, false); } else m_uiPhaseTimer -= uiDiff; break; } case PHASE_FLYING: // wait for arrival or evade after 60seconds if (m_uiFlyingTimer <= uiDiff) { m_uiFlyingTimer = 60000; m_creature->AI()->EnterEvadeMode(); return; } else m_uiFlyingTimer -= uiDiff; return; case PHASE_AIR: { // Ice Tombs if (m_uiIceTombTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_ICE_TOMB) == CAST_OK) m_uiIceTombTimer = 40000; } else m_uiIceTombTimer -= uiDiff; // Frost Bomb if (m_uiFrostBombTimer <= uiDiff) { DoFrostBomb(); m_uiFrostBombTimer = 6000; } else m_uiFrostBombTimer -= uiDiff; // Phase One (ground) if (m_uiPhaseTimer <= uiDiff) { m_uiPhase = PHASE_FLYING; m_uiPhaseTimer = 42000; // fly to the ground point m_creature->GetMotionMaster()->MovePoint(POINT_LAND, SindragosaLoc[0].x, SindragosaLoc[0].y, SindragosaLoc[0].z, false); } else m_uiPhaseTimer -= uiDiff; return; } case PHASE_THREE: { // Frost Beacon if (m_uiFrostBeaconTimer <= uiDiff) { if (Unit *pVictim = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1, SPELL_FROST_BEACON, SELECT_FLAG_PLAYER)) { if (DoCastSpellIfCan(pVictim, SPELL_FROST_BEACON) == CAST_OK) m_uiFrostBeaconTimer = 10000; } } else m_uiFrostBeaconTimer -= uiDiff; // Ice Tomb if (m_uiIceTombTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_ICE_TOMB) == CAST_OK) m_uiIceTombTimer = 10000; } else m_uiIceTombTimer -= uiDiff; // Cleave if (m_uiCleaveTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE) == CAST_OK) m_uiCleaveTimer = urand(5000, 15000); } else m_uiCleaveTimer -= uiDiff; // Tail Smash if (m_uiTailSmashTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TAIL_SMASH) == CAST_OK) m_uiTailSmashTimer = urand(10000, 20000); } else m_uiTailSmashTimer -= uiDiff; // Frost Breath if (m_uiFrostBreathTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_FROST_BREATH) == CAST_OK) m_uiFrostBreathTimer = urand(15000, 20000); } else m_uiFrostBreathTimer -= uiDiff; // Unchained Magic if (m_uiUnchainedMagicTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_UNCHAINED_MAGIC) == CAST_OK) m_uiUnchainedMagicTimer = urand(40000, 60000); } else m_uiUnchainedMagicTimer -= uiDiff; // Icy Grip if (m_uiIcyGripTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_ICY_GRIP) == CAST_OK) m_uiIcyGripTimer = 35000; } else m_uiIcyGripTimer -= uiDiff; // Blistering Cold if (m_uiBlisteringColdTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BLISTERING_COLD) == CAST_OK) m_uiBlisteringColdTimer = 35000; } else m_uiBlisteringColdTimer -= uiDiff; break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Berserk if (m_uiBerserkTimer) { if (m_uiBerserkTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK) { DoScriptText(SAY_BERSERK, m_creature); m_uiBerserkTimer = 0; } } else m_uiBerserkTimer -= uiDiff; } switch (m_uiPhase) { case SINDRAGOSA_PHASE_THREE: { // Ice Tomb if (m_uiIceTombSingleTimer <= uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1, SPELL_ICE_TOMB_SINGLE, SELECT_FLAG_PLAYER)) { if (DoCastSpellIfCan(pTarget, SPELL_ICE_TOMB) == CAST_OK) m_uiIceTombSingleTimer = 15000; } } else m_uiIceTombSingleTimer -= uiDiff; // no break } case SINDRAGOSA_PHASE_GROUND: { // Phase 1 only if (m_uiPhase == SINDRAGOSA_PHASE_GROUND) { // Health Check if (m_creature->GetHealthPercent() <= 30.0f) { if (DoCastSpellIfCan(m_creature, SPELL_MYSTIC_BUFFET) == CAST_OK) { m_uiPhase = SINDRAGOSA_PHASE_THREE; DoScriptText(SAY_PHASE_3, m_creature); } } // Phase 2 (air) if (m_uiPhaseTimer <= uiDiff) { m_uiPhaseTimer = 33000; DoScriptText(SAY_TAKEOFF, m_creature); SetCombatMovement(false); m_creature->GetMotionMaster()->MovePoint(SINDRAGOSA_POINT_GROUND_CENTER, SindragosaPosition[0][0], SindragosaPosition[0][1], SindragosaPosition[0][2], false); } else m_uiPhaseTimer -= uiDiff; } // Cleave if (m_uiCleaveTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE) == CAST_OK) m_uiCleaveTimer = urand(5000, 15000); } else m_uiCleaveTimer -= uiDiff; // Tail Smash if (m_uiTailSmashTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TAIL_SMASH) == CAST_OK) m_uiTailSmashTimer = urand(10000, 20000); } else m_uiTailSmashTimer -= uiDiff; // Frost Breath if (m_uiFrostBreathTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_FROST_BREATH) == CAST_OK) m_uiFrostBreathTimer = urand(15000, 20000); } else m_uiFrostBreathTimer -= uiDiff; // Unchained Magic if (m_uiUnchainedMagicTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_UNCHAINED_MAGIC) == CAST_OK) { m_uiUnchainedMagicTimer = urand(40000, 60000); DoScriptText(SAY_UNCHAINED_MAGIC, m_creature); } } else m_uiUnchainedMagicTimer -= uiDiff; // Icy Grip and Blistering Cold if (m_uiIcyGripTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_ICY_GRIP) == CAST_OK) { m_uiIcyGripTimer = 70000; DoScriptText(SAY_BLISTERING_COLD, m_creature); } } else m_uiIcyGripTimer -= uiDiff; DoMeleeAttackIfReady(); break; } case SINDRAGOSA_PHASE_FLYING_TO_GROUND: case SINDRAGOSA_PHASE_FLYING_TO_AIR: break; case SINDRAGOSA_PHASE_AIR: { // Phase One (ground) if (m_uiPhaseTimer <= uiDiff) { m_uiPhase = SINDRAGOSA_PHASE_FLYING_TO_GROUND; m_uiPhaseTimer = 42000; m_creature->GetMotionMaster()->MovePoint(SINDRAGOSA_POINT_AIR_CENTER, SindragosaPosition[1][0], SindragosaPosition[1][1], SindragosaPosition[1][2], false); } else m_uiPhaseTimer -= uiDiff; // Frost Bomb if (m_uiFrostBombTimer <= uiDiff) { DoFrostBomb(); m_uiFrostBombTimer = 6000; } else m_uiFrostBombTimer -= uiDiff; break; } } // evade on top of the stairs EnterEvadeIfOutOfCombatArea(uiDiff); }