diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 249b065f..ce223d16 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -15,48 +15,49 @@ bool CheckMountStateAction::Execute(Event event) { - bool noattackers = - AI_VALUE2(bool, "combat", "self target") ? (AI_VALUE(uint8, "attacker count") > 0 ? false : true) : true; + bool noattackers = !AI_VALUE2(bool, "combat", "self target") || !AI_VALUE(uint8, "attacker count"); bool enemy = AI_VALUE(Unit*, "enemy player target"); bool dps = AI_VALUE(Unit*, "dps target"); bool shouldDismount = false; bool shouldMount = false; - // bool chasedistance = false; - float attack_distance; - float mount_distance; - if (PlayerbotAI::IsMelee(bot)) - { - attack_distance = sPlayerbotAIConfig->meleeDistance + 2.0f; - mount_distance = sPlayerbotAIConfig->meleeDistance + 10.0f; - } - else - { - attack_distance = sPlayerbotAIConfig->spellDistance + 2.0f; - mount_distance = sPlayerbotAIConfig->spellDistance + 10.0f; - } - Unit* currentTarget = AI_VALUE(Unit*, "current target"); - - if (currentTarget) + if (Unit* currentTarget = AI_VALUE(Unit*, "current target")) { + float dismount_distance; + float mount_distance; + if (PlayerbotAI::IsMelee(bot)) + { + dismount_distance = sPlayerbotAIConfig->meleeDistance + 2.0f; + mount_distance = sPlayerbotAIConfig->meleeDistance + 10.0f; + } + else + { + dismount_distance = sPlayerbotAIConfig->spellDistance + 2.0f; + mount_distance = sPlayerbotAIConfig->spellDistance + 10.0f; + } + + // warrior bots should dismount far enough to charge (because its important for generating some initial rage), + // a real player would be riding toward enemy mashing the charge key but the bots wont cast charge while mounted + if (CLASS_WARRIOR == bot->getClass()) + dismount_distance = std::max(18.0f, dismount_distance); + + // mount_distance should be >= 21 regardless of class, because when travelling a distance < 21 it takes longer + // to cast mount-spell than the time saved from the speed increase. At a distance of 21 both approaches take 3 + // seconds: + // 21 / 7 = 21 / 14 + 1.5 = 3 (7 = dismounted speed 14 = epic-mount speed 1.5 = mount-spell cast time) + mount_distance = std::max(21.0f, mount_distance); + float combatReach = bot->GetCombatReach() + currentTarget->GetCombatReach(); - attack_distance += combatReach; float disToTarget = bot->GetExactDist(currentTarget); - shouldDismount = disToTarget <= attack_distance; + shouldDismount = disToTarget <= dismount_distance + combatReach; + shouldMount = disToTarget > mount_distance + combatReach; } else + { shouldDismount = false; - - if (currentTarget) - { - float combatReach = bot->GetCombatReach() + currentTarget->GetCombatReach(); - mount_distance += combatReach; - float disToTarget = bot->GetExactDist(currentTarget); - shouldMount = disToTarget > mount_distance; - } - else shouldMount = true; - + } + if (bot->IsMounted() && shouldDismount) { WorldPacket emptyPacket;