void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: ai->CastSpell(MOONFIRE); return; default: break; } uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); if (ai->GetCombatOrder() == PlayerbotAI::ORDERS_HEAL) // && ai->GetMovementOrder() == PlayerbotAI::MOVEMENT_STAY) SpellSequence = DruidHeal; else if (IsFeral() && ai->GetCombatOrder() == PlayerbotAI::ORDERS_ASSIST) // && ai->GetMovementOrder() == PlayerbotAI::MOVEMENT_STAY) SpellSequence = DruidCombat; else if (IsFeral() && ai->GetCombatOrder() == PlayerbotAI::ORDERS_TANK) SpellSequence = DruidTank; else SpellSequence = DruidSpell; switch (SpellSequence) { case DruidTank: // Its now a tank druid! //ai->TellMaster("DruidTank"); _DoNextPVECombatManeuverBear(pTarget); break; case DruidSpell: //ai->TellMaster("DruidSpell"); _DoNextPVECombatManeuverSpellDPS(pTarget); break; case DruidHeal: //ai->TellMaster("DruidHeal"); _DoNextPVECombatManeuverHeal(pTarget); break; case DruidCombat: //ai->TellMaster("DruidCombat"); _DoNextPVECombatManeuverMeleeDPS(pTarget); break; } } // 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(); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); if (ai->GetCombatOrder() == PlayerbotAI::ORDERS_HEAL) SpellSequence = DruidHeal; else if (ai->GetCombatOrder() == PlayerbotAI::ORDERS_ASSIST && CAT_FORM > 0) SpellSequence = DruidCombat; // No check for Dire Bear here: you must have Bear form to learn Dire Bear form. else if (ai->GetCombatOrder() == PlayerbotAI::ORDERS_TANK && BEAR_FORM > 0) SpellSequence = DruidTank; else SpellSequence = DruidSpell; switch (SpellSequence) { case DruidTank: // Its now a tank druid! //ai->TellMaster("DruidTank"); _DoNextPVECombatManeuverBear(pTarget); break; case DruidSpell: //ai->TellMaster("DruidSpell"); _DoNextPVECombatManeuverSpellDPS(pTarget); break; case DruidHeal: //ai->TellMaster("DruidHeal"); _DoNextPVECombatManeuverHeal(pTarget); break; case DruidCombat: //ai->TellMaster("DruidCombat"); _DoNextPVECombatManeuverMeleeDPS(pTarget); break; } } // end DoNextCombatManeuver
void PlayerbotDruidAI::_DoNextPVECombatManeuverBear(Unit* pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; //uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); // Face your enemy! if (!m_bot->HasInArc(M_PI_F, pTarget)) { m_bot->SetFacingTo(m_bot->GetAngle(pTarget)); if (pVictim) pVictim->Attack(pTarget, true); } // Try and go into [dire] bear form first if (DIRE_BEAR_FORM > 0 && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) ai->CastSpell(DIRE_BEAR_FORM); else if (BEAR_FORM > 0 && DIRE_BEAR_FORM == 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)) && !pTarget->HasAura(DEMORALIZING_ROAR, EFFECT_INDEX_0) && ai->GetRageAmount() >= 10) ai->CastSpell(DEMORALIZING_ROAR, *pTarget); // entire tank spell sequence is predicated on being in [dire] bear form. If not in it, exit (*before* going out of other forms) if (!m_bot->HasAura(DIRE_BEAR_FORM) && !m_bot->HasAura(BEAR_FORM)) return _DoNextPVECombatManeuverMeleeDPS(pTarget); // bear = melee so... // Impossible due to check above // If still in cat/moonkin/tree form, go out of it //if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) // m_bot->RemoveAurasDueToSpell(CAT_FORM_1); //if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) // m_bot->RemoveAurasDueToSpell(MOONKIN_FORM_1); //if (m_bot->HasAura(TREE_OF_LIFE, EFFECT_INDEX_0)) // m_bot->RemoveAurasDueToSpell(TREE_OF_LIFE_1); if (FAERIE_FIRE_FERAL > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE_FERAL, EFFECT_INDEX_0)) { ai->CastSpell(FAERIE_FIRE, *pTarget); return; } DruidSpellCombat++; if (ENRAGE > 0 && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, EFFECT_INDEX_0)) { ai->CastSpell(ENRAGE, *m_bot); return; } DruidSpellCombat++; if (SWIPE > 0 && DruidSpellCombat < 3 && ai->GetRageAmount() >= 20) { ai->CastSpell(SWIPE, *pTarget); DruidSpellCombat += 2; return; } DruidSpellCombat++; if (MAUL > 0 && DruidSpellCombat < 4 && ai->GetRageAmount() >= 15) { ai->CastSpell(MAUL, *pTarget); DruidSpellCombat += 2; return; } DruidSpellCombat++; if (BASH > 0 && !pTarget->HasAura(BASH, EFFECT_INDEX_0) && DruidSpellCombat < 5 && ai->GetRageAmount() >= 10) { ai->CastSpell(BASH, *pTarget); DruidSpellCombat += 2; return; } DruidSpellCombat++; if (CHALLENGING_ROAR > 0 && pVictim != m_bot && DruidSpellCombat < 6 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0) && ai->GetRageAmount() >= 15) { ai->CastSpell(CHALLENGING_ROAR, *pTarget); DruidSpellCombat += 2; return; } DruidSpellCombat++; if (GROWL > 0 && pVictim != m_bot && DruidSpellCombat < 7 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0)) { ai->CastSpell(GROWL, *pTarget); DruidSpellCombat += 2; return; } DruidSpellCombat = 0; }