aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 484631d902d..6ae346f26de 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -3212,16 +3212,37 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float
// Use a detour raycast to get our first collision point
PathGenerator path(this);
path.CalculatePath(destx, desty, destz, false, true);
+
+ // We have a invalid path result. Skip further processing.
+ if (path.GetPathType() & ~(PATHFIND_NORMAL | PATHFIND_SHORTCUT | PATHFIND_INCOMPLETE | PATHFIND_FARFROMPOLY_END))
+ return;
+
G3D::Vector3 result = path.GetPath().back();
destx = result.x;
desty = result.y;
destz = result.z;
- UpdateAllowedPositionZ(destx, desty, destz);
+ // Object is using a shortcut. 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);
+
+ 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
- float halfHeight = GetCollisionHeight() * 0.5f;
bool col = GetMap()->getObjectHitPos(GetPhaseShift(),
pos.m_positionX, pos.m_positionY, pos.m_positionZ + halfHeight,
destx, desty, destz + halfHeight,