void PlayerbotRogueAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; // remove stealth if (m_bot->HasAura(STEALTH)) m_bot->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); // hp check if (EatDrinkBandage(false)) return; // Search and apply poisons to weapons, if no poison found, try to apply a sharpening/weight stone // Mainhand ... Item * poison, * stone, * weapon; weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { poison = FindPoison(); if (poison) { m_ai->UseItem(poison, EQUIPMENT_SLOT_MAINHAND); m_ai->SetIgnoreUpdateTime(5); } else { stone = m_ai->FindStoneFor(weapon); if (stone) { m_ai->UseItem(stone, EQUIPMENT_SLOT_MAINHAND); m_ai->SetIgnoreUpdateTime(5); } } } //... and offhand weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { poison = FindPoison(); if (poison) { m_ai->UseItem(poison, EQUIPMENT_SLOT_OFFHAND); m_ai->SetIgnoreUpdateTime(5); } else { stone = m_ai->FindStoneFor(weapon); if (stone) { m_ai->UseItem(stone, EQUIPMENT_SLOT_OFFHAND); m_ai->SetIgnoreUpdateTime(5); } } } // Nothing else to do, Night Elves will cast Shadowmeld to reduce their aggro versus patrols or nearby mobs if (SHADOWMELD && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && m_ai->CastSpell(SHADOWMELD, *m_bot)) return; } // end DoNonCombatActions
void PlayerbotPaladinAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; CheckAuras(); //Put up RF if tank if (m_ai->IsTank()) m_ai->SelfBuff(RIGHTEOUS_FURY); //Disable RF if not tank else if (m_bot->HasAura(RIGHTEOUS_FURY)) m_bot->RemoveAurasDueToSpell(RIGHTEOUS_FURY); // Dispel magic/disease/poison if (m_ai->HasDispelOrder() && DispelPlayer() & RETURN_CONTINUE) return; // Revive if (ResurrectPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // buff group if (Buff(&PlayerbotPaladinAI::BuffHelper, 1) & RETURN_CONTINUE) // Paladin's BuffHelper takes care of choosing the specific Blessing so just pass along a non-zero value return; // hp/mana check if (EatDrinkBandage()) return; // Search and apply stones to weapons // Mainhand ... Item* stone, * weapon; weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { stone = m_ai->FindStoneFor(weapon); if (stone) { m_ai->UseItem(stone, EQUIPMENT_SLOT_MAINHAND); m_ai->SetIgnoreUpdateTime(5); } } }
void PlayerbotShamanAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; uint32 spec = m_bot->GetSpec(); CheckShields(); /* // buff myself weapon if (ROCKBITER_WEAPON > 0) (!m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && m_ai->CastSpell(ROCKBITER_WEAPON,*m_bot) ); else if (EARTHLIVING_WEAPON > 0) (!m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && m_ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); else if (WINDFURY_WEAPON > 0) (!m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && m_ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); else if (FLAMETONGUE_WEAPON > 0) (!m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && m_ai->CastSpell(FLAMETONGUE_WEAPON,*m_bot) ); else if (FROSTBRAND_WEAPON > 0) (!m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && m_ai->CastSpell(FROSTBRAND_WEAPON,*m_bot) ); */ // Mainhand Item* weapon; weapon = m_bot->GetItemByPos(EQUIPMENT_SLOT_MAINHAND); if (weapon && (weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) && spec == SHAMAN_SPEC_ELEMENTAL) m_ai->CastSpell(FLAMETONGUE_WEAPON, *m_bot); else if (weapon && (weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) && spec == SHAMAN_SPEC_ENHANCEMENT) m_ai->CastSpell(WINDFURY_WEAPON, *m_bot); //Offhand weapon = m_bot->GetItemByPos(EQUIPMENT_SLOT_OFFHAND); if (weapon && (weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) && spec == SHAMAN_SPEC_ENHANCEMENT) m_ai->CastSpell(FLAMETONGUE_WEAPON, *m_bot); // Revive if (HealPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // hp/mana check if (EatDrinkBandage()) return; } // end DoNonCombatActions
void PlayerbotMageAI::DoNonCombatActions() { Player* master = GetMaster(); if (!m_bot || !master) return; // Buff armor if (MOLTEN_ARMOR) { if (m_ai->SelfBuff(MOLTEN_ARMOR)) return; } else if (MAGE_ARMOR) { if (m_ai->SelfBuff(MAGE_ARMOR)) return; } else if (ICE_ARMOR) { if (m_ai->SelfBuff(ICE_ARMOR)) return; } else if (FROST_ARMOR) if (m_ai->SelfBuff(FROST_ARMOR)) return; // buff group if (m_bot->GetGroup() && ARCANE_BRILLIANCE && m_ai->HasSpellReagents(ARCANE_BRILLIANCE) && m_ai->Buff(ARCANE_BRILLIANCE, m_bot)) return; if (Buff(&PlayerbotMageAI::BuffHelper, ARCANE_INTELLECT, (JOB_ALL | JOB_MANAONLY))) return; // conjure food & water + hp/mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); // TODO: The beauty of a mage is not only its ability to supply itself with water, but to share its water // So, conjure at *least* 1.25 stacks, ready to trade a stack and still have some left for self if (m_ai->FindDrink() == NULL && CONJURE_WATER && m_ai->CastSpell(CONJURE_WATER, *m_bot)) { m_ai->TellMaster("I'm conjuring some water."); m_ai->SetIgnoreUpdateTime(3); return; } if (m_ai->FindFood() == NULL && CONJURE_FOOD && m_ai->CastSpell(CONJURE_FOOD, *m_bot)) { m_ai->TellMaster("I'm conjuring some food."); m_ai->SetIgnoreUpdateTime(3); return; } if (EatDrinkBandage()) return; } // end DoNonCombatActions
void PlayerbotDruidAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; // Revive if (HealPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // Buff group // the check for group targets is performed by NeedGroupBuff (if group is found for bots by the function) if (NeedGroupBuff(GIFT_OF_THE_WILD, MARK_OF_THE_WILD) && m_ai->HasSpellReagents(GIFT_OF_THE_WILD)) { if (Buff(&PlayerbotDruidAI::BuffHelper, GIFT_OF_THE_WILD) & RETURN_CONTINUE) return; } else if (Buff(&PlayerbotDruidAI::BuffHelper, MARK_OF_THE_WILD) & RETURN_CONTINUE) return; if (Buff(&PlayerbotDruidAI::BuffHelper, THORNS, (m_bot->GetGroup() ? JOB_TANK : JOB_ALL)) & RETURN_CONTINUE) return; if (OMEN_OF_CLARITY && !m_bot->HasAura(OMEN_OF_CLARITY) && CastSpell(OMEN_OF_CLARITY, m_bot)) return; // hp/mana check if (EatDrinkBandage()) return; if (INNERVATE && m_ai->In_Reach(m_bot, INNERVATE) && !m_bot->HasAura(INNERVATE) && m_ai->GetManaPercent() <= 20 && CastSpell(INNERVATE, m_bot)) return; // Return to fighting form AFTER reviving, healing, buffing CheckForms(); // Nothing else to do, Night Elves will cast Shadowmeld to reduce their aggro versus patrols or nearby mobs if (SHADOWMELD && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && m_ai->CastSpell(SHADOWMELD, *m_bot)) return; } // end DoNonCombatActions
void PlayerbotPaladinAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; CheckAuras(); //Put up RF if tank if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TANK) m_ai->SelfBuff(RIGHTEOUS_FURY); //Disable RF if not tank else if (m_bot->HasAura(RIGHTEOUS_FURY)) m_bot->RemoveAurasDueToSpell(RIGHTEOUS_FURY); // Revive if (HealPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // buff group if (Buff(&PlayerbotPaladinAI::BuffHelper, 1) & RETURN_CONTINUE) // Paladin's BuffHelper takes care of choosing the specific Blessing so just pass along a non-zero value return; //creat water if (m_ai->FindDrink() == nullptr && m_bot->getLevel() == 60) { if (Item* pItem = m_bot->StoreNewItemInInventorySlot(CRYSTAL_WATER, 20)) m_bot->SendNewItem(pItem, 20, true, false); return; } // hp/mana check if (EatDrinkBandage()) return; // m_ai->TellMaster("DoNonCombatActions() - 10. past EatDrinkBandage()"); // debug }
void PlayerbotRogueAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; // remove stealth if (m_bot->HasAura(STEALTH)) m_bot->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); // hp check if (EatDrinkBandage(false)) return; // Search and apply poisons to weapons // Mainhand ... Item * poison, * weapon; weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { poison = m_ai->FindConsumable(INSTANT_POISON_DISPLAYID); if (!poison) // Note: in Classic, wound poison and crippling poison share the same display ID // If bot has both in his/her inventory, the first one picked will be used, be it a wound poison or not poison = m_ai->FindConsumable(WOUND_POISON_DISPLAYID); if (!poison) poison = m_ai->FindConsumable(DEADLY_POISON_DISPLAYID); if (poison) { m_ai->UseItem(poison, EQUIPMENT_SLOT_MAINHAND); m_ai->SetIgnoreUpdateTime(5); } } //... and offhand weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { poison = m_ai->FindConsumable(DEADLY_POISON_DISPLAYID); if (!poison) // Note: in Classic, wound poison and crippling poison share the same display ID // If bot has both in his/her inventory, the first one picked will be used, be it a wound poison or not poison = m_ai->FindConsumable(WOUND_POISON_DISPLAYID); if (!poison) poison = m_ai->FindConsumable(INSTANT_POISON_DISPLAYID); if (poison) { m_ai->UseItem(poison, EQUIPMENT_SLOT_OFFHAND); m_ai->SetIgnoreUpdateTime(5); } } } // end DoNonCombatActions
void PlayerbotRogueAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; // remove stealth if (m_bot->HasAura(STEALTH)) m_bot->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); if (EatDrinkBandage(false)) return; // Search and apply poisons to weapons // Mainhand ... Item * poison, * weapon; weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { poison = m_ai->FindConsumable(INSTANT_POISON_DISPLAYID); if (!poison) poison = m_ai->FindConsumable(WOUND_POISON_DISPLAYID); if (!poison) poison = m_ai->FindConsumable(DEADLY_POISON_DISPLAYID); if (poison) { m_ai->UseItem(poison, EQUIPMENT_SLOT_MAINHAND); m_ai->SetIgnoreUpdateTime(5); } } //... and offhand weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { poison = m_ai->FindConsumable(DEADLY_POISON_DISPLAYID); if (!poison) poison = m_ai->FindConsumable(WOUND_POISON_DISPLAYID); if (!poison) poison = m_ai->FindConsumable(INSTANT_POISON_DISPLAYID); if (poison) { m_ai->UseItem(poison, EQUIPMENT_SLOT_OFFHAND); m_ai->SetIgnoreUpdateTime(5); } } } // end DoNonCombatActions
void PlayerbotWarriorAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; uint32 spec = m_bot->GetSpec(); //Stance Check if (spec == WARRIOR_SPEC_ARMS && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) m_ai->CastSpell(BATTLE_STANCE); else if (spec == WARRIOR_SPEC_FURY && !m_bot->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0)) m_ai->CastSpell(BERSERKER_STANCE); else if (spec == WARRIOR_SPEC_PROTECTION && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) m_ai->CastSpell(DEFENSIVE_STANCE); // hp check if (EatDrinkBandage(false)) return; // Search and apply stones to weapons // Mainhand ... Item* stone, * weapon; weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { stone = m_ai->FindStoneFor(weapon); if (stone) { m_ai->UseItem(stone, EQUIPMENT_SLOT_MAINHAND); m_ai->SetIgnoreUpdateTime(5); } } //... and offhand (we add a check to avoid trying to apply stone if the warrior is wielding a shield) weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (weapon && (weapon->GetProto()->InventoryType == INVTYPE_WEAPONOFFHAND || weapon->GetProto()->InventoryType == INVTYPE_WEAPONMAINHAND) && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { stone = m_ai->FindStoneFor(weapon); if (stone) { m_ai->UseItem(stone, EQUIPMENT_SLOT_OFFHAND); m_ai->SetIgnoreUpdateTime(5); } } // Nothing else to do, Night Elves will cast Shadowmeld to reduce their aggro versus patrols or nearby mobs if (SHADOWMELD && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && m_ai->CastSpell(SHADOWMELD, *m_bot)) return; } // end DoNonCombatActions
void PlayerbotPaladinAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; CheckAuras(); CheckSeals(); //Put up RF if tank if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TANK) m_ai->SelfBuff(RIGHTEOUS_FURY); //Disable RF if not tank else if (m_bot->HasAura(RIGHTEOUS_FURY)) m_bot->RemoveAurasDueToSpell(RIGHTEOUS_FURY); // Revive if (HealPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // buff group if (Buff(&PlayerbotPaladinAI::BuffHelper, 1) & RETURN_CONTINUE) // Paladin's BuffHelper takes care of choosing the specific Blessing so just pass along a non-zero value return; // hp/mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); if (EatDrinkBandage()) return; // m_ai->TellMaster("DoNonCombatActions() - 10. past EatDrinkBandage()"); // debug }
void PlayerbotDeathKnightAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; SpellSequence = SPELL_DK_UNHOLY; // buff master with HORN_OF_WINTER if (HORN_OF_WINTER > 0) (!GetMaster()->HasAura(HORN_OF_WINTER, EFFECT_INDEX_0) && m_ai->CastSpell (HORN_OF_WINTER, *GetMaster())); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); if (EatDrinkBandage(false)) return; } // end DoNonCombatActions
void PlayerbotDruidAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; // Revive if (HealPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // Buff if (m_bot->GetGroup() && m_ai->HasSpellReagents(GIFT_OF_THE_WILD) && Buff(&PlayerbotDruidAI::BuffHelper, GIFT_OF_THE_WILD) & RETURN_CONTINUE) return; if (Buff(&PlayerbotDruidAI::BuffHelper, MARK_OF_THE_WILD) & RETURN_CONTINUE) return; if (Buff(&PlayerbotDruidAI::BuffHelper, THORNS, (m_bot->GetGroup() ? JOB_TANK : JOB_ALL)) & RETURN_CONTINUE) return; // Return to fighting form AFTER reviving, healing, buffing CheckForms(); // hp/mana check if (EatDrinkBandage()) return; if (INNERVATE && m_ai->In_Reach(m_bot,INNERVATE) && !m_bot->HasAura(INNERVATE) && m_ai->GetManaPercent() <= 20 && CastSpell(INNERVATE, m_bot)) return; } // end DoNonCombatActions
void PlayerbotWarriorAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; uint32 spec = m_bot->GetSpec(); //Stance Check if (spec == WARRIOR_SPEC_ARMS && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) m_ai->CastSpell(BATTLE_STANCE); else if (spec == WARRIOR_SPEC_FURY && !m_bot->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0)) m_ai->CastSpell(BERSERKER_STANCE); else if (spec == WARRIOR_SPEC_PROTECTION && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) m_ai->CastSpell(DEFENSIVE_STANCE); // hp check if (EatDrinkBandage(false)) return; } // end DoNonCombatActions
void PlayerbotMageAI::DoNonCombatActions() { Player* master = GetMaster(); if (!m_bot || !master) return; // Remove curse on group members if orders allow bot to do so if (Player* pCursedTarget = GetDispelTarget(DISPEL_CURSE)) { if (MAGE_REMOVE_CURSE > 0 && (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_NODISPEL) == 0 && CastSpell(MAGE_REMOVE_CURSE, pCursedTarget)) return; } // Buff armor if (MAGE_ARMOR) { if (m_ai->SelfBuff(MAGE_ARMOR)) return; } else if (ICE_ARMOR) { if (m_ai->SelfBuff(ICE_ARMOR)) return; } else if (FROST_ARMOR) { if (m_ai->SelfBuff(FROST_ARMOR)) return; } if (COMBUSTION && !m_bot->HasSpellCooldown(COMBUSTION) && m_ai->SelfBuff(COMBUSTION)) return; // buff group // the check for group targets is performed by NeedGroupBuff (if group is found for bots by the function) if (NeedGroupBuff(ARCANE_BRILLIANCE, ARCANE_INTELLECT) && m_ai->HasSpellReagents(ARCANE_BRILLIANCE)) { if (Buff(&PlayerbotMageAI::BuffHelper, ARCANE_BRILLIANCE) & RETURN_CONTINUE) return; } else if (Buff(&PlayerbotMageAI::BuffHelper, ARCANE_INTELLECT, JOB_MANAONLY) & RETURN_CONTINUE) return; Item* gem = FindManaGem(); if (!gem && CONJURE_MANA_GEM && m_ai->CastSpell(CONJURE_MANA_GEM, *m_bot)) { m_ai->SetIgnoreUpdateTime(3); return; } // TODO: The beauty of a mage is not only its ability to supply itself with water, but to share its water // So, conjure at *least* 1.25 stacks, ready to trade a stack and still have some left for self if (m_ai->FindDrink() == nullptr && CONJURE_WATER && m_ai->CastSpell(CONJURE_WATER, *m_bot)) { m_ai->TellMaster("I'm conjuring some water."); m_ai->SetIgnoreUpdateTime(3); return; } if (m_ai->FindFood() == nullptr && CONJURE_FOOD && m_ai->CastSpell(CONJURE_FOOD, *m_bot)) { m_ai->TellMaster("I'm conjuring some food."); m_ai->SetIgnoreUpdateTime(3); return; } if (EatDrinkBandage()) return; } // end DoNonCombatActions
void PlayerbotHunterAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_rangedCombat || m_ai->GetCombatStyle() == PlayerbotAI::COMBAT_MELEE) { m_rangedCombat = true; m_ai->SetCombatStyle(PlayerbotAI::COMBAT_RANGED); } // buff group if (TRUESHOT_AURA > 0 && !m_bot->HasAura(TRUESHOT_AURA, EFFECT_INDEX_0)) m_ai->CastSpell(TRUESHOT_AURA, *m_bot); // buff myself if (ASPECT_OF_THE_HAWK > 0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0)) m_ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot); //create water if (m_ai->FindDrink() == nullptr && m_bot->getLevel() == 60) { if (Item* pItem = m_bot->StoreNewItemInInventorySlot(CRYSTAL_WATER, 20)) m_bot->SendNewItem(pItem, 20, true, false); return; } // hp/mana check if (EatDrinkBandage()) return; // check for pet if (PET_SUMMON > 0 && !m_petSummonFailed && HasPet(m_bot)) { // we can summon pet, and no critical summon errors before Pet *pet = m_bot->GetPet(); if (!pet) { // summon pet if (PET_SUMMON > 0 && m_ai->CastSpell(PET_SUMMON, *m_bot)) m_ai->TellMaster("summoning pet."); else { m_petSummonFailed = true; m_ai->TellMaster("summon pet failed!"); } } else if (!(pet->isAlive())) { if (PET_REVIVE > 0 && m_ai->CastSpell(PET_REVIVE, *m_bot)) m_ai->TellMaster("reviving pet."); } else if (pet->GetHealthPercent() < 50) { if (PET_MEND > 0 && pet->isAlive() && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && m_ai->CastSpell(PET_MEND, *m_bot)) m_ai->TellMaster("healing pet."); } else if (pet->GetHappinessState() != HAPPY) // if pet is hungry { Unit *caster = (Unit *) m_bot; // list out items in main backpack for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) { Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); if (!pItemProto) continue; if (pet->HaveInDiet(pItemProto)) // is pItem in pets diet { // DEBUG_LOG ("[PlayerbotHunterAI]: DoNonCombatActions - Food for pet: %s",pItemProto->Name1); caster->CastSpell(caster, 23355, true); // pet feed visual uint32 count = 1; // number of items used int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food m_bot->DestroyItemCount(pItem, count, true); // remove item from inventory m_bot->CastCustomSpell(m_bot, PET_FEED, &benefit, nullptr, nullptr, true); // feed pet m_ai->TellMaster("feeding pet."); m_ai->SetIgnoreUpdateTime(10); return; } } } // list out items in other removable backpacks for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) { const Bag* const pBag = (Bag *) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); if (!pItemProto) continue; if (pet->HaveInDiet(pItemProto)) // is pItem in pets diet { // DEBUG_LOG ("[PlayerbotHunterAI]: DoNonCombatActions - Food for pet: %s",pItemProto->Name1); caster->CastSpell(caster, 23355, true); // pet feed visual uint32 count = 1; // number of items used int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food m_bot->DestroyItemCount(pItem, count, true); // remove item from inventory m_bot->CastCustomSpell(m_bot, PET_FEED, &benefit, nullptr, nullptr, true); // feed pet m_ai->TellMaster("feeding pet."); m_ai->SetIgnoreUpdateTime(10); return; } } } } if (pet->HasAura(PET_MEND, EFFECT_INDEX_0) && !pet->HasAura(PET_FEED, EFFECT_INDEX_0)) m_ai->TellMaster("..no pet food!"); m_ai->SetIgnoreUpdateTime(7); } } } // end DoNonCombatActions
void PlayerbotPriestAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; uint32 spec = m_bot->GetSpec(); // selfbuff goes first if (m_ai->SelfBuff(INNER_FIRE)) return; // Revive if (HealPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // After revive if (spec == PRIEST_SPEC_SHADOW && SHADOWFORM > 0) m_ai->SelfBuff(SHADOWFORM); if (VAMPIRIC_EMBRACE > 0) m_ai->SelfBuff(VAMPIRIC_EMBRACE); // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // Buffing // the check for group targets is performed by NeedGroupBuff (if group is found for bots by the function) if (NeedGroupBuff(PRAYER_OF_FORTITUDE, POWER_WORD_FORTITUDE) && m_ai->HasSpellReagents(PRAYER_OF_FORTITUDE)) { if (Buff(&PlayerbotPriestAI::BuffHelper, PRAYER_OF_FORTITUDE) & RETURN_CONTINUE) return; } else if (Buff(&PlayerbotPriestAI::BuffHelper, POWER_WORD_FORTITUDE) & RETURN_CONTINUE) return; if (NeedGroupBuff(PRAYER_OF_SPIRIT, DIVINE_SPIRIT) && m_ai->HasSpellReagents(PRAYER_OF_FORTITUDE)) { if (Buff(&PlayerbotPriestAI::BuffHelper, PRAYER_OF_SPIRIT) & RETURN_CONTINUE) return; } else if (Buff(&PlayerbotPriestAI::BuffHelper, DIVINE_SPIRIT, (JOB_ALL | JOB_MANAONLY)) & RETURN_CONTINUE) return; if (NeedGroupBuff(PRAYER_OF_SHADOW_PROTECTION, SHADOW_PROTECTION) && m_ai->HasSpellReagents(PRAYER_OF_FORTITUDE)) { if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_RESIST_SHADOW && Buff(&PlayerbotPriestAI::BuffHelper, PRAYER_OF_SHADOW_PROTECTION) & RETURN_CONTINUE) return; } else if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_RESIST_SHADOW && Buff(&PlayerbotPriestAI::BuffHelper, SHADOW_PROTECTION) & RETURN_CONTINUE) return; if (EatDrinkBandage()) return; // Nothing else to do, Night Elves will cast Shadowmeld to reduce their aggro versus patrols or nearby mobs if (SHADOWMELD && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && m_ai->CastSpell(SHADOWMELD, *m_bot)) return; } // end DoNonCombatActions
void PlayerbotPriestAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; if (!m_bot->isAlive() || m_bot->IsInDuel()) return; uint32 spec = m_bot->GetSpec(); // selfbuff goes first if (m_ai->SelfBuff(INNER_FIRE)) return; // Revive if (HealPlayer(GetResurrectionTarget()) & RETURN_CONTINUE) return; // After revive if (spec == PRIEST_SPEC_SHADOW && SHADOWFORM > 0) m_ai->SelfBuff(SHADOWFORM); if (VAMPIRIC_EMBRACE > 0) m_ai->SelfBuff(VAMPIRIC_EMBRACE); // Heal if (m_ai->IsHealer()) { if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } else { // Is this desirable? Debatable. // TODO: In a group/raid with a healer you'd want this bot to focus on DPS (it's not specced/geared for healing either) if (HealPlayer(m_bot) & RETURN_CONTINUE) return;// RETURN_CONTINUE; } // Buff if (m_bot->GetGroup()) { if (PRAYER_OF_FORTITUDE && m_ai->HasSpellReagents(PRAYER_OF_FORTITUDE) && m_ai->Buff(PRAYER_OF_FORTITUDE, m_bot)) return; if (PRAYER_OF_SPIRIT && m_ai->HasSpellReagents(PRAYER_OF_SPIRIT) && m_ai->Buff(PRAYER_OF_SPIRIT, m_bot)) return; if (PRAYER_OF_SHADOW_PROTECTION && m_ai->HasSpellReagents(PRAYER_OF_SHADOW_PROTECTION) && m_ai->Buff(PRAYER_OF_SHADOW_PROTECTION, m_bot)) return; } if (Buff(&PlayerbotPriestAI::BuffHelper, POWER_WORD_FORTITUDE)) return; if (Buff(&PlayerbotPriestAI::BuffHelper, DIVINE_SPIRIT, (JOB_ALL | JOB_MANAONLY))) return; if (Buff(&PlayerbotPriestAI::BuffHelper, SHADOW_PROTECTION, (JOB_TANK | JOB_HEAL) )) return; // hp/mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); if (EatDrinkBandage()) return; } // end DoNonCombatActions
void PlayerbotWarlockAI::DoNonCombatActions() { if (!m_ai) return; if (!m_bot) return; //uint32 spec = m_bot->GetSpec(); Pet *pet = m_bot->GetPet(); // Initialize pet spells if (pet && pet->GetEntry() != m_lastDemon) { switch (pet->GetEntry()) { case DEMON_IMP: BLOOD_PACT = m_ai->initPetSpell(BLOOD_PACT_ICON); FIREBOLT = m_ai->initPetSpell(FIREBOLT_ICON); FIRE_SHIELD = m_ai->initPetSpell(FIRE_SHIELD_ICON); break; case DEMON_VOIDWALKER: CONSUME_SHADOWS = m_ai->initPetSpell(CONSUME_SHADOWS_ICON); SACRIFICE = m_ai->initPetSpell(SACRIFICE_ICON); SUFFERING = m_ai->initPetSpell(SUFFERING_ICON); TORMENT = m_ai->initPetSpell(TORMENT_ICON); break; case DEMON_SUCCUBUS: LASH_OF_PAIN = m_ai->initPetSpell(LASH_OF_PAIN_ICON); SEDUCTION = m_ai->initPetSpell(SEDUCTION_ICON); SOOTHING_KISS = m_ai->initPetSpell(SOOTHING_KISS_ICON); break; case DEMON_FELHUNTER: DEVOUR_MAGIC = m_ai->initPetSpell(DEVOUR_MAGIC_ICON); SPELL_LOCK = m_ai->initPetSpell(SPELL_LOCK_ICON); break; } m_lastDemon = pet->GetEntry(); } // Destroy extra soul shards uint8 shardCount = m_bot->GetItemCount(SOUL_SHARD, false, nullptr); uint8 freeSpace = m_ai->GetFreeBagSpace(); if (shardCount > MAX_SHARD_COUNT || (freeSpace == 0 && shardCount > 1)) m_bot->DestroyItemCount(SOUL_SHARD, shardCount > MAX_SHARD_COUNT ? shardCount - MAX_SHARD_COUNT : 1, true, false); // buff myself DEMON_SKIN, DEMON_ARMOR, FEL_ARMOR - Strongest one available is chosen if (DEMON_ARMOR) { if (m_ai->SelfBuff(DEMON_ARMOR)) return; } else if (DEMON_SKIN) if (m_ai->SelfBuff(DEMON_SKIN)) return; // healthstone creation if (CREATE_HEALTHSTONE && shardCount > 0) { Item* const healthStone = m_ai->FindConsumable(HEALTHSTONE_DISPLAYID); if (!healthStone && m_ai->CastSpell(CREATE_HEALTHSTONE)) return; } // soulstone creation and use if (CREATE_SOULSTONE) { Item* soulStone = m_ai->FindConsumable(SOULSTONE_DISPLAYID); if (!soulStone) { if (shardCount > 0 && m_bot->IsSpellReady(CREATE_SOULSTONE) && m_ai->CastSpell(CREATE_SOULSTONE)) return; } else { uint32 soulStoneSpell = soulStone->GetProto()->Spells[0].SpellId; Player* master = GetMaster(); if (!master->HasAura(soulStoneSpell) && m_bot->IsSpellReady(soulStoneSpell)) { // TODO: first choice: healer. Second choice: anyone else with revive spell. Third choice: self or master. m_ai->UseItem(soulStone, master); return; } } } // hp/mana check if (pet && DARK_PACT && (100 * pet->GetPower(POWER_MANA) / pet->GetMaxPower(POWER_MANA)) > 40 && m_ai->GetManaPercent() <= 60) if (m_ai->CastSpell(DARK_PACT, *m_bot)) return; if (LIFE_TAP && m_ai->GetManaPercent() <= 80 && m_ai->GetHealthPercent() > 50) if (m_ai->CastSpell(LIFE_TAP, *m_bot)) return; // Do not waste time/soul shards to create spellstone or firestone // if two-handed weapon (staff) or off-hand item are already equiped // Spellstone creation and use (Spellstone dominates firestone completely as I understand it) Item* const weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); Item* const offweapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (weapon && !offweapon && weapon->GetProto()->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { Item* const stone = m_ai->FindConsumable(SPELLSTONE_DISPLAYID); Item* const stone2 = m_ai->FindConsumable(FIRESTONE_DISPLAYID); uint8 spellstone_count = m_bot->GetItemCount(SPELLSTONE, false, nullptr); if (spellstone_count == 0) spellstone_count = m_bot->GetItemCount(GREATER_SPELLSTONE, false, nullptr); if (spellstone_count == 0) spellstone_count = m_bot->GetItemCount(MAJOR_SPELLSTONE, false, nullptr); uint8 firestone_count = m_bot->GetItemCount(LESSER_FIRESTONE, false, nullptr); if (firestone_count == 0) firestone_count = m_bot->GetItemCount(FIRESTONE, false, nullptr); if (firestone_count == 0) firestone_count = m_bot->GetItemCount(GREATER_FIRESTONE, false, nullptr); if (firestone_count == 0) firestone_count = m_bot->GetItemCount(MAJOR_FIRESTONE, false, nullptr); if (spellstone_count == 0 && firestone_count == 0) { if (CREATE_SPELLSTONE && shardCount > 0 && m_ai->CastSpell(CREATE_SPELLSTONE)) return; else if (CREATE_SPELLSTONE == 0 && CREATE_FIRESTONE > 0 && shardCount > 0 && m_ai->CastSpell(CREATE_FIRESTONE)) return; } else if (stone) { m_ai->UseItem(stone, EQUIPMENT_SLOT_OFFHAND); return; } else { m_ai->UseItem(stone2, EQUIPMENT_SLOT_OFFHAND); return; } } if (EatDrinkBandage()) return; //Heal Voidwalker if (pet && pet->GetEntry() == DEMON_VOIDWALKER && CONSUME_SHADOWS && pet->GetHealthPercent() < 75 && !pet->HasAura(CONSUME_SHADOWS)) m_ai->CastPetSpell(CONSUME_SHADOWS); CheckDemon(); // Soul link demon if (pet && SOUL_LINK && !m_bot->HasAura(SOUL_LINK_AURA) && m_ai->CastSpell(SOUL_LINK, *m_bot)) return; // Check demon buffs if (pet && pet->GetEntry() == DEMON_IMP && BLOOD_PACT && !m_bot->HasAura(BLOOD_PACT) && m_ai->CastPetSpell(BLOOD_PACT)) return; } // end DoNonCombatActions