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 PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: ai->CastSpell(MOONFIRE); return; } uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); ai->SetInFront( pTarget ); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); if (pVictim && ai->GetHealthPercent() >= 40 && GetMaster()->GetHealth() >= GetMaster()->GetMaxHealth()*0.4) { if (pVictim == m_bot) SpellSequence = DruidTank; } else if (pTarget->GetHealth() > pTarget->GetMaxHealth()*0.8 && pVictim) { if (pVictim != m_bot) SpellSequence = DruidSpell; } else if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.4) SpellSequence = DruidHeal; else SpellSequence = DruidCombat; switch (SpellSequence) { case DruidTank: // Its now a tank druid! //ai->TellMaster("DruidTank"); if( !m_bot->HasInArc(M_PI, pTarget)) { m_bot->SetInFront(pTarget); if (pVictim) pVictim->Attack(pTarget, true); } if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); } if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { ai->CastSpell (MOONKIN_FORM); } else if (DIRE_BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { ai->CastSpell (DIRE_BEAR_FORM); } else if (BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { ai->CastSpell (BEAR_FORM); } else if (DEMORALIZING_ROAR > 0 && m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !pTarget->HasAura(DEMORALIZING_ROAR, EFFECT_INDEX_0) && ai->GetRageAmount() >= 10) { ai->CastSpell(DEMORALIZING_ROAR, *pTarget); } if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) { ai->CastSpell(FAERIE_FIRE, *pTarget); DruidSpellCombat++; break; } else if (MOONFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); DruidSpellCombat++; break; } else if (ROOTS > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); DruidSpellCombat++; break; } else if (HURRICANE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetAttackerCount()>=5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { //ai->TellMaster("casting hurricane!"); ai->CastSpell(HURRICANE, *pTarget); ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; break; } else if (WRATH > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) { ai->CastSpell(WRATH, *pTarget); DruidSpellCombat++; break; } else if (INSECT_SWARM > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(INSECT_SWARM , *pTarget); DruidSpellCombat++; break; } else if (STARFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 7 && ai->GetManaPercent() >= 18) { ai->CastSpell(STARFIRE, *pTarget); DruidSpellCombat++; break; } else if (FORCE_OF_NATURE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { //ai->TellMaster("summoning treants."); ai->CastSpell(FORCE_OF_NATURE); DruidSpellCombat++; break; } else if (STARFALL > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); DruidSpellCombat++; break; } else if (BARKSKIN > 0 && pVictim == m_bot && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); DruidSpellCombat++; break; } else if (INNERVATE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); DruidSpellCombat++; break; } else if (MANA_REJUVENATION > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && DruidSpellCombat < 12 && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) { ai->CastSpell(MANA_REJUVENATION, *m_bot); DruidSpellCombat++; break; } else if (ENRAGE > 0 && m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, EFFECT_INDEX_0)) { ai->CastSpell(ENRAGE, *m_bot); DruidSpellCombat = DruidSpellCombat +2; break; } else if (SWIPE > 0 && m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 4 && ai->GetRageAmount()>=20) { ai->CastSpell(SWIPE, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } else if (MAUL > 0 && m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 6 && ai->GetRageAmount()>=15) { ai->CastSpell(MAUL, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } else if (BASH > 0 && m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0) && !pTarget->HasAura(BASH, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetRageAmount()>=10) { ai->CastSpell(BASH, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } else if (CHALLENGING_ROAR > 0 && m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0) && pVictim != m_bot && DruidSpellCombat < 10 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0) && ai->GetRageAmount()>=15) { ai->CastSpell(CHALLENGING_ROAR, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } else if (GROWL > 0 && m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0) && pVictim != m_bot && DruidSpellCombat < 12 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0)) { ai->CastSpell(GROWL, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } else if (DruidSpellCombat > 13) { DruidSpellCombat = 0; break; } else { DruidSpellCombat = 0; break; } break; case DruidSpell: //ai->TellMaster("DruidSpell"); if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(FAERIE_FIRE, *pTarget); DruidSpellCombat++; break; } else if (MOONFIRE > 0 && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); DruidSpellCombat++; break; } else if (ROOTS > 0 && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); DruidSpellCombat++; break; } else if (HURRICANE > 0 && ai->GetAttackerCount()>=5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { //ai->TellMaster("casting hurricane!"); ai->CastSpell(HURRICANE, *pTarget); ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; break; } else if (WRATH > 0 && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) { ai->CastSpell(WRATH, *pTarget); DruidSpellCombat++; break; } else if (INSECT_SWARM > 0 && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(INSECT_SWARM , *pTarget); DruidSpellCombat++; break; } else if (STARFIRE > 0 && DruidSpellCombat < 7 && ai->GetManaPercent() >= 18) { ai->CastSpell(STARFIRE, *pTarget); DruidSpellCombat++; break; } else if (FORCE_OF_NATURE > 0 && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { //ai->TellMaster("summoning treants."); ai->CastSpell(FORCE_OF_NATURE); DruidSpellCombat++; break; } else if (STARFALL > 0 && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); DruidSpellCombat++; break; } else if (BARKSKIN > 0 && pVictim == m_bot && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); DruidSpellCombat++; break; } else if (INNERVATE > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); DruidSpellCombat++; break; } else if (MANA_REJUVENATION > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 12 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) { ai->CastSpell(MANA_REJUVENATION, *m_bot); DruidSpellCombat++; break; } else if (DruidSpellCombat > 13) { DruidSpellCombat = 0; break; } else { DruidSpellCombat = 0; break; } break; case DruidHeal: //ai->TellMaster("DruidHeal"); if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } if (ai->GetHealthPercent() <= 40) { HealTarget (*m_bot, ai->GetHealthPercent()); break; } if (masterHP <= 40) { HealTarget (*GetMaster(), masterHP); break; } else { DruidSpellCombat = 0; break; } break; case DruidCombat: //ai->TellMaster("DruidCombat"); if( !m_bot->HasInArc(M_PI, pTarget)) { m_bot->SetInFront(pTarget); if (pVictim) pVictim->Attack(pTarget, true); } if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } if (CAT_FORM > 0 && !m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) ai->CastSpell (CAT_FORM); /* if (COWER > 0 && m_bot->GetComboPoints() == 1 && ai->GetEnergyAmount() >= 20) { ai->CastSpell(COWER); //ai->TellMaster("Cower"); }*/ if (MAIM > 0 && m_bot->GetComboPoints() >= 1 && pTarget->IsNonMeleeSpellCasted(true)) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("SpellPreventing Maim"); break; } if (RAKE > 0 && m_bot->GetComboPoints() <= 1 && ai->GetEnergyAmount() >= 40) { ai->CastSpell (RAKE, *pTarget); //ai->TellMaster("Rake"); break; } else if (CLAW > 0 && m_bot->GetComboPoints() <= 2 && ai->GetEnergyAmount() >= 45) { ai->CastSpell (CLAW, *pTarget); //ai->TellMaster("Claw"); break; } else if (MANGLE > 0 && m_bot->GetComboPoints() <= 3 && ai->GetEnergyAmount() >= 45) { ai->CastSpell (MANGLE, *pTarget); //ai->TellMaster("Mangle"); break; } else if (CLAW > 0 && m_bot->GetComboPoints() <= 4 && ai->GetEnergyAmount() >= 45) { ai->CastSpell (CLAW, *pTarget); //ai->TellMaster("Claw2"); break; } if (m_bot->GetComboPoints() == 5) { if (RIP > 0 && pTarget->getClass() == CLASS_ROGUE && ai->GetEnergyAmount() >= 30) { ai->CastSpell(RIP, *pTarget); //ai->TellMaster("Rogue Rip"); } else if (MAIM > 0 && pTarget->getClass() == CLASS_DRUID && ai->GetEnergyAmount() >= 35) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Druid Maim"); } else if (MAIM > 0 && pTarget->getClass() == CLASS_SHAMAN && ai->GetEnergyAmount() >= 35) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Shaman Maim"); } else if (MAIM > 0 && pTarget->getClass() == CLASS_WARLOCK && ai->GetEnergyAmount() >= 35) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Warlock Maim"); } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_HUNTER && ai->GetEnergyAmount() >= 35) { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Hunter Ferocious Bite"); } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_WARRIOR && ai->GetEnergyAmount() >= 35) { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Warrior Ferocious Bite"); } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_PALADIN && ai->GetEnergyAmount() >= 35) { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Paladin Ferocious Bite"); } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_DEATH_KNIGHT && ai->GetEnergyAmount() >= 25) { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("DK Ferocious Bite"); } else if (MAIM > 0 && pTarget->getClass() == CLASS_MAGE && ai->GetEnergyAmount() >= 35) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Mage Maim"); } else if (MAIM > 0 && pTarget->getClass() == CLASS_PRIEST && ai->GetEnergyAmount() >= 35) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Priest Maim"); } else if (MAIM > 0 && ai->GetEnergyAmount() >= 35) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Else Maim"); } break; } else { DruidSpellCombat = 0; break; } break; } } // end DoNextCombatManeuver
void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) { Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: if (HAMMER_OF_JUSTICE > 0) ai->CastSpell(HAMMER_OF_JUSTICE); return; } // damage spells ai->SetInFront( pTarget ); Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); float dist = m_bot->GetDistance( pTarget ); std::ostringstream out; //Shield master if low hp. uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) if (masterHP < 25 && HAND_OF_PROTECTION > 0 && !GetMaster()->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(HAND_OF_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0)) ai->CastSpell(HAND_OF_PROTECTION, *GetMaster()); // heal group inside combat, but do not heal if tank if( m_group && pVictim != m_bot ) // possible tank { Group::MemberSlotList const& groupSlot = m_group->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *m_groupMember = sObjectMgr.GetPlayer( itr->guid ); if( !m_groupMember || !m_groupMember->isAlive() ) continue; uint32 memberHP = m_groupMember->GetHealth()*100 / m_groupMember->GetMaxHealth(); if( memberHP < 40 && ai->GetManaPercent() >= 40 ) // do not heal bots without plenty of mana for master & self HealTarget( *m_groupMember, memberHP ); } } if (RIGHTEOUS_FURY > 0 && !m_bot->HasAura(RIGHTEOUS_FURY, EFFECT_INDEX_0)) ai->CastSpell (RIGHTEOUS_FURY, *m_bot); if (SHADOW_RESISTANCE_AURA > 0 && !m_bot->HasAura(SHADOW_RESISTANCE_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_WARLOCK) ai->CastSpell (SHADOW_RESISTANCE_AURA, *m_bot); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_WARRIOR) ai->CastSpell (DEVOTION_AURA, *m_bot); if (FIRE_RESISTANCE_AURA > 0 && !m_bot->HasAura(FIRE_RESISTANCE_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_MAGE) ai->CastSpell (FIRE_RESISTANCE_AURA, *m_bot); if (RETRIBUTION_AURA > 0 && !m_bot->HasAura(RETRIBUTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_PRIEST) ai->CastSpell (RETRIBUTION_AURA, *m_bot); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_SHAMAN) ai->CastSpell (DEVOTION_AURA, *m_bot); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_ROGUE) ai->CastSpell (DEVOTION_AURA, *m_bot); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_PALADIN) ai->CastSpell (DEVOTION_AURA, *m_bot); if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.4) SpellSequence = Healing; else SpellSequence = Combat; switch (SpellSequence) { case Combat: if (JUDGEMENT_OF_LIGHT > 0 && !pTarget->HasAura(JUDGEMENT_OF_LIGHT, EFFECT_INDEX_0) && CombatCounter < 1 && ai->GetManaPercent() >=5) { ai->CastSpell (JUDGEMENT_OF_LIGHT, *pTarget); out << " Judgement of Light"; CombatCounter++; break; } else if (SEAL_OF_COMMAND > 0 && !m_bot->HasAura(SEAL_OF_COMMAND, EFFECT_INDEX_0) && CombatCounter < 2 && ai->GetManaPercent() >= 14) { ai->CastSpell (SEAL_OF_COMMAND, *m_bot); out << " Seal of Command"; CombatCounter++; break; } else if (HAMMER_OF_JUSTICE > 0 && !pTarget->HasAura(HAMMER_OF_JUSTICE, EFFECT_INDEX_0) && CombatCounter < 3 && ai->GetManaPercent() >=3) { ai->CastSpell (HAMMER_OF_JUSTICE, *pTarget); out << " Hammer of Justice"; CombatCounter++; break; } else if (CRUSADER_STRIKE > 0 && CombatCounter < 4 && ai->GetManaPercent() >=5) { ai->CastSpell (CRUSADER_STRIKE, *pTarget); out << " Crusader Strike"; CombatCounter++; break; } else if (AVENGING_WRATH > 0 && CombatCounter < 5 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >=8) { ai->CastSpell (AVENGING_WRATH, *m_bot); out << " Avenging Wrath"; CombatCounter++; break; } else if (SACRED_SHIELD > 0 && CombatCounter < 6 && pVictim == m_bot && ai->GetHealthPercent() < 70 && !m_bot->HasAura(SACRED_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >=12) { ai->CastSpell (SACRED_SHIELD, *m_bot); out << " Sacred Shield"; CombatCounter++; break; } else if (DIVINE_STORM > 0 && CombatCounter < 7 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >=12) { ai->CastSpell (DIVINE_STORM, *pTarget); out << " Divine Storm"; CombatCounter++; break; } else if (HAMMER_OF_WRATH > 0 && CombatCounter < 8 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.20 && ai->GetManaPercent() >=14) { ai->CastSpell (HAMMER_OF_WRATH, *pTarget); out << " Hammer of Wrath"; CombatCounter++; break; } else if (HOLY_WRATH > 0 && CombatCounter < 9 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >=24) { ai->CastSpell (HOLY_WRATH, *pTarget); out << " Holy Wrath"; CombatCounter++; break; } else if (HAND_OF_SACRIFICE > 0 && pVictim == GetMaster() && !GetMaster()->HasAura(HAND_OF_SACRIFICE, EFFECT_INDEX_0) && CombatCounter < 10 && ai->GetManaPercent() >=6) { ai->CastSpell (HAND_OF_SACRIFICE, *GetMaster()); out << " Hand of Sacrifice"; CombatCounter++; break; } else if (DIVINE_PROTECTION > 0 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30 && CombatCounter < 11 && ai->GetManaPercent() >=3) { ai->CastSpell (DIVINE_PROTECTION, *m_bot); out << " Divine Protection"; CombatCounter++; break; } else if (RIGHTEOUS_DEFENSE > 0 && pVictim != m_bot && ai->GetHealthPercent() > 70 && CombatCounter < 12) { ai->CastSpell (RIGHTEOUS_DEFENSE, *pTarget); out << " Righteous Defense"; CombatCounter++; break; } else if (DIVINE_PLEA > 0 && !m_bot->HasAura(DIVINE_PLEA, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && CombatCounter < 13) { ai->CastSpell (DIVINE_PLEA, *m_bot); out << " Divine Plea"; CombatCounter++; break; } else if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && CombatCounter < 14) { ai->CastSpell (DIVINE_FAVOR, *m_bot); out << " Divine Favor"; CombatCounter++; break; } else if (CombatCounter > 15) { CombatCounter = 0; //ai->TellMaster("CombatCounter Reset"); break; } else { CombatCounter = 0; //ai->TellMaster("Counter = 0"); break; } case Healing: if (ai->GetHealthPercent() <= 40) { HealTarget (*m_bot, ai->GetHealthPercent()); out << " ...healing bot"; break; } if (masterHP <= 40) { HealTarget (*GetMaster(), masterHP); out << " ...healing master"; break; } else { CombatCounter = 0; //ai->TellMaster("Counter = 0"); break; } } if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( out.str().c_str() ); if (AVENGING_WRATH > 0 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) ai->CastSpell(AVENGING_WRATH, *m_bot); if (DIVINE_SHIELD > 0 && ai->GetHealthPercent() < 30 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !m_bot->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) ai->CastSpell(DIVINE_SHIELD, *m_bot); if (DIVINE_SACRIFICE > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !m_bot->HasAura(DIVINE_SACRIFICE, EFFECT_INDEX_0)) ai->CastSpell(DIVINE_SACRIFICE, *m_bot); }
void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: if (FIREBALL > 0) ai->CastSpell(FIREBALL); return; default: break; } // ------- Non Duel combat ---------- // Damage Spells (primitive example) Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); float dist = m_bot->GetCombatDistance(pTarget); switch (SpellSequence) { case SPELL_FROST: if (ICY_VEINS > 0 && !m_bot->HasAura(ICY_VEINS, EFFECT_INDEX_0) && LastSpellFrost < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(ICY_VEINS, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (FROSTBOLT > 0 && LastSpellFrost < 2 && !pTarget->HasAura(FROSTBOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) { ai->CastSpell(FROSTBOLT, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (FROST_WARD > 0 && LastSpellFrost < 3 && !m_bot->HasAura(FROST_WARD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 19) { ai->CastSpell(FROST_WARD, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (FROST_NOVA > 0 && LastSpellFrost < 4 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(FROST_NOVA, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_NOVA, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (ICE_LANCE > 0 && LastSpellFrost < 5 && ai->GetManaPercent() >= 7) { ai->CastSpell(ICE_LANCE, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (BLIZZARD > 0 && LastSpellFrost < 6 && ai->GetAttackerCount() >= 5 && ai->GetManaPercent() >= 89) { ai->CastSpell(BLIZZARD, *pTarget); ai->SetIgnoreUpdateTime(8); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (CONE_OF_COLD > 0 && LastSpellFrost < 7 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(CONE_OF_COLD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 35) { ai->CastSpell(CONE_OF_COLD, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (DEEP_FREEZE > 0 && LastSpellFrost < 8 && pTarget->HasAura(AURA_STATE_FROZEN, EFFECT_INDEX_0) && !pTarget->HasAura(DEEP_FREEZE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(DEEP_FREEZE, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (ICE_BARRIER > 0 && LastSpellFrost < 9 && pVictim == m_bot && !m_bot->HasAura(ICE_BARRIER, EFFECT_INDEX_0) && ai->GetHealthPercent() < 50 && ai->GetManaPercent() >= 30) { ai->CastSpell(ICE_BARRIER, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (SUMMON_WATER_ELEMENTAL > 0 && LastSpellFrost < 10 && ai->GetManaPercent() >= 16) { ai->CastSpell(SUMMON_WATER_ELEMENTAL); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (ICE_BLOCK > 0 && LastSpellFrost < 11 && pVictim == m_bot && !m_bot->HasAura(ICE_BLOCK, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30) { ai->CastSpell(ICE_BLOCK, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (COLD_SNAP > 0 && LastSpellFrost < 12) { ai->CastSpell(COLD_SNAP, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } LastSpellFrost = 0; //SpellSequence = SPELL_FIRE; //break; case SPELL_FIRE: if (FIRE_WARD > 0 && !m_bot->HasAura(FIRE_WARD, EFFECT_INDEX_0) && LastSpellFire < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(FIRE_WARD, *m_bot); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (COMBUSTION > 0 && !m_bot->HasAura(COMBUSTION, EFFECT_INDEX_0) && LastSpellFire < 2) { ai->CastSpell(COMBUSTION, *m_bot); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FIREBALL > 0 && LastSpellFire < 3 && ai->GetManaPercent() >= 23) { ai->CastSpell(FIREBALL, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FIRE_BLAST > 0 && LastSpellFire < 4 && ai->GetManaPercent() >= 25) { ai->CastSpell(FIRE_BLAST, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FLAMESTRIKE > 0 && LastSpellFire < 5 && ai->GetManaPercent() >= 35) { ai->CastSpell(FLAMESTRIKE, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (SCORCH > 0 && LastSpellFire < 6 && ai->GetManaPercent() >= 10) { ai->CastSpell(SCORCH, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (PYROBLAST > 0 && LastSpellFire < 7 && !pTarget->HasAura(PYROBLAST, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(PYROBLAST, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (BLAST_WAVE > 0 && LastSpellFire < 8 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 34) { ai->CastSpell(BLAST_WAVE, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (DRAGONS_BREATH > 0 && LastSpellFire < 9 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 37) { ai->CastSpell(DRAGONS_BREATH, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (LIVING_BOMB > 0 && LastSpellFire < 10 && !pTarget->HasAura(LIVING_BOMB, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(LIVING_BOMB, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FROSTFIRE_BOLT > 0 && LastSpellFire < 11 && !pTarget->HasAura(FROSTFIRE_BOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 14) { ai->CastSpell(FROSTFIRE_BOLT, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } LastSpellFire = 0; //SpellSequence = SPELL_ARCANE; //break; case SPELL_ARCANE: if (ARCANE_POWER > 0 && LastSpellArcane < 1 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_POWER, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_MISSILES > 0 && LastSpellArcane < 2 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_MISSILES, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_EXPLOSION > 0 && LastSpellArcane < 3 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_EXPLOSION, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (COUNTERSPELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && LastSpellArcane < 4 && ai->GetManaPercent() >= 9) { ai->CastSpell(COUNTERSPELL, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (SLOW > 0 && LastSpellArcane < 5 && !pTarget->HasAura(SLOW, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) { ai->CastSpell(SLOW, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_BARRAGE > 0 && LastSpellArcane < 6 && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_BARRAGE, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_BLAST > 0 && LastSpellArcane < 7 && ai->GetManaPercent() >= 8) { ai->CastSpell(ARCANE_BLAST, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (MIRROR_IMAGE > 0 && LastSpellArcane < 8 && ai->GetManaPercent() >= 10) { ai->CastSpell(MIRROR_IMAGE); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (MANA_SHIELD > 0 && LastSpellArcane < 9 && ai->GetHealthPercent() < 70 && pVictim == m_bot && !m_bot->HasAura(MANA_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(MANA_SHIELD, *m_bot); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else { LastSpellArcane = 0; SpellSequence = SPELL_FROST; } } } // end DoNextCombatManeuver
void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: ai->CastSpell(RAPTOR_STRIKE); return; default: break; } // ------- Non Duel combat ---------- // Hunter ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); // check for pet and heal if neccessary Pet *pet = m_bot->GetPet(); if ((pet) && (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f) && (PET_MEND > 0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot))) { ai->TellMaster("healing pet."); return; } else if ((pet) && (INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION, *m_bot))) //ai->TellMaster( "casting intimidation." ); // if pet has aggro :) return; // racial traits if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0)) ai->CastSpell(BLOOD_FURY, *m_bot); //ai->TellMaster( "Blood Fury." ); else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0)) ai->CastSpell(BERSERKING, *m_bot); //ai->TellMaster( "Berserking." ); // check if ranged combat is possible (set m_rangedCombat and switch auras float dist = m_bot->GetDistance(pTarget); if ((dist <= ATTACK_DISTANCE || !m_bot->GetUInt32Value(PLAYER_AMMO_ID)) && m_rangedCombat) { // switch to melee combat (target in melee range, out of ammo) m_rangedCombat = false; if (!m_bot->GetUInt32Value(PLAYER_AMMO_ID)) ai->TellMaster("Out of ammo!"); // become monkey (increases dodge chance)... (ASPECT_OF_THE_MONKEY > 0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); } else if (dist > ATTACK_DISTANCE && !m_rangedCombat) { // switch to ranged combat m_rangedCombat = true; // increase ranged attack power... (ASPECT_OF_THE_HAWK > 0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); } else if (m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0)) // check if we have hawk aspect in ranged combat (ASPECT_OF_THE_HAWK > 0 && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); else if (!m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0)) // check if we have monkey aspect in melee combat (ASPECT_OF_THE_MONKEY > 0 && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); // activate auto shot if (AUTO_SHOT > 0 && m_rangedCombat && !m_bot->FindCurrentSpellBySpellId(AUTO_SHOT)) ai->CastSpell(AUTO_SHOT, *pTarget); //ai->TellMaster( "started auto shot." ); else if (AUTO_SHOT > 0 && m_bot->FindCurrentSpellBySpellId(AUTO_SHOT)) m_bot->InterruptNonMeleeSpells(true, AUTO_SHOT); //ai->TellMaster( "stopped auto shot." ); // damage spells std::ostringstream out; if (m_rangedCombat) { out << "Case Ranged"; if (HUNTERS_MARK > 0 && ai->GetManaPercent() >= 3 && !pTarget->HasAura(HUNTERS_MARK, EFFECT_INDEX_0) && ai->CastSpell(HUNTERS_MARK, *pTarget)) out << " > Hunter's Mark"; else if (RAPID_FIRE > 0 && ai->GetManaPercent() >= 3 && !m_bot->HasAura(RAPID_FIRE, EFFECT_INDEX_0) && ai->CastSpell(RAPID_FIRE, *m_bot)) out << " > Rapid Fire"; else if (MULTI_SHOT > 0 && ai->GetManaPercent() >= 13 && ai->GetAttackerCount() >= 3 && ai->CastSpell(MULTI_SHOT, *pTarget)) out << " > Multi-Shot"; else if (ARCANE_SHOT > 0 && ai->GetManaPercent() >= 7 && ai->CastSpell(ARCANE_SHOT, *pTarget)) out << " > Arcane Shot"; else if (CONCUSSIVE_SHOT > 0 && ai->GetManaPercent() >= 6 && !pTarget->HasAura(CONCUSSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(CONCUSSIVE_SHOT, *pTarget)) out << " > Concussive Shot"; else if (EXPLOSIVE_SHOT > 0 && ai->GetManaPercent() >= 10 && !pTarget->HasAura(EXPLOSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_SHOT, *pTarget)) out << " > Explosive Shot"; else if (VIPER_STING > 0 && ai->GetManaPercent() >= 8 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(VIPER_STING, *pTarget)) out << " > Viper Sting"; else if (SERPENT_STING > 0 && ai->GetManaPercent() >= 13 && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SERPENT_STING, *pTarget)) out << " > Serpent Sting"; else if (SCORPID_STING > 0 && ai->GetManaPercent() >= 11 && !pTarget->HasAura(WYVERN_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SCORPID_STING, *pTarget)) out << " > Scorpid Sting"; else if (CHIMERA_SHOT > 0 && ai->GetManaPercent() >= 12 && ai->CastSpell(CHIMERA_SHOT, *pTarget)) out << " > Chimera Shot"; else if (VOLLEY > 0 && ai->GetManaPercent() >= 24 && ai->GetAttackerCount() >= 3 && ai->CastSpell(VOLLEY, *pTarget)) out << " > Volley"; else if (BLACK_ARROW > 0 && ai->GetManaPercent() >= 6 && !pTarget->HasAura(BLACK_ARROW, EFFECT_INDEX_0) && ai->CastSpell(BLACK_ARROW, *pTarget)) out << " > Black Arrow"; else if (AIMED_SHOT > 0 && ai->GetManaPercent() >= 12 && ai->CastSpell(AIMED_SHOT, *pTarget)) out << " > Aimed Shot"; else if (STEADY_SHOT > 0 && ai->GetManaPercent() >= 5 && ai->CastSpell(STEADY_SHOT, *pTarget)) out << " > Steady Shot"; else if (KILL_SHOT > 0 && ai->GetManaPercent() >= 7 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.2 && ai->CastSpell(KILL_SHOT, *pTarget)) out << " > Kill Shot!"; else out << " NONE!"; } else { out << "Case Melee"; if (RAPTOR_STRIKE > 0 && ai->GetManaPercent() >= 6 && ai->CastSpell(RAPTOR_STRIKE, *pTarget)) out << " > Raptor Strike"; else if (EXPLOSIVE_TRAP > 0 && ai->GetManaPercent() >= 27 && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_TRAP, *pTarget)) out << " > Explosive Trap"; else if (WING_CLIP > 0 && ai->GetManaPercent() >= 6 && !pTarget->HasAura(WING_CLIP, EFFECT_INDEX_0) && ai->CastSpell(WING_CLIP, *pTarget)) out << " > Wing Clip"; else if (IMMOLATION_TRAP > 0 && ai->GetManaPercent() >= 13 && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(IMMOLATION_TRAP, *pTarget)) out << " > Immolation Trap"; else if (MONGOOSE_BITE > 0 && ai->GetManaPercent() >= 4 && ai->CastSpell(MONGOOSE_BITE, *pTarget)) out << " > Mongoose Bite"; else if (FROST_TRAP > 0 && ai->GetManaPercent() >= 2 && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FROST_TRAP, *pTarget)) out << " > Frost Trap"; else if (ARCANE_TRAP > 0 && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(ARCANE_TRAP, *pTarget)) out << " > Arcane Trap"; else if (DETERRENCE > 0 && pVictim == m_bot && m_bot->GetHealth() < m_bot->GetMaxHealth() * 0.5 && !m_bot->HasAura(DETERRENCE, EFFECT_INDEX_0) && ai->CastSpell(DETERRENCE, *m_bot)) out << " > Deterrence"; else if (m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura(WAR_STOMP, EFFECT_INDEX_0) && ai->CastSpell(WAR_STOMP, *pTarget)) out << " > War Stomp"; else if (m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura(ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell(ARCANE_TORRENT, *pTarget)) out << " > Arcane Torrent"; else if (m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState(AURA_STATE_DEADLY_POISON) && ai->CastSpell(STONEFORM, *m_bot)) out << " > Stoneform"; else if (m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell(SHADOWMELD, *m_bot)) out << " > Shadowmeld"; else if (m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot)) out << " > Gift of the Naaru"; else if ((pet && !pet->getDeathState() != ALIVE) && (MISDIRECTION > 0 && pVictim == m_bot && !m_bot->HasAura(MISDIRECTION, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9 && ai->CastSpell(MISDIRECTION, *pet))) out << " > Misdirection"; // give threat to pet /*else if( FREEZING_TRAP>0 && ai->GetManaPercent()>=5 && !pTarget->HasAura(FREEZING_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FREEZING_TRAP,*pTarget) ) out << " > Freezing Trap"; // this can trap your bots too else if( BEAR_TRAP>0 && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(BEAR_TRAP,*pTarget) ) out << " > Bear Trap"; // this was just too annoying :) else if( DISENGAGE>0 && pVictim && ai->GetManaPercent()>=5 && ai->CastSpell(DISENGAGE,*pTarget) ) out << " > Disengage!"; // attempt to return to ranged combat*/ else out << " NONE!"; } if (ai->GetManager()->m_confDebugWhisper) ai->TellMaster(out.str().c_str()); } // end DoNextCombatManeuver
bool PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return false; Player* pMaster = ai->GetMaster(); if (!pMaster) return false; uint32 masterHP = pMaster->GetHealth() * 100 / pMaster->GetMaxHealth(); ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); if (pVictim && (ai->GetHealthPercent() >= 40) && (pMaster->GetHealth() >= pMaster->GetMaxHealth() * 0.4)) { if (pVictim == m_bot) SpellSequence = DruidTank; } else if (pVictim && (pTarget->GetHealth() > pTarget->GetMaxHealth() * 0.8)) { if (pVictim != m_bot) SpellSequence = DruidSpell; } else if (ai->GetHealthPercent() <= 40 || pMaster->GetHealth() <= pMaster->GetMaxHealth() * 0.4) SpellSequence = DruidHeal; else SpellSequence = DruidCombat; switch (SpellSequence) { case DruidTank: m_bot->SetInFront(pTarget); if (pVictim) pVictim->Attack(pTarget, true); if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(768); if ((MOONKIN_FORM > 0) && (!m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (ai->CastSpell(MOONKIN_FORM))) return true; if ((DIRE_BEAR_FORM > 0) && (!m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (!m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) && (ai->CastSpell(DIRE_BEAR_FORM))) return true; if ((BEAR_FORM > 0) && (!m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (!m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) && (!m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (ai->CastSpell(BEAR_FORM))) return true; if ((DEMORALIZING_ROAR > 0) && ((m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0))|| m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (!pTarget->HasAura(DEMORALIZING_ROAR, EFFECT_INDEX_0)) && (ai->GetRageAmount() >= 10) && (ai->CastSpell(DEMORALIZING_ROAR, *pTarget))) return true; if ((FAERIE_FIRE > 0) && (DruidSpellCombat < 1) && (!pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) && (ai->CastSpell(FAERIE_FIRE, *pTarget))) { DruidSpellCombat++; return true; } if ((MOONFIRE > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 2) && (!pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 24) && (ai->CastSpell(MOONFIRE, *pTarget))) { DruidSpellCombat++; return true; } if ((ROOTS > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 3) && (!pTarget->HasAura(ROOTS, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 8) && (ai->CastSpell(ROOTS, *pTarget))) { DruidSpellCombat++; return true; } if ((HURRICANE > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (ai->GetAttackerCount() >= 5) && (DruidSpellCombat < 4) && (ai->GetManaPercent() >= 91) && (ai->CastSpell(HURRICANE, *pTarget))) { ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; return true; } if ((WRATH > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 5) && (ai->GetManaPercent() >= 13) && (ai->CastSpell(WRATH, *pTarget))) { DruidSpellCombat++; return true; } if ((INSECT_SWARM > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 6) && (!pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 9) && (ai->CastSpell(INSECT_SWARM , *pTarget))) { DruidSpellCombat++; return true; } if ((STARFIRE > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 7) && (ai->GetManaPercent() >= 18) && (ai->CastSpell(STARFIRE, *pTarget))) { DruidSpellCombat++; return true; } if ((FORCE_OF_NATURE > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 8) && (ai->GetManaPercent() >= 12) && (ai->CastSpell(FORCE_OF_NATURE))) { DruidSpellCombat++; return true; } if ((STARFALL > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STARFALL, EFFECT_INDEX_0)) && (ai->GetAttackerCount() >= 3) && (DruidSpellCombat < 9) && (ai->GetManaPercent() >= 39) && (ai->CastSpell(STARFALL, *pTarget))) { DruidSpellCombat++; return true; } if ((BARKSKIN > 0) && (pVictim == m_bot) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (ai->GetHealthPercent() < 75) && (DruidSpellCombat < 10) && (!m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) && (ai->CastSpell(BARKSKIN, *m_bot))) { DruidSpellCombat++; return true; } if ((INNERVATE > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (ai->GetManaPercent() < 50) && (DruidSpellCombat < 11) && (!m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) && (ai->CastSpell(INNERVATE, *m_bot))) { DruidSpellCombat++; return true; } if ((MANA_REJUVENATION > 0) && (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) && (ai->GetManaPercent() < 50) && (!m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) && (DruidSpellCombat < 12) && (!m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) && (ai->CastSpell(MANA_REJUVENATION, *m_bot))) { DruidSpellCombat++; return true; } if ((ENRAGE > 0) && ((m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0))|| m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 2) && (!m_bot->HasAura(ENRAGE, EFFECT_INDEX_0)) && (ai->CastSpell(ENRAGE, *m_bot))) { DruidSpellCombat++; DruidSpellCombat++; return true; } if ((SWIPE > 0) && ((m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0))|| m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 4) && (ai->GetRageAmount() >= 20) && (ai->CastSpell(SWIPE, *pTarget))) { DruidSpellCombat++; DruidSpellCombat++; return true; } if ((MAUL > 0) && ((m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0))|| m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (DruidSpellCombat < 6) && (ai->GetRageAmount() >= 15) && (ai->CastSpell(MAUL, *pTarget))) { DruidSpellCombat++; DruidSpellCombat++; return true; } if ((BASH > 0) && ((m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0))|| m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (!pTarget->HasAura(BASH, EFFECT_INDEX_0)) && (DruidSpellCombat < 8) && (ai->GetRageAmount() >= 10) && (ai->CastSpell(BASH, *pTarget))) { DruidSpellCombat++; DruidSpellCombat++; return true; } if ((CHALLENGING_ROAR > 0) && ((m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0))|| m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (pVictim != m_bot) && (DruidSpellCombat < 10) && (!pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0)) && (!pTarget->HasAura(GROWL, EFFECT_INDEX_0)) && (ai->GetRageAmount() >= 15) && (ai->CastSpell(CHALLENGING_ROAR, *pTarget))) { DruidSpellCombat++; DruidSpellCombat++; return true; } if ((GROWL > 0) && ((m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0))|| m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && (pVictim != m_bot) && (DruidSpellCombat < 12) && (!pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0)) && (!pTarget->HasAura(GROWL, EFFECT_INDEX_0)) && (ai->CastSpell(GROWL, *pTarget))) { DruidSpellCombat++; DruidSpellCombat++; return true; } DruidSpellCombat = 0; break; case DruidSpell: if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(768); if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(5487); if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(9634); if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(24858); if ((FAERIE_FIRE > 0) && (DruidSpellCombat < 1) && (!pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 8) && (ai->CastSpell(FAERIE_FIRE, *pTarget))) { DruidSpellCombat++; return true; } if ((MOONFIRE > 0) && (DruidSpellCombat < 2) && (!pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 24) && (ai->CastSpell(MOONFIRE, *pTarget))) { DruidSpellCombat++; return true; } if ((ROOTS > 0) && (DruidSpellCombat < 3) && (!pTarget->HasAura(ROOTS, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 8) && (ai->CastSpell(ROOTS, *pTarget))) { DruidSpellCombat++; return true; } if ((HURRICANE > 0) && (ai->GetAttackerCount() >= 5) && (DruidSpellCombat < 4) && (ai->GetManaPercent() >= 91) && (ai->CastSpell(HURRICANE, *pTarget))) { ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; return true; } if ((WRATH > 0) && (DruidSpellCombat < 5) && (ai->GetManaPercent() >= 13) && (ai->CastSpell(WRATH, *pTarget))) { DruidSpellCombat++; return true; } if ((INSECT_SWARM > 0) && (DruidSpellCombat < 6) && (!pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 9) && (ai->CastSpell(INSECT_SWARM , *pTarget))) { DruidSpellCombat++; return true; } if ((STARFIRE > 0) && (DruidSpellCombat < 7) && (ai->GetManaPercent() >= 18) && (ai->CastSpell(STARFIRE, *pTarget))) { DruidSpellCombat++; return true; } if ((FORCE_OF_NATURE > 0) && (DruidSpellCombat < 8) && (ai->GetManaPercent() >= 12) && (ai->CastSpell(FORCE_OF_NATURE))) { DruidSpellCombat++; return true; } if ((STARFALL > 0) && (!m_bot->HasAura(STARFALL, EFFECT_INDEX_0)) && (ai->GetAttackerCount() >= 3) && (DruidSpellCombat < 9) && (ai->GetManaPercent() >= 39) && (ai->CastSpell(STARFALL, *pTarget))) { DruidSpellCombat++; return true; } if ((BARKSKIN > 0) && (pVictim == m_bot) && (ai->GetHealthPercent() < 75) && (DruidSpellCombat < 10) && (!m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) && (ai->CastSpell(BARKSKIN, *m_bot))) { DruidSpellCombat++; return true; } if ((INNERVATE > 0) && (ai->GetManaPercent() < 50) && (DruidSpellCombat < 11) && (!m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) && (ai->CastSpell(INNERVATE, *m_bot))) { DruidSpellCombat++; return true; } if ((MANA_REJUVENATION > 0) && (ai->GetManaPercent() < 50) && (DruidSpellCombat < 12) && (!m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) && (ai->CastSpell(MANA_REJUVENATION, *m_bot))) { DruidSpellCombat++; return true; } DruidSpellCombat = 0; break; case DruidHeal: if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(768); if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(5487); if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(9634); if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(24858); if ((ai->GetHealthPercent() <= 40) && HealTarget(*m_bot, ai->GetHealthPercent())) return true; if ((masterHP <= 40) && HealTarget(*pMaster, masterHP)) return true; DruidSpellCombat = 0; break; case DruidCombat: m_bot->SetInFront(pTarget); if (pVictim) pVictim->Attack(pTarget, true); if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(5487); if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(9634); if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(24858); if ((CAT_FORM > 0) && (!m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) && (ai->CastSpell(CAT_FORM))) return true; if ((MAIM > 0) && (m_bot->GetComboPoints() >= 1) && (pTarget->IsNonMeleeSpellCasted(true)) && (ai->CastSpell(MAIM, *pTarget))) return true; if ((RAKE > 0) && (m_bot->GetComboPoints() <= 1) && (ai->GetEnergyAmount() >= 40) && (ai->CastSpell(RAKE, *pTarget))) return true; if ((CLAW > 0) && (m_bot->GetComboPoints() <= 2) && (ai->GetEnergyAmount() >= 45) && (ai->CastSpell(CLAW, *pTarget))) return true; if ((MANGLE > 0) && (m_bot->GetComboPoints() <= 3) && (ai->GetEnergyAmount() >= 45) && (ai->CastSpell(MANGLE, *pTarget))) return true; if ((CLAW > 0) && (m_bot->GetComboPoints() <= 4) && (ai->GetEnergyAmount() >= 45) && (ai->CastSpell(CLAW, *pTarget))) return true; if (m_bot->GetComboPoints() == 5) { if ((RIP > 0) && (pTarget->getClass() == CLASS_ROGUE) && (ai->GetEnergyAmount() >= 30) && (ai->CastSpell(RIP, *pTarget))) return true; if ((MAIM > 0) && (pTarget->getClass() == CLASS_DRUID) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(MAIM, *pTarget))) return true; if ((MAIM > 0) && (pTarget->getClass() == CLASS_SHAMAN) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(MAIM, *pTarget))) return true; if ((MAIM > 0) && (pTarget->getClass() == CLASS_WARLOCK) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(MAIM, *pTarget))) return true; if ((FEROCIOUS_BITE > 0) && (pTarget->getClass() == CLASS_HUNTER) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(FEROCIOUS_BITE, *pTarget))) return true; if ((FEROCIOUS_BITE > 0) && (pTarget->getClass() == CLASS_WARRIOR) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(FEROCIOUS_BITE, *pTarget))) return true; if ((FEROCIOUS_BITE > 0) && (pTarget->getClass() == CLASS_PALADIN) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(FEROCIOUS_BITE, *pTarget))) return true; if ((FEROCIOUS_BITE > 0) && (pTarget->getClass() == CLASS_DEATH_KNIGHT) && (ai->GetEnergyAmount() >= 25) && (ai->CastSpell(FEROCIOUS_BITE, *pTarget))) return true; if ((MAIM > 0) && (pTarget->getClass() == CLASS_MAGE) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(MAIM, *pTarget))) return true; if ((MAIM > 0) && (pTarget->getClass() == CLASS_PRIEST) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(MAIM, *pTarget))) return true; if ((MAIM > 0) && (ai->GetEnergyAmount() >= 35) && (ai->CastSpell(MAIM, *pTarget))) return true; } DruidSpellCombat = 0; break; } return false; }
void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_PVP_DUEL: if (FIREBALL > 0) ai->CastSpell(FIREBALL); return; } // ------- Non Duel combat ---------- //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob // Damage Spells (primitive example) Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); bool meleeReach = m_bot->CanReachWithMeleeAttack(pTarget); if (!meleeReach && ai->GetCombatStyle() != PlayerbotAI::COMBAT_RANGED) { // switch to ranged combat ai->SetCombatStyle(PlayerbotAI::COMBAT_RANGED); } if (SHOOT > 0 && ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED && !m_bot->FindCurrentSpellBySpellId(SHOOT)) ai->CastSpell(SHOOT, *pTarget); //ai->TellMaster( "started auto shot." ); else if (SHOOT > 0 && m_bot->FindCurrentSpellBySpellId(SHOOT)) m_bot->InterruptNonMeleeSpells(true, SHOOT); switch (SpellSequence) { case SPELL_FROST: if (ICY_VEINS > 0 && !m_bot->HasAura(ICY_VEINS, EFFECT_INDEX_0) && LastSpellFrost < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(ICY_VEINS, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (FROSTBOLT > 0 && LastSpellFrost < 2 && !pTarget->HasAura(FROSTBOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) { ai->CastSpell(FROSTBOLT, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (FROST_WARD > 0 && LastSpellFrost < 3 && !m_bot->HasAura(FROST_WARD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 19) { ai->CastSpell(FROST_WARD, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (FROST_NOVA > 0 && LastSpellFrost < 4 && meleeReach && !pTarget->HasAura(FROST_NOVA, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_NOVA, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (ICE_LANCE > 0 && LastSpellFrost < 5 && ai->GetManaPercent() >= 7) { ai->CastSpell(ICE_LANCE, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (BLIZZARD > 0 && LastSpellFrost < 6 && ai->GetAttackerCount() >= 5 && ai->GetManaPercent() >= 89) { ai->CastSpell(BLIZZARD, *pTarget); ai->SetIgnoreUpdateTime(8); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (CONE_OF_COLD > 0 && LastSpellFrost < 7 && meleeReach && !pTarget->HasAura(CONE_OF_COLD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 35) { ai->CastSpell(CONE_OF_COLD, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (DEEP_FREEZE > 0 && LastSpellFrost < 8 && pTarget->HasAura(AURA_STATE_FROZEN, EFFECT_INDEX_0) && !pTarget->HasAura(DEEP_FREEZE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(DEEP_FREEZE, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (ICE_BARRIER > 0 && LastSpellFrost < 9 && pVictim == m_bot && !m_bot->HasAura(ICE_BARRIER, EFFECT_INDEX_0) && ai->GetHealthPercent() < 50 && ai->GetManaPercent() >= 30) { ai->CastSpell(ICE_BARRIER, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (SUMMON_WATER_ELEMENTAL > 0 && LastSpellFrost < 10 && ai->GetManaPercent() >= 16) { ai->CastSpell(SUMMON_WATER_ELEMENTAL); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (ICE_BLOCK > 0 && LastSpellFrost < 11 && pVictim == m_bot && !m_bot->HasAura(ICE_BLOCK, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30) { ai->CastSpell(ICE_BLOCK, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } else if (COLD_SNAP > 0 && LastSpellFrost < 12) { ai->CastSpell(COLD_SNAP, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost + 1; break; } LastSpellFrost = 0; //SpellSequence = SPELL_FIRE; //break; case SPELL_FIRE: if (FIRE_WARD > 0 && !m_bot->HasAura(FIRE_WARD, EFFECT_INDEX_0) && LastSpellFire < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(FIRE_WARD, *m_bot); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (COMBUSTION > 0 && !m_bot->HasAura(COMBUSTION, EFFECT_INDEX_0) && LastSpellFire < 2) { ai->CastSpell(COMBUSTION, *m_bot); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FIREBALL > 0 && LastSpellFire < 3 && ai->GetManaPercent() >= 23) { ai->CastSpell(FIREBALL, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FIRE_BLAST > 0 && LastSpellFire < 4 && ai->GetManaPercent() >= 25) { ai->CastSpell(FIRE_BLAST, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FLAMESTRIKE > 0 && LastSpellFire < 5 && ai->GetManaPercent() >= 35) { ai->CastSpell(FLAMESTRIKE, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (SCORCH > 0 && LastSpellFire < 6 && ai->GetManaPercent() >= 10) { ai->CastSpell(SCORCH, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (PYROBLAST > 0 && LastSpellFire < 7 && !pTarget->HasAura(PYROBLAST, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(PYROBLAST, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (BLAST_WAVE > 0 && LastSpellFire < 8 && ai->GetAttackerCount() >= 3 && meleeReach && ai->GetManaPercent() >= 34) { ai->CastSpell(BLAST_WAVE, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (DRAGONS_BREATH > 0 && LastSpellFire < 9 && meleeReach && ai->GetManaPercent() >= 37) { ai->CastSpell(DRAGONS_BREATH, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (LIVING_BOMB > 0 && LastSpellFire < 10 && !pTarget->HasAura(LIVING_BOMB, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(LIVING_BOMB, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } else if (FROSTFIRE_BOLT > 0 && LastSpellFire < 11 && !pTarget->HasAura(FROSTFIRE_BOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 14) { ai->CastSpell(FROSTFIRE_BOLT, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire + 1; break; } LastSpellFire = 0; //SpellSequence = SPELL_ARCANE; //break; case SPELL_ARCANE: if (ARCANE_POWER > 0 && LastSpellArcane < 1 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_POWER, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_MISSILES > 0 && LastSpellArcane < 2 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_MISSILES, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_EXPLOSION > 0 && LastSpellArcane < 3 && ai->GetAttackerCount() >= 3 && meleeReach && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_EXPLOSION, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (COUNTERSPELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && LastSpellArcane < 4 && ai->GetManaPercent() >= 9) { ai->CastSpell(COUNTERSPELL, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (SLOW > 0 && LastSpellArcane < 5 && !pTarget->HasAura(SLOW, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) { ai->CastSpell(SLOW, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_BARRAGE > 0 && LastSpellArcane < 6 && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_BARRAGE, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_BLAST > 0 && LastSpellArcane < 7 && ai->GetManaPercent() >= 8) { ai->CastSpell(ARCANE_BLAST, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (MIRROR_IMAGE > 0 && LastSpellArcane < 8 && ai->GetManaPercent() >= 10) { ai->CastSpell(MIRROR_IMAGE); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else if (MANA_SHIELD > 0 && LastSpellArcane < 9 && ai->GetHealthPercent() < 70 && pVictim == m_bot && !m_bot->HasAura(MANA_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(MANA_SHIELD, *m_bot); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane + 1; break; } else { LastSpellArcane = 0; SpellSequence = SPELL_FROST; } } } // end DoNextCombatManeuver
void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: if (HEROIC_STRIKE > 0) ai->CastSpell(HEROIC_STRIKE); return; } // ------- Non Duel combat ---------- //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob // Damage Attacks ai->SetInFront( pTarget ); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); float fTargetDist = m_bot->GetDistance( pTarget ); PlayerbotAI::CombatOrderType co = ai->GetCombatOrder(); // decide what stance to use if( (co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(DEFENSIVE_STANCE,0) && ai->CastSpell(DEFENSIVE_STANCE) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Stance > Defensive" ); else if( !(co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(BATTLE_STANCE,0) && ai->CastSpell(BATTLE_STANCE) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Stance > Battle" ); // get spell sequence if( pTarget->IsNonMeleeSpellCasted(true) ) SpellSequence = WarriorSpellPreventing; else if( m_bot->HasAura( BATTLE_STANCE, 0 ) ) SpellSequence = WarriorBattle; else if( m_bot->HasAura( DEFENSIVE_STANCE, 0 ) ) SpellSequence = WarriorDefensive; else if( m_bot->HasAura( BERSERKER_STANCE, 0 ) ) SpellSequence = WarriorBerserker; // do shouts, berserker rage, etc... if( BERSERKER_RAGE>0 && !m_bot->HasAura( BERSERKER_RAGE, 0 ) && ai->CastSpell( BERSERKER_RAGE ) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Pre > Berseker Rage" ); else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, 0 ) && ai->CastSpell( DEMORALIZING_SHOUT ) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Pre > Demoralizing Shout" ); else if( BATTLE_SHOUT>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( BATTLE_SHOUT, 0 ) && ai->CastSpell( BATTLE_SHOUT ) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Pre > Battle Shout" ); std::ostringstream out; switch (SpellSequence) { case WarriorSpellPreventing: out << "Case Prevent"; if( SHIELD_BASH>0 && ai->GetRageAmount()>=10 && ai->CastSpell( SHIELD_BASH, *pTarget ) ) out << " > Shield Bash"; else if( PUMMEL>0 && ai->GetRageAmount()>=10 && ai->CastSpell( PUMMEL, *pTarget ) ) out << " > Pummel"; else if( SPELL_REFLECTION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( SPELL_REFLECTION, 0 ) && ai->CastSpell( SPELL_REFLECTION, *m_bot ) ) out << " > Spell Reflection"; else out << " > NONE"; break; case WarriorBattle: out << "Case Battle"; if( EXECUTE>0 && ai->GetRageAmount()>=15 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.2 && ai->CastSpell( EXECUTE, *pTarget ) ) out << " > Execute!"; else if( LAST_STAND>0 && !m_bot->HasAura( LAST_STAND, 0 ) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( LAST_STAND, *m_bot ) ) out << " > Last Stand!"; else if( BLOODRAGE>0 && ai->GetRageAmount()<50 && !m_bot->HasAura( BLOODRAGE, 0 ) && ai->CastSpell( BLOODRAGE, *m_bot ) ) out << " > Bloodrage"; else if( DEATH_WISH>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( DEATH_WISH, 0 ) && ai->CastSpell( DEATH_WISH, *m_bot ) ) out << " > Death Wish"; else if( RETALIATION>0 && pVictim == m_bot && ai->GetAttackerCount()>=2 && !m_bot->HasAura( RETALIATION, 0 ) && ai->CastSpell( RETALIATION, *m_bot ) ) out << " > Retaliation"; else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, 0 ) && ai->CastSpell( DEMORALIZING_SHOUT, *pTarget ) ) out << " > Demoralizing Shout"; else if( SWEEPING_STRIKES>0 && ai->GetRageAmount()>=30 && ai->GetAttackerCount()>=2 && !m_bot->HasAura( SWEEPING_STRIKES, 0 ) && ai->CastSpell( SWEEPING_STRIKES, *m_bot ) ) out << " > Sweeping Strikes!"; else if( BLADESTORM>0 && ai->GetRageAmount()>=25 && pVictim == m_bot && !m_bot->HasAura( BLADESTORM, 0 ) && ai->GetAttackerCount()>=3 && ai->CastSpell( BLADESTORM, *pTarget ) ) out << " > Bladestorm!"; else if( MORTAL_STRIKE>0 && ai->GetRageAmount()>=30 && !pTarget->HasAura( MORTAL_STRIKE, 0 ) && ai->CastSpell( MORTAL_STRIKE, *pTarget ) ) out << " > Mortal Strike"; else if( INTIMIDATING_SHOUT>0 && ai->GetRageAmount()>=25 && ai->GetAttackerCount()>5 && ai->CastSpell( INTIMIDATING_SHOUT, *pTarget ) ) out << " > Intimidating Shout"; else if( THUNDER_CLAP>0 && ai->GetRageAmount()>=20 && pVictim == m_bot && !pTarget->HasAura( THUNDER_CLAP, 0 ) && ai->CastSpell( THUNDER_CLAP, *pTarget ) ) out << " > Thunder Clap"; else if( ENRAGED_REGENERATION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( BERSERKER_RAGE, 0 ) && !m_bot->HasAura( ENRAGED_REGENERATION, 0 ) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( ENRAGED_REGENERATION, *m_bot ) ) out << " > Enraged Regeneration"; else if( SHOCKWAVE>0 && ai->GetRageAmount()>=15 && pVictim == m_bot && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( SHOCKWAVE, *pTarget ) ) out << " > Shockwave"; else if( REND>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( REND, 0 ) && ai->CastSpell( REND, *pTarget ) ) out << " > Rend"; else if( HAMSTRING>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( HAMSTRING, 0 ) && ai->CastSpell( HAMSTRING, *pTarget ) ) out << " > Hamstring"; else if( CHALLENGING_SHOUT>0 && ai->GetRageAmount()>=5 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, 0 ) && !pTarget->HasAura( CHALLENGING_SHOUT, 0 ) && ai->CastSpell( CHALLENGING_SHOUT, *pTarget ) ) out << " > Challenging Shout"; else if( BLOODTHIRST>0 && ai->GetRageAmount()>=20 && !m_bot->HasAura( BLOODTHIRST, 0 ) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.7 && ai->CastSpell( BLOODTHIRST, *pTarget ) ) out << " > Bloodthrist"; else if( CLEAVE>0 && ai->GetRageAmount()>=20 && ai->CastSpell( CLEAVE, *pTarget ) ) out << " > Cleave"; else if( HEROIC_STRIKE>0 && ai->GetRageAmount()>=15 && ai->CastSpell( HEROIC_STRIKE, *pTarget ) ) out << " > Heroic Strike"; else if( CONCUSSION_BLOW>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( CONCUSSION_BLOW, *pTarget ) ) out << " > Concussion Blow"; else if( SLAM>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SLAM, *pTarget ) ) out << " > Slam"; else if( PIERCING_HOWL>0 && ai->GetRageAmount()>=10 && ai->GetAttackerCount()>=3 && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( PIERCING_HOWL, *pTarget ) ) out << " > Piercing Howl"; else if( MOCKING_BLOW>0 && ai->GetRageAmount()>=10 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, 0 ) && !pTarget->HasAura( CHALLENGING_SHOUT, 0 ) && ai->CastSpell( MOCKING_BLOW, *pTarget ) ) out << " > Mocking Blow"; else if( OVERPOWER>0 && ai->GetRageAmount()>=5 && ai->CastSpell( OVERPOWER, *pTarget ) ) out << " > Overpower"; else if( SUNDER_ARMOR>0 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) out << " > Sunder Armor"; else if( SHATTERING_THROW>0 && !pTarget->HasAura( SHATTERING_THROW, 0 ) && ai->CastSpell( SHATTERING_THROW, *pTarget ) ) out << " > Shattering Throw"; else if( HEROIC_THROW>0 && ai->CastSpell( HEROIC_THROW, *pTarget ) ) out << " > Heroic Throw"; else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( WAR_STOMP, *pTarget ) ) out << " > War Stomp"; else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) out << " > Every Man for Himself"; else if( m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( WILL_OF_THE_FORSAKEN, *m_bot ) ) out << " > Will of the Forsaken"; else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM, *m_bot ) ) out << " > Stoneform"; else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) out << " > Escape Artist"; else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, 0 ) && ai->CastSpell( SHADOWMELD, *m_bot ) ) out << " > Shadowmeld"; else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, 0 ) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) out << " > Blood Fury"; else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, 0 ) && ai->CastSpell( BERSERKING, *m_bot ) ) out << " > Berserking"; else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, 0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot) ) out << " > Gift of the Naaru"; else out << " > NONE"; break; case WarriorDefensive: out << "Case Defensive"; if( DISARM>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( DISARM, 0 ) && ai->CastSpell( DISARM, *pTarget ) ) out << " > Disarm"; else if( SUNDER_ARMOR>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) out << " > Sunder Armor"; else if( REVENGE>0 && ai->GetRageAmount()>=5 && ai->CastSpell( REVENGE, *pTarget ) ) out << " > Revenge"; else if( SHIELD_BLOCK>0 && !m_bot->HasAura( SHIELD_BLOCK, 0 ) && ai->CastSpell( SHIELD_BLOCK, *m_bot ) ) out << " > Shield Block"; else if( SHIELD_WALL>0 && !m_bot->HasAura( SHIELD_WALL, 0 ) && ai->CastSpell( SHIELD_WALL, *m_bot ) ) out << " > Shield Wall"; else out << " > NONE"; break; case WarriorBerserker: out << "Case Berserker"; if( WHIRLWIND>0 && ai->GetRageAmount()>=25 && ai->CastSpell( WHIRLWIND, *pTarget ) ) out << " > Whirlwind"; out << " > NONE"; break; } if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( out.str().c_str() ); }
void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_PVP_DUEL: (ai->HasAura(SCREAM, *pTarget) && ai->GetHealthPercent() < 60 && ai->CastSpell(HEAL)) || ai->CastSpell(SHADOW_WORD_PAIN) || (ai->GetHealthPercent() < 80 && ai->CastSpell(RENEW)) || (ai->GetPlayerBot()->GetDistance(pTarget) <= 5 && ai->CastSpell(SCREAM)) || ai->CastSpell(MIND_BLAST) || (ai->GetHealthPercent() < 50 && ai->CastSpell(GREATER_HEAL)) || ai->CastSpell(SMITE); return; default: break; } // ------- Non Duel combat ---------- Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); bool meleeReach = m_bot->CanReachWithMeleeAttack(pTarget); if (ai->GetCombatStyle() != PlayerbotAI::COMBAT_RANGED && !meleeReach) ai->SetCombatStyle(PlayerbotAI::COMBAT_RANGED); // if in melee range OR can't shoot OR have no ranged (wand) equipped else if (ai->GetCombatStyle() != PlayerbotAI::COMBAT_MELEE && (meleeReach || SHOOT == 0 || !m_bot->GetWeaponForAttack(RANGED_ATTACK, true, true)) && !ai->IsHealer()) ai->SetCombatStyle(PlayerbotAI::COMBAT_MELEE); if (SHOOT > 0 && ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED && !m_bot->FindCurrentSpellBySpellId(SHOOT)) ai->CastSpell(SHOOT, *pTarget); //ai->TellMaster( "started auto shot." ); else if (SHOOT > 0 && m_bot->FindCurrentSpellBySpellId(SHOOT)) m_bot->InterruptNonMeleeSpells(true, SHOOT); // Heal myself if (ai->GetHealthPercent() < 15 && FADE > 0 && !m_bot->HasAura(FADE, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting fade."); ai->CastSpell(FADE, *m_bot); } else if (ai->GetHealthPercent() < 25 && POWER_WORD_SHIELD > 0 && !m_bot->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting pws on myself."); ai->CastSpell(POWER_WORD_SHIELD); } else if (ai->GetHealthPercent() < 35 && DESPERATE_PRAYER > 0) { ai->TellMaster("I'm casting desperate prayer."); ai->CastSpell(DESPERATE_PRAYER, *m_bot); } else if (ai->GetHealthPercent() < 80) HealTarget (m_bot); // Heal master uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { if (masterHP < 25 && POWER_WORD_SHIELD > 0 && !GetMaster()->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) ai->CastSpell(POWER_WORD_SHIELD, *(GetMaster())); else if (masterHP < 80) HealTarget (GetMaster()); } // Heal group if (m_group) { Group::MemberSlotList const& groupSlot = m_group->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *m_groupMember = sObjectMgr.GetPlayer(itr->guid); if (!m_groupMember || !m_groupMember->isAlive()) continue; uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); if (memberHP < 25) HealTarget(m_groupMember); } } // Damage Spells switch (SpellSequence) { case SPELL_HOLY: if (SMITE > 0 && ai->In_Reach(pTarget,SMITE) && LastSpellHoly < 1 && !pTarget->HasAura(SMITE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 17) { ai->CastSpell(SMITE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (MANA_BURN > 0 && ai->In_Reach(pTarget,MANA_BURN) && LastSpellHoly < 2 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 14) { //ai->TellMaster("I'm casting mana burn."); ai->CastSpell(MANA_BURN, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (HOLY_NOVA > 0 && ai->In_Reach(pTarget,HOLY_NOVA) && LastSpellHoly < 3 && meleeReach && ai->GetManaPercent() >= 22) { //ai->TellMaster("I'm casting holy nova."); ai->CastSpell(HOLY_NOVA); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (HOLY_FIRE > 0 && ai->In_Reach(pTarget,HOLY_FIRE) && LastSpellHoly < 4 && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13) { //ai->TellMaster("I'm casting holy fire."); ai->CastSpell(HOLY_FIRE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (PRAYER_OF_MENDING > 0 && ai->In_Reach(pTarget,PRAYER_OF_MENDING) && LastSpellHoly < 5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth() * 0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, EFFECT_INDEX_0) && ai->GetManaPercent() >= 15) { //ai->TellMaster("I'm casting prayer of mending on master."); ai->CastSpell(PRAYER_OF_MENDING, *GetMaster()); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (LastSpellHoly > 6) { LastSpellHoly = 0; SpellSequence = SPELL_SHADOWMAGIC; break; } LastSpellHoly = LastSpellHoly + 1; //SpellSequence = SPELL_SHADOWMAGIC; //break; case SPELL_SHADOWMAGIC: if (SHADOW_WORD_PAIN > 0 && ai->In_Reach(pTarget,SHADOW_WORD_PAIN) && LastSpellShadowMagic < 1 && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) { //ai->TellMaster("I'm casting pain."); ai->CastSpell(SHADOW_WORD_PAIN, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (MIND_BLAST > 0 && ai->In_Reach(pTarget,MIND_BLAST) && LastSpellShadowMagic < 2 && ai->GetManaPercent() >= 19) { //ai->TellMaster("I'm casting mind blast."); ai->CastSpell(MIND_BLAST, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (SCREAM > 0 && ai->In_Reach(pTarget,SCREAM) && LastSpellShadowMagic < 3 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 15) { ai->TellMaster("I'm casting scream."); ai->CastSpell(SCREAM); SpellSequence = SPELL_DISCIPLINE; (LastSpellShadowMagic = LastSpellShadowMagic + 1); break; } else if (MIND_FLAY > 0 && LastSpellShadowMagic < 4 && !pTarget->HasAura(MIND_FLAY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { //ai->TellMaster("I'm casting mind flay."); ai->CastSpell(MIND_FLAY, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (DEVOURING_PLAGUE > 0 && ai->In_Reach(pTarget,DEVOURING_PLAGUE) && LastSpellShadowMagic < 5 && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) { ai->CastSpell(DEVOURING_PLAGUE, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (SHADOW_PROTECTION > 0 && ai->In_Reach(pTarget,SHADOW_PROTECTION) && LastSpellShadowMagic < 6 && ai->GetManaPercent() >= 60) { ai->CastSpell(SHADOW_PROTECTION, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic < 7 && !pTarget->HasAura(VAMPIRIC_TOUCH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 18) { ai->CastSpell(VAMPIRIC_TOUCH, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (SHADOWFIEND > 0 && ai->In_Reach(pTarget,SHADOWFIEND) && LastSpellShadowMagic < 8) { ai->CastSpell(SHADOWFIEND); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (MIND_SEAR > 0 && ai->In_Reach(pTarget,MIND_SEAR) && LastSpellShadowMagic < 9 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 28) { ai->CastSpell(MIND_SEAR, *pTarget); ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (LastSpellShadowMagic > 10) { LastSpellShadowMagic = 0; SpellSequence = SPELL_DISCIPLINE; break; } LastSpellShadowMagic = LastSpellShadowMagic + 1; //SpellSequence = SPELL_DISCIPLINE; //break; case SPELL_DISCIPLINE: if (FEAR_WARD > 0 && ai->In_Reach(pTarget,FEAR_WARD) && LastSpellDiscipline < 1 && ai->GetManaPercent() >= 3) { //ai->TellMaster("I'm casting fear ward"); ai->CastSpell(FEAR_WARD, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (POWER_INFUSION > 0 && LastSpellDiscipline < 2 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting power infusion"); ai->CastSpell(POWER_INFUSION, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (MASS_DISPEL > 0 && ai->In_Reach(pTarget,MASS_DISPEL) && LastSpellDiscipline < 3 && ai->GetManaPercent() >= 33) { //ai->TellMaster("I'm casting mass dispel"); ai->CastSpell(MASS_DISPEL); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline < 4) { //ai->TellMaster("I'm casting inner focus"); ai->CastSpell(INNER_FOCUS, *m_bot); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (PENANCE > 0 && LastSpellDiscipline < 5 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting PENANCE"); ai->CastSpell(PENANCE); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (LastSpellDiscipline > 6) { LastSpellDiscipline = 0; SpellSequence = SPELL_HOLY; break; } else { LastSpellDiscipline = LastSpellDiscipline + 1; SpellSequence = SPELL_HOLY; } } } // end DoNextCombatManeuver
void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: { if (SHADOW_BOLT > 0) ai->CastSpell(SHADOW_BOLT); return; } default: break; } // ------- Non Duel combat ---------- Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); Pet *pet = m_bot->GetPet(); // Empower demon if (pet && DEMONIC_EMPOWERMENT && !m_bot->HasSpellCooldown(DEMONIC_EMPOWERMENT)) ai->CastSpell(DEMONIC_EMPOWERMENT); // Use voidwalker sacrifice on low health if possible if (ai->GetHealthPercent() < 50) if (pet && pet->GetEntry() == DEMON_VOIDWALKER && SACRIFICE && !m_bot->HasAura(SACRIFICE)) ai->CastPetSpell(SACRIFICE); // Use healthstone if (ai->GetHealthPercent() < 30) { Item* healthStone = ai->FindConsumable(HEALTHSTONE_DISPLAYID); if (healthStone) ai->UseItem(healthStone); } // Damage Spells switch (SpellSequence) { case SPELL_CURSES: if (CURSE_OF_AGONY && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(SHADOWFLAME) && LastSpellCurse < 1) { ai->CastSpell(CURSE_OF_AGONY, *pTarget); SpellSequence = SPELL_AFFLICTION; ++LastSpellCurse; break; } else if (CURSE_OF_THE_ELEMENTS && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(CURSE_OF_WEAKNESS) && LastSpellCurse < 2) { ai->CastSpell(CURSE_OF_THE_ELEMENTS, *pTarget); SpellSequence = SPELL_AFFLICTION; ++LastSpellCurse; break; } else if (CURSE_OF_WEAKNESS && !pTarget->HasAura(CURSE_OF_WEAKNESS) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS) && LastSpellCurse < 3) { ai->CastSpell(CURSE_OF_WEAKNESS, *pTarget); SpellSequence = SPELL_AFFLICTION; ++LastSpellCurse; break; } else if (CURSE_OF_TONGUES && !pTarget->HasAura(CURSE_OF_TONGUES) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(CURSE_OF_WEAKNESS) && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS) && LastSpellCurse < 4) { ai->CastSpell(CURSE_OF_TONGUES, *pTarget); SpellSequence = SPELL_AFFLICTION; ++LastSpellCurse; break; } LastSpellCurse = 0; //SpellSequence = SPELL_AFFLICTION; /* no break */ case SPELL_AFFLICTION: if (LIFE_TAP && LastSpellAffliction < 1 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 50) { ai->CastSpell(LIFE_TAP, *m_bot); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (CORRUPTION && !pTarget->HasAura(CORRUPTION) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(SEED_OF_CORRUPTION) && LastSpellAffliction < 2) { ai->CastSpell(CORRUPTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (DRAIN_SOUL && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.40 && !pTarget->HasAura(DRAIN_SOUL) && LastSpellAffliction < 3) { ai->CastSpell(DRAIN_SOUL, *pTarget); //ai->SetIgnoreUpdateTime(15); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (DRAIN_LIFE && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL) && !pTarget->HasAura(SEED_OF_CORRUPTION) && !pTarget->HasAura(DRAIN_LIFE) && !pTarget->HasAura(DRAIN_MANA) && ai->GetHealthPercent() <= 70) { ai->CastSpell(DRAIN_LIFE, *pTarget); //ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (UNSTABLE_AFFLICTION && LastSpellAffliction < 5 && !pTarget->HasAura(UNSTABLE_AFFLICTION) && !pTarget->HasAura(SHADOWFLAME)) { ai->CastSpell(UNSTABLE_AFFLICTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (HAUNT && LastSpellAffliction < 6 && !pTarget->HasAura(HAUNT)) { ai->CastSpell(HAUNT, *pTarget); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (SEED_OF_CORRUPTION && !pTarget->HasAura(SEED_OF_CORRUPTION) && LastSpellAffliction < 7) { ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (HOWL_OF_TERROR && !pTarget->HasAura(HOWL_OF_TERROR) && ai->GetAttackerCount() > 3 && LastSpellAffliction < 8) { ai->CastSpell(HOWL_OF_TERROR, *pTarget); ai->TellMaster("casting howl of terror!"); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if (FEAR && !pTarget->HasAura(FEAR) && pVictim == m_bot && ai->GetAttackerCount() >= 2 && LastSpellAffliction < 9) { ai->CastSpell(FEAR, *pTarget); //ai->TellMaster("casting fear!"); //ai->SetIgnoreUpdateTime(1.5); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } else if ((pet) && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 10 && pet->GetPower(POWER_MANA) > 0)) { ai->CastSpell(DARK_PACT, *m_bot); SpellSequence = SPELL_DESTRUCTION; ++LastSpellAffliction; break; } LastSpellAffliction = 0; //SpellSequence = SPELL_DESTRUCTION; /* no break */ case SPELL_DESTRUCTION: if (SHADOWFURY && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY)) { ai->CastSpell(SHADOWFURY, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (SHADOW_BOLT && LastSpellDestruction < 2) { ai->CastSpell(SHADOW_BOLT, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (RAIN_OF_FIRE && LastSpellDestruction < 3 && ai->GetAttackerCount() >= 3) { ai->CastSpell(RAIN_OF_FIRE, *pTarget); //ai->TellMaster("casting rain of fire!"); //ai->SetIgnoreUpdateTime(8); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (SHADOWFLAME && !pTarget->HasAura(SHADOWFLAME) && LastSpellDestruction < 4) { ai->CastSpell(SHADOWFLAME, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (IMMOLATE && !pTarget->HasAura(IMMOLATE) && !pTarget->HasAura(SHADOWFLAME) && LastSpellDestruction < 5) { ai->CastSpell(IMMOLATE, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (CONFLAGRATE && LastSpellDestruction < 6) { ai->CastSpell(CONFLAGRATE, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (INCINERATE && LastSpellDestruction < 7) { ai->CastSpell(INCINERATE, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (SEARING_PAIN && LastSpellDestruction < 8) { ai->CastSpell(SEARING_PAIN, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (SOUL_FIRE && LastSpellDestruction < 9) { ai->CastSpell(SOUL_FIRE, *pTarget); //ai->SetIgnoreUpdateTime(6); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (CHAOS_BOLT && LastSpellDestruction < 10) { ai->CastSpell(CHAOS_BOLT, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (SHADOWBURN && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.20 && !pTarget->HasAura(SHADOWBURN)) { ai->CastSpell(SHADOWBURN, *pTarget); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else if (HELLFIRE && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE) && ai->GetAttackerCount() >= 5 && ai->GetHealthPercent() >= 50) { ai->CastSpell(HELLFIRE); ai->TellMaster("casting hellfire!"); //ai->SetIgnoreUpdateTime(15); SpellSequence = SPELL_CURSES; ++LastSpellDestruction; break; } else { LastSpellDestruction = 0; SpellSequence = SPELL_CURSES; } break; default: break; } } // end DoNextCombatManeuver
void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: (ai->HasAura(SCREAM,*pTarget) && ai->GetHealthPercent() < 60 && ai->CastSpell(HEAL)) || ai->CastSpell(PAIN) || (ai->GetHealthPercent() < 80 && ai->CastSpell(RENEW)) || (ai->GetPlayerBot()->GetDistance(pTarget) <= 5 && ai->CastSpell(SCREAM)) || ai->CastSpell(MIND_BLAST) || (ai->GetHealthPercent() < 20 && ai->CastSpell(GREAT_HEAL)) || ai->CastSpell(SMITE); return; } // ------- Non Duel combat ---------- ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); // Heal myself if (ai->GetHealthPercent() < 15 && FADE > 0 && !m_bot->HasAura(FADE, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting fade."); ai->CastSpell(FADE, *m_bot); } else if (ai->GetHealthPercent() < 25 && PWS > 0 && !m_bot->HasAura(PWS, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting pws on myself."); ai->CastSpell(PWS); } else if (ai->GetHealthPercent() < 35 && DESPERATE_PRAYER > 0) { ai->TellMaster("I'm casting desperate prayer."); ai->CastSpell(DESPERATE_PRAYER, *m_bot); } else if (ai->GetHealthPercent() < 80) HealTarget (*m_bot, ai->GetHealthPercent()); // Heal master uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { if (masterHP < 25 && PWS > 0 && !GetMaster()->HasAura(PWS, EFFECT_INDEX_0)) ai->CastSpell(PWS, *(GetMaster())); else if (masterHP < 80) HealTarget (*GetMaster(), masterHP); } // Heal group if( m_group ) { Group::MemberSlotList const& groupSlot = m_group->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *m_groupMember = sObjectMgr.GetPlayer( itr->guid ); if( !m_groupMember || !m_groupMember->isAlive() ) continue; uint32 memberHP = m_groupMember->GetHealth()*100 / m_groupMember->GetMaxHealth(); if( memberHP < 25 ) HealTarget( *m_groupMember, memberHP ); } } // Damage Spells ai->SetInFront( pTarget ); float dist = m_bot->GetDistance( pTarget ); switch (SpellSequence) { case SPELL_HOLY: if (SMITE > 0 && LastSpellHoly <1 && !pTarget->HasAura(SMITE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 17) { ai->CastSpell(SMITE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (MANA_BURN > 0 && LastSpellHoly <2 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 14) { //ai->TellMaster("I'm casting mana burn."); ai->CastSpell(MANA_BURN, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (HOLY_NOVA > 0 && LastSpellHoly <3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 22) { //ai->TellMaster("I'm casting holy nova."); ai->CastSpell(HOLY_NOVA); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (HOLY_FIRE > 0 && LastSpellHoly <4 && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13) { //ai->TellMaster("I'm casting holy fire."); ai->CastSpell(HOLY_FIRE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (PRAYER_OF_MENDING > 0 && LastSpellHoly <5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, EFFECT_INDEX_0) && ai->GetManaPercent() >= 15) { //ai->TellMaster("I'm casting prayer of mending on master."); ai->CastSpell(PRAYER_OF_MENDING, *GetMaster()); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (LastSpellHoly > 6) { LastSpellHoly = 0; SpellSequence = SPELL_SHADOWMAGIC; break; } LastSpellHoly = LastSpellHoly + 1; //SpellSequence = SPELL_SHADOWMAGIC; //break; case SPELL_SHADOWMAGIC: if (PAIN > 0 && LastSpellShadowMagic <1 && !pTarget->HasAura(PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) { //ai->TellMaster("I'm casting pain."); ai->CastSpell(PAIN, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (MIND_BLAST > 0 && LastSpellShadowMagic <2 && ai->GetManaPercent() >= 19) { //ai->TellMaster("I'm casting mind blast."); ai->CastSpell(MIND_BLAST, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (SCREAM > 0 && LastSpellShadowMagic <3 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 15) { ai->TellMaster("I'm casting scream."); ai->CastSpell(SCREAM); SpellSequence = SPELL_DISCIPLINE; (LastSpellShadowMagic = LastSpellShadowMagic +1); break; } else if (MIND_FLAY > 0 && LastSpellShadowMagic <4 && !pTarget->HasAura(MIND_FLAY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { //ai->TellMaster("I'm casting mind flay."); ai->CastSpell(MIND_FLAY, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (DEVOURING_PLAGUE > 0 && LastSpellShadowMagic <5 && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) { ai->CastSpell(DEVOURING_PLAGUE, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (SHADOW_PROTECTION > 0 && LastSpellShadowMagic <6 && ai->GetManaPercent() >= 60) { ai->CastSpell(SHADOW_PROTECTION, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic <7 && !pTarget->HasAura(VAMPIRIC_TOUCH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 18) { ai->CastSpell(VAMPIRIC_TOUCH, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (SHADOWFIEND > 0 && LastSpellShadowMagic <8) { ai->CastSpell(SHADOWFIEND); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (MIND_SEAR > 0 && LastSpellShadowMagic <9 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 28) { ai->CastSpell(MIND_SEAR, *pTarget); ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (LastSpellShadowMagic > 10) { LastSpellShadowMagic = 0; SpellSequence = SPELL_DISCIPLINE; break; } LastSpellShadowMagic = LastSpellShadowMagic +1; //SpellSequence = SPELL_DISCIPLINE; //break; case SPELL_DISCIPLINE: if (FEAR_WARD > 0 && LastSpellDiscipline <1 && ai->GetManaPercent() >= 3) { //ai->TellMaster("I'm casting fear ward"); ai->CastSpell(FEAR_WARD, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (POWER_INFUSION > 0 && LastSpellDiscipline <2 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting power infusion"); ai->CastSpell(POWER_INFUSION, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (MASS_DISPEL > 0 && LastSpellDiscipline <3 && ai->GetManaPercent() >= 33) { //ai->TellMaster("I'm casting mass dispel"); ai->CastSpell(MASS_DISPEL); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline <4) { //ai->TellMaster("I'm casting inner focus"); ai->CastSpell(INNER_FOCUS, *m_bot); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (PENANCE > 0 && LastSpellDiscipline <5 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting PENANCE"); ai->CastSpell(PENANCE); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (LastSpellDiscipline > 6) { LastSpellDiscipline = 0; SpellSequence = SPELL_HOLY; break; } else { LastSpellDiscipline = LastSpellDiscipline + 1; SpellSequence = SPELL_HOLY; } } } // end DoNextCombatManeuver
bool PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) { Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return false; Player* pMaster = ai->GetMaster(); if (!pMaster) return false; ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); float dist = m_bot->GetDistance(pTarget); uint32 masterHP = pMaster->GetHealth() * 100 / pMaster->GetMaxHealth(); if (pMaster->isAlive()) { if ((masterHP < 25) && (HAND_OF_PROTECTION > 0) && (!pMaster->HasAura(FORBEARANCE, EFFECT_INDEX_0)) && (!pMaster->HasAura(HAND_OF_PROTECTION, EFFECT_INDEX_0)) && (!pMaster->HasAura(DIVINE_PROTECTION, EFFECT_INDEX_0)) && (!pMaster->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0)) && (ai->CastSpell(HAND_OF_PROTECTION, *pMaster))) return true; } if (m_group && (pVictim != m_bot)) { Group::MemberSlotList const& groupSlot = m_group->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *m_groupMember = sObjectMgr.GetPlayer(itr->guid); if (!m_groupMember || !m_groupMember->isAlive()) continue; uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); if ((memberHP < 40) && (ai->GetManaPercent() >= 40) && (HealTarget(*m_groupMember, memberHP))) return true; } } if ((RIGHTEOUS_FURY > 0) && (!m_bot->HasAura(RIGHTEOUS_FURY, EFFECT_INDEX_0)) && (ai->CastSpell(RIGHTEOUS_FURY, *m_bot))) return true; if ((SHADOW_RESISTANCE_AURA > 0) && (!m_bot->HasAura(SHADOW_RESISTANCE_AURA, EFFECT_INDEX_0)) && (pTarget->getClass() == CLASS_WARLOCK) && (ai->CastSpell(SHADOW_RESISTANCE_AURA, *m_bot))) return true; if ((DEVOTION_AURA > 0) && (!m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0)) && (pTarget->getClass() == CLASS_WARRIOR) && (ai->CastSpell(DEVOTION_AURA, *m_bot))) return true; if ((FIRE_RESISTANCE_AURA > 0) && (!m_bot->HasAura(FIRE_RESISTANCE_AURA, EFFECT_INDEX_0)) && (pTarget->getClass() == CLASS_MAGE) && (ai->CastSpell(FIRE_RESISTANCE_AURA, *m_bot))) return true; if ((RETRIBUTION_AURA > 0) && (!m_bot->HasAura(RETRIBUTION_AURA, EFFECT_INDEX_0)) && (pTarget->getClass() == CLASS_PRIEST) && (ai->CastSpell(RETRIBUTION_AURA, *m_bot))) return true; if ((DEVOTION_AURA > 0) && (!m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0)) && (pTarget->getClass() == CLASS_SHAMAN) && (ai->CastSpell(DEVOTION_AURA, *m_bot))) return true; if ((DEVOTION_AURA > 0) && (!m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0)) && (pTarget->getClass() == CLASS_ROGUE) && (ai->CastSpell(DEVOTION_AURA, *m_bot))) return true; if ((DEVOTION_AURA > 0) && (!m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0)) && (pTarget->getClass() == CLASS_PALADIN) && (ai->CastSpell(DEVOTION_AURA, *m_bot))) return true; if ((ai->GetHealthPercent() <= 40) || (pMaster->GetHealth() <= (pMaster->GetMaxHealth() * 0.4))) SpellSequence = Healing; else SpellSequence = Combat; switch (SpellSequence) { case Combat: if ((JUDGEMENT_OF_LIGHT > 0) && (!pTarget->HasAura(JUDGEMENT_OF_LIGHT, EFFECT_INDEX_0)) && (CombatCounter < 1) && (ai->GetManaPercent() >= 5) && (ai->CastSpell(JUDGEMENT_OF_LIGHT, *pTarget))) { CombatCounter++; return true; } if ((SEAL_OF_COMMAND > 0) && (!m_bot->HasAura(SEAL_OF_COMMAND, EFFECT_INDEX_0)) && (CombatCounter < 2) && (ai->GetManaPercent() >= 14) && (ai->CastSpell(SEAL_OF_COMMAND, *m_bot))) { CombatCounter++; return true; } if ((HAMMER_OF_JUSTICE > 0) && (!pTarget->HasAura(HAMMER_OF_JUSTICE, EFFECT_INDEX_0)) && (CombatCounter < 3) && (ai->GetManaPercent() >= 3) && (ai->CastSpell(HAMMER_OF_JUSTICE, *pTarget))) { CombatCounter++; return true; } if ((CRUSADER_STRIKE > 0) && (CombatCounter < 4) && (ai->GetManaPercent() >= 5) && (ai->CastSpell(CRUSADER_STRIKE, *pTarget))) { CombatCounter++; return true; } if ((AVENGING_WRATH > 0) && (CombatCounter < 5) && (!m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 8) && (ai->CastSpell(AVENGING_WRATH, *m_bot))) { CombatCounter++; return true; } if ((SACRED_SHIELD > 0) && (CombatCounter < 6) && (pVictim == m_bot) && (ai->GetHealthPercent() < 70) && (!m_bot->HasAura(SACRED_SHIELD, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 12) && (ai->CastSpell(SACRED_SHIELD, *m_bot))) { CombatCounter++; return true; } if ((DIVINE_STORM > 0) && (CombatCounter < 7) && (ai->GetAttackerCount() >= 3) && (dist <= ATTACK_DISTANCE) && (ai->GetManaPercent() >= 12) && (ai->CastSpell(DIVINE_STORM, *pTarget))) { CombatCounter++; return true; } if ((HAMMER_OF_WRATH > 0) && (CombatCounter < 8) && (pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.20) && (ai->GetManaPercent() >= 14) && (ai->CastSpell(HAMMER_OF_WRATH, *pTarget))) { CombatCounter++; return true; } if ((HOLY_WRATH > 0) && (CombatCounter < 9) && (ai->GetAttackerCount() >= 3) && (dist <= ATTACK_DISTANCE) && (ai->GetManaPercent() >= 24) && (ai->CastSpell(HOLY_WRATH, *pTarget))) { CombatCounter++; return true; } if ((HAND_OF_SACRIFICE > 0) && (pVictim == pMaster) && (!pMaster->HasAura(HAND_OF_SACRIFICE, EFFECT_INDEX_0)) && (CombatCounter < 10) && (ai->GetManaPercent() >= 6) && (ai->CastSpell(HAND_OF_SACRIFICE, *pMaster))) { CombatCounter++; return true; } if ((DIVINE_PROTECTION > 0) && (pVictim == m_bot) && (!m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0)) && (ai->GetHealthPercent() < 30) && (CombatCounter < 11) && (ai->GetManaPercent() >= 3) && (ai->CastSpell(DIVINE_PROTECTION, *m_bot))) { CombatCounter++; return true; } if ((RIGHTEOUS_DEFENSE > 0) && (pVictim != m_bot) && (ai->GetHealthPercent() > 70) && (CombatCounter < 12) && (ai->CastSpell(RIGHTEOUS_DEFENSE, *pTarget))) { CombatCounter++; return true; } if ((DIVINE_PLEA > 0) && (!m_bot->HasAura(DIVINE_PLEA, EFFECT_INDEX_0)) && (ai->GetManaPercent() < 50) && (CombatCounter < 13) && (ai->CastSpell(DIVINE_PLEA, *m_bot))) { CombatCounter++; return true; } if ((DIVINE_FAVOR > 0) && (!m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0)) && (CombatCounter < 14) && (ai->CastSpell(DIVINE_FAVOR, *m_bot))) { CombatCounter++; return true; } CombatCounter = 0; break; case Healing: if ((ai->GetHealthPercent() <= 40) && (HealTarget(*m_bot, ai->GetHealthPercent()))) return true; if ((masterHP <= 40) && (HealTarget(*pMaster, masterHP))) return true; CombatCounter = 0; break; } if ((AVENGING_WRATH > 0) && (!m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 8) && (ai->CastSpell(AVENGING_WRATH, *m_bot))) return true; if ((DIVINE_SHIELD > 0) && (ai->GetHealthPercent() < 30) && (pVictim == m_bot) && (!m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0)) && (!m_bot->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 3) && (ai->CastSpell(DIVINE_SHIELD, *m_bot))) return true; if ((DIVINE_SACRIFICE > 0) && (ai->GetHealthPercent() > 50) && (pVictim != m_bot) && (!m_bot->HasAura(DIVINE_SACRIFICE, EFFECT_INDEX_0)) && (ai->CastSpell(DIVINE_SACRIFICE, *m_bot))) return true; return false; }
void PlayerbotDruidAI::_DoNextPVECombatManeuverSpellDPS(Unit* pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; //uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) ai->CastSpell (MOONKIN_FORM); // NOTE: Tree of Life is beneficial to armor and Wrath - leave on if not in Moonkin (not talented or OutOfMana) if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(CAT_FORM_1); //ai->TellMaster("FormClearCat"); return; } if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(BEAR_FORM_1); //ai->TellMaster("FormClearBear"); return; } if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(DIRE_BEAR_FORM_1); //ai->TellMaster("FormClearDireBear"); return; } if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(FAERIE_FIRE, *pTarget); return; } DruidSpellCombat++; if (MOONFIRE > 0 && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); return; } DruidSpellCombat++; if (ROOTS > 0 && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); return; } DruidSpellCombat++; if (HURRICANE > 0 && ai->GetAttackerCount() >= 5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { ai->CastSpell(HURRICANE, *pTarget); ai->SetIgnoreUpdateTime(10); return; } DruidSpellCombat++; if (WRATH > 0 && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) { ai->CastSpell(WRATH, *pTarget); return; } DruidSpellCombat++; if (INSECT_SWARM > 0 && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(INSECT_SWARM, *pTarget); return; } DruidSpellCombat++; if (STARFIRE > 0 && DruidSpellCombat < 7 && ai->GetManaPercent() >= 18) { ai->CastSpell(STARFIRE, *pTarget); return; } DruidSpellCombat++; if (FORCE_OF_NATURE > 0 && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { ai->CastSpell(FORCE_OF_NATURE); return; } DruidSpellCombat++; if (STARFALL > 0 && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); return; } DruidSpellCombat++; if (BARKSKIN > 0 && pVictim == m_bot && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); return; } DruidSpellCombat++; if (INNERVATE > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); return; } DruidSpellCombat = 0; }