diff options
author | Ovahlord <dreadkiller@gmx.de> | 2020-05-02 00:06:34 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-01-01 23:49:31 +0100 |
commit | b8e1de0f929598c2ebb8da2ee3de99f91be43d14 (patch) | |
tree | 858acc8242a421e1ede28ae4a35550a22f67fec7 | |
parent | 6d94bc2f4b23c51a69213a46b28a5e97aa99f5d5 (diff) |
Core/Objects: use the static vmap check in MovePositionToFirstCollision for all path results to avoid falling below wmo surfaces when the mmap path returns unreliable data
(cherry picked from commit a548d9f9b021a54cfc9013b7e104ccf524e88358)
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 6ae346f26de..5e24ce2d606 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -3222,28 +3222,25 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float desty = result.y; destz = result.z; - // Object is using a shortcut. Check static LOS + // check static LOS float halfHeight = GetCollisionHeight() * 0.5f; - if (path.GetPathType() & PATHFIND_SHORTCUT) - { - bool 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); + bool 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; + 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)); - } + // 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 - bool col = GetMap()->getObjectHitPos(GetPhaseShift(), + col = GetMap()->getObjectHitPos(GetPhaseShift(), pos.m_positionX, pos.m_positionY, pos.m_positionZ + halfHeight, destx, desty, destz + halfHeight, destx, desty, destz, -0.5f); |