diff options
author | click <clickvd@gonnamakeyou.com> | 2012-03-30 18:14:58 -0700 |
---|---|---|
committer | click <clickvd@gonnamakeyou.com> | 2012-03-30 18:14:58 -0700 |
commit | 280f88db6b291c6d1065d0d3cfb4d7678be1c7dd (patch) | |
tree | 0bd297aeba8cbc1552e7a06aa5000555b3655495 /src | |
parent | b2924379894d26528d360e6c5eba401428f9a285 (diff) | |
parent | 51e3a687d5be8b2b7a86c4ec7a698e85c707d8b9 (diff) |
Merge pull request #5649 from Elron103/pull-requests2
Core/Movement: Fix random position finding near edges, avoid big z-coordinate differences
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Object/Object.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index eef0e51392c..69effaa016e 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2692,8 +2692,42 @@ void WorldObject::GetNearPoint(WorldObject const* /*searcher*/, float &x, float void WorldObject::MovePosition(Position &pos, float dist, float angle) { angle += m_orientation; - pos.m_positionX += dist * cos(angle); - pos.m_positionY += dist * sin(angle); + float destx, desty, destz, ground, floor; + destx = pos.m_positionX + dist * cos(angle); + desty = pos.m_positionY + dist * sin(angle); + + // Prevent invalid coordinates here, position is unchanged + if (!Trinity::IsValidMapCoord(destx, desty)) + { + sLog->outCrash("WorldObject::MovePosition invalid coordinates X: %f and Y: %f were passed!", destx, desty); + return; + } + + ground = GetMap()->GetHeight(GetPhaseMask(), destx, desty, MAX_HEIGHT, true); + floor = GetMap()->GetHeight(GetPhaseMask(), destx, desty, pos.m_positionZ, true); + destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; + + float step = dist/10.0f; + + for (uint8 j = 0; j < 10; ++j) + { + // do not allow too big z changes + if (fabs(pos.m_positionZ - destz) > 6) + { + destx -= step * cos(angle); + desty -= step * sin(angle); + ground = GetMap()->GetHeight(GetPhaseMask(), destx, desty, MAX_HEIGHT, true); + floor = GetMap()->GetHeight(GetPhaseMask(), destx, desty, pos.m_positionZ, true); + destz = fabs(ground - pos.m_positionZ) <= fabs(floor - pos.m_positionZ) ? ground : floor; + } + // we have correct destz now + else + { + pos.Relocate(destx, desty, destz); + break; + } + } + Trinity::NormalizeMapCoord(pos.m_positionX); Trinity::NormalizeMapCoord(pos.m_positionY); UpdateGroundPositionZ(pos.m_positionX, pos.m_positionY, pos.m_positionZ); |