aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2020-05-16 17:40:08 +0200
committerShauren <shauren.trinity@gmail.com>2022-01-04 15:33:04 +0100
commit0c15b2ac7cd8f57004b009a99ec357ef2eefecb3 (patch)
treefb2324b88d891e5c5faf5c214ab3ff0a5ffed9c4 /src/server/game/Entities/Object
parent98272944eef1d710665223df4e16978876e8f9f3 (diff)
Core/Objects: fixed destination calculation for destination based spells casted by flying units
* Additionally he PathGenerator will now check for realtime movement flags instead of creature based template data only so scripted flying movement and players will now correctly get their path calculated (cherry picked from commit fdcb7388a64bf61a691535933a9fbae0504b80cc)
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp38
1 files changed, 21 insertions, 17 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(),