diff --git a/src/strategy/actions/AttackAction.cpp b/src/strategy/actions/AttackAction.cpp index 1ba9f4b5..344138d6 100644 --- a/src/strategy/actions/AttackAction.cpp +++ b/src/strategy/actions/AttackAction.cpp @@ -95,11 +95,11 @@ bool AttackAction::Attack(Unit* target, bool with_pet /*true*/) return false; } - if (bot->IsMounted() && bot->IsWithinLOSInMap(target)) - { - WorldPacket emptyPacket; - bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket); - } + // if (bot->IsMounted() && bot->IsWithinLOSInMap(target)) + // { + // WorldPacket emptyPacket; + // bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket); + // } ObjectGuid guid = target->GetGUID(); bot->SetSelection(target->GetGUID()); diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 6e4e84d1..09a4e208 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -5,6 +5,7 @@ #include "CheckMountStateAction.h" #include "BattlegroundWS.h" #include "Event.h" +#include "PlayerbotAI.h" #include "Playerbots.h" #include "ServerFacade.h" #include "SpellAuraEffects.h" @@ -20,18 +21,11 @@ bool CheckMountStateAction::Execute(Event event) bool attackdistance = false; bool chasedistance = false; float attack_distance = 35.0f; - - switch (bot->getClass()) - { - case CLASS_WARRIOR: - case CLASS_PALADIN: - attack_distance = 10.0f; - break; - case CLASS_ROGUE: - attack_distance = 40.0f; - break; + if (PlayerbotAI::IsMelee(bot)) { + attack_distance = 10.0f; + } else { + attack_distance = 40.0f; } - if (enemy) attack_distance /= 2; @@ -41,6 +35,12 @@ bool CheckMountStateAction::Execute(Event event) chasedistance = enemy && sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", "enemy player target"), 45.0f) && AI_VALUE2(bool, "moving", "enemy player target"); } + if (bot->IsMounted() && attackdistance) { + WorldPacket emptyPacket; + bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket); + return true; + } + Player* master = GetMaster(); if (master != nullptr && !bot->InBattleground()) { @@ -48,7 +48,7 @@ bool CheckMountStateAction::Execute(Event event) return false; // bool farFromMaster = sServerFacade->GetDistance2d(bot, master) > sPlayerbotAIConfig->sightDistance; - if (master->IsMounted() && !bot->IsMounted() && noattackers) + if (master->IsMounted() && !bot->IsMounted() && noattackers && !attackdistance && !bot->IsInCombat() && botAI->GetState() != BOT_STATE_COMBAT) { return Mount(); } @@ -72,6 +72,13 @@ bool CheckMountStateAction::Execute(Event event) return false; } + // For random bots + if (!bot->InBattleground() && !master) { + if (!bot->IsMounted() && noattackers && !attackdistance && !bot->IsInCombat()) { + return Mount(); + } + } + if (bot->InBattleground() && !attackdistance && (noattackers || fartarget) && !bot->IsInCombat() && !bot->IsMounted()) { if (bot->GetBattlegroundTypeId() == BATTLEGROUND_WS) @@ -269,8 +276,8 @@ bool CheckMountStateAction::Mount() if (index >= ids.size()) continue; - botAI->CastSpell(ids[index], bot); - return true; + + return botAI->CastSpell(ids[index], bot);; } std::vector items = AI_VALUE2(std::vector, "inventory items", "mount");