本文整理汇总了C++中Pet::HasAura方法的典型用法代码示例。如果您正苦于以下问题:C++ Pet::HasAura方法的具体用法?C++ Pet::HasAura怎么用?C++ Pet::HasAura使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Pet
的用法示例。
在下文中一共展示了Pet::HasAura方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: NeedGroupBuff
/**
* NeedGroupBuff()
* return boolean Returns true if more than two targets in the bot's group need the group buff.
*
* params:groupBuffSpellId uint32 the spell ID of the group buff like Arcane Brillance
* params:singleBuffSpellId uint32 the spell ID of the single target buff equivalent of the group buff like Arcane Intellect for group buff Arcane Brillance
* return false if false is returned, the bot is expected to perform a buff check for the single target buff of the group buff.
*
*/
bool PlayerbotClassAI::NeedGroupBuff(uint32 groupBuffSpellId, uint32 singleBuffSpellId)
{
if (!m_bot) return false;
uint8 numberOfGroupTargets = 0;
// Check group players to avoid using regeant and mana with an expensive group buff
// when only two players or less need it
if (m_bot->GetGroup())
{
Group::MemberSlotList const& groupSlot = m_bot->GetGroup()->GetMemberSlots();
for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++)
{
Player *groupMember = sObjectMgr.GetPlayer(itr->guid);
if (!groupMember || !groupMember->isAlive())
continue;
// Check if group member needs buff
if (!groupMember->HasAura(groupBuffSpellId, EFFECT_INDEX_0) && !groupMember->HasAura(singleBuffSpellId, EFFECT_INDEX_0))
numberOfGroupTargets++;
// Don't forget about pet
Pet * pet = groupMember->GetPet();
if (pet && !pet->HasAuraType(SPELL_AURA_MOD_UNATTACKABLE) && (pet->HasAura(groupBuffSpellId, EFFECT_INDEX_0) || pet->HasAura(singleBuffSpellId, EFFECT_INDEX_0)))
numberOfGroupTargets++;
}
// treshold set to 2 targets because beyond that value, the group buff cost is cheaper in mana
if (numberOfGroupTargets < 3)
return false;
// In doubt, buff everyone
return true;
}
else
return false; // no group, no group buff
}
示例2: DoNonCombatActions
void PlayerbotHunterAI::DoNonCombatActions()
{
PlayerbotAI *ai = GetAI();
if (!ai)
return;
Player * m_bot = GetPlayerBot();
if (!m_bot)
return;
// reset ranged combat state
if (!m_rangedCombat)
m_rangedCombat = true;
// buff group
if (TRUESHOT_AURA > 0)
(!m_bot->HasAura(TRUESHOT_AURA, EFFECT_INDEX_0) && ai->CastSpell (TRUESHOT_AURA, *m_bot));
// buff myself
if (ASPECT_OF_THE_HAWK > 0)
(!m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell (ASPECT_OF_THE_HAWK, *m_bot));
// 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() < 30)
{
ai->TellMaster("I could use a drink.");
ai->UseItem(pItem);
return;
}
// hp check
if (m_bot->getStandState() != UNIT_STAND_STATE_STAND)
m_bot->SetStandState(UNIT_STAND_STATE_STAND);
pItem = ai->FindFood();
if (pItem != NULL && ai->GetHealthPercent() < 30)
{
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;
}
// 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 && ai->CastSpell(PET_SUMMON, *m_bot))
ai->TellMaster("summoning pet.");
else
{
m_petSummonFailed = true;
ai->TellMaster("summon pet failed!");
}
}
else if (pet->getDeathState() != ALIVE)
{
// revive pet
if (PET_REVIVE > 0 && ai->GetManaPercent() >= 80 && ai->CastSpell(PET_REVIVE, *m_bot))
ai->TellMaster("reviving pet.");
}
else if (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f)
{
// heal pet when health lower 50%
if (PET_MEND > 0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot))
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, 51284, true); // pet feed visual
//.........这里部分代码省略.........
示例3: DoNextCombatManeuver
void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget)
{
PlayerbotAI* ai = GetAI();
if (!ai)
return;
switch (ai->GetScenarioType())
{
case PlayerbotAI::SCENARIO_DUEL:
ai->CastSpell(RAPTOR_STRIKE);
return;
default:
break;
}
// ------- Non Duel combat ----------
// Hunter
Player *m_bot = GetPlayerBot();
Unit* pVictim = pTarget->getVictim();
// check for pet and heal if neccessary
Pet *pet = m_bot->GetPet();
if ((pet)
&& (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f)
&& (PET_MEND > 0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot)))
{
ai->TellMaster("healing pet.");
return;
}
else if ((pet)
&& (INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION, *m_bot)))
//ai->TellMaster( "casting intimidation." ); // if pet has aggro :)
return;
// racial traits
if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0))
ai->CastSpell(BLOOD_FURY, *m_bot);
//ai->TellMaster( "Blood Fury." );
else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0))
ai->CastSpell(BERSERKING, *m_bot);
//ai->TellMaster( "Berserking." );
// check if ranged combat is possible (set m_rangedCombat and switch auras
float dist = m_bot->GetCombatDistance(pTarget);
if ((dist <= ATTACK_DISTANCE || !m_bot->GetUInt32Value(PLAYER_AMMO_ID)) && m_rangedCombat)
{
// switch to melee combat (target in melee range, out of ammo)
m_rangedCombat = false;
if (!m_bot->GetUInt32Value(PLAYER_AMMO_ID))
ai->TellMaster("Out of ammo!");
// become monkey (increases dodge chance)...
(ASPECT_OF_THE_MONKEY > 0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot));
}
else if (dist > ATTACK_DISTANCE && !m_rangedCombat)
{
// switch to ranged combat
m_rangedCombat = true;
// increase ranged attack power...
(ASPECT_OF_THE_HAWK > 0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot));
}
else if (m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0))
// check if we have hawk aspect in ranged combat
(ASPECT_OF_THE_HAWK > 0 && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot));
else if (!m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0))
// check if we have monkey aspect in melee combat
(ASPECT_OF_THE_MONKEY > 0 && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot));
// activate auto shot
if (AUTO_SHOT > 0 && m_rangedCombat && !m_bot->FindCurrentSpellBySpellId(AUTO_SHOT))
ai->CastSpell(AUTO_SHOT, *pTarget);
//ai->TellMaster( "started auto shot." );
else if (AUTO_SHOT > 0 && m_bot->FindCurrentSpellBySpellId(AUTO_SHOT))
m_bot->InterruptNonMeleeSpells(true, AUTO_SHOT);
//ai->TellMaster( "stopped auto shot." );
// damage spells
std::ostringstream out;
if (m_rangedCombat)
{
out << "Case Ranged";
if (HUNTERS_MARK > 0 && ai->GetManaPercent() >= 3 && !pTarget->HasAura(HUNTERS_MARK, EFFECT_INDEX_0) && ai->CastSpell(HUNTERS_MARK, *pTarget))
out << " > Hunter's Mark";
else if (RAPID_FIRE > 0 && ai->GetManaPercent() >= 3 && !m_bot->HasAura(RAPID_FIRE, EFFECT_INDEX_0) && ai->CastSpell(RAPID_FIRE, *m_bot))
out << " > Rapid Fire";
else if (MULTI_SHOT > 0 && ai->GetManaPercent() >= 13 && ai->GetAttackerCount() >= 3 && ai->CastSpell(MULTI_SHOT, *pTarget))
out << " > Multi-Shot";
else if (ARCANE_SHOT > 0 && ai->GetManaPercent() >= 7 && ai->CastSpell(ARCANE_SHOT, *pTarget))
out << " > Arcane Shot";
else if (CONCUSSIVE_SHOT > 0 && ai->GetManaPercent() >= 6 && !pTarget->HasAura(CONCUSSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(CONCUSSIVE_SHOT, *pTarget))
out << " > Concussive Shot";
else if (EXPLOSIVE_SHOT > 0 && ai->GetManaPercent() >= 10 && !pTarget->HasAura(EXPLOSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_SHOT, *pTarget))
out << " > Explosive Shot";
else if (VIPER_STING > 0 && ai->GetManaPercent() >= 8 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(VIPER_STING, *pTarget))
out << " > Viper Sting";
else if (SERPENT_STING > 0 && ai->GetManaPercent() >= 13 && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SERPENT_STING, *pTarget))
out << " > Serpent Sting";
else if (SCORPID_STING > 0 && ai->GetManaPercent() >= 11 && !pTarget->HasAura(WYVERN_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SCORPID_STING, *pTarget))
out << " > Scorpid Sting";
else if (CHIMERA_SHOT > 0 && ai->GetManaPercent() >= 12 && ai->CastSpell(CHIMERA_SHOT, *pTarget))
//.........这里部分代码省略.........
示例4: DoNonCombatActions
//.........这里部分代码省略.........
if (ai->SelfBuff(FEL_ARMOR))
return;
}
else if (DEMON_ARMOR)
{
if (ai->SelfBuff(DEMON_ARMOR))
return;
}
else if (DEMON_SKIN)
if (ai->SelfBuff(DEMON_SKIN))
return;
// healthstone creation
if (CREATE_HEALTHSTONE && shardCount > 0)
{
Item* const healthStone = ai->FindConsumable(HEALTHSTONE_DISPLAYID);
if (!healthStone && ai->CastSpell(CREATE_HEALTHSTONE))
return;
}
// soulstone creation and use
if (CREATE_SOULSTONE)
{
Item* soulStone = ai->FindConsumable(SOULSTONE_DISPLAYID);
if (!soulStone)
{
if (shardCount > 0 && !m_bot->HasSpellCooldown(CREATE_SOULSTONE) && ai->CastSpell(CREATE_SOULSTONE))
return;
}
else
{
uint32 soulStoneSpell = soulStone->GetProto()->Spells[0].SpellId;
Player * master = GetMaster();
if (!master->HasAura(soulStoneSpell) && !m_bot->HasSpellCooldown(soulStoneSpell))
{
ai->UseItem(soulStone, master);
return;
}
}
}
// firestone creation and use
Item* const weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0)
{
Item* const stone = ai->FindConsumable(FIRESTONE_DISPLAYID);
if (!stone)
{
if (CREATE_FIRESTONE && shardCount > 0 && ai->CastSpell(CREATE_FIRESTONE))
return;
}
else
{
ai->UseItem(stone, EQUIPMENT_SLOT_MAINHAND);
return;
}
}
if (m_bot->getStandState() != UNIT_STAND_STATE_STAND)
m_bot->SetStandState(UNIT_STAND_STATE_STAND);
// mana check
if (pet && DARK_PACT && pet->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() <= 50)
if (ai->CastSpell(DARK_PACT, *m_bot))
return;
示例5: 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);
//.........这里部分代码省略.........
示例6: DoNonCombatActions
void PlayerbotHunterAI::DoNonCombatActions()
{
PlayerbotAI *ai = GetAI();
Player * m_bot = GetPlayerBot();
Player* m_master = ai->GetLeader();
static const uint32 MinorGlyphs[] = {57903, 57866, 57870}; // feigh death - revive pet - healing pet
static const uint32 SurvivalMajorGlyphs[] = {56832, 56826, 63066}; // serpent sting - steady shot - explosive shot
for (uint32 i = 0; i < 3; i++)
{
if (!m_bot->HasSpell(MinorGlyphs[i]))
m_bot->learnSpell(MinorGlyphs[i], true);
if (!m_bot->HasSpell(SurvivalMajorGlyphs[i]))
m_bot->learnSpell(SurvivalMajorGlyphs[i], true);
}
if (!m_bot->HasAura(TRUESHOT_AURA, EFFECT_INDEX_0))
ai->CastSpell(TRUESHOT_AURA, m_bot);
if (!m_bot->HasAura(ASPECT_OF_THE_VIPER, EFFECT_INDEX_0) && ai->GetManaPercent() < 90 && ai->CastSpell(ASPECT_OF_THE_VIPER, m_bot))
return;
else if (!m_bot->HasAura(ASPECT_OF_THE_DRAGONHAWK, EFFECT_INDEX_0) && ai->GetManaPercent() >= 90 && ai->CastSpell(ASPECT_OF_THE_DRAGONHAWK, m_bot))
return;
// reset ranged combat state
if (!m_rangedCombat)
m_rangedCombat = true;
// 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 && ai->CastSpell(PET_SUMMON, m_bot))
{
}
else
{
m_petSummonFailed = true;
}
}
else if (pet->getDeathState() != ALIVE)
{
// revive pet
if (PET_REVIVE > 0 && ai->GetManaPercent() >= 80 && ai->CastSpell(PET_REVIVE, m_bot))
{
}
}
else if (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f)
{
// heal pet when health lower 50%
if (PET_MEND > 0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, m_bot))
{
}
}
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
{
caster->CastSpell(caster, 51284, 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, NULL, NULL, true); // feed pet
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;
//.........这里部分代码省略.........
示例7: DoNextCombatManeuverPVE
CombatManeuverReturns PlayerbotHunterAI::DoNextCombatManeuverPVE(Unit *pTarget)
{
if (!m_ai) return RETURN_NO_ACTION_ERROR;
if (!m_bot) return RETURN_NO_ACTION_ERROR;
if (!pTarget) return RETURN_NO_ACTION_ERROR;
Unit* pVictim = pTarget->getVictim();
// check for pet and heal if neccessary
Pet *pet = m_bot->GetPet();
// TODO: clarify/simplify: !pet->getDeathState() != ALIVE
if (pet && PET_MEND > 0 && pet->isAlive() && pet->GetHealthPercent() < 50 && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && m_ai->CastSpell(PET_MEND, *m_bot))
{
m_ai->TellMaster("healing pet.");
return RETURN_CONTINUE;
}
else if (pet && INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && m_ai->CastSpell(INTIMIDATION, *m_bot))
return RETURN_CONTINUE;
// racial traits
if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0))
m_ai->CastSpell(BLOOD_FURY, *m_bot);
else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0))
m_ai->CastSpell(BERSERKING, *m_bot);
// check if ranged combat is possible
bool meleeReach = m_bot->CanReachWithMeleeAttack(pTarget);
if (meleeReach || !m_has_ammo)
{
// switch to melee combat (target in melee range, out of ammo)
m_rangedCombat = false;
m_ai->SetCombatStyle(PlayerbotAI::COMBAT_MELEE);
if (!m_bot->GetUInt32Value(PLAYER_AMMO_ID))
m_ai->TellMaster("Out of ammo!");
// become monkey (increases dodge chance)...
if (ASPECT_OF_THE_MONKEY > 0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0))
m_ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot);
}
else if (!meleeReach)
{
// switch to ranged combat
m_rangedCombat = true;
m_ai->SetCombatStyle(PlayerbotAI::COMBAT_RANGED);
// increase ranged attack power...
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);
// m_ai->TellMaster("target dist %f",m_bot->GetCombatDistance(pTarget,true));
if (AUTO_SHOT > 0)
{
if (m_bot->isAttackReady(RANGED_ATTACK))
m_bot->CastSpell(pTarget, AUTO_SHOT, true);
m_bot->setAttackTimer(RANGED_ATTACK,500);
const SpellEntry* spellInfo = sSpellStore.LookupEntry(AUTO_SHOT);
if (!spellInfo)
return RETURN_CONTINUE;
if (m_ai->CheckBotCast(spellInfo) != SPELL_CAST_OK)
m_bot->InterruptNonMeleeSpells(true, AUTO_SHOT);
}
}
// damage spells
if (m_ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED)
{
if (HUNTERS_MARK > 0 && m_ai->In_Reach(pTarget,HUNTERS_MARK) && !pTarget->HasAura(HUNTERS_MARK, EFFECT_INDEX_0) && m_ai->CastSpell(HUNTERS_MARK, *pTarget))
return RETURN_CONTINUE;
else if (RAPID_FIRE > 0 && m_ai->In_Reach(pTarget,RAPID_FIRE) && !m_bot->HasAura(RAPID_FIRE, EFFECT_INDEX_0) && m_ai->CastSpell(RAPID_FIRE, *m_bot))
return RETURN_CONTINUE;
else if (MULTI_SHOT > 0 && m_ai->In_Reach(pTarget,MULTI_SHOT) && m_ai->GetAttackerCount() >= 3 && m_ai->CastSpell(MULTI_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (ARCANE_SHOT > 0 && m_ai->In_Reach(pTarget,ARCANE_SHOT) && m_ai->CastSpell(ARCANE_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (CONCUSSIVE_SHOT > 0 && m_ai->In_Reach(pTarget,CONCUSSIVE_SHOT) && !pTarget->HasAura(CONCUSSIVE_SHOT, EFFECT_INDEX_0) && m_ai->CastSpell(CONCUSSIVE_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (VIPER_STING > 0 && m_ai->In_Reach(pTarget,VIPER_STING) && pTarget->GetPower(POWER_MANA) > 0 && m_ai->GetManaPercent() < 70 && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && m_ai->CastSpell(VIPER_STING, *pTarget))
return RETURN_CONTINUE;
else if (SERPENT_STING > 0 && m_ai->In_Reach(pTarget,SERPENT_STING) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && m_ai->CastSpell(SERPENT_STING, *pTarget))
return RETURN_CONTINUE;
else if (SCORPID_STING > 0 && m_ai->In_Reach(pTarget,SCORPID_STING) && !pTarget->HasAura(WYVERN_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && m_ai->CastSpell(SCORPID_STING, *pTarget))
return RETURN_CONTINUE;
else if (VOLLEY > 0 && m_ai->In_Reach(pTarget,VOLLEY) && m_ai->GetAttackerCount() >= 3 && m_ai->CastSpell(VOLLEY, *pTarget))
return RETURN_CONTINUE;
else if (BLACK_ARROW > 0 && m_ai->In_Reach(pTarget,BLACK_ARROW) && !pTarget->HasAura(BLACK_ARROW, EFFECT_INDEX_0) && m_ai->CastSpell(BLACK_ARROW, *pTarget))
return RETURN_CONTINUE;
else if (AIMED_SHOT > 0 && m_ai->In_Reach(pTarget,AIMED_SHOT) && m_ai->CastSpell(AIMED_SHOT, *pTarget))
return RETURN_CONTINUE;
else
return RETURN_NO_ACTION_OK;
}
else
{
if (RAPTOR_STRIKE > 0 && m_ai->In_Reach(pTarget,RAPTOR_STRIKE) && m_ai->CastSpell(RAPTOR_STRIKE, *pTarget))
return RETURN_CONTINUE;
//.........这里部分代码省略.........
示例8: 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
//.........这里部分代码省略.........
示例9: DoNonCombatActions
void PlayerbotHunterAI::DoNonCombatActions()
{
PlayerbotAI *ai = GetAI();
if (!ai)
return;
Player * m_bot = GetPlayerBot();
if (!m_bot)
return;
// reset ranged combat state
if (!m_rangedCombat)
m_rangedCombat = true;
// buff group
if (TRUESHOT_AURA > 0)
(!m_bot->HasAura(TRUESHOT_AURA, EFFECT_INDEX_0) && ai->CastSpell (TRUESHOT_AURA, *m_bot));
// buff myself
if (ASPECT_OF_THE_HAWK > 0)
(!m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell (ASPECT_OF_THE_HAWK, *m_bot));
// 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() < 30)
{
ai->TellMaster("I could use a drink.");
ai->UseItem(pItem);
return;
}
// hp check
if (m_bot->getStandState() != UNIT_STAND_STATE_STAND)
m_bot->SetStandState(UNIT_STAND_STATE_STAND);
pItem = ai->FindFood();
if (pItem != NULL && ai->GetHealthPercent() < 30)
{
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;
}
else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70)
{
ai->TellMaster("I'm casting gift of the naaru.");
ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot);
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 && ai->CastSpell(PET_SUMMON, *m_bot))
ai->TellMaster("summoning pet.");
else
{
m_petSummonFailed = true;
ai->TellMaster("summon pet failed!");
}
}
else if (pet->getDeathState() != ALIVE)
{
// revive pet
if (PET_REVIVE > 0 && ai->GetManaPercent() >= 80 && ai->CastSpell(PET_REVIVE, *m_bot))
ai->TellMaster("reviving pet.");
}
else if (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f)
{
// heal pet when health lower 50%
if (PET_MEND > 0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot))
ai->TellMaster("healing pet.");
}
}
} // end DoNonCombatActions
示例10: DoNextCombatManeuver
void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget)
{
PlayerbotAI* ai = GetAI();
if (!ai)
return;
switch (ai->GetScenarioType())
{
case PlayerbotAI::SCENARIO_DUEL:
ai->CastSpell(PLAGUE_STRIKE);
return;
}
// ------- Non Duel combat ----------
//ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob
// DK Attacks: Unholy, Frost & Blood
// damage spells
ai->SetInFront( pTarget );//<---
Player *m_bot = GetPlayerBot();
Unit* pVictim = pTarget->getVictim();
Pet *pet = m_bot->GetPet();
float dist = m_bot->GetDistance( pTarget );
std::ostringstream out;
switch (SpellSequence)
{
case SPELL_DK_UNHOLY:
if (UNHOLY_PRESENCE > 0)
(!m_bot->HasAura(UNHOLY_PRESENCE, 0) && !m_bot->HasAura(BLOOD_PRESENCE, 0) && !m_bot->HasAura(FROST_PRESENCE, 0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot));
// check for BONE_SHIELD in combat
if (BONE_SHIELD > 0)
(!m_bot->HasAura(BONE_SHIELD, 0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, 0) && ai->CastSpell (BONE_SHIELD, *m_bot));
if (ARMY_OF_THE_DEAD > 0 && ai->GetAttackerCount()>=5 && LastSpellUnholyDK < 1)
{
ai->CastSpell(ARMY_OF_THE_DEAD);
out << " summoning Army of the Dead!";
if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, 0))
ai->SetIgnoreUpdateTime(7);
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK +1;
break;
}
else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, 0) && LastSpellUnholyDK < 2)
{
ai->CastSpell(PLAGUE_STRIKE, *pTarget);
out << " Plague Strike";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK +1;
break;
}
else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, 0) && LastSpellUnholyDK < 3)
{
ai->CastSpell(DEATH_GRIP, *pTarget);
out << " Death Grip";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK +1;
break;
}
else if (DEATH_COIL > 0 && LastSpellUnholyDK < 4 && ai->GetRunicPower() >= 40)
{
ai->CastSpell(DEATH_COIL, *pTarget);
out << " Death Coil";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK +1;
break;
}
else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, 0) && LastSpellUnholyDK < 5)
{
ai->CastSpell(DEATH_STRIKE, *pTarget);
out << " Death Strike";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK +1;
break;
}
else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, 0) && LastSpellUnholyDK < 6)
{
ai->CastSpell(UNHOLY_BLIGHT);
out << " Unholy Blight";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK +1;
break;
}
else if (SCOURGE_STRIKE > 0 && LastSpellUnholyDK < 7)
{
ai->CastSpell(SCOURGE_STRIKE, *pTarget);
out << " Scourge Strike";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK +1;
break;
}
else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, 0) && LastSpellUnholyDK < 8)
{
ai->CastSpell(DEATH_AND_DECAY);
out << " Death and Decay";
ai->SetIgnoreUpdateTime(1);
//.........这里部分代码省略.........
示例11: DoNextCombatManeuverPVE
CombatManeuverReturns PlayerbotHunterAI::DoNextCombatManeuverPVE(Unit *pTarget)
{
if (!m_ai) return RETURN_NO_ACTION_ERROR;
if (!m_bot) return RETURN_NO_ACTION_ERROR;
if (!pTarget) return RETURN_NO_ACTION_ERROR;
Unit* pVictim = pTarget->getVictim();
// check for pet and heal if neccessary
Pet *pet = m_bot->GetPet();
// TODO: clarify/simplify: !pet->getDeathState() != ALIVE
if (pet && PET_MEND > 0 && pet->isAlive() && pet->GetHealthPercent() < 50 && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && m_ai->CastSpell(PET_MEND, *m_bot))
{
m_ai->TellMaster("healing pet.");
return RETURN_CONTINUE;
}
else if (pet && INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && m_ai->CastSpell(INTIMIDATION, *m_bot))
return RETURN_CONTINUE;
// racial traits
if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0))
m_ai->CastSpell(BLOOD_FURY, *m_bot);
else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0))
m_ai->CastSpell(BERSERKING, *m_bot);
// check if ranged combat is possible
float dist = m_bot->GetCombatDistance(pTarget, true);
if ((dist <= ATTACK_DISTANCE || !m_bot->GetUInt32Value(PLAYER_AMMO_ID)) && m_ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED)
{
// switch to melee combat (target in melee range, out of ammo)
m_ai->SetCombatStyle(PlayerbotAI::COMBAT_MELEE);
if (!m_bot->GetUInt32Value(PLAYER_AMMO_ID))
m_ai->TellMaster("Out of ammo!");
}
else if (dist > ATTACK_DISTANCE && m_ai->GetCombatStyle() == PlayerbotAI::COMBAT_MELEE)
m_ai->SetCombatStyle(PlayerbotAI::COMBAT_RANGED);
// Set appropriate aspect
if (m_ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED)
{
if (ASPECT_OF_THE_HAWK && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0))
m_ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot);
}
else
{
if (ASPECT_OF_THE_MONKEY && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0))
m_ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot);
}
// activate auto shot: Reworked to account for AUTO_SHOT being a triggered spell
if (AUTO_SHOT > 0 && m_ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED && m_ai->GetCurrentSpellId() != AUTO_SHOT)
m_bot->CastSpell(pTarget, AUTO_SHOT, true);
// damage spells
if (m_ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED)
{
if (HUNTERS_MARK > 0 && !pTarget->HasAura(HUNTERS_MARK, EFFECT_INDEX_0) && m_ai->CastSpell(HUNTERS_MARK, *pTarget))
return RETURN_CONTINUE;
else if (RAPID_FIRE > 0 && !m_bot->HasAura(RAPID_FIRE, EFFECT_INDEX_0) && m_ai->CastSpell(RAPID_FIRE, *m_bot))
return RETURN_CONTINUE;
else if (MULTI_SHOT > 0 && m_ai->GetAttackerCount() >= 3 && m_ai->CastSpell(MULTI_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (ARCANE_SHOT > 0 && m_ai->CastSpell(ARCANE_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (CONCUSSIVE_SHOT > 0 && !pTarget->HasAura(CONCUSSIVE_SHOT, EFFECT_INDEX_0) && m_ai->CastSpell(CONCUSSIVE_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (EXPLOSIVE_SHOT > 0 && !pTarget->HasAura(EXPLOSIVE_SHOT, EFFECT_INDEX_0) && m_ai->CastSpell(EXPLOSIVE_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (VIPER_STING > 0 && pTarget->GetPower(POWER_MANA) > 0 && m_ai->GetManaPercent() < 70 && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && m_ai->CastSpell(VIPER_STING, *pTarget))
return RETURN_CONTINUE;
else if (SERPENT_STING > 0 && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && m_ai->CastSpell(SERPENT_STING, *pTarget))
return RETURN_CONTINUE;
else if (SCORPID_STING > 0 && !pTarget->HasAura(WYVERN_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && m_ai->CastSpell(SCORPID_STING, *pTarget))
return RETURN_CONTINUE;
else if (CHIMERA_SHOT > 0 && m_ai->CastSpell(CHIMERA_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (VOLLEY > 0 && m_ai->GetAttackerCount() >= 3 && m_ai->CastSpell(VOLLEY, *pTarget))
return RETURN_CONTINUE;
else if (BLACK_ARROW > 0 && !pTarget->HasAura(BLACK_ARROW, EFFECT_INDEX_0) && m_ai->CastSpell(BLACK_ARROW, *pTarget))
return RETURN_CONTINUE;
else if (AIMED_SHOT > 0 && m_ai->CastSpell(AIMED_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (STEADY_SHOT > 0 && m_ai->CastSpell(STEADY_SHOT, *pTarget))
return RETURN_CONTINUE;
else if (KILL_SHOT > 0 && pTarget->GetHealthPercent() < 20 && m_ai->CastSpell(KILL_SHOT, *pTarget))
return RETURN_CONTINUE;
else
return RETURN_NO_ACTION_OK;
}
else
{
if (RAPTOR_STRIKE > 0 && m_ai->CastSpell(RAPTOR_STRIKE, *pTarget))
return RETURN_CONTINUE;
else if (EXPLOSIVE_TRAP > 0 && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && m_ai->CastSpell(EXPLOSIVE_TRAP, *pTarget))
return RETURN_CONTINUE;
else if (WING_CLIP > 0 && !pTarget->HasAura(WING_CLIP, EFFECT_INDEX_0) && m_ai->CastSpell(WING_CLIP, *pTarget))
return RETURN_CONTINUE;
else if (IMMOLATION_TRAP > 0 && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && m_ai->CastSpell(IMMOLATION_TRAP, *pTarget))
return RETURN_CONTINUE;
else if (MONGOOSE_BITE > 0 && m_ai->CastSpell(MONGOOSE_BITE, *pTarget))
//.........这里部分代码省略.........
示例12: DoNonCombatActions
void PlayerbotHunterAI::DoNonCombatActions()
{
PlayerbotAI *ai = GetAI();
Player *m_bot = GetPlayerBot();
if (!m_bot || !ai || m_bot->isDead()) { return; }
//If Casting or Eating/Drinking return
if (m_bot->HasUnitState(UNIT_STAT_CASTING)) { return; }
if (m_bot->getStandState() == UNIT_STAND_STATE_SIT) { return; }
// buff group
if (CastSpell(TRUESHOT_AURA, m_bot)) { return; }
//mana/hp check
//Don't bother with eating, if low on hp, just let it heal themself
if (m_bot->getRace() == (uint8) RACE_UNDEAD_PLAYER && ai->GetHealthPercent() < 75 && CastSpell(R_CANNIBALIZE,m_bot)) { return; }
if (ai->GetManaPercent() < 20 || ai->GetHealthPercent() < 30) { ai->Feast(); }
#pragma region Check Pet
// 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 && ai->CastSpell(PET_SUMMON,m_bot) )
ai->TellMaster( "summoning pet." );
else
{
m_petSummonFailed = true;
ai->TellMaster( "summon pet failed!" );
}
}
else if( pet->getDeathState() != ALIVE )
{
// revive pet
if( PET_REVIVE>0 && ai->GetManaPercent()>=80 && ai->CastSpell(PET_REVIVE,m_bot) )
ai->TellMaster( "reviving pet." );
}
else if( ((float)pet->GetHealth()/(float)pet->GetMaxHealth()) < 0.5f )
{
// heal pet when health lower 50%
if( PET_MEND>0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND,0) && ai->GetManaPercent()>=13 && ai->CastSpell(PET_MEND,m_bot) )
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 ItemTemplate* const pItemProto = pItem->GetTemplate();
if (!pItemProto )
continue;
if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet
{
//sLog.outDebug("Food for pet: %s",pItemProto->Name1);
caster->CastSpell(caster,51284,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,NULL,NULL,true); // feed pet
ai->TellMaster( "feeding pet." );
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 ItemTemplate* const pItemProto = pItem->GetTemplate();
if (!pItemProto )
continue;
if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet
{
//sLog.outDebug("Food for pet: %s",pItemProto->Name1);
caster->CastSpell(caster,51284,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,NULL,NULL,true); // feed pet
ai->TellMaster( "feeding pet." );
ai->SetIgnoreUpdateTime(10);
return;
}
}
//.........这里部分代码省略.........
示例13: DoNextCombatManeuverPVE
CombatManeuverReturns PlayerbotDeathKnightAI::DoNextCombatManeuverPVE(Unit *pTarget)
{
if (!m_ai) return RETURN_NO_ACTION_ERROR;
if (!m_bot) return RETURN_NO_ACTION_ERROR;
// DK Attacks: Unholy, Frost & Blood
// damage spells
Unit* pVictim = pTarget->getVictim();
Pet *pet = m_bot->GetPet();
float dist = m_bot->GetCombatDistance(pTarget, true);
std::ostringstream out;
switch (SpellSequence)
{
case SPELL_DK_UNHOLY:
if (UNHOLY_PRESENCE > 0 && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && m_ai->CastSpell(UNHOLY_PRESENCE, *m_bot))
return RETURN_CONTINUE;
// check for BONE_SHIELD in combat
if (BONE_SHIELD > 0 && !m_bot->HasAura(BONE_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && m_ai->CastSpell(BONE_SHIELD, *m_bot))
return RETURN_CONTINUE;
if (ARMY_OF_THE_DEAD > 0 && m_ai->GetAttackerCount() >= 5 && LastSpellUnholyDK < 1 && m_ai->CastSpell(ARMY_OF_THE_DEAD) && m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0))
{
out << " summoning Army of the Dead!";
m_ai->SetIgnoreUpdateTime(7);
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 2 && m_ai->CastSpell(PLAGUE_STRIKE, *pTarget))
{
out << " Plague Strike";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, EFFECT_INDEX_0) && LastSpellUnholyDK < 3 && m_ai->CastSpell(DEATH_GRIP, *pTarget))
{
out << " Death Grip";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (DEATH_COIL > 0 && LastSpellUnholyDK < 4 && m_ai->CastSpell(DEATH_COIL, *pTarget))
{
out << " Death Coil";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 5 && m_ai->CastSpell(DEATH_STRIKE, *pTarget))
{
out << " Death Strike";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, EFFECT_INDEX_0) && LastSpellUnholyDK < 6 && m_ai->CastSpell(UNHOLY_BLIGHT))
{
out << " Unholy Blight";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (SCOURGE_STRIKE > 0 && LastSpellUnholyDK < 7 && m_ai->CastSpell(SCOURGE_STRIKE, *pTarget))
{
out << " Scourge Strike";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (DEATH_AND_DECAY > 0 && m_ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, EFFECT_INDEX_0) && LastSpellUnholyDK < 8 && m_ai->CastSpell(DEATH_AND_DECAY))
{
out << " Death and Decay";
m_ai->SetIgnoreUpdateTime(1);
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && !pTarget->HasAura(SUMMON_GARGOYLE, EFFECT_INDEX_0) && LastSpellUnholyDK < 9 && m_ai->CastSpell(SUMMON_GARGOYLE, *pTarget))
{
out << " summoning Gargoyle";
m_ai->SetIgnoreUpdateTime(2);
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (CORPSE_EXPLOSION > 0 && dist <= ATTACK_DISTANCE && LastSpellUnholyDK < 10 && m_ai->CastSpell(CORPSE_EXPLOSION, *pTarget))
{
out << " Corpse Explosion";
SpellSequence = SPELL_DK_FROST;
LastSpellUnholyDK = LastSpellUnholyDK + 1;
return RETURN_CONTINUE;
}
if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 11 && m_ai->CastSpell(ANTI_MAGIC_SHELL, *m_bot))
{
out << " Anti-Magic Shell";
SpellSequence = SPELL_DK_FROST;
//.........这里部分代码省略.........