aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorclick <clickvd@gonnamakeyou.com>2012-03-30 18:14:58 -0700
committerclick <clickvd@gonnamakeyou.com>2012-03-30 18:14:58 -0700
commit280f88db6b291c6d1065d0d3cfb4d7678be1c7dd (patch)
tree0bd297aeba8cbc1552e7a06aa5000555b3655495 /src
parentb2924379894d26528d360e6c5eba401428f9a285 (diff)
parent51e3a687d5be8b2b7a86c4ec7a698e85c707d8b9 (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-xsrc/server/game/Entities/Object/Object.cpp38
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);