aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp38
-rw-r--r--src/server/game/Movement/PathGenerator.cpp4
2 files changed, 23 insertions, 19 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 0026d42a968..0780bc85a38 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -3214,9 +3214,10 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float
path.SetUseRaycast(true);
path.CalculatePath(destx, desty, destz, false);
- // We have a invalid path result. Skip further processing.
- if (path.GetPathType() & ~(PATHFIND_NORMAL | PATHFIND_SHORTCUT | PATHFIND_INCOMPLETE | PATHFIND_FARFROMPOLY_END | PATHFIND_NOT_USING_PATH))
- return;
+ // Check for valid path types before we proceed
+ if (!(path.GetPathType() & PATHFIND_NOT_USING_PATH))
+ if (path.GetPathType() & ~(PATHFIND_NORMAL | PATHFIND_SHORTCUT | PATHFIND_INCOMPLETE | PATHFIND_FARFROMPOLY_END))
+ return;
G3D::Vector3 result = path.GetPath().back();
destx = result.x;
@@ -3225,23 +3226,26 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float
// check static LOS
float halfHeight = GetCollisionHeight() * 0.5f;
- bool col;
- /*
- col = VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(PhasingHandler::GetTerrainMapId(GetPhaseShift(), GetMap(), pos.m_positionX, pos.m_positionY),
- pos.m_positionX, pos.m_positionY, pos.m_positionZ + halfHeight,
- destx, desty, destz + halfHeight,
- destx, desty, destz, -0.5f);
-
- destz -= halfHeight;
+ bool col = false;
- // Collided with static LOS object, move back to collision point
- if (col)
+ // Unit is flying, check for potential collision via vmaps
+ if (path.GetPathType() & PATHFIND_NOT_USING_PATH)
{
- destx -= CONTACT_DISTANCE * std::cos(angle);
- desty -= CONTACT_DISTANCE * std::sin(angle);
- dist = std::sqrt((pos.m_positionX - destx) * (pos.m_positionX - destx) + (pos.m_positionY - desty) * (pos.m_positionY - desty));
+ col = VMAP::VMapFactory::createOrGetVMapManager()->getObjectHitPos(PhasingHandler::GetTerrainMapId(GetPhaseShift(), GetMap(), pos.m_positionX, pos.m_positionY),
+ pos.m_positionX, pos.m_positionY, pos.m_positionZ + halfHeight,
+ destx, desty, destz + halfHeight,
+ destx, desty, destz, -0.5f);
+
+ destz -= halfHeight;
+
+ // Collided with static LOS object, move back to collision point
+ if (col)
+ {
+ destx -= CONTACT_DISTANCE * std::cos(angle);
+ desty -= CONTACT_DISTANCE * std::sin(angle);
+ dist = std::sqrt((pos.m_positionX - destx) * (pos.m_positionX - destx) + (pos.m_positionY - desty) * (pos.m_positionY - desty));
+ }
}
- */
// check dynamic collision
col = GetMap()->getObjectHitPos(GetPhaseShift(),
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index 77d59afdbad..0effe2a5d87 100644
--- a/src/server/game/Movement/PathGenerator.cpp
+++ b/src/server/game/Movement/PathGenerator.cpp
@@ -179,7 +179,7 @@ void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 con
{
TC_LOG_DEBUG("maps.mmaps", "++ BuildPolyPath :: (startPoly == 0 || endPoly == 0)");
BuildShortcut();
- bool path = _source->GetTypeId() == TYPEID_UNIT && _source->ToCreature()->CanFly();
+ bool path = _source->GetTypeId() == TYPEID_UNIT && _source->ToCreature()->IsFlying();
bool waterPath = _source->GetTypeId() == TYPEID_UNIT && _source->ToCreature()->CanSwim();
if (waterPath)
@@ -233,7 +233,7 @@ void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 con
TC_LOG_DEBUG("maps.mmaps", "++ BuildPolyPath :: flying case");
if (Unit const* _sourceUnit = _source->ToUnit())
{
- if (_sourceUnit->CanFly())
+ if (_sourceUnit->IsFlying())
buildShotrcut = true;
// Allow to build a shortcut if the unit is falling and it's trying to move downwards towards a target (i.e. charging)
else if (_sourceUnit->IsFalling() && endPos.z < startPos.z)