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;
}