Skip to content

Instantly share code, notes, and snippets.

@Langerz82
Last active January 1, 2019 14:18
Show Gist options
  • Save Langerz82/e35f37c279c2ca455e9941a6a72752a4 to your computer and use it in GitHub Desktop.
Save Langerz82/e35f37c279c2ca455e9941a6a72752a4 to your computer and use it in GitHub Desktop.
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