bot will no longer mount to reach target within 21 units (as this is the distance at which the time taken to cast mount spell is more than the time saved by moving faster), warrior bot will now dismount with enough distance to perform charge (rather than right infront of target which real warrior wouldnt do)

This commit is contained in:
Fuzz
2024-08-20 16:32:08 +10:00
parent bb34a09afe
commit 87cbaa9527

View File

@@ -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;