diff -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; }