bool PlayerbotClassAI::TakePosition(Unit *followTarget, BotRole bRole, float bDist, float bMinDist, float bMaxDist, float bAngle, Unit *faceTarget) { bool doFollow = true; bool omitAngle = false; bool angleIsAutoSet = false; if (!bAngle) angleIsAutoSet = true; if (bAngle < 0) bAngle += 2 * M_PI; //if (bAngle > 2 * M_PI) bAngle -= 2 * M_PI; //Do not send values higher than 2 PI, lower than -2 PI bool rval = false; if (followTarget == NULL) { followTarget = GetMaster(); if (followTarget == NULL) { return false; } } if (faceTarget == NULL) { faceTarget = followTarget; } if (bRole == BOT_ROLE_NONE) { bRole = ( (m_role == BOT_ROLE_NONE) ? BOT_ROLE_DPS_MELEE : m_role); } //Default values Unit *pVictim = followTarget->getVictim(); if (pVictim && pVictim->GetGUID() == m_bot->GetGUID()) //if target is attacking me { if (bRole == BOT_ROLE_TANK || bRole == BOT_ROLE_OFFTANK || bRole == BOT_ROLE_DPS_MELEE) { //Move to target if (!bDist || bDist > 0.7f) bDist = 0.7f; if (bMinDist < 0 || bMinDist > 1) bMinDist = 0; if (bMaxDist <= 0 || bMaxDist > MELEE_RANGE) bMaxDist = MELEE_RANGE; bAngle = 0; } else {doFollow = false;} //Do not move, creature will come } else { // calculating distance to follow switch (bRole) { case BOT_ROLE_TANK: case BOT_ROLE_OFFTANK: if (!bDist) { bDist = 0.7f; bMinDist = 0; bMaxDist = MELEE_RANGE; bAngle = 0;} break; case BOT_ROLE_HEALER: case BOT_ROLE_SUPPORT: if (!bDist) { bDist = urand(12, 14); bMinDist = 10; bMaxDist = 18; bAngle = ((urand(0,1) * 90 ) + urand(110,160)) * M_PI / 180; } break; case BOT_ROLE_DPS_RANGED: if (!bDist) { bDist = urand(18, 24); bMinDist = 10; bMaxDist = 26; bAngle = ((urand(0,1) * 90 ) + urand(110,160)) * M_PI / 180; } break; default: if (!bDist) { bDist = 0.7f; bMinDist = 0.1f; bMaxDist = MELEE_RANGE; bAngle = ((urand(0,1) * 90 ) + urand(110,160)) * M_PI / 180; } break; } } //Do not try to go behind if ranged and creature is not boss like if (bDist > MELEE_RANGE && followTarget->GetTypeId() != TYPEID_PLAYER) { const CreatureTemplate *creatureInfo = ((Creature*) followTarget)->GetCreatureInfo(); if (!creatureInfo || creatureInfo->rank != 3) { omitAngle = true; } } //Move if (doFollow) { float curDist = m_bot->GetDistance(followTarget); if (m_pulling || (!m_bot->isMoving() && ((curDist > bMaxDist || curDist < bMinDist) //Outside range boundries || (!omitAngle && ((!followTarget->HasInArc(M_PI,m_bot)) ^ (bAngle > 0.5f * M_PI && bAngle < 1.5f * M_PI)))) )//is at right position front/behind? ) { //m_bot->GetMotionMaster()->Clear(); //sLog->outError("Bot[%u] is moving, curDist[%f], bDist[%f], bminDist[%f], bMaxDist[%f], bAngle[%f], InFront[%u]", m_bot->GetGUIDLow(), curDist, bDist,bMinDist, bMaxDist, bAngle, followTarget->HasInArc(M_PI,m_bot)); if (angleIsAutoSet && omitAngle) { m_bot->GetMotionMaster()->MoveChase(followTarget, bDist); } else { m_bot->GetMotionMaster()->MoveChase(followTarget, bDist, bAngle); } rval |= true; } } //Face your faceTarget if (!m_bot->HasInArc(M_PI/16, faceTarget) && !m_bot->isMoving() ) { m_bot->SetFacingToObject(faceTarget); rval |= true; } return rval; }
CombatManeuverReturns PlayerbotPriestAI::DoNextCombatManeuverPVE(Unit *pTarget) { if (!m_ai) return RETURN_NO_ACTION_ERROR; if (!m_bot) return RETURN_NO_ACTION_ERROR; bool meleeReach = m_bot->CanReachWithMeleeAttack(pTarget); uint32 spec = m_bot->GetSpec(); // Define a tank bot will look at Unit* pMainTank = GetHealTarget(JOB_TANK); if (m_ai->GetCombatStyle() != PlayerbotAI::COMBAT_RANGED && !meleeReach) m_ai->SetCombatStyle(PlayerbotAI::COMBAT_RANGED); // switch to melee if in melee range AND can't shoot OR have no ranged (wand) equipped AND is not healer else if(m_ai->GetCombatStyle() != PlayerbotAI::COMBAT_MELEE && meleeReach && (SHOOT == 0 || !m_bot->GetWeaponForAttack(RANGED_ATTACK, true, true)) && !m_ai->IsHealer()) m_ai->SetCombatStyle(PlayerbotAI::COMBAT_MELEE); // Dwarves priests will try to buff with Fear Ward if (FEAR_WARD > 0 && !m_bot->HasSpellCooldown(FEAR_WARD)) { // Buff tank first if (pMainTank) { if (m_ai->In_Reach(pMainTank, FEAR_WARD) && !pMainTank->HasAura(FEAR_WARD, EFFECT_INDEX_0) && CastSpell(FEAR_WARD, pMainTank)) return RETURN_CONTINUE; } // Else try to buff master else if (GetMaster()) { if (m_ai->In_Reach(GetMaster(), FEAR_WARD) && !GetMaster()->HasAura(FEAR_WARD, EFFECT_INDEX_0) && CastSpell(FEAR_WARD, GetMaster())) return RETURN_CONTINUE; } } //Used to determine if this bot is highest on threat Unit* newTarget = m_ai->FindAttacker((PlayerbotAI::ATTACKERINFOTYPE) (PlayerbotAI::AIT_VICTIMSELF | PlayerbotAI::AIT_HIGHESTTHREAT), m_bot); if (newTarget && !m_ai->IsNeutralized(newTarget)) // TODO: && party has a tank { if (FADE > 0 && !m_bot->HasAura(FADE, EFFECT_INDEX_0) && !m_bot->HasSpellCooldown(FADE)) { if (CastSpell(FADE, m_bot)) { m_ai->TellMaster("I'm casting fade."); return RETURN_CONTINUE; } else m_ai->TellMaster("I have AGGRO."); } // Heal myself // TODO: move to HealTarget code if (m_ai->GetHealthPercent() < 35 && POWER_WORD_SHIELD > 0 && !m_bot->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(WEAKNED_SOUL, EFFECT_INDEX_0)) { if (CastSpell(POWER_WORD_SHIELD) & RETURN_CONTINUE) { m_ai->TellMaster("I'm casting PW:S on myself."); return RETURN_CONTINUE; } else if (m_ai->IsHealer()) // Even if any other RETURN_ANY_OK - aside from RETURN_CONTINUE m_ai->TellMaster("Your healer's about TO DIE. HELP ME."); } if (m_ai->GetHealthPercent() < 35 && DESPERATE_PRAYER > 0 && m_ai->In_Reach(m_bot,DESPERATE_PRAYER) && CastSpell(DESPERATE_PRAYER, m_bot) & RETURN_CONTINUE) { m_ai->TellMaster("I'm casting desperate prayer."); return RETURN_CONTINUE; } // Night Elves priest bot can also cast Elune's Grace to improve his/her dodge rating if (ELUNES_GRACE && !m_bot->HasAura(ELUNES_GRACE, EFFECT_INDEX_0) && !m_bot->HasSpellCooldown(ELUNES_GRACE) && CastSpell(ELUNES_GRACE, m_bot)) return RETURN_CONTINUE; // If enemy comes in melee reach if (meleeReach) { // Already healed self or tank. If healer, do nothing else to anger mob if (m_ai->IsHealer()) return RETURN_NO_ACTION_OK; // In a sense, mission accomplished. // Have threat, can't quickly lower it. 3 options remain: Stop attacking, lowlevel damage (wand), keep on keeping on. if (newTarget->GetHealthPercent() > 25) { // If elite, do nothing and pray tank gets aggro off you if (m_ai->IsElite(newTarget)) return RETURN_NO_ACTION_OK; // Not an elite. You could insert PSYCHIC SCREAM here but in any PvE situation that's 90-95% likely // to worsen the situation for the group. ... So please don't. return CastSpell(SHOOT, pTarget); } } } // Damage tweaking for healers if (m_ai->IsHealer()) { // Heal other players/bots first if (HealPlayer(GetHealTarget()) & RETURN_CONTINUE) return RETURN_CONTINUE; // No one needs to be healed: do small damage instead // If target is elite and not handled by MT: do nothing if (m_ai->IsElite(pTarget) && pMainTank && pMainTank->getVictim() != pTarget) return RETURN_NO_ACTION_OK; // Cast Shadow Word:Pain on current target and keep its up (if mana >= 40% or target HP < 15%) if (SHADOW_WORD_PAIN > 0 && m_ai->In_Reach(pTarget,SHADOW_WORD_PAIN) && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && (pTarget->GetHealthPercent() < 15 || m_ai->GetManaPercent() >= 40) && CastSpell(SHADOW_WORD_PAIN, pTarget)) return RETURN_CONTINUE; else // else shoot at it return CastSpell(SHOOT, pTarget); } // Damage Spells switch (spec) { case PRIEST_SPEC_HOLY: if (HOLY_FIRE > 0 && m_ai->In_Reach(pTarget,HOLY_FIRE) && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && CastSpell(HOLY_FIRE, pTarget)) return RETURN_CONTINUE; if (SMITE > 0 && m_ai->In_Reach(pTarget,SMITE) && CastSpell(SMITE, pTarget)) return RETURN_CONTINUE; //if (HOLY_NOVA > 0 && m_ai->In_Reach(pTarget,HOLY_NOVA) && meleeReach && m_ai->CastSpell(HOLY_NOVA)) // return RETURN_CONTINUE; break; case PRIEST_SPEC_SHADOW: if (DEVOURING_PLAGUE > 0 && m_ai->In_Reach(pTarget,DEVOURING_PLAGUE) && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && CastSpell(DEVOURING_PLAGUE, pTarget)) return RETURN_CONTINUE; if (SHADOW_WORD_PAIN > 0 && m_ai->In_Reach(pTarget,SHADOW_WORD_PAIN) && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && CastSpell(SHADOW_WORD_PAIN, pTarget)) return RETURN_CONTINUE; if (MIND_BLAST > 0 && m_ai->In_Reach(pTarget,MIND_BLAST) && (!m_bot->HasSpellCooldown(MIND_BLAST)) && CastSpell(MIND_BLAST, pTarget)) return RETURN_CONTINUE; if (MIND_FLAY > 0 && m_ai->In_Reach(pTarget,MIND_FLAY) && CastSpell(MIND_FLAY, pTarget)) { m_ai->SetIgnoreUpdateTime(3); return RETURN_CONTINUE; } if (SHADOWFORM == 0 && MIND_FLAY == 0 && SMITE > 0 && m_ai->In_Reach(pTarget,SMITE) && CastSpell(SMITE, pTarget)) // low levels return RETURN_CONTINUE; break; case PRIEST_SPEC_DISCIPLINE: if (POWER_INFUSION > 0 && m_ai->In_Reach(GetMaster(),POWER_INFUSION) && CastSpell(POWER_INFUSION, GetMaster())) // TODO: just master? return RETURN_CONTINUE; if (INNER_FOCUS > 0 && m_ai->In_Reach(m_bot,INNER_FOCUS) && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && CastSpell(INNER_FOCUS, m_bot)) return RETURN_CONTINUE; if (SMITE > 0 && m_ai->In_Reach(pTarget,SMITE) && CastSpell(SMITE, pTarget)) return RETURN_CONTINUE; break; } // No spec due to low level OR no spell found yet if (MIND_BLAST > 0 && m_ai->In_Reach(pTarget,MIND_BLAST) && (!m_bot->HasSpellCooldown(MIND_BLAST)) && CastSpell(MIND_BLAST, pTarget)) return RETURN_CONTINUE; if (SHADOW_WORD_PAIN > 0 && m_ai->In_Reach(pTarget,SHADOW_WORD_PAIN) && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && CastSpell(SHADOW_WORD_PAIN, pTarget)) return RETURN_CONTINUE; if (MIND_FLAY > 0 && m_ai->In_Reach(pTarget,MIND_FLAY) && CastSpell(MIND_FLAY, pTarget)) { m_ai->SetIgnoreUpdateTime(3); return RETURN_CONTINUE; } if (SHADOWFORM == 0 && SMITE > 0 && m_ai->In_Reach(pTarget,SMITE) && CastSpell(SMITE, pTarget)) return RETURN_CONTINUE; // Default: shoot with wand return CastSpell(SHOOT, pTarget); return RETURN_NO_ACTION_OK; } // end DoNextCombatManeuver
void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) { if (!pTarget || pTarget->isDead()) return; PlayerbotAI *ai = GetAI(); if (!ai) return; Player *m_bot = GetPlayerBot(); if (!m_bot || m_bot->isDead()) return; Unit *pVictim = pTarget->getVictim(); Unit *m_tank = FindMainTankInRaid(GetMaster()); if (!m_tank && m_bot->GetGroup() && GetMaster()->GetGroup() != m_bot->GetGroup()) { FindMainTankInRaid(m_bot); } if (!m_tank) { m_tank = m_bot; } uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); float pDist = m_bot->GetDistance(pTarget); uint8 pThreat = GetThreatPercent(pTarget); uint8 reqHeal = 0; uint8 OwnPartyHP = GetHealthPercentRaid(m_bot, reqHeal); switch(ai->GetScenarioType()) { case SCENARIO_DUEL: ((ai->GetHealthPercent() < 80 && CastSpell(LESSER_HEAL)) || CastSpell(LIGHTNING_BOLT, pTarget)); return; } // Cast CC breakers if any match found (include any dispels first) does not work yet //uint32 ccSpells[4] = { R_ESCAPE_ARTIST, R_EVERY_MAN_FOR_HIMSELF, R_WILL_OF_FORSAKEN, R_STONEFORM }; //if (ai->GetManaPercent() < 35) { ccSpells[0] = 0; ccSpells[1] = 0; } //We dont have any mana to waste... //if (castSelfCCBreakers(ccSpells)) { } // Most of them don't trigger gcd #pragma region Choose Actions // Choose actions accoring to talents if (m_tank->GetGUID() == m_bot->GetGUID()) { m_role=BOT_ROLE_TANK; // Hey! I am Main Tank } else if (TALENT_ENHANCEMENT) { m_role = BOT_ROLE_DPS_MELEE; } else if (TALENT_ELEMENTAL) { m_role = BOT_ROLE_DPS_RANGED; } else if (TALENT_RESTO) { m_role = BOT_ROLE_SUPPORT; } else { m_role = BOT_ROLE_DPS_MELEE; //Unknown build or low level.. Mainly attack } // if i am under attack and if i am not tank or offtank: change target if needed if (m_tank->GetGUID() != m_bot->GetGUID() && isUnderAttack() ) { if (pVictim && pVictim->GetGUID() == m_bot->GetGUID() && pDist <= 2) { } // My target is almost up to me, no need to search else //Have to select nearest target { Unit *curAtt = GetNearestAttackerOf(m_bot); if (curAtt && curAtt->GetGUID() != pTarget->GetGUID()) { m_bot->SetSelection(curAtt->GetGUID()); //ai->AddLootGUID(curAtt->GetGUID()); DoNextCombatManeuver(curAtt); //Restart new update to get variables fixed.. return; } } //my target is attacking me } #pragma endregion // Choose Weapon Enchant if (ChangeWeaponEnchants()) return; if (TALENT_ELEMENTAL) { if (!m_bot->HasAura(WATER_SHIELD) && CastSpell(WATER_SHIELD,m_bot)) { return; } } if (TALENT_ENHANCEMENT) { if (!m_bot->HasAura(LIGHTNING_SHIELD) && CastSpell(LIGHTNING_SHIELD,m_bot)) { return; } } if (TALENT_RESTO) { if (!m_bot->HasAura(WATER_SHIELD) && CastSpell(WATER_SHIELD,m_bot)) { return; } } // Choose shield /* if (EARTH_SHIELD && ai->GetHealthPercent() < 80 && isUnderAttack()) { if (CastSpell(EARTH_SHIELD,m_bot)) { return; } } else if (WATER_SHIELD && ai->GetManaPercent() < 40) { if (CastSpell(WATER_SHIELD,m_bot)) { return; } } else if (LIGHTNING_SHIELD && ( isUnderAttack() || m_tank->GetGUID() == m_bot->GetGUID() ) && !(m_bot->HasAura(WATER_SHIELD) && ai->GetManaPercent() < 80) ) { if (CastSpell(LIGHTNING_SHIELD,m_bot)) { return; } } else if (CastSpell(WATER_SHIELD,m_bot)) { return; } */ // If there's a cast stop if(m_bot->HasUnitState(UNIT_STATE_CASTING)) return; switch(m_role) { #pragma region BOT_ROLE_TANK / BOT_ROLE_OFFTANK case BOT_ROLE_TANK: case BOT_ROLE_OFFTANK: if (!TALENT_ELEMENTAL && !TALENT_RESTO) { TakePosition(pTarget); } else { TakePosition(pTarget,BOT_ROLE_DPS_RANGED); // mob will come to you sooner or later no need to hurry } // Do support stuff if (!m_bot->isMoving() && ChangeTotems(m_role)) { return; } if (ai->GetManaPercent() > 70 && DoSupportRaid(m_bot)) { return; } break; #pragma endregion #pragma region BOT_ROLE_DPS_MELEE case BOT_ROLE_DPS_MELEE: TakePosition(pTarget); // Do support stuff if (!m_bot->isMoving() && ChangeTotems(m_role)) { return; } if (ai->GetManaPercent() > 40 && DoSupportRaid(m_bot)) { return; } break; #pragma endregion #pragma region BOT_ROLE_DPS_RANGED case BOT_ROLE_DPS_RANGED: TakePosition(pTarget); // Do support stuff if (!m_bot->isMoving() && ChangeTotems(m_role)) { return; } if (ai->GetManaPercent() > 40 && DoSupportRaid(m_bot)) { return; } break; #pragma endregion #pragma region BOT_ROLE_SUPPORT case BOT_ROLE_SUPPORT: TakePosition(pTarget); // Do support stuff if (!m_bot->isMoving() && ChangeTotems(m_role)) { return; } if (DoSupportRaid(m_bot)) { return; } //heal pets and bots Unit *target = DoSelectLowestHpFriendly(40, 1000); if(target && target->isAlive() && HealTarget(target, target->GetHealth()*100 / target->GetMaxHealth()) ) { return; } break; #pragma endregion } #pragma region ShamanCommon //Defensive Stuff if (m_tank->GetGUID() != m_bot->GetGUID() && pVictim && pVictim->GetGUID() == m_bot->GetGUID() ) { if (pDist > 5 && CastSpell(FROST_SHOCK, pTarget)) { return; } if ((pTarget->GetCreatureType() == (uint32) CREATURE_TYPE_BEAST || pTarget->GetCreatureType() == (uint32) CREATURE_TYPE_HUMANOID) && CastSpell(HEX, pTarget)) { return; // no gcd } if (CastSpell(WIND_SHEAR, pTarget)) { } // no gcd } if (m_bot->getRace() == (uint8) RACE_BLOODELF && pDist < 8 && pTarget->IsNonMeleeSpellCasted(true) && CastSpell(R_ARCANE_TORRENT, pTarget)) { } //no gcd if (pTarget->IsNonMeleeSpellCasted(true) && CastSpell(WIND_SHEAR, pTarget)) { } //no gcd if (m_bot->getRace() == (uint8) RACE_TAUREN && pVictim && pVictim->GetGUID() == m_bot->GetGUID() && pDist < 8 && CastSpell(R_WAR_STOMP, pTarget)) { return; } //Catch if (pTarget->HasUnitMovementFlag(UNIT_FLAG_FLEEING)) { if (CastSpell(FROST_SHOCK,pTarget)) return; } //Buff and restores if ( ( (ai->GetHealthPercent() < 60 && isUnderAttack()) || (ai->GetManaPercent() < 30) ) && CastSpell(SHAMANISTIC_RAGE, m_bot)) { return; } if (m_bot->getRace() == (uint8) RACE_TROLL && CastSpell(R_BERSERKING,m_bot)) {} // no GCD if (m_bot->getRace() == (uint8) RACE_ORC && CastSpell(R_BLOOD_FURY,m_bot)) {} // no GCD if (!m_bot->HasAura(HEROISM) && !m_bot->HasAura(EXHAUSTION) && !m_bot->HasAura(SATED) && CastSpell(HEROISM,m_bot)) { return; } if (m_role != BOT_ROLE_SUPPORT && CastSpell(NATURES_SWIFTNESS, m_bot)) { } //healers keep it for healing no gcd else if (CastSpell(ELEMENTAL_MASTERY, m_bot)) { } //no gcd // If at threat limit, use WIND_SHEAR to reduce threat if (pThreat > threatThreshold && m_tank->GetGUID() != m_bot->GetGUID() && !isUnderAttack()) { if (m_tank->getVictim() && m_tank->getVictim()->GetGUID() != pTarget->GetGUID()) // I am attacking wrong target!! { m_bot->SetSelection(m_tank->getVictim()->GetGUID()); return; } else { if (CastSpell(WIND_SHEAR,pTarget)) { return; //Lets see if we can manage } else { return; //use no spells and wait threat to be reduced } } } if (TALENT_ELEMENTAL) { if (CastSpell(ELEMENTAL_MASTERY, m_bot)) { } //no gcd if (!pTarget->HasAura(FLAME_SHOCK,m_bot->GetGUID()) && CastSpell(FLAME_SHOCK,pTarget)) { return; } if (CastSpell(LAVA_BURST,pTarget)) { return; } if (CastSpell(CHAIN_LIGHTNING,pTarget)) { return; } if (CastSpell(LIGHTNING_BOLT,pTarget)) { return; } } //dps if (MAELSTROM_WEAPON) { Aura *maelaura = m_bot->GetAura(MAELSTROM_WEAPON); if (maelaura && maelaura->GetStackAmount() == 5) { if ((isUnderAttack(m_tank,3) || m_tank->GetGUID() == m_bot->GetGUID()) && CastSpell(CHAIN_LIGHTNING,pTarget,true,true)) { return; } if (CastSpell(LIGHTNING_BOLT,pTarget,true,true)) { return; } } } if (CastSpell(FLAME_SHOCK,pTarget)) { return; } if (CastSpell(STORMSTRIKE,pTarget,true,true)) { return; } //if (!TALENT_ENHANCEMENT && CanCast(LAVA_BURST,pTarget,true) && pTarget->HasAura(FLAME_SHOCK,m_bot->GetGUID()) && CastSpell(LAVA_BURST,pTarget,false)) { return; } if (CastSpell(FERAL_SPIRIT,m_bot)) { return; } if (CanCast(EARTH_SHOCK,pTarget,true) && (pTarget->HasAura(STORMSTRIKE,m_bot->GetGUID()) || pTarget->HasAura(FLAME_SHOCK,m_bot->GetGUID()) ) && CastSpell(EARTH_SHOCK,pTarget)) { return; } //if (CanCast(FLAME_SHOCK,pTarget) && CastSpell(FLAME_SHOCK,pTarget)) { return; } if (CastSpell(LAVA_LASH,pTarget,true,true)) { return; } if (CastSpell(FIRE_NOVA,pTarget)) { return; } //if ((isUnderAttack(m_tank,4) || m_tank->GetGUID() == m_bot->GetGUID()) && CastSpell(FIRE_NOVA,pTarget)) { return; } if (ai->GetManaPercent() > 60 && castDispel(PURGE,pTarget)) { return; //PURGE but dont overpurge } #pragma endregion // drink potion if support / healer (Other builds simply overuse mana and waste mana pots) if(ai->GetManaPercent() < 5 && (m_role == BOT_ROLE_SUPPORT || m_role == BOT_ROLE_HEALER) ) { Item *pItem = ai->FindPotion(); if(pItem != NULL) { if (pItem->GetSpell() && m_bot->HasSpellCooldown(pItem->GetSpell()) ) { return; //pot is in cooldown } ai->UseItem(*pItem); } } } //end DoNextCombatManeuver
void PlayerbotMageAI::DoNonCombatActions() { Player * m_bot = GetPlayerBot(); Player * master = GetMaster(); if (!m_bot || !master) return; SpellSequence = SPELL_FROST; PlayerbotAI* ai = GetAI(); // Buff armor if (MOLTEN_ARMOR) { if (ai->SelfBuff(MOLTEN_ARMOR)) return; } else if (MAGE_ARMOR) { if (ai->SelfBuff(MAGE_ARMOR)) return; } else if (ICE_ARMOR) { if (ai->SelfBuff(ICE_ARMOR)) return; } else if (FROST_ARMOR) if (ai->SelfBuff(FROST_ARMOR)) return; // buff master's group if (master->GetGroup()) { // Buff master with group buff... if (!master->IsInDuel(master)) if (ARCANE_BRILLIANCE && ai->HasSpellReagents(ARCANE_BRILLIANCE)) if (ai->Buff(ARCANE_BRILLIANCE, master)) return; // ...and check group for new members joined or resurrected, or just buff everyone if no group buff available 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 || !tPlayer->isAlive() || tPlayer == m_bot) continue; if (tPlayer->IsInDuelWith(master)) continue; // buff if (BuffPlayer(tPlayer)) return; } } // There is no group, buff master else if (master->isAlive() && !master->IsInDuel(master)) if (BuffPlayer(master)) return; // Buff self finally if (BuffPlayer(m_bot)) return; // conjure food & water 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 && CONJURE_WATER && ai->GetBaseManaPercent() >= 48) { ai->TellMaster("I'm conjuring some water."); ai->CastSpell(CONJURE_WATER, *m_bot); ai->SetIgnoreUpdateTime(3); return; } else if (pItem != NULL && ai->GetManaPercent() < 30) { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); return; } pItem = ai->FindFood(); if (pItem == NULL && CONJURE_FOOD && ai->GetBaseManaPercent() >= 48) { ai->TellMaster("I'm conjuring some food."); ai->CastSpell(CONJURE_FOOD, *m_bot); ai->SetIgnoreUpdateTime(3); } // 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; } } // end DoNonCombatActions
void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: (ai->HasAura(SCREAM,*pTarget) && ai->GetHealthPercent() < 60 && ai->CastSpell(HEAL)) || ai->CastSpell(PAIN) || (ai->GetHealthPercent() < 80 && ai->CastSpell(RENEW)) || (ai->GetPlayerBot()->GetDistance(pTarget) <= 5 && ai->CastSpell(SCREAM)) || ai->CastSpell(MIND_BLAST) || (ai->GetHealthPercent() < 20 && ai->CastSpell(GREAT_HEAL)) || ai->CastSpell(SMITE); return; } // ------- Non Duel combat ---------- ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); // Heal myself if (ai->GetHealthPercent() < 15 && FADE > 0 && !m_bot->HasAura(FADE, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting fade."); ai->CastSpell(FADE, *m_bot); } else if (ai->GetHealthPercent() < 25 && PWS > 0 && !m_bot->HasAura(PWS, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting pws on myself."); ai->CastSpell(PWS); } else if (ai->GetHealthPercent() < 35 && DESPERATE_PRAYER > 0) { ai->TellMaster("I'm casting desperate prayer."); ai->CastSpell(DESPERATE_PRAYER, *m_bot); } else if (ai->GetHealthPercent() < 80) HealTarget (*m_bot, ai->GetHealthPercent()); // Heal master uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { if (masterHP < 25 && PWS > 0 && !GetMaster()->HasAura(PWS, EFFECT_INDEX_0)) ai->CastSpell(PWS, *(GetMaster())); else if (masterHP < 80) HealTarget (*GetMaster(), masterHP); } // Heal group if( m_group ) { 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 < 25 ) HealTarget( *m_groupMember, memberHP ); } } // Damage Spells ai->SetInFront( pTarget ); float dist = m_bot->GetDistance( pTarget ); switch (SpellSequence) { case SPELL_HOLY: if (SMITE > 0 && LastSpellHoly <1 && !pTarget->HasAura(SMITE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 17) { ai->CastSpell(SMITE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (MANA_BURN > 0 && LastSpellHoly <2 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 14) { //ai->TellMaster("I'm casting mana burn."); ai->CastSpell(MANA_BURN, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (HOLY_NOVA > 0 && LastSpellHoly <3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 22) { //ai->TellMaster("I'm casting holy nova."); ai->CastSpell(HOLY_NOVA); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (HOLY_FIRE > 0 && LastSpellHoly <4 && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13) { //ai->TellMaster("I'm casting holy fire."); ai->CastSpell(HOLY_FIRE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (PRAYER_OF_MENDING > 0 && LastSpellHoly <5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, EFFECT_INDEX_0) && ai->GetManaPercent() >= 15) { //ai->TellMaster("I'm casting prayer of mending on master."); ai->CastSpell(PRAYER_OF_MENDING, *GetMaster()); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; } else if (LastSpellHoly > 6) { LastSpellHoly = 0; SpellSequence = SPELL_SHADOWMAGIC; break; } LastSpellHoly = LastSpellHoly + 1; //SpellSequence = SPELL_SHADOWMAGIC; //break; case SPELL_SHADOWMAGIC: if (PAIN > 0 && LastSpellShadowMagic <1 && !pTarget->HasAura(PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) { //ai->TellMaster("I'm casting pain."); ai->CastSpell(PAIN, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (MIND_BLAST > 0 && LastSpellShadowMagic <2 && ai->GetManaPercent() >= 19) { //ai->TellMaster("I'm casting mind blast."); ai->CastSpell(MIND_BLAST, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (SCREAM > 0 && LastSpellShadowMagic <3 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 15) { ai->TellMaster("I'm casting scream."); ai->CastSpell(SCREAM); SpellSequence = SPELL_DISCIPLINE; (LastSpellShadowMagic = LastSpellShadowMagic +1); break; } else if (MIND_FLAY > 0 && LastSpellShadowMagic <4 && !pTarget->HasAura(MIND_FLAY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { //ai->TellMaster("I'm casting mind flay."); ai->CastSpell(MIND_FLAY, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (DEVOURING_PLAGUE > 0 && LastSpellShadowMagic <5 && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) { ai->CastSpell(DEVOURING_PLAGUE, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (SHADOW_PROTECTION > 0 && LastSpellShadowMagic <6 && ai->GetManaPercent() >= 60) { ai->CastSpell(SHADOW_PROTECTION, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic <7 && !pTarget->HasAura(VAMPIRIC_TOUCH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 18) { ai->CastSpell(VAMPIRIC_TOUCH, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (SHADOWFIEND > 0 && LastSpellShadowMagic <8) { ai->CastSpell(SHADOWFIEND); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (MIND_SEAR > 0 && LastSpellShadowMagic <9 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 28) { ai->CastSpell(MIND_SEAR, *pTarget); ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; } else if (LastSpellShadowMagic > 10) { LastSpellShadowMagic = 0; SpellSequence = SPELL_DISCIPLINE; break; } LastSpellShadowMagic = LastSpellShadowMagic +1; //SpellSequence = SPELL_DISCIPLINE; //break; case SPELL_DISCIPLINE: if (FEAR_WARD > 0 && LastSpellDiscipline <1 && ai->GetManaPercent() >= 3) { //ai->TellMaster("I'm casting fear ward"); ai->CastSpell(FEAR_WARD, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (POWER_INFUSION > 0 && LastSpellDiscipline <2 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting power infusion"); ai->CastSpell(POWER_INFUSION, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (MASS_DISPEL > 0 && LastSpellDiscipline <3 && ai->GetManaPercent() >= 33) { //ai->TellMaster("I'm casting mass dispel"); ai->CastSpell(MASS_DISPEL); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline <4) { //ai->TellMaster("I'm casting inner focus"); ai->CastSpell(INNER_FOCUS, *m_bot); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (PENANCE > 0 && LastSpellDiscipline <5 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting PENANCE"); ai->CastSpell(PENANCE); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (LastSpellDiscipline > 6) { LastSpellDiscipline = 0; SpellSequence = SPELL_HOLY; break; } else { LastSpellDiscipline = LastSpellDiscipline + 1; SpellSequence = SPELL_HOLY; } } } // end DoNextCombatManeuver
void PlayerbotMageAI::DoNonCombatActions() { Player * m_bot = GetPlayerBot(); if (!m_bot) return; SpellSequence = SPELL_FROST; PlayerbotAI* ai = GetAI(); // buff myself if (DALARAN_INTELLECT > 0) (!m_bot->HasAura(DALARAN_INTELLECT, 0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *m_bot)); else if (ARCANE_INTELLECT > 0) (!m_bot->HasAura(ARCANE_INTELLECT, 0) && !m_bot->HasAura(DALARAN_INTELLECT, 0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *m_bot)); if (MAGE_ARMOR > 0) (!m_bot->HasAura(MAGE_ARMOR, 0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MAGE_ARMOR, *m_bot)); else if (ICE_ARMOR > 0) (!m_bot->HasAura(ICE_ARMOR, 0) && !m_bot->HasAura(MAGE_ARMOR, 0) && ai->GetManaPercent() >= 34 && ai->CastSpell (ICE_ARMOR, *m_bot)); else if (FROST_ARMOR > 0) (!m_bot->HasAura(FROST_ARMOR, 0) && !m_bot->HasAura(MAGE_ARMOR, 0) && !m_bot->HasAura(ICE_ARMOR, 0) && ai->GetManaPercent() >= 34 && ai->CastSpell (FROST_ARMOR, *m_bot)); // buff master's group if (GetMaster()->GetGroup()) { Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = objmgr.GetPlayer(uint64 (itr->guid)); if( !tPlayer || !tPlayer->isAlive() ) continue; // buff (!tPlayer->HasAura(ARCANE_INTELLECT,0) && !tPlayer->HasAura(DALARAN_INTELLECT,0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *tPlayer)); (!tPlayer->HasAura(DALARAN_INTELLECT,0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *tPlayer)); (!tPlayer->HasAura(DAMPEN_MAGIC,0) && !tPlayer->HasAura(AMPLIFY_MAGIC,0) && ai->GetManaPercent() >= 32 && ai->CastSpell (DAMPEN_MAGIC, *tPlayer)); (!tPlayer->HasAura(AMPLIFY_MAGIC,0) && !tPlayer->HasAura(DAMPEN_MAGIC,0) && ai->GetManaPercent() >= 32 && ai->CastSpell (AMPLIFY_MAGIC, *tPlayer)); } } // conjure food & water if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); if (pItem == NULL && CONJURE_WATER && ai->GetBaseManaPercent() >= 48) { ai->TellMaster("I'm conjuring some water."); ai->CastSpell(CONJURE_WATER, *m_bot); ai->SetIgnoreUpdateTime(3); return; } else if (pItem != NULL && ai->GetManaPercent() < 15) { ai->TellMaster("I could use a drink."); ai->UseItem(*pItem); ai->SetIgnoreUpdateTime(30); return; } pItem = ai->FindFood(); if (pItem == NULL && CONJURE_FOOD && ai->GetBaseManaPercent() >= 48) { ai->TellMaster("I'm conjuring some food."); ai->CastSpell(CONJURE_FOOD, *m_bot); ai->SetIgnoreUpdateTime(3); } // 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() < 15) { ai->TellMaster("I could use some food."); ai->UseItem(*pItem); ai->SetIgnoreUpdateTime(30); return; } } // end DoNonCombatActions
void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) { if (!pTarget || pTarget->isDead()) return; PlayerbotAI *ai = GetAI(); if (!ai) return; Player *m_bot = GetPlayerBot(); if (!m_bot || m_bot->isDead()) return; Unit *pVictim = pTarget->getVictim(); Unit *m_tank = FindMainTankInRaid(GetMaster()); if (!m_tank && m_bot->GetGroup() && GetMaster()->GetGroup() != m_bot->GetGroup()) { FindMainTankInRaid(m_bot); } if (!m_tank) { m_tank = m_bot; } uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); float pDist = m_bot->GetDistance(pTarget); uint8 pThreat = GetThreatPercent(pTarget); Pet *pet = m_bot->GetPet(); if (m_tank->GetGUID() == m_bot->GetGUID() && pet && pet->isAlive() && pet->isInCombat()) { m_tank = pet; } uint8 petThreat = 0; if (pet) { GetThreatPercent(pTarget,pet); } // switch (ai->GetScenarioType()) // { // case PlayerbotAI::SCENARIO_DUEL: // ai->CastSpell(RAPTOR_STRIKE); // return; // } // ------- Non Duel combat ---------- #pragma region Choose Target // Choose Target if (isUnderAttack()) // I am under attack { if (pVictim && pVictim->GetGUID() == m_bot->GetGUID() && pDist <= 2) { } // My target is almost up to me, no need to search else //Have to select nearest target { Unit *curAtt = GetNearestAttackerOf(m_bot); if (curAtt && curAtt->GetGUID() != pTarget->GetGUID()) { m_bot->SetSelection(curAtt->GetGUID()); //ai->AddLootGUID(curAtt->GetGUID()); DoNextCombatManeuver(curAtt); //Restart new update to get variables fixed.. return; } } //my target is attacking me } #pragma endregion #pragma region Pet Actions // Pet's own Actions if( pet && pet->isAlive() ) { // Setup pet if (pet->GetCharmInfo()->IsAtStay()) {pet->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW); } //Heal pet if ( ( ((float)pet->GetHealth()/(float)pet->GetMaxHealth()) < 0.5f ) && ( PET_MEND>0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && CastSpell(PET_MEND,m_bot) )) { return; } // Set pet to attack hunter's attacker > its own attackers > hunter's target if (!pet->getVictim()) { pet->AI()->AttackStart(pTarget); } else if (isUnderAttack(m_bot)) { pet->AI()->AttackStart(pTarget); } //Always help hunter if she's under attack else if (pet->getVictim()->GetGUID() != pTarget->GetGUID() && !isUnderAttack(pet)) { pet->AI()->AttackStart(pTarget); } else if (isUnderAttack(pet)) // Pet is under attack and hunter has no attackers { if ( pet->getVictim()->getVictim() && pet->getVictim()->getVictim()->GetGUID() == pet->GetGUID() && pDist <= 2) { } // My target is almost up to me, no need to search else //Have to select nearest target { Unit *curAtt = GetNearestAttackerOf(pet,true); if (curAtt && (!pet->getVictim() || curAtt->GetGUID() != pet->getVictim()->GetGUID())) { pet->AI()->AttackStart(curAtt); //Attack nearest attacker } } //Actions to do under attack (Always tank it, and try to kill it, until someone (!= hunter) takes aggro back) //Hunter should help her pet whether main tank or not, unless she's being attacked (BEWARE Targeting Loop possibility) if (pet->getVictim() && !isUnderAttack(m_bot) && pet->getVictim()->GetGUID() != pTarget->GetGUID()) { m_bot->SetSelection(pet->getVictim()->GetGUID()); DoNextCombatManeuver(pet->getVictim()); //Restart new update to get variables fixed.. return; } } // Pet tanking behaviour if (pet->GetGUID() == m_tank->GetGUID() || isUnderAttack(m_bot) || isUnderAttack(pet)) { if (GROWL) pet->GetCharmInfo()->SetSpellAutocast(GROWL,true); //Autocast growl if (BAD_ATTITUDE) pet->GetCharmInfo()->SetSpellAutocast(BAD_ATTITUDE,true); if (COWER) pet->GetCharmInfo()->SetSpellAutocast(COWER,false); if (CastSpell(INTIMIDATION,m_bot)) { return; } } else { if (GROWL) pet->GetCharmInfo()->SetSpellAutocast(GROWL,false); //Do not try to get aggro if (BAD_ATTITUDE) pet->GetCharmInfo()->SetSpellAutocast(BAD_ATTITUDE,false); if (COWER) pet->GetCharmInfo()->SetSpellAutocast(COWER,true); //Autocast cower } // NORMAL PET dps attacks if (petThreat < threatThreshold || pet->GetGUID() == m_tank->GetGUID() || isUnderAttack(m_bot)) { if (CastSpell(KILL_COMMAND,m_bot)) { } else if (CastSpell(BESTIAL_WRATH,m_bot)) { } } // NETHERSHOCK DEMORALIZINGSCREECH } #pragma endregion // If there's a cast stop if(m_bot->HasUnitState(UNIT_STAT_CASTING)) return; // Cast CC breakers if any match found (does not work yet) // uint32 ccSpells[4] = { R_ESCAPE_ARTIST, R_EVERY_MAN_FOR_HIMSELF, R_WILL_OF_FORSAKEN, R_STONEFORM }; // if (castSelfCCBreakers(ccSpells)) { } //most of them dont have gcd #pragma region Evasive manuevers // Do evasive manuevers if under attack if (isUnderAttack()) { if (m_tank->GetGUID() == m_bot->GetGUID()) { } // i am tank and my pet is probably dead, so i have to face the attackers else if (CastSpell(FEIGN_DEATH,m_bot)) { return; } //avoid attack //else if (m_bot->getRace() == (uint8) RACE_NIGHTELF && CastSpell(R_SHADOWMELD,m_bot) ) { return; } else if (CastSpell(CONCUSSIVE_SHOT,pTarget)) { return; } else if (CastSpell(WYVERN_STING,pTarget)) { return; } else if (CastSpell(SCATTER_SHOT,pTarget)) { return; } else if (CastSpell(FREEZING_ARROW,pTarget)) { return; } else if (CastSpell(MISDIRECTION,m_tank)) { return; } else if (m_bot->getRace() == (uint8) RACE_TAUREN && pDist < 8 && CastSpell(R_WAR_STOMP, pTarget) ) { return; } //no gcd but is cast else if (pTarget->GetCreatureType() == (uint32) CREATURE_TYPE_BEAST && CastSpell(SCARE_BEAST,pTarget)) { return; } else if (pDist <= 2 && CastSpell(FREEZING_TRAP,pTarget)) { return; } } #pragma endregion //Select combat mode m_role = BOT_ROLE_DPS_RANGED; if ((isUnderAttack() && pDist <= ATTACK_DISTANCE) || !m_bot->GetUInt32Value(PLAYER_AMMO_ID) ) { m_role = BOT_ROLE_DPS_MELEE; } TakePosition(pTarget); #pragma region Buff / Protect //Buff UP if (m_bot->getRace() == (uint8) RACE_TROLL && CastSpell(R_BERSERKING,m_bot) ) { } //no GCD if (m_bot->getRace() == (uint8) RACE_ORC && CastSpell(R_BLOOD_FURY,m_bot) ) { } //no GCD if (CastSpell(TRUESHOT_AURA, m_bot)) { return; } if (CastSpell(RAPID_FIRE,m_bot)) { return; } if (CastSpell(HUNTERS_MARK,pTarget)) { return; } if ((ai->GetHealthPercent() < 80 || ai->GetManaPercent() < 60 ) && CastSpell(READINESS,m_bot)) { } //no gcd //Protect yourself if needed if (m_bot->getRace() == (uint8) RACE_DWARF && ai->GetHealthPercent() < 75 && CastSpell(R_STONEFORM,m_bot) ) { } //no gcd if (ai->GetHealthPercent() < 20 && CastSpell(DETERRENCE,m_bot)) {} //No GCD if (m_bot->getRace() == (uint8) RACE_DRAENEI && ai->GetHealthPercent() < 55 && CastSpell(R_GIFT_OF_NAARU,m_bot)) { return; } //Break Spells if (m_bot->getRace() == (uint8) RACE_BLOODELF && pDist < 8 && ( pTarget->IsNonMeleeSpellCasted(true) || ai->GetManaPercent() < 20 ) && CastSpell(R_ARCANE_TORRENT, pTarget) ) { } //no gcd if (pTarget->IsNonMeleeSpellCasted(true) && CastSpell(SILENCING_SHOT, pTarget) ) { return; } if (pTarget->IsNonMeleeSpellCasted(true) && CastSpell(SCATTER_SHOT, pTarget) ) { return; } //Catch if (pTarget->HasUnitMovementFlag(UNIT_FLAG_FLEEING)) { if (CastSpell(WING_CLIP,pTarget)) return; if (CastSpell(CONCUSSIVE_SHOT,pTarget)) return; if (CastSpell(SCATTER_SHOT, pTarget) ) { return; } } #pragma endregion //Do combat switch (m_role) { #pragma region BOT_ROLE_DPS_MELEE case BOT_ROLE_DPS_MELEE: if (AUTO_SHOT) { m_bot->InterruptNonMeleeSpells( true, AUTO_SHOT ); } //Stop autoshot if (CastSpell(ASPECT_OF_THE_MONKEY,m_bot)) { return; } //Get Monkey aspect if (m_bot->getRace() == (uint8) RACE_TAUREN && pDist < 8 && CastSpell(R_WAR_STOMP, pTarget)) { return; } //no gcd but is cast // Threat control if (pThreat < threatThreshold || m_tank->GetGUID() == m_bot->GetGUID() || m_bot->HasAura(MISDIRECTION) ) { } //Continue attack else { if (pet && isUnderAttack(pet) && pet->getVictim() && pet->getVictim()->GetGUID() != pTarget->GetGUID()) //Should be helping pet { m_bot->SetSelection(pet->getVictim()->GetGUID()); return; } else if (m_tank->getVictim() && m_tank->getVictim()->GetGUID() != pTarget->GetGUID()) // I am attacking wrong target!! { m_bot->SetSelection(m_tank->getVictim()->GetGUID()); return; } else if (CastSpell(FEIGN_DEATH,m_bot)) { return; } else { return; } // No more threat reducing spells, just slow down } if (CastSpell(RAPTOR_STRIKE,pTarget,true,true)) {} //No gcd if (CastSpell(MONGOOSE_BITE,pTarget,true,true)) { return; } // Cannot be sure if casted or not else if (CastSpell(COUNTERATTACK,pTarget,true,true)) { return; } // Cannot be sure if casted or not if (CastSpell(WING_CLIP,pTarget)) { return; } if (isUnderAttack(m_tank,6) && CastSpell(SNAKE_TRAP,m_bot)) { return; } if (isUnderAttack(m_tank,4) && CastSpell(EXPLOSIVE_TRAP,m_bot)) { return; } if (CastSpell(IMMOLATION_TRAP,m_bot)) { return; } break; #pragma endregion #pragma region BOT_ROLE_DPS_RANGED case BOT_ROLE_DPS_RANGED: if (m_pulling) { if (GetAI()->CastSpell(CONCUSSIVE_SHOT,pTarget) || GetAI()->CastSpell(AUTO_SHOT,pTarget)) { m_pulling = false; GetAI()->SetCombatOrder(ORDERS_NONE); GetAI()->Follow(*GetMaster()); GetAI()->SetIgnoreUpdateTime(2); if(HasPet(GetPlayerBot())) m_bot->GetPet()->SetReactState(REACT_DEFENSIVE); } return; } if (AUTO_SHOT && !m_bot->FindCurrentSpellBySpellId(AUTO_SHOT)) { ai->CastSpell(AUTO_SHOT,pTarget); } //Start autoshot if (!(ai->GetManaPercent() < 85 && m_bot->HasAura(ASPECT_OF_THE_VIPER)) && CastSpell(ASPECT_OF_THE_HAWK,m_bot)) { return; } //Get Hawk aspect if ((ai->GetManaPercent() < 25) && CastSpell(ASPECT_OF_THE_VIPER,m_bot,true,false,true)) { return; } //Build up mana // if i am main tank, protect master by taunt if(m_tank->GetGUID() == m_bot->GetGUID()) { // Taunt if needed (Only for master) Unit *curAtt = GetAttackerOf(GetMaster()); if (curAtt && CastSpell(DISTRACTING_SHOT, curAtt)) { return; } // My target is not attacking me, taunt.. if (pVictim && pVictim->GetGUID() != m_bot->GetGUID() && CastSpell(DISTRACTING_SHOT, pTarget) ) { return; } } // If i am not tank, transfer threat to tank or pet.. else { if (CastSpell(MISDIRECTION,m_tank)) { return; } if (pet && pet->isAlive() && CastSpell(MISDIRECTION,pet)) { return; } // Threat control if (pThreat < threatThreshold || m_bot->HasAura(MISDIRECTION) ) { } //Continue attack else { if (pet && isUnderAttack(pet) && pet->getVictim() && pet->getVictim()->GetGUID() != pTarget->GetGUID()) //Should be helping pet { m_bot->SetSelection(pet->getVictim()->GetGUID()); return; } else if (m_tank->getVictim() && m_tank->getVictim()->GetGUID() != pTarget->GetGUID()) // I am attacking wrong target!! { m_bot->SetSelection(m_tank->getVictim()->GetGUID()); return; } else if (CastSpell(FEIGN_DEATH,m_bot)) { return; } else { return; } // No more threat reducing spells, just slow down } } // DO dps if (ai->GetHealthPercent(*pTarget) < 20 && CastSpell(KILL_SHOT,pTarget)) { return; } if (isUnderAttack(m_tank,4) && CastSpell(MULTI_SHOT,pTarget)) { return; } if (isUnderAttack(m_tank,4) && CastSpell(VOLLEY,pTarget)) { GetAI()->SetIgnoreUpdateTime(7); return; } if (CanCast(CHIMERA_SHOT,pTarget) && (pTarget->HasAura(VIPER_STING,m_bot->GetGUID()) || pTarget->HasAura(SERPENT_STING,m_bot->GetGUID()) ) && CastSpell(CHIMERA_SHOT,pTarget,false) ) { return; } if (ai->GetManaPercent() < 60 && ai->GetManaPercent(*pTarget) > 4 && CastSpell(VIPER_STING,pTarget)) { return; } if (!pTarget->HasAura(VIPER_STING,m_bot->GetGUID()) && CastSpell(SERPENT_STING,pTarget)) { return; } if (CastSpell(ARCANE_SHOT,pTarget)) { return; } if (CastSpell(BLACK_ARROW,pTarget)) { return; } if (CastSpell(EXPLOSIVE_SHOT,pTarget)) { return; } if (CastSpell(STEADY_SHOT,pTarget)) { return; } break; #pragma endregion } /*// drink potion if support / healer (Other builds simply overuse mana and waste mana pots) if(ai->GetManaPercent() < 5 && (m_role == BOT_ROLE_SUPPORT || m_role == BOT_ROLE_HEALER) ) { Item *pItem = ai->FindPotion(); if(pItem != NULL) { if (pItem->GetSpell() && m_bot->HasSpellCooldown(pItem->GetSpell()) ) { return; } //pot is in cooldown ai->UseItem(*pItem); } }*/ } // end DoNextCombatManeuver
void PlayerbotWarlockAI::DoNonCombatActions() { SpellSequence = SPELL_CURSES; PlayerbotAI *ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!ai || !m_bot) return; Pet *pet = m_bot->GetPet(); // Initialize pet spells if (pet && pet->GetEntry() != m_lastDemon) { switch (pet->GetEntry()) { case DEMON_IMP: { BLOOD_PACT = ai->initPetSpell(BLOOD_PACT_ICON); FIREBOLT = ai->initPetSpell(FIREBOLT_ICON); FIRE_SHIELD = ai->initPetSpell(FIRE_SHIELD_ICON); break; } case DEMON_VOIDWALKER: { CONSUME_SHADOWS = ai->initPetSpell(CONSUME_SHADOWS_ICON); SACRIFICE = ai->initPetSpell(SACRIFICE_ICON); SUFFERING = ai->initPetSpell(SUFFERING_ICON); TORMENT = ai->initPetSpell(TORMENT_ICON); break; } case DEMON_SUCCUBUS: { LASH_OF_PAIN = ai->initPetSpell(LASH_OF_PAIN_ICON); SEDUCTION = ai->initPetSpell(SEDUCTION_ICON); SOOTHING_KISS = ai->initPetSpell(SOOTHING_KISS_ICON); break; } case DEMON_FELHUNTER: { DEVOUR_MAGIC = ai->initPetSpell(DEVOUR_MAGIC_ICON); FEL_INTELLIGENCE = ai->initPetSpell(FEL_INTELLIGENCE_ICON); SHADOW_BITE = ai->initPetSpell(SHADOW_BITE_ICON); SPELL_LOCK = ai->initPetSpell(SPELL_LOCK_ICON); break; } case DEMON_FELGUARD: { ANGUISH = ai->initPetSpell(ANGUISH_ICON); CLEAVE = ai->initPetSpell(CLEAVE_ICON); INTERCEPT = ai->initPetSpell(INTERCEPT_ICON); break; } } m_lastDemon = pet->GetEntry(); if (!m_isTempImp) m_demonOfChoice = pet->GetEntry(); } // Destroy extra soul shards uint8 shardCount = m_bot->GetItemCount(SOUL_SHARD, false, NULL); uint8 freeSpace = 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 if (FEL_ARMOR) { 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; if (LIFE_TAP && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 50) if (ai->CastSpell(LIFE_TAP, *m_bot)) return; if (ai->GetManaPercent() < 25) { Item* pItem = ai->FindDrink(); if (pItem) { ai->TellMaster(sObjectMgr.GetPlayerBotString(103, GetMaster()->GetSession()->GetSessionDbLocaleIndex())); ai->UseItem(pItem); return; } } // hp check if (ai->GetHealthPercent() < 30) { Item* pItem = ai->FindFood(); if (pItem) { ai->TellMaster(sObjectMgr.GetPlayerBotString(101, GetMaster()->GetSession()->GetSessionDbLocaleIndex())); ai->UseItem(pItem); return; } } if (ai->GetHealthPercent() < 50 && !m_bot->HasAura(RECENTLY_BANDAGED)) { Item* fItem = ai->FindBandage(); if (fItem) { ai->TellMaster(sObjectMgr.GetPlayerBotString(102, GetMaster()->GetSession()->GetSessionDbLocaleIndex())); ai->UseItem(fItem); return; } } //Heal Voidwalker if (pet && pet->GetEntry() == DEMON_VOIDWALKER && CONSUME_SHADOWS && pet->GetHealthPercent() < 75 && !pet->HasAura(CONSUME_SHADOWS)) ai->CastPetSpell(CONSUME_SHADOWS); // Summon demon if (!pet || m_isTempImp) { uint32 summonSpellId; if (m_demonOfChoice != DEMON_IMP && shardCount > 0) { switch (m_demonOfChoice) { case DEMON_VOIDWALKER: summonSpellId = SUMMON_VOIDWALKER; break; case DEMON_FELGUARD: summonSpellId = SUMMON_FELGUARD; break; case DEMON_FELHUNTER: summonSpellId = SUMMON_FELHUNTER; break; case DEMON_SUCCUBUS: summonSpellId = SUMMON_SUCCUBUS; break; default: summonSpellId = 0; break; } if (ai->CastSpell(summonSpellId)) { ai->TellMaster(sObjectMgr.GetPlayerBotString(123, GetMaster()->GetSession()->GetSessionDbLocaleIndex())); m_isTempImp = false; return; } } else if (!pet && SUMMON_IMP && ai->CastSpell(SUMMON_IMP)) { if (m_demonOfChoice != DEMON_IMP) m_isTempImp = true; ai->TellMaster(sObjectMgr.GetPlayerBotString(124, GetMaster()->GetSession()->GetSessionDbLocaleIndex())); return; } } // Soul link demon if (pet && SOUL_LINK && !m_bot->HasAura(SOUL_LINK_AURA) && ai->CastSpell(SOUL_LINK, *m_bot)) return; // Check demon buffs if (pet && pet->GetEntry() == DEMON_IMP && BLOOD_PACT && !m_bot->HasAura(BLOOD_PACT) && ai->CastPetSpell(BLOOD_PACT)) return; if (pet && pet->GetEntry() == DEMON_FELHUNTER && FEL_INTELLIGENCE && !m_bot->HasAura(FEL_INTELLIGENCE) && ai->CastPetSpell(FEL_INTELLIGENCE)) return; } // end DoNonCombatActions
void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_PVP_DUEL: (ai->HasAura(SCREAM, *pTarget) && ai->GetHealthPercent() < 60 && ai->CastSpell(HEAL)) || ai->CastSpell(SHADOW_WORD_PAIN) || (ai->GetHealthPercent() < 80 && ai->CastSpell(RENEW)) || (ai->GetPlayerBot()->GetDistance(pTarget) <= 5 && ai->CastSpell(SCREAM)) || ai->CastSpell(MIND_BLAST) || (ai->GetHealthPercent() < 50 && ai->CastSpell(GREATER_HEAL)) || ai->CastSpell(SMITE); return; default: break; } // ------- Non Duel combat ---------- Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); bool meleeReach = m_bot->CanReachWithMeleeAttack(pTarget); if (ai->GetCombatStyle() != PlayerbotAI::COMBAT_RANGED && !meleeReach) ai->SetCombatStyle(PlayerbotAI::COMBAT_RANGED); // if in melee range OR can't shoot OR have no ranged (wand) equipped else if (ai->GetCombatStyle() != PlayerbotAI::COMBAT_MELEE && (meleeReach || SHOOT == 0 || !m_bot->GetWeaponForAttack(RANGED_ATTACK, true, true)) && !ai->IsHealer()) ai->SetCombatStyle(PlayerbotAI::COMBAT_MELEE); if (SHOOT > 0 && ai->GetCombatStyle() == PlayerbotAI::COMBAT_RANGED && !m_bot->FindCurrentSpellBySpellId(SHOOT)) ai->CastSpell(SHOOT, *pTarget); //ai->TellMaster( "started auto shot." ); else if (SHOOT > 0 && m_bot->FindCurrentSpellBySpellId(SHOOT)) m_bot->InterruptNonMeleeSpells(true, SHOOT); // Heal myself if (ai->GetHealthPercent() < 15 && FADE > 0 && !m_bot->HasAura(FADE, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting fade."); ai->CastSpell(FADE, *m_bot); } else if (ai->GetHealthPercent() < 25 && POWER_WORD_SHIELD > 0 && !m_bot->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting pws on myself."); ai->CastSpell(POWER_WORD_SHIELD); } else if (ai->GetHealthPercent() < 35 && DESPERATE_PRAYER > 0) { ai->TellMaster("I'm casting desperate prayer."); ai->CastSpell(DESPERATE_PRAYER, *m_bot); } else if (ai->GetHealthPercent() < 80) HealTarget (m_bot); // Heal master uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { if (masterHP < 25 && POWER_WORD_SHIELD > 0 && !GetMaster()->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) ai->CastSpell(POWER_WORD_SHIELD, *(GetMaster())); else if (masterHP < 80) HealTarget (GetMaster()); } // Heal group if (m_group) { 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 < 25) HealTarget(m_groupMember); } } // Damage Spells switch (SpellSequence) { case SPELL_HOLY: if (SMITE > 0 && ai->In_Reach(pTarget,SMITE) && LastSpellHoly < 1 && !pTarget->HasAura(SMITE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 17) { ai->CastSpell(SMITE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (MANA_BURN > 0 && ai->In_Reach(pTarget,MANA_BURN) && LastSpellHoly < 2 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 14) { //ai->TellMaster("I'm casting mana burn."); ai->CastSpell(MANA_BURN, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (HOLY_NOVA > 0 && ai->In_Reach(pTarget,HOLY_NOVA) && LastSpellHoly < 3 && meleeReach && ai->GetManaPercent() >= 22) { //ai->TellMaster("I'm casting holy nova."); ai->CastSpell(HOLY_NOVA); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (HOLY_FIRE > 0 && ai->In_Reach(pTarget,HOLY_FIRE) && LastSpellHoly < 4 && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13) { //ai->TellMaster("I'm casting holy fire."); ai->CastSpell(HOLY_FIRE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (PRAYER_OF_MENDING > 0 && ai->In_Reach(pTarget,PRAYER_OF_MENDING) && LastSpellHoly < 5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth() * 0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, EFFECT_INDEX_0) && ai->GetManaPercent() >= 15) { //ai->TellMaster("I'm casting prayer of mending on master."); ai->CastSpell(PRAYER_OF_MENDING, *GetMaster()); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly + 1; break; } else if (LastSpellHoly > 6) { LastSpellHoly = 0; SpellSequence = SPELL_SHADOWMAGIC; break; } LastSpellHoly = LastSpellHoly + 1; //SpellSequence = SPELL_SHADOWMAGIC; //break; case SPELL_SHADOWMAGIC: if (SHADOW_WORD_PAIN > 0 && ai->In_Reach(pTarget,SHADOW_WORD_PAIN) && LastSpellShadowMagic < 1 && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) { //ai->TellMaster("I'm casting pain."); ai->CastSpell(SHADOW_WORD_PAIN, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (MIND_BLAST > 0 && ai->In_Reach(pTarget,MIND_BLAST) && LastSpellShadowMagic < 2 && ai->GetManaPercent() >= 19) { //ai->TellMaster("I'm casting mind blast."); ai->CastSpell(MIND_BLAST, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (SCREAM > 0 && ai->In_Reach(pTarget,SCREAM) && LastSpellShadowMagic < 3 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 15) { ai->TellMaster("I'm casting scream."); ai->CastSpell(SCREAM); SpellSequence = SPELL_DISCIPLINE; (LastSpellShadowMagic = LastSpellShadowMagic + 1); break; } else if (MIND_FLAY > 0 && LastSpellShadowMagic < 4 && !pTarget->HasAura(MIND_FLAY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { //ai->TellMaster("I'm casting mind flay."); ai->CastSpell(MIND_FLAY, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (DEVOURING_PLAGUE > 0 && ai->In_Reach(pTarget,DEVOURING_PLAGUE) && LastSpellShadowMagic < 5 && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) { ai->CastSpell(DEVOURING_PLAGUE, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (SHADOW_PROTECTION > 0 && ai->In_Reach(pTarget,SHADOW_PROTECTION) && LastSpellShadowMagic < 6 && ai->GetManaPercent() >= 60) { ai->CastSpell(SHADOW_PROTECTION, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic < 7 && !pTarget->HasAura(VAMPIRIC_TOUCH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 18) { ai->CastSpell(VAMPIRIC_TOUCH, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (SHADOWFIEND > 0 && ai->In_Reach(pTarget,SHADOWFIEND) && LastSpellShadowMagic < 8) { ai->CastSpell(SHADOWFIEND); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (MIND_SEAR > 0 && ai->In_Reach(pTarget,MIND_SEAR) && LastSpellShadowMagic < 9 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 28) { ai->CastSpell(MIND_SEAR, *pTarget); ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (LastSpellShadowMagic > 10) { LastSpellShadowMagic = 0; SpellSequence = SPELL_DISCIPLINE; break; } LastSpellShadowMagic = LastSpellShadowMagic + 1; //SpellSequence = SPELL_DISCIPLINE; //break; case SPELL_DISCIPLINE: if (FEAR_WARD > 0 && ai->In_Reach(pTarget,FEAR_WARD) && LastSpellDiscipline < 1 && ai->GetManaPercent() >= 3) { //ai->TellMaster("I'm casting fear ward"); ai->CastSpell(FEAR_WARD, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (POWER_INFUSION > 0 && LastSpellDiscipline < 2 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting power infusion"); ai->CastSpell(POWER_INFUSION, *(GetMaster())); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (MASS_DISPEL > 0 && ai->In_Reach(pTarget,MASS_DISPEL) && LastSpellDiscipline < 3 && ai->GetManaPercent() >= 33) { //ai->TellMaster("I'm casting mass dispel"); ai->CastSpell(MASS_DISPEL); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline < 4) { //ai->TellMaster("I'm casting inner focus"); ai->CastSpell(INNER_FOCUS, *m_bot); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (PENANCE > 0 && LastSpellDiscipline < 5 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting PENANCE"); ai->CastSpell(PENANCE); SpellSequence = SPELL_HOLY; LastSpellDiscipline = LastSpellDiscipline + 1; break; } else if (LastSpellDiscipline > 6) { LastSpellDiscipline = 0; SpellSequence = SPELL_HOLY; break; } else { LastSpellDiscipline = LastSpellDiscipline + 1; SpellSequence = SPELL_HOLY; } } } // end DoNextCombatManeuver
void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_PVP_DUEL: ai->CastSpell(MOONFIRE); return; default: break; } uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); if (ai->IsTank()) SpellSequence = DruidTank; else if (ai->IsDPS()) SpellSequence = DruidSpell; else if (ai->IsHealer()) SpellSequence = DruidHeal; else SpellSequence = DruidCombat; switch (SpellSequence) { case DruidTank: // Its now a tank druid! //ai->TellMaster("DruidTank"); if (!m_bot->HasInArc(M_PI_F, pTarget)) { if (pVictim) pVictim->Attack(pTarget, true); } if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) ai->CastSpell (MOONKIN_FORM); else 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); else 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); else 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); if (FAERIE_FIRE > 0 && ai->In_Reach(pTarget,FAERIE_FIRE) && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) { ai->CastSpell(FAERIE_FIRE, *pTarget); DruidSpellCombat++; break; } else if (MOONFIRE > 0 && ai->In_Reach(pTarget,MOONFIRE) && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); DruidSpellCombat++; break; } else 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++; break; } else if (HURRICANE > 0 && ai->In_Reach(pTarget,HURRICANE) && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { //ai->TellMaster("casting hurricane!"); ai->CastSpell(HURRICANE, *pTarget); ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; break; } else if (WRATH > 0 && ai->In_Reach(pTarget,WRATH) && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) { ai->CastSpell(WRATH, *pTarget); DruidSpellCombat++; break; } else if (INSECT_SWARM > 0 && ai->In_Reach(pTarget,INSECT_SWARM) && 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++; break; } else if (STARFIRE > 0 && ai->In_Reach(pTarget,STARFIRE) && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 7 && ai->GetManaPercent() >= 18) { ai->CastSpell(STARFIRE, *pTarget); DruidSpellCombat++; break; } else if (FORCE_OF_NATURE > 0 && ai->In_Reach(pTarget,FORCE_OF_NATURE) && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { //ai->TellMaster("summoning treants."); ai->CastSpell(FORCE_OF_NATURE); DruidSpellCombat++; break; } else if (STARFALL > 0 && ai->In_Reach(pTarget,STARFALL) && 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++; break; } else 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++; break; } else if (INNERVATE > 0 && ai->In_Reach(pTarget,INNERVATE) && 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++; break; } else 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 + 2; break; } else if (SWIPE > 0 && ai->In_Reach(pTarget,SWIPE) && (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 + 2; break; } else 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 + 2; break; } else 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 + 2; break; } else 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 + 2; break; } else if (GROWL > 0 && ai->In_Reach(pTarget,GROWL) && (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 + 2; break; } else if (DruidSpellCombat > 13) { DruidSpellCombat = 0; break; } else { DruidSpellCombat = 0; break; } break; case DruidSpell: //ai->TellMaster("DruidSpell"); if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } if (FAERIE_FIRE > 0 && ai->In_Reach(pTarget,FAERIE_FIRE) && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(FAERIE_FIRE, *pTarget); DruidSpellCombat++; break; } else if (MOONFIRE > 0 && ai->In_Reach(pTarget,MOONFIRE) && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); DruidSpellCombat++; break; } else if (ROOTS > 0 && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); DruidSpellCombat++; break; } else if (HURRICANE > 0 && ai->In_Reach(pTarget,HURRICANE) && ai->GetAttackerCount() >= 5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { //ai->TellMaster("casting hurricane!"); ai->CastSpell(HURRICANE, *pTarget); ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; break; } else if (WRATH > 0 && ai->In_Reach(pTarget,WRATH) && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) { ai->CastSpell(WRATH, *pTarget); DruidSpellCombat++; break; } else if (INSECT_SWARM > 0 && ai->In_Reach(pTarget,INSECT_SWARM) && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(INSECT_SWARM, *pTarget); DruidSpellCombat++; break; } else if (STARFIRE > 0 && ai->In_Reach(pTarget,STARFIRE) && DruidSpellCombat < 7 && ai->GetManaPercent() >= 18) { ai->CastSpell(STARFIRE, *pTarget); DruidSpellCombat++; break; } else if (FORCE_OF_NATURE > 0 && ai->In_Reach(pTarget,FORCE_OF_NATURE) && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { //ai->TellMaster("summoning treants."); ai->CastSpell(FORCE_OF_NATURE); DruidSpellCombat++; break; } else if (STARFALL > 0 && ai->In_Reach(pTarget,STARFALL) && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); DruidSpellCombat++; break; } else if (BARKSKIN > 0 && pVictim == m_bot && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); DruidSpellCombat++; break; } else if (INNERVATE > 0 && ai->In_Reach(pTarget,INNERVATE) && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); DruidSpellCombat++; break; } else if (DruidSpellCombat > 13) { DruidSpellCombat = 0; break; } else { DruidSpellCombat = 0; break; } break; case DruidHeal: //ai->TellMaster("DruidHeal"); if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } if (ai->GetHealthPercent() <= 40) { HealTarget (m_bot); break; } if (masterHP <= 40) { HealTarget (GetMaster()); break; } else { DruidSpellCombat = 0; break; } break; case DruidCombat: //ai->TellMaster("DruidCombat"); if (!m_bot->HasInArc(M_PI_F, pTarget)) { if (pVictim) pVictim->Attack(pTarget, true); } if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } if (CAT_FORM > 0 && !m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) ai->CastSpell (CAT_FORM); if (MAIM > 0 && m_bot->GetComboPoints() >= 1 && pTarget->IsNonMeleeSpellCasted(true)) { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("SpellPreventing Maim"); break; } if (RAKE > 0 && m_bot->GetComboPoints() <= 1 && ai->GetEnergyAmount() >= 40) { ai->CastSpell (RAKE, *pTarget); //ai->TellMaster("Rake"); break; } else if (CLAW > 0 && m_bot->GetComboPoints() <= 2 && ai->GetEnergyAmount() >= 45) { ai->CastSpell (CLAW, *pTarget); //ai->TellMaster("Claw"); break; } else if (MANGLE > 0 && m_bot->GetComboPoints() <= 3 && ai->GetEnergyAmount() >= 45) { ai->CastSpell (MANGLE, *pTarget); //ai->TellMaster("Mangle"); break; } else if (CLAW > 0 && m_bot->GetComboPoints() <= 4 && ai->GetEnergyAmount() >= 45) { ai->CastSpell (CLAW, *pTarget); //ai->TellMaster("Claw2"); break; } if (m_bot->GetComboPoints() == 5) { if (RIP > 0 && pTarget->getClass() == CLASS_ROGUE && ai->GetEnergyAmount() >= 30) ai->CastSpell(RIP, *pTarget); //ai->TellMaster("Rogue Rip"); else if (MAIM > 0 && pTarget->getClass() == CLASS_DRUID && ai->GetEnergyAmount() >= 35) ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Druid Maim"); else if (MAIM > 0 && pTarget->getClass() == CLASS_SHAMAN && ai->GetEnergyAmount() >= 35) ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Shaman Maim"); else if (MAIM > 0 && pTarget->getClass() == CLASS_WARLOCK && ai->GetEnergyAmount() >= 35) ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Warlock Maim"); else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_HUNTER && ai->GetEnergyAmount() >= 35) ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Hunter Ferocious Bite"); else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_WARRIOR && ai->GetEnergyAmount() >= 35) ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Warrior Ferocious Bite"); else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_PALADIN && ai->GetEnergyAmount() >= 35) ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Paladin Ferocious Bite"); else if (MAIM > 0 && pTarget->getClass() == CLASS_MAGE && ai->GetEnergyAmount() >= 35) ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Mage Maim"); else if (MAIM > 0 && pTarget->getClass() == CLASS_PRIEST && ai->GetEnergyAmount() >= 35) ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Priest Maim"); else if (MAIM > 0 && ai->GetEnergyAmount() >= 35) ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Else Maim"); break; } else { DruidSpellCombat = 0; break; } break; } } // end DoNextCombatManeuver
void PlayerbotDruidAI::DoNonCombatActions() { Player * m_bot = GetPlayerBot(); Player * master = GetMaster(); if (!m_bot || !master) return; PlayerbotAI* ai = GetAI(); // 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; } else if (!pItem && INNERVATE > 0 && !m_bot->HasAura(INNERVATE) && ai->GetManaPercent() <= 20 && ai->CastSpell(INNERVATE, *m_bot)) 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; } // buff and heal master's group if (master->GetGroup()) { // Buff master with group buff if (master->isAlive() && GIFT_OF_THE_WILD && ai->HasSpellReagents(GIFT_OF_THE_WILD) && ai->Buff(GIFT_OF_THE_WILD, master)) return; 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 || tPlayer == m_bot) continue; // Resurrect member if needed if (!tPlayer->isAlive()) { if (ai->CastSpell(REVIVE, *tPlayer)) { std::string msg = "Resurrecting "; msg += tPlayer->GetName(); m_bot->Say(msg, LANG_UNIVERSAL); return; } else continue; } else { // buff and heal if (BuffPlayer(tPlayer)) return; if (HealTarget(tPlayer)) return; } } } else { if (master->isAlive()) { if (BuffPlayer(master)) return; if (HealTarget(master)) return; } else if (ai->CastSpell(REVIVE, *master)) ai->TellMaster("Resurrecting you, Master."); } BuffPlayer(m_bot); } // end DoNonCombatActions
void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) { Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: if (HAMMER_OF_JUSTICE > 0) ai->CastSpell(HAMMER_OF_JUSTICE); return; } // damage spells Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); float dist = m_bot->GetDistance(pTarget); std::ostringstream out; //Shield master if low hp. uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) if (masterHP < 25 && HAND_OF_PROTECTION > 0 && !GetMaster()->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(HAND_OF_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0)) ai->CastSpell(HAND_OF_PROTECTION, *GetMaster()); // heal group inside combat, but do not heal if tank if (m_group && pVictim != m_bot) // possible tank { 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) // do not heal bots without plenty of mana for master & self if (HealTarget(m_groupMember)) return; } } if (RIGHTEOUS_FURY > 0 && !m_bot->HasAura(RIGHTEOUS_FURY, EFFECT_INDEX_0)) ai->CastSpell (RIGHTEOUS_FURY, *m_bot); 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); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_WARRIOR) ai->CastSpell (DEVOTION_AURA, *m_bot); 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); if (RETRIBUTION_AURA > 0 && !m_bot->HasAura(RETRIBUTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_PRIEST) ai->CastSpell (RETRIBUTION_AURA, *m_bot); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_SHAMAN) ai->CastSpell (DEVOTION_AURA, *m_bot); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_ROGUE) ai->CastSpell (DEVOTION_AURA, *m_bot); if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_PALADIN) ai->CastSpell (DEVOTION_AURA, *m_bot); if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->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); out << " Judgement of Light"; CombatCounter++; break; } else 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); out << " Seal of Command"; CombatCounter++; break; } else if (HAMMER_OF_JUSTICE > 0 && !pTarget->HasAura(HAMMER_OF_JUSTICE, EFFECT_INDEX_0) && CombatCounter < 3 && ai->GetManaPercent() >= 3) { ai->CastSpell (HAMMER_OF_JUSTICE, *pTarget); out << " Hammer of Justice"; CombatCounter++; break; } else if (CRUSADER_STRIKE > 0 && CombatCounter < 4 && ai->GetManaPercent() >= 5) { ai->CastSpell (CRUSADER_STRIKE, *pTarget); out << " Crusader Strike"; CombatCounter++; break; } else if (AVENGING_WRATH > 0 && CombatCounter < 5 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell (AVENGING_WRATH, *m_bot); out << " Avenging Wrath"; CombatCounter++; break; } else 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); out << " Sacred Shield"; CombatCounter++; break; } else if (DIVINE_STORM > 0 && CombatCounter < 7 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 12) { ai->CastSpell (DIVINE_STORM, *pTarget); out << " Divine Storm"; CombatCounter++; break; } else if (HAMMER_OF_WRATH > 0 && CombatCounter < 8 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.20 && ai->GetManaPercent() >= 14) { ai->CastSpell (HAMMER_OF_WRATH, *pTarget); out << " Hammer of Wrath"; CombatCounter++; break; } else if (HOLY_WRATH > 0 && CombatCounter < 9 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 24) { ai->CastSpell (HOLY_WRATH, *pTarget); out << " Holy Wrath"; CombatCounter++; break; } else if (HAND_OF_SACRIFICE > 0 && pVictim == GetMaster() && !GetMaster()->HasAura(HAND_OF_SACRIFICE, EFFECT_INDEX_0) && CombatCounter < 10 && ai->GetManaPercent() >= 6) { ai->CastSpell (HAND_OF_SACRIFICE, *GetMaster()); out << " Hand of Sacrifice"; CombatCounter++; break; } else 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); out << " Divine Protection"; CombatCounter++; break; } else if (RIGHTEOUS_DEFENSE > 0 && pVictim != m_bot && ai->GetHealthPercent() > 70 && CombatCounter < 12) { ai->CastSpell (RIGHTEOUS_DEFENSE, *pTarget); out << " Righteous Defense"; CombatCounter++; break; } else if (DIVINE_PLEA > 0 && !m_bot->HasAura(DIVINE_PLEA, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && CombatCounter < 13) { ai->CastSpell (DIVINE_PLEA, *m_bot); out << " Divine Plea"; CombatCounter++; break; } else if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && CombatCounter < 14) { ai->CastSpell (DIVINE_FAVOR, *m_bot); out << " Divine Favor"; CombatCounter++; break; } else if (CombatCounter > 15) { CombatCounter = 0; //ai->TellMaster("CombatCounter Reset"); break; } else { CombatCounter = 0; //ai->TellMaster("Counter = 0"); break; } case Healing: if (ai->GetHealthPercent() <= 40) { HealTarget (m_bot); out << " ...healing bot"; break; } if (masterHP <= 40) { HealTarget (GetMaster()); out << " ...healing master"; break; } else { CombatCounter = 0; //ai->TellMaster("Counter = 0"); break; } } if (ai->GetManager()->m_confDebugWhisper) ai->TellMaster(out.str().c_str()); if (AVENGING_WRATH > 0 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) ai->CastSpell(AVENGING_WRATH, *m_bot); 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); if (DIVINE_SACRIFICE > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !m_bot->HasAura(DIVINE_SACRIFICE, EFFECT_INDEX_0)) ai->CastSpell(DIVINE_SACRIFICE, *m_bot); }
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; } } }
void PlayerbotPriestAI::DoNonCombatActions() { PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; SpellSequence = SPELL_HOLY; // buff myself if (FORTITUDE > 0) (!m_bot->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (FORTITUDE, *m_bot)); if (INNER_FIRE > 0) (!m_bot->HasAura(INNER_FIRE, EFFECT_INDEX_0) && ai->CastSpell (INNER_FIRE, *m_bot)); // buff master if (FORTITUDE > 0) (!GetMaster()->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(FORTITUDE,*(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() < 30) { ai->TellMaster("I could use a drink."); ai->UseItem(*pItem); ai->SetIgnoreUpdateTime(30); 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); ai->SetIgnoreUpdateTime(30); 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); ai->SetIgnoreUpdateTime(8); return; } // buff and heal master's 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(uint64 (itr->guid)); if( !tPlayer ) continue; // first rezz em if ( !tPlayer->isAlive() && !tPlayer->GetPlayerbotAI() ) { std::string msg = "rezzing "; msg += tPlayer->GetName(); GetPlayerBot()->Say(msg, LANG_UNIVERSAL); ai->CastSpell(REZZ, *tPlayer); // rez is only 10 sec, but give time for lag ai->SetIgnoreUpdateTime(17); } else if( tPlayer->isAlive() ) { // buff and heal (!tPlayer->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (FORTITUDE, *tPlayer)); (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); } } } } // end DoNonCombatActions
int ProcXIQueryPointer(ClientPtr client) { int rc; xXIQueryPointerReply rep; DeviceIntPtr pDev, kbd; WindowPtr pWin, t; SpritePtr pSprite; XkbStatePtr state; char *buttons = NULL; int buttons_size = 0; /* size of buttons array */ XIClientPtr xi_client; Bool have_xi22 = FALSE; REQUEST(xXIQueryPointerReq); REQUEST_SIZE_MATCH(xXIQueryPointerReq); /* Check if client is compliant with XInput 2.2 or later. Earlier clients * do not know about touches, so we must report emulated button presses. 2.2 * and later clients are aware of touches, so we don't include emulated * button presses in the reply. */ xi_client = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey); if (version_compare(xi_client->major_version, xi_client->minor_version, 2, 2) >= 0) have_xi22 = TRUE; rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess); if (rc != Success) { client->errorValue = stuff->deviceid; return rc; } if (pDev->valuator == NULL || IsKeyboardDevice(pDev) || (!IsMaster(pDev) && !IsFloating(pDev))) { /* no attached devices */ client->errorValue = stuff->deviceid; return BadDevice; } rc = dixLookupWindow(&pWin, stuff->win, client, DixGetAttrAccess); if (rc != Success) { client->errorValue = stuff->win; return rc; } if (pDev->valuator->motionHintWindow) MaybeStopHint(pDev, client); if (IsMaster(pDev)) kbd = GetMaster(pDev, MASTER_KEYBOARD); else kbd = (pDev->key) ? pDev : NULL; pSprite = pDev->spriteInfo->sprite; rep = (xXIQueryPointerReply) { .repType = X_Reply, .RepType = X_XIQueryPointer, .sequenceNumber = client->sequence, .length = 6, .root = (GetCurrentRootWindow(pDev))->drawable.id, .root_x = double_to_fp1616(pSprite->hot.x), .root_y = double_to_fp1616(pSprite->hot.y), .child = None }; if (kbd) { state = &kbd->key->xkbInfo->state; rep.mods.base_mods = state->base_mods; rep.mods.latched_mods = state->latched_mods; rep.mods.locked_mods = state->locked_mods; rep.group.base_group = state->base_group; rep.group.latched_group = state->latched_group; rep.group.locked_group = state->locked_group; } if (pDev->button) { int i; rep.buttons_len = bytes_to_int32(bits_to_bytes(pDev->button->numButtons)); rep.length += rep.buttons_len; buttons = calloc(rep.buttons_len, 4); if (!buttons) return BadAlloc; buttons_size = rep.buttons_len * 4; for (i = 1; i < pDev->button->numButtons; i++) if (BitIsOn(pDev->button->down, i)) SetBit(buttons, pDev->button->map[i]); if (!have_xi22 && pDev->touch && pDev->touch->buttonsDown > 0) SetBit(buttons, pDev->button->map[1]); } else rep.buttons_len = 0; if (pSprite->hot.pScreen == pWin->drawable.pScreen) { rep.same_screen = xTrue; rep.win_x = double_to_fp1616(pSprite->hot.x - pWin->drawable.x); rep.win_y = double_to_fp1616(pSprite->hot.y - pWin->drawable.y); for (t = pSprite->win; t; t = t->parent) if (t->parent == pWin) { rep.child = t->drawable.id; break; } } else { rep.same_screen = xFalse; rep.win_x = 0; rep.win_y = 0; } #ifdef PANORAMIX if (!noPanoramiXExtension) { rep.root_x += double_to_fp1616(screenInfo.screens[0]->x); rep.root_y += double_to_fp1616(screenInfo.screens[0]->y); if (stuff->win == rep.root) { rep.win_x += double_to_fp1616(screenInfo.screens[0]->x); rep.win_y += double_to_fp1616(screenInfo.screens[0]->y); } } #endif WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep); if (buttons) WriteToClient(client, buttons_size, buttons); free(buttons); return Success; } /*********************************************************************** * * This procedure writes the reply for the XIQueryPointer function, * if the client and server have a different byte ordering. * */ void SRepXIQueryPointer(ClientPtr client, int size, xXIQueryPointerReply * rep) { swaps(&rep->sequenceNumber); swapl(&rep->length); swapl(&rep->root); swapl(&rep->child); swapl(&rep->root_x); swapl(&rep->root_y); swapl(&rep->win_x); swapl(&rep->win_y); swaps(&rep->buttons_len); WriteToClient(client, size, rep); }
void PlayerbotPriestAI::DoNonCombatActions() { PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); Player * master = GetMaster(); if (!m_bot || !master) return; SpellSequence = SPELL_HOLY; // selfbuff goes first if (ai->SelfBuff(INNER_FIRE)) return; // 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; } // buff and heal master's group if (master->GetGroup()) { // Buff master with group buffs if (master->isAlive()) { if (PRAYER_OF_FORTITUDE && ai->HasSpellReagents(PRAYER_OF_FORTITUDE) && ai->Buff(PRAYER_OF_FORTITUDE, master)) return; if (PRAYER_OF_SPIRIT && ai->HasSpellReagents(PRAYER_OF_SPIRIT) && ai->Buff(PRAYER_OF_SPIRIT, master)) return; if (PRAYER_OF_SHADOW_PROTECTION && ai->HasSpellReagents(PRAYER_OF_SHADOW_PROTECTION) && ai->Buff(PRAYER_OF_SHADOW_PROTECTION, master)) return; } 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 || tPlayer == m_bot) continue; // first rezz em if (!tPlayer->isAlive()) { if (ai->CastSpell(RESURRECTION, *tPlayer)) { std::string msg = "Resurrecting "; msg += tPlayer->GetName(); m_bot->Say(msg, LANG_UNIVERSAL); return; } else continue; } else { // buff and heal if (BuffPlayer(tPlayer)) return; if (HealTarget(tPlayer)) return; } } } else { if (master->isAlive()) { if (BuffPlayer(master)) return; if (HealTarget(master)) return; } else if (ai->CastSpell(RESURRECTION, *master)) ai->TellMaster("Resurrecting you, Master."); } BuffPlayer(m_bot); } // end DoNonCombatActions
static int remove_master(ClientPtr client, xXIRemoveMasterInfo *r, int flags[MAXDEVICES]) { DeviceIntPtr ptr, keybd, XTestptr, XTestkeybd; int rc = Success; if (r->return_mode != XIAttachToMaster && r->return_mode != XIFloating) return BadValue; rc = dixLookupDevice(&ptr, r->deviceid, client, DixDestroyAccess); if (rc != Success) goto unwind; if (!IsMaster(ptr)) { client->errorValue = r->deviceid; rc = BadDevice; goto unwind; } /* XXX: For now, don't allow removal of VCP, VCK */ if (ptr == inputInfo.pointer || ptr == inputInfo.keyboard) { rc = BadDevice; goto unwind; } ptr = GetMaster(ptr, MASTER_POINTER); rc = dixLookupDevice(&ptr, ptr->id, client, DixDestroyAccess); if (rc != Success) goto unwind; keybd = GetMaster(ptr, MASTER_KEYBOARD); rc = dixLookupDevice(&keybd, keybd->id, client, DixDestroyAccess); if (rc != Success) goto unwind; XTestptr = GetXTestDevice(ptr); rc = dixLookupDevice(&XTestptr, XTestptr->id, client, DixDestroyAccess); if (rc != Success) goto unwind; XTestkeybd = GetXTestDevice(keybd); rc = dixLookupDevice(&XTestkeybd, XTestkeybd->id, client, DixDestroyAccess); if (rc != Success) goto unwind; /* Disabling sends the devices floating, reattach them if * desired. */ if (r->return_mode == XIAttachToMaster) { DeviceIntPtr attached, newptr, newkeybd; rc = dixLookupDevice(&newptr, r->return_pointer, client, DixAddAccess); if (rc != Success) goto unwind; if (!IsMaster(newptr)) { client->errorValue = r->return_pointer; rc = BadDevice; goto unwind; } rc = dixLookupDevice(&newkeybd, r->return_keyboard, client, DixAddAccess); if (rc != Success) goto unwind; if (!IsMaster(newkeybd)) { client->errorValue = r->return_keyboard; rc = BadDevice; goto unwind; } for (attached = inputInfo.devices; attached; attached = attached->next) { if (!IsMaster(attached)) { if (GetMaster(attached, MASTER_ATTACHED) == ptr) { AttachDevice(client, attached, newptr); flags[attached->id] |= XISlaveAttached; } if (GetMaster(attached, MASTER_ATTACHED) == keybd) { AttachDevice(client, attached, newkeybd); flags[attached->id] |= XISlaveAttached; } } } } /* can't disable until we removed pairing */ keybd->spriteInfo->paired = NULL; ptr->spriteInfo->paired = NULL; XTestptr->spriteInfo->paired = NULL; XTestkeybd->spriteInfo->paired = NULL; /* disable the remove the devices, XTest devices must be done first else the sprites they rely on will be destroyed */ DisableDevice(XTestptr, FALSE); DisableDevice(XTestkeybd, FALSE); DisableDevice(keybd, FALSE); DisableDevice(ptr, FALSE); flags[XTestptr->id] |= XIDeviceDisabled | XISlaveDetached; flags[XTestkeybd->id] |= XIDeviceDisabled | XISlaveDetached; flags[keybd->id] |= XIDeviceDisabled; flags[ptr->id] |= XIDeviceDisabled; RemoveDevice(XTestptr, FALSE); RemoveDevice(XTestkeybd, FALSE); RemoveDevice(keybd, FALSE); RemoveDevice(ptr, FALSE); flags[XTestptr->id] |= XISlaveRemoved; flags[XTestkeybd->id] |= XISlaveRemoved; flags[keybd->id] |= XIMasterRemoved; flags[ptr->id] |= XIMasterRemoved; unwind: return rc; }
void PlayerbotShamanAI::DoNonCombatActions() { PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; SpellSequence = SPELL_ENHANCEMENT; // buff master with EARTH_SHIELD if (EARTH_SHIELD > 0) (!GetMaster()->HasAura(EARTH_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(EARTH_SHIELD, *(GetMaster()))); // buff myself with WATER_SHIELD, LIGHTNING_SHIELD if (WATER_SHIELD > 0) (!m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(WATER_SHIELD, *m_bot)); else if (LIGHTNING_SHIELD > 0) (!m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(LIGHTNING_SHIELD, *m_bot)); /* // buff myself weapon if (ROCKBITER_WEAPON > 0) (!m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_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) && ai->CastSpell(ROCKBITER_WEAPON,*m_bot) ); else if (EARTHLIVING_WEAPON > 0) (!m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_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) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); else if (WINDFURY_WEAPON > 0) (!m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_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) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); else if (FLAMETONGUE_WEAPON > 0) (!m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_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) && ai->CastSpell(FLAMETONGUE_WEAPON,*m_bot) ); else if (FROSTBRAND_WEAPON > 0) (!m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_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) && ai->CastSpell(FROSTBRAND_WEAPON,*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; } // heal master's 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 || !tPlayer->isAlive()) continue; // heal (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); } } } // end DoNonCombatActions
void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: if (FIREBALL > 0) ai->CastSpell(FIREBALL); return; } // ------- Non Duel combat ---------- ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob // Damage Spells (primitive example) ai->SetInFront( pTarget ); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); switch (SpellSequence) { case SPELL_FROST: if (ICY_VEINS > 0 && !m_bot->HasAura(ICY_VEINS, 0) && LastSpellFrost < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(ICY_VEINS, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (FROSTBOLT > 0 && LastSpellFrost < 2 && !pTarget->HasAura(FROSTBOLT, 0) && ai->GetManaPercent() >= 16) { ai->CastSpell(FROSTBOLT, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (FROST_WARD > 0 && LastSpellFrost < 3 && !m_bot->HasAura(FROST_WARD, 0) && ai->GetManaPercent() >= 19) { ai->CastSpell(FROST_WARD, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (FROST_NOVA > 0 && LastSpellFrost < 4 && !pTarget->HasAura(FROST_NOVA, 0) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_NOVA, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (ICE_LANCE > 0 && LastSpellFrost < 5 && ai->GetManaPercent() >= 7) { ai->CastSpell(ICE_LANCE, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (BLIZZARD > 0 && LastSpellFrost < 6 && ai->GetAttackerCount()>=5 && ai->GetManaPercent() >= 89) { ai->CastSpell(BLIZZARD, *pTarget); ai->SetIgnoreUpdateTime(8); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (CONE_OF_COLD > 0 && LastSpellFrost < 7 && !pTarget->HasAura(CONE_OF_COLD, 0) && ai->GetManaPercent() >= 35) { ai->CastSpell(CONE_OF_COLD, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (DEEP_FREEZE > 0 && LastSpellFrost < 8 && ai->GetManaPercent() >= 9) { ai->CastSpell(DEEP_FREEZE, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (ICE_BARRIER > 0 && LastSpellFrost < 9 && ai->GetHealthPercent() < 70 && ai->GetManaPercent() >= 30) { ai->CastSpell(ICE_BARRIER, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (SUMMON_WATER_ELEMENTAL > 0 && LastSpellFrost < 10 && ai->GetManaPercent() >= 16) { ai->CastSpell(SUMMON_WATER_ELEMENTAL); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (ICE_BLOCK > 0 && LastSpellFrost < 11 && !m_bot->HasAura(ICE_BLOCK, 0) && ai->GetHealthPercent() < 25) { ai->CastSpell(ICE_BLOCK, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } else if (COLD_SNAP > 0 && LastSpellFrost < 12) { ai->CastSpell(COLD_SNAP, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } LastSpellFrost = 0; //SpellSequence = SPELL_FIRE; //break; case SPELL_FIRE: if (FIRE_WARD > 0 && !m_bot->HasAura(FIRE_WARD, 0) && LastSpellFire < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(FIRE_WARD, *m_bot); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (COMBUSTION > 0 && !m_bot->HasAura(COMBUSTION, 0) && LastSpellFire < 2) { ai->CastSpell(COMBUSTION, *GetMaster()); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (FIREBALL > 0 && LastSpellFire < 3 && ai->GetManaPercent() >= 23) { ai->CastSpell(FIREBALL, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (FIRE_BLAST > 0 && LastSpellFire < 4 && ai->GetManaPercent() >= 25) { ai->CastSpell(FIRE_BLAST, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (FLAMESTRIKE > 0 && LastSpellFire < 5 && ai->GetManaPercent() >= 35) { ai->CastSpell(FLAMESTRIKE, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (SCORCH > 0 && LastSpellFire < 6 && ai->GetManaPercent() >= 10) { ai->CastSpell(SCORCH, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (PYROBLAST > 0 && LastSpellFire < 7 && !pTarget->HasAura(PYROBLAST, 0) && ai->GetManaPercent() >= 27) { ai->CastSpell(PYROBLAST, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (BLAST_WAVE > 0 && LastSpellFire < 8 && ai->GetAttackerCount()>=3 && pVictim && ai->GetManaPercent() >= 34) { ai->CastSpell(BLAST_WAVE); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (DRAGONS_BREATH > 0 && LastSpellFire < 9 && pVictim && ai->GetManaPercent() >= 37) { ai->CastSpell(DRAGONS_BREATH, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (LIVING_BOMB > 0 && LastSpellFire < 10 && !pTarget->HasAura(LIVING_BOMB, 0) && ai->GetManaPercent() >= 27) { ai->CastSpell(LIVING_BOMB, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } else if (FROSTFIRE_BOLT > 0 && LastSpellFire < 11 && !pTarget->HasAura(FROSTFIRE_BOLT, 0) && ai->GetManaPercent() >= 14) { ai->CastSpell(FROSTFIRE_BOLT, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } LastSpellFire = 0; //SpellSequence = SPELL_ARCANE; //break; case SPELL_ARCANE: if (ARCANE_POWER > 0 && LastSpellArcane < 1 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_POWER, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (ARCANE_MISSILES > 0 && LastSpellArcane < 2 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_MISSILES, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (ARCANE_EXPLOSION > 0 && LastSpellArcane < 3 && ai->GetAttackerCount()>=3 && pVictim && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_EXPLOSION, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (COUNTERSPELL > 0 && pTarget->GetPower(POWER_MANA) > 0 && LastSpellArcane < 4 && ai->GetManaPercent() >= 9) { ai->CastSpell(COUNTERSPELL, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (SLOW > 0 && LastSpellArcane < 5 && !pTarget->HasAura(SLOW, 0) && ai->GetManaPercent() >= 12) { ai->CastSpell(SLOW, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (ARCANE_BARRAGE > 0 && LastSpellArcane < 6 && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_BARRAGE, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (ARCANE_BLAST > 0 && LastSpellArcane < 7 && ai->GetManaPercent() >= 8) { ai->CastSpell(ARCANE_BLAST, *pTarget); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (MIRROR_IMAGE > 0 && LastSpellArcane < 8 && ai->GetManaPercent() >= 10) { ai->CastSpell(MIRROR_IMAGE); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else if (MANA_SHIELD > 0 && LastSpellArcane < 9 && ai->GetHealthPercent() < 50 && !m_bot->HasAura(MANA_SHIELD, 0) && ai->GetManaPercent() >= 8) { ai->CastSpell(MANA_SHIELD, *m_bot); SpellSequence = SPELL_FROST; LastSpellArcane = LastSpellArcane +1; break; } else { LastSpellArcane = 0; SpellSequence = SPELL_FROST; } } } // end DoNextCombatManeuver
void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) { PlayerbotAI* ai = GetAI(); if (!ai) return; switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: ai->CastSpell(LIGHTNING_BOLT); return; default: break; } // ------- Non Duel combat ---------- ai->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, GetMaster()); // dont want to melee mob <----changed Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); // Heal myself if (ai->GetHealthPercent() < 30 && ai->GetManaPercent() >= 32) ai->CastSpell(HEALING_WAVE); else if (ai->GetHealthPercent() < 50 && ai->GetManaPercent() >= 19) ai->CastSpell(LESSER_HEALING_WAVE); else if (ai->GetHealthPercent() < 70) HealTarget (*m_bot, ai->GetHealthPercent()); // Heal master uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { if (masterHP < 30 && ai->GetManaPercent() >= 32) ai->CastSpell(HEALING_WAVE, *(GetMaster())); else if (masterHP < 70) HealTarget (*GetMaster(), masterHP); } // Heal group if (m_group) { 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 < 30) HealTarget(*m_groupMember, memberHP); } } // Damage Spells ai->SetInFront(pTarget); switch (SpellSequence) { case SPELL_ENHANCEMENT: if (STRENGTH_OF_EARTH_TOTEM > 0 && LastSpellEnhancement == 1 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 13) { ai->CastSpell(STRENGTH_OF_EARTH_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (STONESKIN_TOTEM > 0 && LastSpellEnhancement == 5 && (!m_bot->HasAura(STONESKIN_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 13) { ai->CastSpell(STONESKIN_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FOCUSED > 0 && LastSpellEnhancement == 2) { ai->CastSpell(FOCUSED, *pTarget); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FROST_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 10 && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && (!m_bot->HasAura(FLAMETONGUE_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FLAMETONGUE_TOTEM > 0 && LastSpellEnhancement == 15 && (!m_bot->HasAura(FLAMETONGUE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 14) { ai->CastSpell(FLAMETONGUE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FIRE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 20 && (!m_bot->HasAura(FIRE_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(FIRE_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (GROUNDING_TOTEM > 0 && LastSpellEnhancement == 25 && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(GROUNDING_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (NATURE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 30 && (!m_bot->HasAura(NATURE_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(NATURE_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (WIND_FURY_TOTEM > 0 && LastSpellEnhancement == 35 && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 11) { ai->CastSpell(WIND_FURY_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (STORMSTRIKE > 0 && LastSpellEnhancement == 4 && (!pTarget->HasAura(STORMSTRIKE, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 8) { ai->CastSpell(STORMSTRIKE, *pTarget); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (LAVA_LASH > 0 && LastSpellEnhancement == 6 && ai->GetManaPercent() >= 4) { ai->CastSpell(LAVA_LASH, *pTarget); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FERAL_SPIRIT > 0 && LastSpellEnhancement == 7 && ai->GetManaPercent() >= 12) { ai->CastSpell(FERAL_SPIRIT); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (WRATH_OF_AIR_TOTEM > 0 && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && LastSpellEnhancement == 40) { ai->CastSpell(WRATH_OF_AIR_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (EARTH_ELEMENTAL_TOTEM > 0 && LastSpellEnhancement == 45 && ai->GetManaPercent() >= 24) { ai->CastSpell(EARTH_ELEMENTAL_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (BLOODLUST > 0 && LastSpellEnhancement == 8 && (!GetMaster()->HasAura(BLOODLUST, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 26) { ai->CastSpell(BLOODLUST); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (HEROISM > 0 && LastSpellEnhancement == 10 && (!GetMaster()->HasAura(HEROISM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 26) { ai->CastSpell(HEROISM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (SHAMANISTIC_RAGE > 0 && (!m_bot->HasAura(SHAMANISTIC_RAGE, EFFECT_INDEX_0)) && LastSpellEnhancement == 11) { ai->CastSpell(SHAMANISTIC_RAGE, *m_bot); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (LastSpellEnhancement > 50) { LastSpellEnhancement = 1; SpellSequence = SPELL_RESTORATION; break; } LastSpellEnhancement = LastSpellEnhancement + 1; //SpellSequence = SPELL_RESTORATION; //break; case SPELL_RESTORATION: if (HEALING_STREAM_TOTEM > 0 && LastSpellRestoration < 3 && ai->GetHealthPercent() < 50 && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 4) { ai->CastSpell(HEALING_STREAM_TOTEM); SpellSequence = SPELL_ELEMENTAL; LastSpellRestoration = LastSpellRestoration + 1; break; } else if (MANA_SPRING_TOTEM > 0 && LastSpellRestoration < 4 && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(MANA_SPRING_TOTEM); SpellSequence = SPELL_ELEMENTAL; LastSpellRestoration = LastSpellRestoration + 1; break; } else if (MANA_TIDE_TOTEM > 0 && LastSpellRestoration < 5 && ai->GetManaPercent() < 50 && ai->GetManaPercent() >= 3) { ai->CastSpell(MANA_TIDE_TOTEM); SpellSequence = SPELL_ELEMENTAL; LastSpellRestoration = LastSpellRestoration + 1; break; } /*else if (TREMOR_TOTEM > 0 && LastSpellRestoration < 6 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 2) { ai->CastSpell(TREMOR_TOTEM); SpellSequence = SPELL_ELEMENTAL; LastSpellRestoration = LastSpellRestoration +1; break; }*/ else if (LastSpellRestoration > 6) { LastSpellRestoration = 0; SpellSequence = SPELL_ELEMENTAL; break; } LastSpellRestoration = LastSpellRestoration + 1; //SpellSequence = SPELL_ELEMENTAL; //break; case SPELL_ELEMENTAL: if (LIGHTNING_BOLT > 0 && LastSpellElemental == 1 && ai->GetManaPercent() >= 13) { ai->CastSpell(LIGHTNING_BOLT, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (SEARING_TOTEM > 0 && LastSpellElemental == 2 && (!pTarget->HasAura(SEARING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 9) { ai->CastSpell(SEARING_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (STONECLAW_TOTEM > 0 && ai->GetHealthPercent() < 51 && LastSpellElemental == 3 && (!pTarget->HasAura(STONECLAW_TOTEM, EFFECT_INDEX_0)) && (!pTarget->HasAura(EARTHBIND_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 8) { ai->CastSpell(STONECLAW_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (FLAME_SHOCK > 0 && LastSpellElemental == 4 && (!pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 22) { ai->CastSpell(FLAME_SHOCK, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (LAVA_BURST > 0 && LastSpellElemental == 5 && (pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(LAVA_BURST, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (MAGMA_TOTEM > 0 && LastSpellElemental == 6 && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 35) { ai->CastSpell(MAGMA_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (EARTHBIND_TOTEM > 0 && LastSpellElemental == 7 && (!pTarget->HasAura(EARTHBIND_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(EARTHBIND_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (EARTH_SHOCK > 0 && LastSpellElemental == 8 && ai->GetManaPercent() >= 23) { ai->CastSpell(EARTH_SHOCK, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (PURGE > 0 && LastSpellElemental == 9 && ai->GetManaPercent() >= 8) { ai->CastSpell(PURGE, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (WIND_SHOCK > 0 && LastSpellElemental == 10 && ai->GetManaPercent() >= 8) { ai->CastSpell(WIND_SHOCK, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (FIRE_NOVA_TOTEM > 0 && LastSpellElemental == 11 && ai->GetManaPercent() >= 33) { ai->CastSpell(FIRE_NOVA_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (FROST_SHOCK > 0 && LastSpellElemental == 12 && (!pTarget->HasAura(FROST_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 23) { ai->CastSpell(FROST_SHOCK, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (CHAIN_LIGHTNING > 0 && LastSpellElemental == 13 && ai->GetManaPercent() >= 33) { ai->CastSpell(CHAIN_LIGHTNING, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (TOTEM_OF_WRATH > 0 && LastSpellElemental == 14 && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(TOTEM_OF_WRATH); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } else if (FIRE_ELEMENTAL_TOTEM > 0 && LastSpellElemental == 15 && ai->GetManaPercent() >= 23) { ai->CastSpell(FIRE_ELEMENTAL_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } /*else if (HEX > 0 && LastSpellElemental == 16 && (!pTarget->HasAura(HEX, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 3) { ai->CastSpell(HEX); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; }*/ else if (LastSpellElemental > 16) { LastSpellElemental = 1; SpellSequence = SPELL_ENHANCEMENT; break; } else { LastSpellElemental = LastSpellElemental + 1; SpellSequence = SPELL_ENHANCEMENT; } } } // end DoNextCombatManeuver
void PlayerbotWarriorAI::DoNonCombatActions() { PlayerbotAI *ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; // TODO (by Runsttren): check if shout aura bot has is casted by this bot, // otherwise cast other useful shout // If the bot is protect talented, she/he needs stamina not attack power. // With stance change can the shout change to. // Inserted line to battle shout m_bot->HasAura( COMMANDING_SHOUT, 0 ) // Natsukawa if( ( (COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, 0 )) || (BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, 0 )) ) && ai->GetRageAmount()<10 && BLOODRAGE>0 && !m_bot->HasAura( BLOODRAGE, 0 ) ) { // we do have a useful shout, no rage coming but can cast bloodrage... do it ai->CastSpell( BLOODRAGE, *m_bot ); } else if( COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, 0 ) ) { // use commanding shout now ai->CastSpell( COMMANDING_SHOUT, *m_bot ); } else if( BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, 0 ) && !m_bot->HasAura( COMMANDING_SHOUT, 0 ) ) { // use battle shout ai->CastSpell( BATTLE_SHOUT, *m_bot ); } // buff master with VIGILANCE if (VIGILANCE > 0) (!GetMaster()->HasAura( VIGILANCE, 0 ) && ai->CastSpell( VIGILANCE, *GetMaster() ) ); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindFood(); Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); ai->UseItem(*pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); ai->SetIgnoreUpdateTime(8); return; } else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, 0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I'm casting gift of the naaru."); ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot); return; } } // end DoNonCombatActions
void PlayerbotRogueAI::DoNonCombatActions() { PlayerbotAI *ai = GetAI(); if (!ai) return; Player * m_bot = GetPlayerBot(); 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); Item* pItem = ai->FindFood(); Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster(sObjectMgr.GetPlayerBotString(101, GetMaster()->GetSession()->GetSessionDbLocaleIndex())); ai->UseItem(pItem); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster(sObjectMgr.GetPlayerBotString(102, GetMaster()->GetSession()->GetSessionDbLocaleIndex())); ai->UseItem(fItem); 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 = ai->FindConsumable(INSTANT_POISON_DISPLAYID); if (!poison) poison = ai->FindConsumable(WOUND_POISON_DISPLAYID); if (!poison) poison = ai->FindConsumable(DEADLY_POISON_DISPLAYID); if (poison) { ai->UseItem(poison, EQUIPMENT_SLOT_MAINHAND); 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 = ai->FindConsumable(DEADLY_POISON_DISPLAYID); if (!poison) poison = ai->FindConsumable(WOUND_POISON_DISPLAYID); if (!poison) poison = ai->FindConsumable(INSTANT_POISON_DISPLAYID); if (poison) { ai->UseItem(poison, EQUIPMENT_SLOT_OFFHAND); ai->SetIgnoreUpdateTime(5); } } } // end DoNonCombatActions
void PlayerbotPaladinAI::DoNonCombatActions(){ Player * m_bot = GetPlayerBot(); if (!m_bot) { return; } // buff myself if (BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(BLESSING_OF_MIGHT, 0)) { GetAI()->CastSpell (BLESSING_OF_MIGHT, *m_bot); } if (RIGHTEOUS_FURY > 0 && !m_bot->HasAura(RIGHTEOUS_FURY, 0)) { GetAI()->CastSpell (RIGHTEOUS_FURY, *m_bot); } if (SEAL_OF_COMMAND > 0) { GetAI()->CastSpell (SEAL_OF_COMMAND, *m_bot); } //Select Class buff seq. ///Process Who is my master --> get the player class --> aura already present if not then proced --> cast the spell //Priest if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); } if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); } //Mage if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); } if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); } //Paladin if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); } if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); } //Warlock if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); } if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); } //Warrior if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, 0)) { GetAI()->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); } if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); } if (BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, 0) && !GetMaster()->HasAura(BLESSING_OF_KINGS, 0) && !GetMaster()->HasAura(BERSERKER_STANCE, 0) && !GetMaster()->HasAura(BATTLE_STANCE, 0)) { GetAI()->CastSpell (BLESSING_OF_KINGS, *(GetMaster())); } if (GREATER_BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, 0) && !GetMaster()->HasAura(BERSERKER_STANCE, 0) && !GetMaster()->HasAura(BATTLE_STANCE, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_KINGS, *(GetMaster())); } //Rogue if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, 0)) { GetAI()->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); } if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); } //Shaman if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, 0)) { GetAI()->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); } if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0)) { GetAI()->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); } // mana check if (m_bot->getStandState() != PLAYER_STATE_NONE) m_bot->SetStandState(PLAYER_STATE_NONE); Item* pItem = GetAI()->FindDrink(); if (pItem != NULL && GetAI()->GetManaPercent() < 40) { GetAI()->TellMaster("I could use a drink."); GetAI()->UseItem(*pItem); GetAI()->SetIgnoreUpdateTime(30); return; } // hp check original if (m_bot->getStandState() != PLAYER_STATE_NONE) m_bot->SetStandState(PLAYER_STATE_NONE); pItem = GetAI()->FindFood(); if (pItem != NULL && GetAI()->GetHealthPercent() < 80) { GetAI()->TellMaster("I could use some food."); GetAI()->UseItem(*pItem); GetAI()->SetIgnoreUpdateTime(30); return; } //This is a paladin, self healing maybe? ;D Out of combat he can take care of him self, no ned to be healed. //Causes server to crash in some cases /disabled for now/ /* if (m_bot->getStandState() != PLAYER_STATE_NONE) m_bot->SetStandState(PLAYER_STATE_NONE); if (HOLY_LIGHT > 0 && GetAI()->GetHealthPercent() < 98 && GetAI()->GetManaPercent() >= 41) { GetAI()->CastSpell(HOLY_LIGHT); } */ }
void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) { if (!pTarget || pTarget->isDead()) return; PlayerbotAI *ai = GetAI(); if (!ai) return; Player *m_bot = GetPlayerBot(); if (!m_bot || m_bot->isDead()) return; Unit *pVictim = pTarget->getVictim(); Unit *m_tank = FindMainTankInRaid(GetMaster()); if (!m_tank && m_bot->GetGroup() && GetMaster()->GetGroup() != m_bot->GetGroup()) { FindMainTankInRaid(m_bot); } if (!m_tank) { m_tank = m_bot; } uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); float pDist = m_bot->GetDistance(pTarget); uint8 pThreat = GetThreatPercent(pTarget); Pet *pet = m_bot->GetPet(); std::ostringstream out; if (!m_pulling) { m_role = BOT_ROLE_DPS_MELEE; #pragma region Choose Role/Presence // Choose Presence if (m_tank->GetGUID() == m_bot->GetGUID()) // Hey! I am Main Tank { if (CastSpell(FROST_PRESENCE,m_bot)) { m_role = BOT_ROLE_TANK; return; } } else if (isUnderAttack()) // I am under attack { if (pVictim && pVictim->GetGUID() == m_bot->GetGUID() && pDist <= 2) {} // My target is almost up to me, no need to search else //Have to select nearest target { Unit *curAtt = GetNearestAttackerOf(m_bot); if (curAtt && curAtt->GetGUID() != pTarget->GetGUID()) { m_bot->SetSelection(curAtt->GetGUID()); //ai->AddLootGUID(curAtt->GetGUID()); DoNextCombatManeuver(curAtt); //Restart new update to get variables fixed.. return; } } //my target is attacking me //if (m_bot->getRace() == (uint8) RACE_NIGHTELF && CastSpell(R_SHADOWMELD,m_bot) ) { return; } if (CastSpell(FROST_PRESENCE,m_bot)) { m_role = BOT_ROLE_OFFTANK; return; } } else if (TALENT_UNHOLY) { if (CastSpell(UNHOLY_PRESENCE,m_bot)) return; } else if (CastSpell(BLOOD_PRESENCE,m_bot)) return; #pragma endregion } // Cast CC breakers if any match found (does not work yet) // uint32 ccSpells[6] = { LICHBORNE, ICEBOUND_FORTITUDE, R_ESCAPE_ARTIST, R_EVERY_MAN_FOR_HIMSELF, R_WILL_OF_FORSAKEN, R_STONEFORM }; // if (castSelfCCBreakers(ccSpells)) { } //most of them dont have gcd TakePosition(pTarget); if (m_pulling) { if (GetAI()->CastSpell(DEATH_GRIP,pTarget)) { m_pulling = false; GetAI()->SetCombatOrder(ORDERS_NONE); GetAI()->Follow(*GetMaster()); GetAI()->SetIgnoreUpdateTime(2); if (m_bot->GetPet()) pet->SetReactState (REACT_DEFENSIVE); } return; } // If there's a cast stop if(m_bot->HasUnitState(UNIT_STATE_CASTING)) { return; } #pragma region Buff Heal Interrupt //Buff UP if (CastSpell(HORN_OF_WINTER,m_bot)) { return; } if (CastSpell(BONE_SHIELD,m_bot)) { return; } //HEAL UP && PROTECT UP if (ai->GetHealthPercent() < 80 && ai->GetHealthPercent() > 20 && CastSpell(VAMPIRIC_BLOOD,m_bot)) { } //NO GCD if (ai->GetHealthPercent() < 65 && CastSpell(RUNE_TAP,m_bot)) { } //NO GCD if (CanCast(DEATH_STRIKE,pTarget,true) && ai->GetHealthPercent() < 90 && (pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) ||pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) ) && CastSpell(DEATH_STRIKE,pTarget,false) ) {return;} if (m_bot->getRace() == (uint8) RACE_DWARF && ai->GetHealthPercent() < 75 && CastSpell(R_STONEFORM,m_bot)) { } //no gcd if (m_bot->getRace() == (uint8) RACE_DRAENEI && ai->GetHealthPercent() < 55 && CastSpell(R_GIFT_OF_NAARU,m_bot)) { return; } //no Gcd, but has cast if (pet && ai->GetHealthPercent() < 50 && CastSpell(DEATH_PACT,m_bot)) { return; } if (pet && ai->GetHealthPercent() < 60 && CastSpell(MARK_OF_BLOOD,pTarget)) { return; } if (ai->GetHealthPercent() < 65 && CastSpell(ICEBOUND_FORTITUDE,m_bot)) { } //No GCD if (ai->GetHealthPercent() < 65 && CastSpell(UNBREAKABLE_ARMOR,m_bot)) { return; } //Break spells being cast if (pTarget->IsNonMeleeSpellCasted(true)) { if (CastSpell(MIND_FREEZE,pTarget)) {} // No GCD if (CastSpell(STRANGULATE,pTarget)) { return; } if (m_bot->getRace() == (uint8) RACE_BLOODELF && pDist < 8 && CastSpell(R_ARCANE_TORRENT, pTarget)) { } //no gcd if (CastSpell(ANTI_MAGIC_ZONE,m_bot)) { return; } if (CastSpell(ANTI_MAGIC_SHELL,m_bot)) {} //NO GCD } //Catch if (pTarget->HasUnitMovementFlag(UNIT_FLAG_FLEEING)) { if (CastSpell(DEATH_GRIP,pTarget)) return; if (CastSpell(CHAINS_OF_ICE,pTarget)) return; } #pragma endregion #pragma region Taunt / Threat // if i am main tank, protect master by taunt if(m_tank->GetGUID() == m_bot->GetGUID()) { // Taunt if needed (Only for master) Unit *curAtt = GetAttackerOf(GetMaster()); if (curAtt && CastSpell(DARK_COMMAND, curAtt)) { } //No gcd // My target is not attacking me, taunt.. if (pVictim && pVictim->GetGUID() != m_bot->GetGUID() && CastSpell(DARK_COMMAND, pTarget) ) { } // No gcd } // If not in Frost Presence slow down due to threat if (pThreat > threatThreshold && !m_bot->HasAura(FROST_PRESENCE) && m_tank->GetGUID() != m_bot->GetGUID() && !isUnderAttack()) { if (m_tank->getVictim() && m_tank->getVictim()->GetGUID() != pTarget->GetGUID()) // I am attacking wrong target!! { m_bot->SetSelection(m_tank->getVictim()->GetGUID()); return; } else { return; } //DK has no threat reducing spells, just slow down } #pragma endregion #pragma region Dps //Dps up if (CastSpell(EMPOWER_WEAPON,m_bot)) {} //NO GCD if (ai->GetHealthPercent() > 90 && CastSpell(HYSTERIA,m_bot)) {} //NO GCD if (m_bot->getRace() == (uint8) RACE_TROLL && CastSpell(R_BERSERKING,m_bot)) {} //no GCD if (m_bot->getRace() == (uint8) RACE_ORC && CastSpell(R_BLOOD_FURY,m_bot)) {} //no GCD // Use up excess Runic Power if (ai->GetRunicPower() > 60 && CastSpell(FROST_STRIKE,pTarget)) { return; } else if (ai->GetRunicPower() > 60 && CastSpell(DEATH_COIL,pTarget,true,true,true)) { return; } if ((isUnderAttack() || ai->GetRunicPower() > 70) && CastSpell(RUNE_STRIKE,pTarget)) {} //Next attack spell // Build Diseases if (!pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) && CastSpell(ICY_TOUCH,pTarget)) { return; } if (!pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) && CastSpell(PLAGUE_STRIKE,pTarget)) { return; } // Use AOEs summons if (isUnderAttack(m_tank,4) && CastSpell(DEATH_AND_DECAY,pTarget)) { return; } if (isUnderAttack(m_tank,4) && CastSpell(HOWLING_BLAST,pTarget)) { return; } if (CanCast(PESTILENCE,pTarget,true) && isUnderAttack(m_tank,4) && (pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) && pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) ) && CastSpell(PESTILENCE,pTarget,false)) { return; } if (CanCast(BLOOD_BOIL,pTarget,true) && isUnderAttack(m_tank,4) && (pTarget->HasAura(FROST_FEVER,m_bot->GetGUID()) || pTarget->HasAura(BLOOD_PLAGUE,m_bot->GetGUID()) ) && CastSpell(BLOOD_BOIL,pTarget,false)) { return; } if (m_bot->getRace() == (uint8) RACE_TAUREN && pDist < 8 && CastSpell(R_WAR_STOMP, pTarget)) { return; } //no gcd but is cast if (isUnderAttack(m_tank,6) && CastSpell(ARMY_OF_THE_DEAD,m_bot)) { return; } if (isUnderAttack(m_tank,4) && CastSpell(SUMMON_GARGOYLE,pTarget)) { return; } //This should be somewhat different // Use standard damage spells if (CastSpell(HEART_STRIKE,pTarget,true,true)) { return; } if (CastSpell(BLOOD_STRIKE,pTarget)) { return; } if (TALENT_FROST && CastSpell(OBLITERATE,pTarget)) { return; } else if (TALENT_UNHOLY && CastSpell(SCOURGE_STRIKE,pTarget)) { return; } else if (CastSpell(DEATH_STRIKE,pTarget)) { return; } #pragma endregion } // end DoNextCombatManeuver