/* * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WarriorTriggers.h" #include "Playerbots.h" bool BloodrageBuffTrigger::IsActive() { return AI_VALUE2(uint8, "health", "self target") >= sPlayerbotAIConfig.mediumHealth && AI_VALUE2(uint8, "rage", "self target") < 20; } bool VigilanceTrigger::IsActive() { if (!bot->HasSpell(50720)) return false; Group* group = bot->GetGroup(); if (!group) return false; Player* currentVigilanceTarget = nullptr; Player* mainTank = nullptr; Player* assistTank1 = nullptr; Player* assistTank2 = nullptr; Player* highestGearScorePlayer = nullptr; uint32 highestGearScore = 0; for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) { Player* member = ref->GetSource(); if (!member || member == bot || !member->IsAlive()) continue; if (!currentVigilanceTarget && botAI->HasAura("vigilance", member, false, true)) currentVigilanceTarget = member; if (!mainTank && botAI->IsMainTank(member)) mainTank = member; else if (!assistTank1 && botAI->IsAssistTankOfIndex(member, 0)) assistTank1 = member; else if (!assistTank2 && botAI->IsAssistTankOfIndex(member, 1)) assistTank2 = member; uint32 gearScore = botAI->GetEquipGearScore(member); if (gearScore > highestGearScore) { highestGearScore = gearScore; highestGearScorePlayer = member; } } Player* highestPriorityTarget = mainTank ? mainTank : (assistTank1 ? assistTank1 : (assistTank2 ? assistTank2 : highestGearScorePlayer)); if (!currentVigilanceTarget || currentVigilanceTarget != highestPriorityTarget) return true; return false; } bool ShatteringThrowTrigger::IsActive() { if (!bot->HasSpell(64382) || bot->HasSpellCooldown(64382)) return false; GuidVector enemies = AI_VALUE(GuidVector, "possible targets"); for (ObjectGuid const& guid : enemies) { Unit* enemy = botAI->GetUnit(guid); if (!enemy || !enemy->IsAlive() || enemy->IsFriendlyTo(bot)) continue; if (bot->IsWithinDistInMap(enemy, 25.0f) && (enemy->HasAura(642) || // Divine Shield enemy->HasAura(45438) || // Ice Block enemy->HasAura(41450))) // Blessing of Protection { return true; } } return false; } bool BattleShoutTrigger::IsActive() { if (!BuffTrigger::IsActive()) return false; uint32 battleShoutSpellId = AI_VALUE2(uint32, "spell id", "battle shout"); if (!battleShoutSpellId) return false; SpellInfo const* bsInfo = sSpellMgr->GetSpellInfo(battleShoutSpellId); if (!bsInfo) return false; int32 bsApValue = 0; for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff) { if (bsInfo->Effects[eff].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER) { bsApValue = bsInfo->Effects[eff].BasePoints + 1; break; } } if (!bsApValue) return false; static const uint32 commandingPresenceSpells[] = { 12318, 12857, 12858, 12860, 12861 }; static const float commandingPresenceBonus[] = { 0.05f, 0.10f, 0.15f, 0.20f, 0.25f }; float cpBonus = 0.0f; for (int rank = 4; rank >= 0; --rank) { if (bot->HasAura(commandingPresenceSpells[rank])) { cpBonus = commandingPresenceBonus[rank]; break; } } int32 effectiveBsAp = int32(bsApValue * (1.0f + cpBonus)); static const char* blessingNames[] = { "blessing of might", "greater blessing of might", nullptr }; for (int i = 0; blessingNames[i] != nullptr; ++i) { Aura* bom = botAI->GetAura(blessingNames[i], bot); if (!bom) continue; SpellInfo const* bomInfo = bom->GetSpellInfo(); if (!bomInfo) continue; for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff) { if (bomInfo->Effects[eff].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER) { int32 bomApValue = bomInfo->Effects[eff].BasePoints + 1; if (bomApValue >= effectiveBsAp) return false; break; } } } return true; }