diff --git a/src/strategy/raids/icecrown/RaidIccActions.cpp b/src/strategy/raids/icecrown/RaidIccActions.cpp index fe8bad27..448908cf 100644 --- a/src/strategy/raids/icecrown/RaidIccActions.cpp +++ b/src/strategy/raids/icecrown/RaidIccActions.cpp @@ -37,7 +37,7 @@ bool IccLmTankPositionAction::Execute(Event event) bot->SetTarget(boss->GetGUID()); if (botAI->IsTank(bot) || botAI->IsMainTank(bot) || botAI->IsAssistTank(bot)) { - if (bot->GetExactDist2d(ICC_LM_TANK_POSITION) > 5.0f) + if (bot->GetExactDist2d(ICC_LM_TANK_POSITION) > 15.0f) return MoveTo(bot->GetMapId(), ICC_LM_TANK_POSITION.GetPositionX(), ICC_LM_TANK_POSITION.GetPositionY(), ICC_LM_TANK_POSITION.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_NORMAL); @@ -402,7 +402,11 @@ bool IccGunshipTeleportAllyAction::Execute(Event event) // Only target the mage that is channeling Below Zero if (!(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(69705))) - return false; + { + if (bot->GetExactDist2d(ICC_GUNSHIP_TELEPORT_ALLY2) > 45.0f) + return bot->TeleportTo(bot->GetMapId(), ICC_GUNSHIP_TELEPORT_ALLY2.GetPositionX(), + ICC_GUNSHIP_TELEPORT_ALLY2.GetPositionY(), ICC_GUNSHIP_TELEPORT_ALLY2.GetPositionZ(), bot->GetOrientation()); + } bot->SetTarget(boss->GetGUID()); // Check if the bot is targeting a valid boss before teleporting @@ -424,7 +428,11 @@ bool IccGunshipTeleportHordeAction::Execute(Event event) // Only target the sorcerer that is channeling Below Zero if (!(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(69705))) - return false; + { + if (bot->GetExactDist2d(ICC_GUNSHIP_TELEPORT_HORDE2) > 45.0f) + return bot->TeleportTo(bot->GetMapId(), ICC_GUNSHIP_TELEPORT_HORDE2.GetPositionX(), + ICC_GUNSHIP_TELEPORT_HORDE2.GetPositionY(), ICC_GUNSHIP_TELEPORT_HORDE2.GetPositionZ(), bot->GetOrientation()); + } bot->SetTarget(boss->GetGUID()); // Check if the bot is targeting a valid boss before teleporting @@ -991,6 +999,14 @@ bool IccPutricideGasCloudAction::Execute(Event event) if (!gasCloud) return false; + static ObjectGuid lastGasCloudGuid; + // If this is a new gas cloud, reset to position 2 + if (lastGasCloudGuid != gasCloud->GetGUID()) + { + lastGasCloudGuid = gasCloud->GetGUID(); + lastKnownPosition = 0; // This will make it go to position 2 + } + // Check if this bot has Gaseous Bloat bool botHasAura = botAI->HasAura("Gaseous Bloat", bot); @@ -1007,10 +1023,10 @@ bool IccPutricideGasCloudAction::Execute(Event event) const Position* nextPos = nullptr; // Determine current position - if (dist1 < 5.0f) currentPosition = 1; - else if (dist2 < 5.0f) currentPosition = 2; - else if (dist3 < 5.0f) currentPosition = 3; - else if (dist4 < 5.0f) currentPosition = 4; + if (dist1 < 8.0f) currentPosition = 1; + else if (dist2 < 8.0f) currentPosition = 2; + else if (dist3 < 8.0f) currentPosition = 3; + else if (dist4 < 8.0f) currentPosition = 4; // If we're at a new position, update last known position if (currentPosition != 0 && currentPosition != lastKnownPosition) @@ -1018,8 +1034,8 @@ bool IccPutricideGasCloudAction::Execute(Event event) lastKnownPosition = currentPosition; } - // If we haven't reached our last known position yet, don't start new movement - if (lastKnownPosition != 0 && lastKnownPosition != currentPosition) + // Only prevent movement if we're already moving and haven't reached the target yet + if (lastKnownPosition != 0 && lastKnownPosition != currentPosition && AI_VALUE(bool, "moving")) { return false; } @@ -1030,10 +1046,6 @@ bool IccPutricideGasCloudAction::Execute(Event event) switch(currentPosition) { case 0: // Not at any position - case 4: // At position 4, go to 1 - nextPos = &ICC_PUTRICIDE_GAS1_POSITION; - lastKnownPosition = 1; - break; case 1: nextPos = &ICC_PUTRICIDE_GAS2_POSITION; lastKnownPosition = 2; @@ -1046,13 +1058,31 @@ bool IccPutricideGasCloudAction::Execute(Event event) nextPos = &ICC_PUTRICIDE_GAS4_POSITION; lastKnownPosition = 4; break; + case 4: + nextPos = &ICC_PUTRICIDE_GAS1_POSITION; + lastKnownPosition = 1; + break; } if (nextPos) { + // Use PathGenerator to find a safe path to the target + PathGenerator path(bot); + path.CalculatePath(nextPos->GetPositionX(), nextPos->GetPositionY(), nextPos->GetPositionZ(), false); + + if (path.GetPathType() == PATHFIND_NORMAL || path.GetPathType() == PATHFIND_INCOMPLETE) + { + return MoveTo(bot->GetMapId(), nextPos->GetPositionX(), nextPos->GetPositionY(), nextPos->GetPositionZ(), + false, true, false, false, MovementPriority::MOVEMENT_FORCED); + } + else + { + // If no valid path found, try to move directly (old behavior) return MoveTo(bot->GetMapId(), nextPos->GetPositionX(), nextPos->GetPositionY(), nextPos->GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } + } + return false; } return false; } @@ -1083,13 +1113,13 @@ bool IccPutricideGasCloudAction::Execute(Event event) lastKnownPosition = 0; return Attack(gasCloud); } - // If no one has aura yet, everyone stays at position 1 + // If no one has aura yet, everyone stays at position 2 else if (!someoneHasAura) { lastKnownPosition = 0; - return MoveTo(bot->GetMapId(), ICC_PUTRICIDE_GAS1_POSITION.GetPositionX(), - ICC_PUTRICIDE_GAS1_POSITION.GetPositionY(), - ICC_PUTRICIDE_GAS1_POSITION.GetPositionZ(), + return MoveTo(bot->GetMapId(), ICC_PUTRICIDE_GAS2_POSITION.GetPositionX(), + ICC_PUTRICIDE_GAS2_POSITION.GetPositionY(), + ICC_PUTRICIDE_GAS2_POSITION.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_NORMAL); } } @@ -1190,29 +1220,102 @@ bool IccBpcNucleusAction::Execute(Event event) bool IccBpcMainTankAction::Execute(Event event) { - if (!botAI->IsMainTank(bot)) + if (botAI->IsMainTank(bot)) + { + // Move to MT position if we're not there + if (bot->GetExactDist2d(ICC_BPC_MT_POSITION) > 20.0f) + return MoveTo(bot->GetMapId(), ICC_BPC_MT_POSITION.GetPositionX(), + ICC_BPC_MT_POSITION.GetPositionY(), ICC_BPC_MT_POSITION.GetPositionZ(), + false, true, false, true, MovementPriority::MOVEMENT_COMBAT); + + Unit* valanar = AI_VALUE2(Unit*, "find target", "prince valanar"); + Unit* taldaram = AI_VALUE2(Unit*, "find target", "prince taldaram"); + Unit* currentTarget = AI_VALUE(Unit*, "current target"); + + // Keep current prince if we have one + if (currentTarget && (currentTarget == valanar || currentTarget == taldaram)) + return Attack(currentTarget); + + // Pick a new prince that isn't targeting us + if (valanar && (!valanar->GetVictim() || valanar->GetVictim() != bot)) + return Attack(valanar); + if (taldaram && (!taldaram->GetVictim() || taldaram->GetVictim() != bot)) + return Attack(taldaram); + return false; + } + + if (!botAI->IsTank(bot)) + { + Unit* currentTarget = AI_VALUE(Unit*, "current target"); + GuidVector targets = AI_VALUE(GuidVector, "possible targets"); - // Move to MT position if we're not there - if (bot->GetExactDist2d(ICC_BPC_MT_POSITION) > 20.0f) - return MoveTo(bot->GetMapId(), ICC_BPC_MT_POSITION.GetPositionX(), - ICC_BPC_MT_POSITION.GetPositionY(), ICC_BPC_MT_POSITION.GetPositionZ(), - false, true, false, true, MovementPriority::MOVEMENT_COMBAT); + // First check if skull-marked target is a valid empowered prince + Unit* skullTarget = nullptr; + if (Group* group = bot->GetGroup()) + { + if (ObjectGuid skullGuid = group->GetTargetIcon(7)) // 7 = skull + { + skullTarget = botAI->GetUnit(skullGuid); + if (skullTarget && skullTarget->IsAlive() && skullTarget->HasAura(71596) && + (skullTarget->GetEntry() == 37972 || // Keleseth + skullTarget->GetEntry() == 37973 || // Taldaram + skullTarget->GetEntry() == 37970)) // Valanar + { + return Attack(skullTarget); + } + } + } - Unit* valanar = AI_VALUE2(Unit*, "find target", "prince valanar"); - Unit* taldaram = AI_VALUE2(Unit*, "find target", "prince taldaram"); - Unit* currentTarget = AI_VALUE(Unit*, "current target"); + // If no valid skull target, search for empowered prince + Unit* empoweredPrince = nullptr; + for (auto i = targets.begin(); i != targets.end(); ++i) + { + Unit* unit = botAI->GetUnit(*i); + if (!unit || !unit->IsAlive()) + continue; - // Keep current prince if we have one - if (currentTarget && (currentTarget == valanar || currentTarget == taldaram)) - return Attack(currentTarget); + if (unit->HasAura(71596)) + { + if (unit->GetEntry() == 37972 || // Keleseth + unit->GetEntry() == 37973 || // Taldaram + unit->GetEntry() == 37970) // Valanar + { + empoweredPrince = unit; - // Pick a new prince - if (valanar) - return Attack(valanar); - if (taldaram) - return Attack(taldaram); + // Mark empowered prince with skull if in group + if (Group* group = bot->GetGroup()) + { + group->SetTargetIcon(7, bot->GetGUID(), unit->GetGUID()); // 7 = skull + } + break; + } + } + } + // Attack empowered prince if found and current target doesn't have aura + if (empoweredPrince) + { + // Only switch if current target doesn't have the aura + if (!currentTarget || !currentTarget->HasAura(71596)) + { + return Attack(empoweredPrince); + } + else + { + return Attack(currentTarget); + } + } + + // Keep current prince target if no empowered prince found + if (currentTarget && (currentTarget->GetEntry() == 37972 || // Keleseth + currentTarget->GetEntry() == 37973 || // Taldaram + currentTarget->GetEntry() == 37970)) // Valanar + { + return Attack(currentTarget); + } + + } return false; } @@ -1297,9 +1400,7 @@ bool IccBpcEmpoweredVortexAction::Execute(Event event) bool IccBqlTankPositionAction::Execute(Event event) { - // Only tanks should move to tank position - if (!(botAI->IsTank(bot) || botAI->IsMainTank(bot) || botAI->IsAssistTank(bot) || botAI->IsRanged(bot))) - return false; + Unit* boss = AI_VALUE2(Unit*, "find target", "blood-queen lana'thel"); // If tank is not at position, move there if (botAI->IsTank(bot) || botAI->IsMainTank(bot) || botAI->IsAssistTank(bot)) @@ -1313,9 +1414,10 @@ bool IccBqlTankPositionAction::Execute(Event event) float radius = 8.0f; float moveIncrement = 3.0f; bool isRanged = botAI->IsRanged(bot); + bool isMelee = botAI->IsMelee(bot); GuidVector members = AI_VALUE(GuidVector, "group members"); - if (isRanged && !(bot->HasAura(70877) || bot->HasAura(71474))) + if (isRanged && !(bot->HasAura(70877) || bot->HasAura(71474) && boss->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))) //frenzied bloodthrist { // Ranged: spread from other ranged for (auto& member : members) @@ -1332,7 +1434,23 @@ bool IccBqlTankPositionAction::Execute(Event event) } } } + if (isMelee && boss->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) // melee also spread + { + // Melee: spread from other melee + for (auto& member : members) + { + Unit* unit = botAI->GetUnit(member); + if (!unit || !unit->IsAlive() || unit == bot || unit->HasAura(70877) || unit->HasAura(71474)) + continue; + float dist = bot->GetExactDist2d(unit); + if (dist < radius) + { + float moveDistance = std::min(moveIncrement, radius - dist + 1.0f); + return MoveAway(unit, moveDistance); + } + } + } return false; // Everyone is in position } @@ -1619,11 +1737,11 @@ bool IccValithriaHealAction::Execute(Event event) switch (bot->getClass()) { case CLASS_SHAMAN: - return botAI->CastSpell(49276, valithria); // Lesser Healing Wave + return valithria->HasAura(61301) ? botAI->CastSpell(49273, valithria) : botAI->CastSpell(61301, valithria); // Cast Healing Wave if Riptide is up, otherwise cast Riptide case CLASS_PRIEST: - return botAI->CastSpell(48071, valithria); // Flash Heal + return valithria->HasAura(48068) ? botAI->CastSpell(48063, valithria) : botAI->CastSpell(48068, valithria); // Cast Greater Heal if Renew is up, otherwise cast Renew case CLASS_PALADIN: - return botAI->CastSpell(48782, valithria); // Holy Light + return valithria->HasAura(53563) ? botAI->CastSpell(48782, valithria) : botAI->CastSpell(53563, valithria); // Cast Holy Light if Beacon is up, otherwise cast Beacon of Light default: return false; } diff --git a/src/strategy/raids/icecrown/RaidIccActions.h b/src/strategy/raids/icecrown/RaidIccActions.h index a7a1fd2c..5a3be286 100644 --- a/src/strategy/raids/icecrown/RaidIccActions.h +++ b/src/strategy/raids/icecrown/RaidIccActions.h @@ -18,7 +18,9 @@ const Position ICC_LM_TANK_POSITION = Position(-391.0f, 2259.0f, 42.0f); const Position ICC_DARK_RECKONING_SAFE_POSITION = Position(-523.33386f, 2211.2031f, 62.823116f); const Position ICC_ROTTING_FROST_GIANT_TANK_POSITION = Position(-265.90125f, 2209.0605f, 199.97006f); const Position ICC_GUNSHIP_TELEPORT_ALLY = Position (-370.04645f, 1993.3536f, 466.65656f); -const Position ICC_GUNSHIP_TELEPORT_HORDE = Position (-449.5343f, 2477.2024f, 470.17648f); +const Position ICC_GUNSHIP_TELEPORT_ALLY2 = Position (-392.66208f, 2064.893f, 466.5672f, 5.058196f); +const Position ICC_GUNSHIP_TELEPORT_HORDE = Position (-449.5343f, 2477.2024f, 470.17648f); +const Position ICC_GUNSHIP_TELEPORT_HORDE2 = Position (-429.81586f, 2400.6804f, 471.56537f); const Position ICC_DBS_TANK_POSITION = Position(-494.26517f, 2211.549f, 541.11414f); const Position ICC_FESTERGUT_TANK_POSITION = Position(4269.1772f, 3144.7673f, 360.38577f); const Position ICC_FESTERGUT_RANGED_SPORE = Position(4261.143f, 3109.4146f, 360.38605f); diff --git a/src/strategy/raids/icecrown/RaidIccMultipliers.cpp b/src/strategy/raids/icecrown/RaidIccMultipliers.cpp index edf528d0..74695cc2 100644 --- a/src/strategy/raids/icecrown/RaidIccMultipliers.cpp +++ b/src/strategy/raids/icecrown/RaidIccMultipliers.cpp @@ -21,6 +21,15 @@ #include "WarriorActions.h" #include "PlayerbotAI.h" +//LK global variables +namespace { + uint32 g_lastPlagueTime = 0; + bool g_plagueAllowedToCure = false; + std::map g_plagueTimes; + std::map g_allowCure; + std::mutex g_plagueMutex; // Add mutex for thread safety +} + float IccLadyDeathwhisperMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "lady deathwhisper"); @@ -279,7 +288,7 @@ float IccAddsPutricideMultiplier::GetValue(Action* action) { if (dynamic_cast(action) || dynamic_cast(action)) return 2.0f; - else if (dynamic_cast(action) || dynamic_cast(action)) + else if (dynamic_cast(action) || dynamic_cast(action) || dynamic_cast(action)) return 0.0f; } } @@ -542,55 +551,56 @@ float IccLichKingNecroticPlagueMultiplier::GetValue(Action* action) // Handle cure actions if (dynamic_cast(action)) { - static std::map plagueTimes; - static std::map allowCure; - - Unit* target = action->GetTarget(); - if (!target || !target->IsPlayer()) - return 0.0f; + Group* group = bot->GetGroup(); + if (!group) + return 1.0f; + + // Check if any bot in the group has plague + bool anyBotHasPlague = false; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + if (Player* member = ref->GetSource()) + { + if (botAI->HasAura("Necrotic Plague", member)) + { + anyBotHasPlague = true; + break; + } + } + } - ObjectGuid targetGuid = target->GetGUID(); uint32 currentTime = getMSTime(); - // Check if target has plague - bool hasPlague = target->HasAura(70338) || target->HasAura(73785) || - target->HasAura(73786) || target->HasAura(73787) || - target->HasAura(70337) || target->HasAura(73912) || - target->HasAura(73913) || target->HasAura(73914); - - // If no plague, reset timers and block cure - if (!hasPlague) + // Reset state if no one has plague + if (!anyBotHasPlague) { - plagueTimes.erase(targetGuid); - allowCure.erase(targetGuid); + g_lastPlagueTime = 0; + g_plagueAllowedToCure = false; + return 1.0f; + } + + // Start timer if this is a new plague + if (g_lastPlagueTime == 0) + { + g_lastPlagueTime = currentTime; + g_plagueAllowedToCure = false; return 0.0f; } - // If we haven't seen this plague yet, start the timer - if (plagueTimes.find(targetGuid) == plagueTimes.end()) - { - plagueTimes[targetGuid] = currentTime; - allowCure[targetGuid] = false; - return 0.0f; - } - - // If we've already allowed cure for this plague instance, keep allowing it - if (allowCure[targetGuid]) + // Once we allow cure, keep allowing it until plague is gone + if (g_plagueAllowedToCure) { return 1.0f; } - // Check if enough time has passed - uint32 timeSincePlague = currentTime - plagueTimes[targetGuid]; - if (timeSincePlague >= 3000) + // Check if enough time has passed (3,5 seconds) + if (currentTime - g_lastPlagueTime >= 3500) { - allowCure[targetGuid] = true; + g_plagueAllowedToCure = true; return 1.0f; } - else - { - return 0.0f; - } + + return 0.0f; } return 1.0f; diff --git a/src/strategy/raids/icecrown/RaidIccStrategy.cpp b/src/strategy/raids/icecrown/RaidIccStrategy.cpp index a3a482b2..b3c566f9 100644 --- a/src/strategy/raids/icecrown/RaidIccStrategy.cpp +++ b/src/strategy/raids/icecrown/RaidIccStrategy.cpp @@ -92,26 +92,26 @@ void RaidIccStrategy::InitTriggers(std::vector& triggers) //BPC triggers.push_back(new TriggerNode("icc bpc keleseth tank", - NextAction::array(0, new NextAction("icc bpc keleseth tank", ACTION_EMERGENCY + 1), nullptr))); + NextAction::array(0, new NextAction("icc bpc keleseth tank", ACTION_RAID + 1), nullptr))); triggers.push_back(new TriggerNode("icc bpc nucleus", - NextAction::array(0, new NextAction("icc bpc nucleus", ACTION_EMERGENCY + 3), nullptr))); + NextAction::array(0, new NextAction("icc bpc nucleus", ACTION_RAID + 2), nullptr))); triggers.push_back(new TriggerNode("icc bpc main tank", - NextAction::array(0, new NextAction("icc bpc main tank", ACTION_EMERGENCY + 2), nullptr))); + NextAction::array(0, new NextAction("icc bpc main tank", ACTION_RAID + 4), nullptr))); triggers.push_back(new TriggerNode("icc bpc empowered vortex", - NextAction::array(0, new NextAction("icc bpc empowered vortex", ACTION_INTERRUPT), nullptr))); + NextAction::array(0, new NextAction("icc bpc empowered vortex", ACTION_RAID + 3), nullptr))); //BQL triggers.push_back(new TriggerNode("icc bql tank position", NextAction::array(0, new NextAction("icc bql tank position", ACTION_RAID), nullptr))); triggers.push_back(new TriggerNode("icc bql pact of darkfallen", - NextAction::array(0, new NextAction("icc bql pact of darkfallen", ACTION_EMERGENCY +1), nullptr))); + NextAction::array(0, new NextAction("icc bql pact of darkfallen", ACTION_RAID +1), nullptr))); triggers.push_back(new TriggerNode("icc bql vampiric bite", - NextAction::array(0, new NextAction("icc bql vampiric bite", ACTION_EMERGENCY + 5), nullptr))); + NextAction::array(0, new NextAction("icc bql vampiric bite", ACTION_RAID + 2), nullptr))); //VDW triggers.push_back(new TriggerNode("icc valkyre spear", diff --git a/src/strategy/raids/icecrown/RaidIccTriggers.cpp b/src/strategy/raids/icecrown/RaidIccTriggers.cpp index 01d03e58..1e89b804 100644 --- a/src/strategy/raids/icecrown/RaidIccTriggers.cpp +++ b/src/strategy/raids/icecrown/RaidIccTriggers.cpp @@ -370,6 +370,10 @@ bool IccPutricideMalleableGooTrigger::IsActive() //BPC bool IccBpcKelesethTankTrigger::IsActive() { + Unit* boss = AI_VALUE2(Unit*, "find target", "prince keleseth"); + if (!boss) + return false; + if (!botAI->IsAssistTank(bot)) return false; @@ -385,15 +389,15 @@ bool IccBpcKelesethTankTrigger::IsActive() } } - Unit* boss = AI_VALUE2(Unit*, "find target", "prince keleseth"); - if (!boss || boss->GetEntry() != 37972) // Verify it's actually Keleseth - return false; - return true; } bool IccBpcNucleusTrigger::IsActive() { + Unit* boss = AI_VALUE2(Unit*, "find target", "prince keleseth"); + if (!boss) + return false; + if (!botAI->IsAssistTank(bot)) return false; @@ -414,13 +418,11 @@ bool IccBpcNucleusTrigger::IsActive() bool IccBpcMainTankTrigger::IsActive() { - if (!botAI->IsMainTank(bot)) - return false; - Unit* valanar = AI_VALUE2(Unit*, "find target", "prince valanar"); Unit* taldaram = AI_VALUE2(Unit*, "find target", "prince taldaram"); - - return valanar != nullptr || taldaram != nullptr; + Unit* keleseth = AI_VALUE2(Unit*, "find target", "prince keleseth"); + + return valanar != nullptr || taldaram != nullptr || keleseth != nullptr; } bool IccBpcEmpoweredVortexTrigger::IsActive() @@ -435,12 +437,10 @@ bool IccBpcEmpoweredVortexTrigger::IsActive() // For ranged, spread whenever Valanar is empowered if (botAI->IsRanged(bot)) - return valanar->HasAura(70952); // Invocation of Blood + return valanar->HasAura(71596); // Invocation of Blood // For melee, only spread during vortex cast - if (valanar->HasAura(70952) && // Invocation of Blood - valanar->GetCurrentSpell(CURRENT_GENERIC_SPELL) && - valanar->GetCurrentSpell(CURRENT_GENERIC_SPELL)->m_spellInfo->Id == 72039) + if (valanar->HasAura(71596) && valanar->HasUnitState(UNIT_STATE_CASTING) && valanar->FindCurrentSpellBySpellId(72039)) { return true; } @@ -452,7 +452,7 @@ bool IccBpcEmpoweredVortexTrigger::IsActive() bool IccBqlTankPositionTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "blood-queen lana'thel"); - if (!boss || !(botAI->IsTank(bot) || botAI->IsMainTank(bot) || botAI->IsAssistTank(bot) || botAI->IsRanged(bot))) + if (!boss) return false; return true;