diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index 149773a7..ea460bc1 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -827,15 +827,21 @@ bool MovementAction::ReachCombatTo(Unit* target, float distance) ty = target->GetPositionY(); tz = target->GetPositionZ(); } + // Prediction may cause this, which makes ShortenPathUntilDist fail + if (bot->GetExactDist(tx, ty, tz) <= distance) + { + tx = target->GetPositionX(); + ty = target->GetPositionY(); + tz = target->GetPositionZ(); + } } if (bot->GetExactDist(tx, ty, tz) <= distance) - { return false; - } PathGenerator path(bot); path.CalculatePath(tx, ty, tz, false); PathType type = path.GetPathType(); - if (type != PATHFIND_NORMAL && type != PATHFIND_INCOMPLETE) + int typeOk = PATHFIND_NORMAL | PATHFIND_INCOMPLETE; + if (!(type & typeOk)) return false; path.ShortenPathUntilDist(G3D::Vector3(tx, ty, tz), distance); G3D::Vector3 endPos = path.GetPath().back(); @@ -881,7 +887,7 @@ bool MovementAction::IsMovingAllowed(Unit* target) bool MovementAction::IsMovingAllowed(uint32 mapId, float x, float y, float z) { - // removed sqrt as means distance limit was effectively 22500 (ReactDistance²) + // removed sqrt as means distance limit was effectively 22500 (ReactDistance�) // leaving it commented incase we find ReactDistance limit causes problems // float distance = sqrt(bot->GetDistance(x, y, z)); float distance = bot->GetDistance(x, y, z); @@ -2351,10 +2357,15 @@ bool MoveRandomAction::Execute(Event event) float angle = (float)rand_norm() * static_cast(M_PI); x += urand(0, distance) * cos(angle); y += urand(0, distance) * sin(angle); + float ox = x; + float oy = y; + float oz = z; if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), x, y, z)) { - continue; + x = ox; + y = oy; + z = oz; } if (map->IsInWater(bot->GetPhaseMask(), x, y, z, bot->GetCollisionHeight())) continue; diff --git a/src/strategy/values/Arrow.cpp b/src/strategy/values/Arrow.cpp index a981eade..f52dc670 100644 --- a/src/strategy/values/Arrow.cpp +++ b/src/strategy/values/Arrow.cpp @@ -47,11 +47,14 @@ WorldLocation ArrowFormation::GetLocationInternal() float x = master->GetPositionX() - masterUnit->GetX() + botUnit->GetX(); float y = master->GetPositionY() - masterUnit->GetY() + botUnit->GetY(); float z = master->GetPositionZ(); - if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), x, y, z)) - return Formation::NullLocation; - // master->UpdateGroundPositionZ(x, y, z); + { + x = master->GetPositionX() - masterUnit->GetX() + botUnit->GetX(); + y = master->GetPositionY() - masterUnit->GetY() + botUnit->GetY(); + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(master->GetMapId(), x, y, z); } diff --git a/src/strategy/values/Formations.cpp b/src/strategy/values/Formations.cpp index 9418b441..61ec1b3d 100644 --- a/src/strategy/values/Formations.cpp +++ b/src/strategy/values/Formations.cpp @@ -7,6 +7,7 @@ #include "Arrow.h" #include "Event.h" +#include "Map.h" #include "Playerbots.h" #include "ServerFacade.h" @@ -88,10 +89,14 @@ public: float x = master->GetPositionX() + cos(angle) * range; float y = master->GetPositionY() + sin(angle) * range; float z = master->GetPositionZ(); - if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z)) - return Formation::NullLocation; + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range; + y = master->GetPositionY() + sin(angle) * range; + z = master->GetPositionZ() + master->GetHoverHeight(); + master->UpdateAllowedPositionZ(x, y, z); + } return WorldLocation(master->GetMapId(), x, y, z); } @@ -134,9 +139,15 @@ public: float x = master->GetPositionX() + cos(angle) * range + dx; float y = master->GetPositionY() + sin(angle) * range + dy; float z = master->GetPositionZ(); - if (!master->GetMap()->CheckCollisionAndGetValidCoords( - master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), x, y, z)) - return Formation::NullLocation; + z = bot->GetMapHeight(x, y, z + 5.0f); + if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + dx; + y = master->GetPositionY() + sin(angle) * range + dy; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } // bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), // bot->GetPositionZ(), x, y, z); return WorldLocation(master->GetMapId(), x, y, z); @@ -145,9 +156,15 @@ public: float x = master->GetPositionX() + cos(angle) * range + dx; float y = master->GetPositionY() + sin(angle) * range + dy; float z = master->GetPositionZ(); + z = bot->GetMapHeight(x, y, z + 5.0f); if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z)) - return Formation::NullLocation; + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + dx; + y = master->GetPositionY() + sin(angle) * range + dy; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(master->GetMapId(), x, y, z); } @@ -200,9 +217,13 @@ public: float y = target->GetPositionY() + sin(angle) * range; float z = target->GetPositionZ(); if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z)) - return Formation::NullLocation; - + master->GetPositionZ(), x, y, z)) + { + x = target->GetPositionX() + cos(angle) * range; + y = target->GetPositionY() + sin(angle) * range; + z = target->GetPositionZ() + target->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(bot->GetMapId(), x, y, z); } }; @@ -362,9 +383,14 @@ public: if (minDist) { - if (!master->GetMap()->CheckCollisionAndGetValidCoords( - master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), x, y, z)) - return Formation::NullLocation; + if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + cos(followAngle) * followRange; + y = master->GetPositionY() + sin(angle) * range + sin(followAngle) * followRange; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(bot->GetMapId(), minX, minY, z); } @@ -372,8 +398,13 @@ public: } if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z)) - return Formation::NullLocation; + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + cos(followAngle) * followRange; + y = master->GetPositionY() + sin(angle) * range + sin(followAngle) * followRange; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(bot->GetMapId(), x, y, z); } }; @@ -636,7 +667,11 @@ WorldLocation MoveFormation::MoveSingleLine(std::vector line, float dif Player* master = botAI->GetMaster(); if (!master->GetMap()->CheckCollisionAndGetValidCoords( master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), lx, ly, lz)) - return Formation::NullLocation; + { + lx = x + cos(angle) * radius; + ly = y + sin(angle) * radius; + lz = cz; + } return WorldLocation(bot->GetMapId(), lx, ly, lz); }