Last active
January 1, 2019 14:18
-
-
Save Langerz82/e35f37c279c2ca455e9941a6a72752a4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp | |
index a9a9c78c0b..1dd69d093f 100644 | |
--- a/src/server/game/Entities/Object/Object.cpp | |
+++ b/src/server/game/Entities/Object/Object.cpp | |
@@ -1434,7 +1434,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const | |
if (canSwim) | |
max_z = GetMapWaterOrGroundLevel(x, y, z, &ground_z); | |
else | |
- max_z = ground_z = GetMapHeight(x, y, z); | |
+ max_z = ground_z = GetMapHeight(x, y, z, true, DEFAULT_HEIGHT_SEARCH, GetDistance2d(x, y)/2.0f); | |
if (max_z > INVALID_HEIGHT) | |
{ | |
@@ -3126,6 +3126,7 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y, | |
GetNearPoint2D(searcher, x, y, distance2d, absAngle + angle); | |
z = GetPositionZ(); | |
(searcher ? searcher : this)->UpdateAllowedPositionZ(x, y, z); | |
+ | |
if (IsWithinLOS(x, y, z)) | |
return; | |
} | |
@@ -3472,12 +3473,12 @@ float WorldObject::GetMapWaterOrGroundLevel(float x, float y, float z, float* gr | |
GetCollisionHeight()); | |
} | |
-float WorldObject::GetMapHeight(float x, float y, float z, bool vmap/* = true*/, float distanceToSearch/* = DEFAULT_HEIGHT_SEARCH*/) const | |
+float WorldObject::GetMapHeight(float x, float y, float z, bool vmap/* = true*/, float distanceToSearch/* = DEFAULT_HEIGHT_SEARCH*/, float tolerance) const | |
{ | |
if (z != MAX_HEIGHT) | |
z += GetCollisionHeight(); | |
- return GetMap()->GetHeight(GetPhaseMask(), x, y, z, vmap, distanceToSearch); | |
+ return GetMap()->GetHeight(GetPhaseMask(), x, y, z, vmap, distanceToSearch, tolerance); | |
} | |
std::string WorldObject::GetDebugInfo() const | |
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h | |
index 76824c2719..88e6f98649 100644 | |
--- a/src/server/game/Entities/Object/Object.h | |
+++ b/src/server/game/Entities/Object/Object.h | |
@@ -508,7 +508,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation | |
virtual float GetCollisionHeight() const { return 0.0f; } | |
float GetMapWaterOrGroundLevel(float x, float y, float z, float* ground = nullptr) const; | |
- float GetMapHeight(float x, float y, float z, bool vmap = true, float distanceToSearch = 50.0f) const; // DEFAULT_HEIGHT_SEARCH in map.h | |
+ float GetMapHeight(float x, float y, float z, bool vmap = true, float distanceToSearch = 50.0f, float tolerance = 0.0f) const; // DEFAULT_HEIGHT_SEARCH in map.h | |
std::string GetDebugInfo() const override; | |
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp | |
index 46e2479e5d..5138ed3718 100644 | |
--- a/src/server/game/Maps/Map.cpp | |
+++ b/src/server/game/Maps/Map.cpp | |
@@ -2441,14 +2441,15 @@ float Map::GetWaterOrGroundLevel(uint32 phasemask, float x, float y, float z, fl | |
return VMAP_INVALID_HEIGHT_VALUE; | |
} | |
-float Map::GetHeight(float x, float y, float z, bool checkVMap /*= true*/, float maxSearchDist /*= DEFAULT_HEIGHT_SEARCH*/) const | |
+ | |
+float Map::GetHeight(float x, float y, float z, bool checkVMap /*= true*/, float maxSearchDist /*= DEFAULT_HEIGHT_SEARCH*/, float tolerance) const | |
{ | |
// find raw .map surface under Z coordinates | |
float mapHeight = VMAP_INVALID_HEIGHT_VALUE; | |
if (GridMap* gmap = const_cast<Map*>(this)->GetGrid(x, y)) | |
{ | |
float gridHeight = gmap->getHeight(x, y); | |
- if (G3D::fuzzyGe(z, gridHeight - GROUND_HEIGHT_TOLERANCE)) | |
+ if (G3D::fuzzyGe(z, gridHeight - GROUND_HEIGHT_TOLERANCE - tolerance)) | |
mapHeight = gridHeight; | |
} | |
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h | |
index ceff28fc9b..f537834ae8 100644 | |
--- a/src/server/game/Maps/Map.h | |
+++ b/src/server/game/Maps/Map.h | |
@@ -541,10 +541,15 @@ class TC_GAME_API Map : public GridRefManager<NGridType> | |
float GetWaterOrGroundLevel(uint32 phasemask, float x, float y, float z, float* ground = nullptr, bool swim = false, float collisionHeight = 2.03128f) const; // DEFAULT_COLLISION_HEIGHT in Object.h | |
float GetMinHeight(float x, float y) const; | |
- float GetHeight(float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const; | |
+ float GetHeight(float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const | |
+ { | |
+ return GetHeight(x, y, z, checkVMap /*= true*/, maxSearchDist /*= DEFAULT_HEIGHT_SEARCH*/, 0.0f); | |
+ }; | |
+ float GetHeight(float x, float y, float z, bool checkVMap /*= true*/, float maxSearchDist /*= DEFAULT_HEIGHT_SEARCH*/, float tolerance) const; | |
+ | |
float GetHeight(Position const& pos, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const { return GetHeight(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), vmap, maxSearchDist); } | |
- float GetHeight(uint32 phasemask, float x, float y, float z, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const { return std::max<float>(GetHeight(x, y, z, vmap, maxSearchDist), GetGameObjectFloor(phasemask, x, y, z, maxSearchDist)); } | |
- float GetHeight(uint32 phasemask, Position const& pos, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const { return GetHeight(phasemask, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), vmap, maxSearchDist); } | |
+ float GetHeight(uint32 phasemask, float x, float y, float z, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH, float tolerance = 0.0f) const { return std::max<float>(GetHeight(x, y, z, vmap, maxSearchDist, tolerance), GetGameObjectFloor(phasemask, x, y, z, maxSearchDist)); } | |
+ float GetHeight(uint32 phasemask, Position const& pos, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH, float tolerance = 0.0f) const { return GetHeight(phasemask, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), vmap, maxSearchDist, tolerance); } | |
bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask, LineOfSightChecks checks, VMAP::ModelIgnoreFlags ignoreFlags) const; | |
void Balance() { _dynamicTree.balance(); } | |
void RemoveGameObjectModel(GameObjectModel const& model) { _dynamicTree.remove(model); } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment