void RandomPlayerbotMgr::OnPlayerLogin(Player* player) { for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; if (player == bot || player->GetPlayerbotAI()) continue; Group* group = bot->GetGroup(); if (!group) continue; for (GroupReference *gref = group->GetFirstMember(); gref; gref = gref->next()) { Player* member = gref->getSource(); PlayerbotAI* ai = bot->GetPlayerbotAI(); if (member == player && (!ai->GetMaster() || ai->GetMaster()->GetPlayerbotAI())) { ai->SetMaster(player); ai->ResetStrategies(); ai->TellMaster("Hello"); break; } } } if (!player->GetPlayerbotAI()) players.push_back(player); }
void RandomPlayerbotMgr::OnPlayerLogout(Player* player) { for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; PlayerbotAI* ai = bot->GetPlayerbotAI(); if (player == ai->GetMaster()) { ai->SetMaster(NULL); ai->ResetStrategies(); } } if (!player->GetPlayerbotAI()) { vector<Player*>::iterator i = find(players.begin(), players.end(), player); if (i != players.end()) players.erase(i); } }
bool PlayerbotPaladinAI::HealTarget(Unit &target, uint8 hp) { PlayerbotAI* ai = GetAI(); if (!ai) return false; Player* pMaster = ai->GetMaster(); if (!pMaster) return false; if ((hp < 40) && (HOLY_LIGHT > 0) && (ai->GetManaPercent() >= 34) && (ai->CastSpell(HOLY_LIGHT, target))) return true; if ((hp < 35) && (HOLY_SHOCK > 0) && (ai->GetManaPercent() >= 21) && (ai->CastSpell(HOLY_SHOCK, target))) return true; if ((hp < 30) && (FLASH_OF_LIGHT > 0) && (ai->GetManaPercent() >= 8) && (ai->CastSpell(FLASH_OF_LIGHT, target))) return true; if ((hp < 25) && (LAY_ON_HANDS > 0) && (ai->GetHealthPercent() > 30) && (ai->GetManaPercent() >= 8) && (ai->CastSpell(LAY_ON_HANDS, target))) return true; return false; }
void PlayerbotPaladinAI::DoNonCombatActions() { PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; // Buff myself if (ai->GetCombatOrder() == ai->ORDERS_TANK) ai->SelfBuff(RIGHTEOUS_FURY); BuffPlayer(m_bot); // Buff master BuffPlayer(ai->GetMaster()); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetManaPercent() < 40) { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); return; } // hp check original if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); pItem = ai->FindFood(); if (pItem != NULL && ai->GetHealthPercent() < 40) { ai->TellMaster("I could use some food."); ai->UseItem(pItem); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); return; } // heal and buff group if (GetMaster()->GetGroup()) { Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if (!tPlayer) continue; if (!tPlayer->isAlive()) { if (ai->CastSpell(REDEMPTION, *tPlayer)) { std::string msg = "Resurrecting "; msg += tPlayer->GetName(); m_bot->Say(msg, LANG_UNIVERSAL); return; } else continue; } if (HealTarget(tPlayer)) return; if (tPlayer != m_bot && tPlayer != GetMaster()) if (BuffPlayer(tPlayer)) return; } } }
bool PlayerbotDruidAI::HealTarget(Unit &target, uint8 hp) { PlayerbotAI* ai = GetAI(); if (!ai) return false; Player* pMaster = ai->GetMaster(); if (!pMaster) return false; Player *m_bot = GetPlayerBot(); if ((hp < 70) && (REJUVENATION > 0) && (!target.HasAura(REJUVENATION, EFFECT_INDEX_0)) && (!target.HasAura(REGROWTH, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 21) && (ai->CastSpell(REJUVENATION, target))) return true; if ((hp < 60) && (LIFEBLOOM > 0) && (!target.HasAura(LIFEBLOOM, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 28) && (ai->CastSpell(LIFEBLOOM, target))) return true; if ((hp < 55) && (REGROWTH > 0) && (!target.HasAura(REGROWTH, EFFECT_INDEX_0)) && (!target.HasAura(REJUVENATION, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 33) && (ai->CastSpell(REGROWTH, target))) return true; if ((hp < 50) && (SWIFTMEND > 0) && (target.HasAura(REJUVENATION, EFFECT_INDEX_0) || target.HasAura(REGROWTH, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 16) && (ai->CastSpell(SWIFTMEND, target))) return true; if ((hp < 45) && (WILD_GROWTH > 0) && (!target.HasAura(WILD_GROWTH, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 26) && (ai->CastSpell(WILD_GROWTH, target))) return true; if ((hp < 30) && (NOURISH > 0) && (ai->GetManaPercent() >= 18) && (ai->CastSpell(NOURISH, target))) return true; if ((hp < 25) && (HEALING_TOUCH > 0) && (ai->GetManaPercent() >= 38) && (ai->CastSpell(HEALING_TOUCH, target))) return true; return false; }
bool PlayerbotDruidAI::DoNonCombatActions() { Player * m_bot = GetPlayerBot(); if (!m_bot) return false; PlayerbotAI* ai = GetAI(); if (!ai) return false; Player* pMaster = ai->GetMaster(); if (!pMaster) return false; 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 ((MARK_OF_THE_WILD > 0) && (!m_bot->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0)) && (ai->CastSpell(MARK_OF_THE_WILD, *m_bot))) return true; if ((THORNS > 0) && (!m_bot->HasAura(THORNS, EFFECT_INDEX_0)) && (ai->CastSpell(THORNS, *m_bot))) return true; if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* drinkOrFoodItem = ai->FindDrink(); Item* bandageItem = ai->FindBandage(); if (drinkOrFoodItem && (ai->GetManaPercent() < 30)) { ai->UseItem(*drinkOrFoodItem); ai->SetIgnoreUpdateTime(30); return true; } if (!drinkOrFoodItem && (INNERVATE > 0) && (!m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) && (ai->GetManaPercent() <= 70) && (ai->CastSpell(INNERVATE, *m_bot))) return true; if (!drinkOrFoodItem && (MANA_REJUVENATION > 0) && (!m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) && (ai->GetManaPercent() <= 70) && (ai->CastSpell(MANA_REJUVENATION, *m_bot))) return true; if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); drinkOrFoodItem = ai->FindFood(); if (drinkOrFoodItem && (ai->GetHealthPercent() < 30)) { ai->UseItem(*drinkOrFoodItem); ai->SetIgnoreUpdateTime(30); return true; } if (!drinkOrFoodItem && bandageItem && (!m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0)) && (ai->GetHealthPercent() < 70)) { ai->UseItem(*bandageItem); ai->SetIgnoreUpdateTime(8); return true; } if (pMaster->GetGroup()) { Group::MemberSlotList const& groupSlot = pMaster->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if (!tPlayer || !tPlayer->isAlive()) continue; if ((!tPlayer->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0)) && (ai->CastSpell(MARK_OF_THE_WILD, *tPlayer))) return true; if (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())) return true; } } return false; }
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; }
bool PlayerbotPaladinAI::DoNonCombatActions() { PlayerbotAI* ai = GetAI(); if (!ai) return false; Player* pMaster = ai->GetMaster(); if (!pMaster) return false; Player * m_bot = GetPlayerBot(); if (!m_bot) return false; if ((GREATER_BLESSING_OF_MIGHT > 0) && (!m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_MIGHT, *m_bot))) return true; if ((BLESSING_OF_MIGHT > 0) && (!m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (!m_bot->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_MIGHT, *m_bot))) return true; if ((DIVINE_FAVOR > 0) && (!m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0)) && (ai->GetManaPercent() >= 3) && (ai->CastSpell(DIVINE_FAVOR , *m_bot))) return true; if ((BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_PRIEST) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_PRIEST) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_MAGE) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_MAGE) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_PALADIN) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_PALADIN) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_WARLOCK) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_WISDOM > 0) && (pMaster->getClass() == CLASS_WARLOCK) && (!pMaster->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_WISDOM, * (pMaster)))) return true; if ((BLESSING_OF_MIGHT > 0) && (pMaster->getClass() == CLASS_WARRIOR) && (!pMaster->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (!pMaster->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_MIGHT, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_MIGHT > 0) && (pMaster->getClass() == CLASS_WARRIOR) && (!pMaster->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (!pMaster->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_MIGHT, * (pMaster)))) return true; if ((BLESSING_OF_KINGS > 0) && (pMaster->getClass() == CLASS_WARRIOR) && (!pMaster->HasAura(GREATER_BLESSING_OF_KINGS, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_KINGS, EFFECT_INDEX_0)) && (!pMaster->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0)) && (!pMaster->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_KINGS, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_KINGS > 0) && (pMaster->getClass() == CLASS_WARRIOR) && (!pMaster->HasAura(GREATER_BLESSING_OF_KINGS, EFFECT_INDEX_0)) && (!pMaster->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0)) && (!pMaster->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_KINGS, * (pMaster)))) return true; if ((BLESSING_OF_MIGHT > 0) && (pMaster->getClass() == CLASS_ROGUE) && (!pMaster->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_MIGHT, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_MIGHT > 0) && (pMaster->getClass() == CLASS_ROGUE) && (!pMaster->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_MIGHT, * (pMaster)))) return true; if ((BLESSING_OF_MIGHT > 0) && (pMaster->getClass() == CLASS_SHAMAN) && (!pMaster->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (!pMaster->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (ai->CastSpell(BLESSING_OF_MIGHT, * (pMaster)))) return true; if ((GREATER_BLESSING_OF_MIGHT > 0) && (pMaster->getClass() == CLASS_SHAMAN) && (!pMaster->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) && (ai->CastSpell(GREATER_BLESSING_OF_MIGHT, * (pMaster)))) return true; if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* drinkOrFoodItem = ai->FindDrink(); Item* bandageItem = ai->FindBandage(); if (drinkOrFoodItem && (ai->GetManaPercent() < 40)) { ai->UseItem(*drinkOrFoodItem); ai->SetIgnoreUpdateTime(30); return true; } if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); drinkOrFoodItem = ai->FindFood(); if (drinkOrFoodItem && ai->GetHealthPercent() < 40) { ai->UseItem(*drinkOrFoodItem); ai->SetIgnoreUpdateTime(30); return true; } if (!drinkOrFoodItem && bandageItem && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->UseItem(*bandageItem); ai->SetIgnoreUpdateTime(8); return true; } if (pMaster->GetGroup()) { Group::MemberSlotList const& groupSlot = pMaster->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if (!tPlayer || !tPlayer->isAlive()) continue; if (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())) return true; } } return false; }
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; }