rendered paste bodydiff -r e03997aa6b67 -r 055acf613473 src/game/Map.h
--- a/src/game/Map.h Sun Dec 14 13:18:47 2008 -0600
+++ b/src/game/Map.h Mon Dec 15 21:30:29 2008 +0300
@@ -183,7 +183,9 @@
// can return INVALID_HEIGHT if under z+2 z coord not found height
float GetHeight(float x, float y, float z, bool pCheckVMap=true) const;
bool IsInWater(float x, float y, float z) const; // does not use z pos. This is for future use
-
+ float GetVmapHeight(float x, float y, float z) const;
+
uint16 GetAreaFlag(float x, float y ) const;
uint8 GetTerrainType(float x, float y ) const;
float GetWaterLevel(float x, float y ) const;
diff -r 8dc69056db7d -r ec936a4aa2a6 src/game/Map.cpp
--- a/src/game/Map.cpp Fri Jan 16 18:49:41 2009 -0600
+++ b/src/game/Map.cpp Sun Jan 18 14:08:52 2009 -1200
@@ -1262,7 +1265,34 @@
return mapHeight; // explicitly use map data if original z < mapHeight but map found (z+2 > mapHeight)
else
return VMAP_INVALID_HEIGHT_VALUE; // we not have any height
- }
+ }
+}
+
+float Map::GetVmapHeight(float x, float y, float z) const
+{
+ float mapHeight = GetHeight(x, y, MAX_HEIGHT, false);
+
+ if(mapHeight <= INVALID_HEIGHT) //check, if we have .map surface, unsure: there is any map in world without map height?
+ return INVALID_HEIGHT;
+
+ float vmapHeight, loverHeight;
+ if(z + 2.0f < mapHeight) //we under map surface
+ loverHeight = -1000.f;
+ else loverHeight = mapHeight;
+
+ VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
+ if(vmgr->isHeightCalcEnabled())
+ bool result = vmgr->getObjectHitPos(GetId(), x,y,z + 2.0f, x,y,loverHeight - 1.0f, x,y,vmapHeight, 0);
+ else
+ return mapHeight;
+
+ if(z + 2.0f < mapHeight && !result) //we under map surface and haven't meet any object
+ return INVALID_HEIGHT;
+
+ if(vmapHeight < mapHeight)
+ return mapHeight;
+
+ return vmapHeight;
}
uint16 Map::GetAreaFlag(float x, float y ) const
diff -r 8dc69056db7d -r ec936a4aa2a6 src/game/Creature.cpp
--- a/src/game/Creature.cpp Fri Jan 16 18:49:41 2009 -0600
+++ b/src/game/Creature.cpp Sun Jan 18 14:08:52 2009 -1200
@@ -1676,16 +1676,15 @@
if (getDeathState() == DEAD_FALLING)
return false;
- // Let's do with no vmap because no way to get far distance with vmap high call
- float tz = GetMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZ(), false);
-
- // Abort too if the ground is very near
- if (fabs(GetPositionZ() - tz) < 0.1f)
+ float x, y, z;
+ GetPosition(x, y, z);
+ float ground_Z = GetMap()->GetVmapHeight(x, y, z);
+ if (fabs(ground_Z - z) < 0.1f)
return false;
Unit::setDeathState(DEAD_FALLING);
- GetMotionMaster()->MovePoint(0, GetPositionX(), GetPositionY(), tz);
- Relocate(GetPositionX(), GetPositionY(), tz);
+ GetMotionMaster()->MovePoint(0, x, y, ground_Z);
+ Relocate(x, y, ground_Z);
return true;
}