/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it * and/or modify it under version 2 of the License, or (at your option), any later version. */ #include "WarriorActions.h" #include "Playerbots.h" bool CastSunderArmorAction::isUseful() { Aura* aura = botAI->GetAura("sunder armor", GetTarget(), false, true); return !aura || aura->GetStackAmount() < 5 || aura->GetDuration() <= 6000; } Value* CastVigilanceAction::GetTargetValue() { Group* group = bot->GetGroup(); if (!group) { return new ManualSetValue(botAI, nullptr); } Player* currentVigilanceTarget = nullptr; Player* mainTank = nullptr; Player* assistTank1 = nullptr; Player* assistTank2 = nullptr; Player* highestGearScorePlayer = nullptr; uint32 highestGearScore = 0; // Iterate once through the group to gather all necessary information for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) { Player* member = ref->GetSource(); if (!member || member == bot || !member->IsAlive()) continue; // Check if member has Vigilance applied by the bot if (!currentVigilanceTarget && botAI->HasAura("vigilance", member, false, true)) { currentVigilanceTarget = member; } // Identify Main Tank if (!mainTank && botAI->IsMainTank(member)) { mainTank = member; } // Identify Assist Tanks if (assistTank1 == nullptr && botAI->IsAssistTankOfIndex(member, 0)) { assistTank1 = member; } else if (assistTank2 == nullptr && botAI->IsAssistTankOfIndex(member, 1)) { assistTank2 = member; } // Determine Highest Gear Score uint32 gearScore = botAI->GetEquipGearScore(member, false, false); if (gearScore > highestGearScore) { highestGearScore = gearScore; highestGearScorePlayer = member; } } // Determine the highest-priority target Player* highestPriorityTarget = mainTank ? mainTank : (assistTank1 ? assistTank1 : (assistTank2 ? assistTank2 : highestGearScorePlayer)); // If no valid target, return nullptr if (!highestPriorityTarget) { return new ManualSetValue(botAI, nullptr); } // If the current target is already the highest-priority target, do nothing if (currentVigilanceTarget == highestPriorityTarget) { return new ManualSetValue(botAI, nullptr); } // Assign the new target Unit* targetUnit = highestPriorityTarget->ToUnit(); if (targetUnit) { return new ManualSetValue(botAI, targetUnit); } return new ManualSetValue(botAI, nullptr); } bool CastVigilanceAction::Execute(Event event) { Unit* target = GetTarget(); if (!target || target == bot) return false; return botAI->CastSpell("vigilance", target); }