void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: ai->CastSpell(PLAGUE_STRIKE); return; } // ------- Non Duel combat ---------- //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob // DK Attacks: Unholy, Frost & Blood // damage spells ai->SetInFront( pTarget );//<--- Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); Pet *pet = m_bot->GetPet(); float dist = m_bot->GetDistance( pTarget ); std::ostringstream out; switch (SpellSequence) { case SPELL_DK_UNHOLY: if (UNHOLY_PRESENCE > 0) (!m_bot->HasAura(UNHOLY_PRESENCE, 0) && !m_bot->HasAura(BLOOD_PRESENCE, 0) && !m_bot->HasAura(FROST_PRESENCE, 0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot)); // check for BONE_SHIELD in combat if (BONE_SHIELD > 0) (!m_bot->HasAura(BONE_SHIELD, 0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, 0) && ai->CastSpell (BONE_SHIELD, *m_bot)); if (ARMY_OF_THE_DEAD > 0 && ai->GetAttackerCount()>=5 && LastSpellUnholyDK < 1) { ai->CastSpell(ARMY_OF_THE_DEAD); out << " summoning Army of the Dead!"; if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, 0)) ai->SetIgnoreUpdateTime(7); SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, 0) && LastSpellUnholyDK < 2) { ai->CastSpell(PLAGUE_STRIKE, *pTarget); out << " Plague Strike"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, 0) && LastSpellUnholyDK < 3) { ai->CastSpell(DEATH_GRIP, *pTarget); out << " Death Grip"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (DEATH_COIL > 0 && LastSpellUnholyDK < 4 && ai->GetRunicPower() >= 40) { ai->CastSpell(DEATH_COIL, *pTarget); out << " Death Coil"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, 0) && LastSpellUnholyDK < 5) { ai->CastSpell(DEATH_STRIKE, *pTarget); out << " Death Strike"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, 0) && LastSpellUnholyDK < 6) { ai->CastSpell(UNHOLY_BLIGHT); out << " Unholy Blight"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (SCOURGE_STRIKE > 0 && LastSpellUnholyDK < 7) { ai->CastSpell(SCOURGE_STRIKE, *pTarget); out << " Scourge Strike"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, 0) && LastSpellUnholyDK < 8) { ai->CastSpell(DEATH_AND_DECAY); out << " Death and Decay"; ai->SetIgnoreUpdateTime(1); SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, 0) && !pTarget->HasAura(SUMMON_GARGOYLE, 0) && LastSpellUnholyDK < 9 && ai->GetRunicPower() >= 60) { ai->CastSpell(SUMMON_GARGOYLE, *pTarget); out << " summoning Gargoyle"; ai->SetIgnoreUpdateTime(2); SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (CORPSE_EXPLOSION > 0 && dist <= ATTACK_DISTANCE && LastSpellUnholyDK < 10) { ai->CastSpell(CORPSE_EXPLOSION, *pTarget); out << " Corpse Explosion"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, 0) && LastSpellUnholyDK < 11 && ai->GetRunicPower() >= 20) { ai->CastSpell(ANTI_MAGIC_SHELL, *m_bot); out << " Anti-Magic Shell"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (ANTI_MAGIC_ZONE > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, 0) && LastSpellUnholyDK < 12) { ai->CastSpell(ANTI_MAGIC_ZONE, *m_bot); out << " Anti-Magic Zone"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if(( !pet ) && (RAISE_DEAD > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, 0) && LastSpellUnholyDK < 13)) { ai->CastSpell(RAISE_DEAD); out << " summoning Ghoul"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if(( pet ) && (GHOUL_FRENZY > 0 && pVictim == pet && !pet->HasAura(GHOUL_FRENZY, 0) && LastSpellUnholyDK < 14)) { ai->CastSpell(GHOUL_FRENZY, *pet); out << " casting Ghoul Frenzy on pet"; SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } else if (LastSpellUnholyDK > 15) { LastSpellUnholyDK = 0; SpellSequence = SPELL_DK_FROST; break; } LastSpellUnholyDK = 0; case SPELL_DK_FROST: if (FROST_PRESENCE > 0) (!m_bot->HasAura(FROST_PRESENCE, 0) && !m_bot->HasAura(BLOOD_PRESENCE, 0) && !m_bot->HasAura(UNHOLY_PRESENCE, 0) && ai->CastSpell (FROST_PRESENCE, *m_bot)); if (DEATHCHILL > 0) (!m_bot->HasAura(DEATHCHILL, 0) && !m_bot->HasAura(KILLING_MACHINE, 0) && ai->CastSpell (DEATHCHILL, *m_bot)); else if (KILLING_MACHINE > 0) (!m_bot->HasAura(KILLING_MACHINE, 0) && !m_bot->HasAura(DEATHCHILL, 0) && ai->CastSpell (KILLING_MACHINE, *m_bot)); if (ICY_TOUCH > 0 && !pTarget->HasAura(ICY_TOUCH, 0) && LastSpellFrostDK < 1) { ai->CastSpell(ICY_TOUCH, *pTarget); out << " Icy Touch"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (OBLITERATE > 0 && LastSpellFrostDK < 2) { ai->CastSpell(OBLITERATE, *pTarget); out << " Obliterate"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (FROST_STRIKE > 0 && LastSpellFrostDK < 3 && ai->GetRunicPower() >= 40) { ai->CastSpell(FROST_STRIKE, *pTarget); out << " Frost Strike"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (HOWLING_BLAST > 0 && ai->GetAttackerCount()>=3 && LastSpellFrostDK < 4) { ai->CastSpell(HOWLING_BLAST, *pTarget); out << " Howling Blast"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (CHAINS_OF_ICE > 0 && !pTarget->HasAura(CHAINS_OF_ICE, 0) && LastSpellFrostDK < 5) { ai->CastSpell(CHAINS_OF_ICE, *pTarget); out << " Chains of Ice"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (RUNE_STRIKE > 0 && LastSpellFrostDK < 6 && ai->GetRunicPower() >= 20) { ai->CastSpell(RUNE_STRIKE, *pTarget); out << " Rune Strike"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (ICY_CLUTCH > 0 && !pTarget->HasAura(ICY_CLUTCH, 0) && LastSpellFrostDK < 7) { ai->CastSpell(ICY_CLUTCH, *pTarget); out << " Icy Clutch"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (ICEBOUND_FORTITUDE > 0 && ai->GetHealthPercent() < 50 && pVictim == m_bot && !m_bot->HasAura(ICEBOUND_FORTITUDE, 0) && LastSpellFrostDK < 8 && ai->GetRunicPower() >= 20) { ai->CastSpell(ICEBOUND_FORTITUDE, *m_bot); out << " Icebound Fortitude"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (MIND_FREEZE > 0 && pTarget->IsNonMeleeSpellCasted(true) && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 9 && ai->GetRunicPower() >= 20) { ai->CastSpell(MIND_FREEZE, *pTarget); out << " Mind Freeze"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (HUNGERING_COLD > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 10 && ai->GetRunicPower() >= 40) { ai->CastSpell(HUNGERING_COLD, *pTarget); out << " Hungering Cold"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (EMPOWER_WEAPON > 0 && ai->GetRunicPower() < 20 && LastSpellFrostDK < 11) { ai->CastSpell(EMPOWER_WEAPON, *m_bot); out << " Empower Rune Weapon"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (UNBREAKABLE_ARMOR > 0 && !m_bot->HasAura(UNBREAKABLE_ARMOR, 0) && ai->GetHealthPercent() < 70 && pVictim == m_bot && LastSpellFrostDK < 12) { ai->CastSpell(UNBREAKABLE_ARMOR, *m_bot); out << " Unbreakable Armor"; SpellSequence = SPELL_DK_BLOOD; LastSpellFrostDK = LastSpellFrostDK +1; break; } else if (LastSpellFrostDK > 13) { LastSpellFrostDK = 0; SpellSequence = SPELL_DK_BLOOD; break; } LastSpellFrostDK = 0; case SPELL_DK_BLOOD: if (BLOOD_PRESENCE > 0) (!m_bot->HasAura(BLOOD_PRESENCE, 0) && !m_bot->HasAura(UNHOLY_PRESENCE, 0) && !m_bot->HasAura(FROST_PRESENCE, 0) && ai->CastSpell (BLOOD_PRESENCE, *m_bot)); if (MARK_OF_BLOOD > 0 && !pTarget->HasAura(MARK_OF_BLOOD, 0) && LastSpellBloodDK < 1) { ai->CastSpell(MARK_OF_BLOOD, *pTarget); out << " Mark of Blood"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (BLOOD_STRIKE > 0 && LastSpellBloodDK < 2) { ai->CastSpell(BLOOD_STRIKE, *pTarget); out << " Blood Strike"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (PESTILENCE > 0 && dist <= ATTACK_DISTANCE && ai->GetAttackerCount()>=3 && LastSpellBloodDK < 3) { ai->CastSpell(PESTILENCE, *pTarget); out << " Pestilence"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (STRANGULATE > 0 && !pTarget->HasAura(STRANGULATE, 0) && LastSpellBloodDK < 4) { ai->CastSpell(STRANGULATE, *pTarget); out << " Strangulate"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (BLOOD_BOIL > 0 && ai->GetAttackerCount()>=5 && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 5) { ai->CastSpell(BLOOD_BOIL, *pTarget); out << " Blood Boil"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (HEART_STRIKE > 0 && LastSpellBloodDK < 6) { ai->CastSpell(HEART_STRIKE, *pTarget); out << " Heart Strike"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (VAMPIRIC_BLOOD > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, 0) && LastSpellBloodDK < 7) { ai->CastSpell(VAMPIRIC_BLOOD, *m_bot); out << " Vampiric Blood"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (RUNE_TAP > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, 0) && LastSpellBloodDK < 8) { ai->CastSpell(RUNE_TAP, *m_bot); out << " Rune Tap"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (HYSTERIA > 0 && ai->GetHealthPercent() > 25 && !m_bot->HasAura(HYSTERIA, 0) && LastSpellBloodDK < 9) { ai->CastSpell(HYSTERIA, *m_bot); out << " Hysteria"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (DANCING_WEAPON > 0 && !m_bot->HasAura(DANCING_WEAPON, 0) && ai->GetRunicPower() >= 60 && LastSpellBloodDK < 10) { ai->CastSpell(DANCING_WEAPON, *pTarget); out << " summoning Dancing Rune Weapon"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (DARK_COMMAND > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !pTarget->HasAura(DARK_COMMAND, 0) && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 11) { ai->CastSpell(DARK_COMMAND, *pTarget); out << " Dark Command"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if(( pet ) && (DEATH_PACT > 0 && ai->GetHealthPercent() < 50 && LastSpellBloodDK < 12 && ai->GetRunicPower() >= 40)) { ai->CastSpell(DEATH_PACT, *pet); out << " Death Pact (sacrifice pet)"; SpellSequence = SPELL_DK_UNHOLY; LastSpellBloodDK = LastSpellBloodDK +1; break; } else if (LastSpellBloodDK > 13) { LastSpellBloodDK = 0; SpellSequence = SPELL_DK_UNHOLY; break; } else { LastSpellBloodDK = 0; SpellSequence = SPELL_DK_UNHOLY; } } if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( out.str().c_str() ); } // end DoNextCombatManeuver
void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) { if (!pTarget || pTarget->isDead()) return; PlayerbotAI *ai = GetAI(); if (!ai) return; Player *m_bot = GetPlayerBot(); if (!m_bot || m_bot->isDead()) return; Unit *pVictim = pTarget->getVictim(); Unit *m_tank = FindMainTankInRaid(GetMaster()); if (!m_tank && m_bot->GetGroup() && GetMaster()->GetGroup() != m_bot->GetGroup()) { FindMainTankInRaid(m_bot); } if (!m_tank) { m_tank = m_bot; } uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); float pDist = m_bot->GetDistance(pTarget); uint8 pThreat = GetThreatPercent(pTarget); Pet *pet = m_bot->GetPet(); std::ostringstream out; if (!m_pulling) { m_role = BOT_ROLE_DPS_MELEE; #pragma region Choose Role/Presence // Choose Presence if (m_tank->GetGUID() == m_bot->GetGUID()) // Hey! I am Main Tank { if (CastSpell(FROST_PRESENCE,m_bot)) { m_role = BOT_ROLE_TANK; return; } } else if (isUnderAttack()) // I am under attack { if (pVictim && pVictim->GetGUID() == m_bot->GetGUID() && pDist <= 2) {} // My target is almost up to me, no need to search else //Have to select nearest target { Unit *curAtt = GetNearestAttackerOf(m_bot); if (curAtt && curAtt->GetGUID() != pTarget->GetGUID()) { m_bot->SetSelection(curAtt->GetGUID()); //ai->AddLootGUID(curAtt->GetGUID()); DoNextCombatManeuver(curAtt); //Restart new update to get variables fixed.. return; } } //my target is attacking me //if (m_bot->getRace() == (uint8) RACE_NIGHTELF && CastSpell(R_SHADOWMELD,m_bot) ) { return; } if (CastSpell(FROST_PRESENCE,m_bot)) { m_role = BOT_ROLE_OFFTANK; return; } } else if (TALENT_UNHOLY) { if (CastSpell(UNHOLY_PRESENCE,m_bot)) return; } else if (CastSpell(BLOOD_PRESENCE,m_bot)) return; #pragma endregion } // Cast CC breakers if any match found (does not work yet) // uint32 ccSpells[6] = { LICHBORNE, ICEBOUND_FORTITUDE, R_ESCAPE_ARTIST, R_EVERY_MAN_FOR_HIMSELF, R_WILL_OF_FORSAKEN, R_STONEFORM }; // if (castSelfCCBreakers(ccSpells)) { } //most of them dont have gcd TakePosition(pTarget); if (m_pulling) { if (GetAI()->CastSpell(DEATH_GRIP,pTarget)) { m_pulling = false; GetAI()->SetCombatOrder(ORDERS_NONE); GetAI()->Follow(*GetMaster()); GetAI()->SetIgnoreUpdateTime(2); if (m_bot->GetPet()) pet->SetReactState (REACT_DEFENSIVE); } return; } // If there's a cast stop if(m_bot->HasUnitState(UNIT_STATE_CASTING)) { return; } #pragma region Buff Heal Interrupt //Buff UP if (CastSpell(HORN_OF_WINTER,m_bot)) { return; } if (CastSpell(BONE_SHIELD,m_bot)) { return; } //HEAL UP && PROTECT UP if (ai->GetHealthPercent() < 80 && ai->GetHealthPercent() > 20 && CastSpell(VAMPIRIC_BLOOD,m_bot)) { } //NO GCD if (ai->GetHealthPercent() < 65 && CastSpell(RUNE_TAP,m_bot)) { } //NO GCD if (CanCast(DEATH_STRIKE,pTarget,true) && ai->GetHealthPercent() < 90 && (pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) ||pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) ) && CastSpell(DEATH_STRIKE,pTarget,false) ) {return;} if (m_bot->getRace() == (uint8) RACE_DWARF && ai->GetHealthPercent() < 75 && CastSpell(R_STONEFORM,m_bot)) { } //no gcd if (m_bot->getRace() == (uint8) RACE_DRAENEI && ai->GetHealthPercent() < 55 && CastSpell(R_GIFT_OF_NAARU,m_bot)) { return; } //no Gcd, but has cast if (pet && ai->GetHealthPercent() < 50 && CastSpell(DEATH_PACT,m_bot)) { return; } if (pet && ai->GetHealthPercent() < 60 && CastSpell(MARK_OF_BLOOD,pTarget)) { return; } if (ai->GetHealthPercent() < 65 && CastSpell(ICEBOUND_FORTITUDE,m_bot)) { } //No GCD if (ai->GetHealthPercent() < 65 && CastSpell(UNBREAKABLE_ARMOR,m_bot)) { return; } //Break spells being cast if (pTarget->IsNonMeleeSpellCasted(true)) { if (CastSpell(MIND_FREEZE,pTarget)) {} // No GCD if (CastSpell(STRANGULATE,pTarget)) { return; } if (m_bot->getRace() == (uint8) RACE_BLOODELF && pDist < 8 && CastSpell(R_ARCANE_TORRENT, pTarget)) { } //no gcd if (CastSpell(ANTI_MAGIC_ZONE,m_bot)) { return; } if (CastSpell(ANTI_MAGIC_SHELL,m_bot)) {} //NO GCD } //Catch if (pTarget->HasUnitMovementFlag(UNIT_FLAG_FLEEING)) { if (CastSpell(DEATH_GRIP,pTarget)) return; if (CastSpell(CHAINS_OF_ICE,pTarget)) return; } #pragma endregion #pragma region Taunt / Threat // if i am main tank, protect master by taunt if(m_tank->GetGUID() == m_bot->GetGUID()) { // Taunt if needed (Only for master) Unit *curAtt = GetAttackerOf(GetMaster()); if (curAtt && CastSpell(DARK_COMMAND, curAtt)) { } //No gcd // My target is not attacking me, taunt.. if (pVictim && pVictim->GetGUID() != m_bot->GetGUID() && CastSpell(DARK_COMMAND, pTarget) ) { } // No gcd } // If not in Frost Presence slow down due to threat if (pThreat > threatThreshold && !m_bot->HasAura(FROST_PRESENCE) && m_tank->GetGUID() != m_bot->GetGUID() && !isUnderAttack()) { if (m_tank->getVictim() && m_tank->getVictim()->GetGUID() != pTarget->GetGUID()) // I am attacking wrong target!! { m_bot->SetSelection(m_tank->getVictim()->GetGUID()); return; } else { return; } //DK has no threat reducing spells, just slow down } #pragma endregion #pragma region Dps //Dps up if (CastSpell(EMPOWER_WEAPON,m_bot)) {} //NO GCD if (ai->GetHealthPercent() > 90 && CastSpell(HYSTERIA,m_bot)) {} //NO GCD if (m_bot->getRace() == (uint8) RACE_TROLL && CastSpell(R_BERSERKING,m_bot)) {} //no GCD if (m_bot->getRace() == (uint8) RACE_ORC && CastSpell(R_BLOOD_FURY,m_bot)) {} //no GCD // Use up excess Runic Power if (ai->GetRunicPower() > 60 && CastSpell(FROST_STRIKE,pTarget)) { return; } else if (ai->GetRunicPower() > 60 && CastSpell(DEATH_COIL,pTarget,true,true,true)) { return; } if ((isUnderAttack() || ai->GetRunicPower() > 70) && CastSpell(RUNE_STRIKE,pTarget)) {} //Next attack spell // Build Diseases if (!pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) && CastSpell(ICY_TOUCH,pTarget)) { return; } if (!pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) && CastSpell(PLAGUE_STRIKE,pTarget)) { return; } // Use AOEs summons if (isUnderAttack(m_tank,4) && CastSpell(DEATH_AND_DECAY,pTarget)) { return; } if (isUnderAttack(m_tank,4) && CastSpell(HOWLING_BLAST,pTarget)) { return; } if (CanCast(PESTILENCE,pTarget,true) && isUnderAttack(m_tank,4) && (pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) && pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) ) && CastSpell(PESTILENCE,pTarget,false)) { return; } if (CanCast(BLOOD_BOIL,pTarget,true) && isUnderAttack(m_tank,4) && (pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) || pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) ) && CastSpell(BLOOD_BOIL,pTarget,false)) { return; } if (m_bot->getRace() == (uint8) RACE_TAUREN && pDist < 8 && CastSpell(R_WAR_STOMP, pTarget)) { return; } //no gcd but is cast if (isUnderAttack(m_tank,6) && CastSpell(ARMY_OF_THE_DEAD,m_bot)) { return; } if (isUnderAttack(m_tank,4) && CastSpell(SUMMON_GARGOYLE,pTarget)) { return; } //This should be somewhat different // Use standard damage spells if (CastSpell(HEART_STRIKE,pTarget,true,true)) { return; } if (CastSpell(BLOOD_STRIKE,pTarget)) { return; } if (TALENT_FROST && CastSpell(OBLITERATE,pTarget)) { return; } else if (TALENT_UNHOLY && CastSpell(SCOURGE_STRIKE,pTarget)) { return; } else if (CastSpell(DEATH_STRIKE,pTarget)) { return; } #pragma endregion } // end DoNextCombatManeuver