*Fix Creature::FallGround. By Silver1ce.
--HG-- branch : trunk
This commit is contained in:
@@ -1676,16 +1676,15 @@ bool Creature::FallGround()
|
|||||||
if (getDeathState() == DEAD_FALLING)
|
if (getDeathState() == DEAD_FALLING)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Let's do with no vmap because no way to get far distance with vmap high call
|
float x, y, z;
|
||||||
float tz = GetMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZ(), false);
|
GetPosition(x, y, z);
|
||||||
|
float ground_Z = GetMap()->GetVmapHeight(x, y, z, true);
|
||||||
// Abort too if the ground is very near
|
if (fabs(ground_Z - z) < 0.1f)
|
||||||
if (fabs(GetPositionZ() - tz) < 0.1f)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Unit::setDeathState(DEAD_FALLING);
|
Unit::setDeathState(DEAD_FALLING);
|
||||||
GetMotionMaster()->MovePoint(0, GetPositionX(), GetPositionY(), tz);
|
GetMotionMaster()->MovePoint(0, x, y, ground_Z);
|
||||||
Relocate(GetPositionX(), GetPositionY(), tz);
|
Relocate(x, y, ground_Z);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1265,6 +1265,26 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float Map::GetVmapHeight(float x, float y, float z, bool useMaps) const
|
||||||
|
{
|
||||||
|
float mapHeight;
|
||||||
|
float vmapHeight;
|
||||||
|
if (useMaps)
|
||||||
|
{
|
||||||
|
mapHeight = GetHeight(x, y, z, false);
|
||||||
|
if (fabs(mapHeight - z) < 0.1)
|
||||||
|
return mapHeight;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mapHeight = INVALID_HEIGHT;
|
||||||
|
VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
|
||||||
|
if (vmgr->isLineOfSightCalcEnabled())
|
||||||
|
bool result = vmgr->getObjectHitPos(GetId(), x, y, z + 2.0f, x, y, mapHeight, x, y, vmapHeight, 0);
|
||||||
|
else
|
||||||
|
return INVALID_HEIGHT;
|
||||||
|
return vmapHeight;
|
||||||
|
}
|
||||||
|
|
||||||
uint16 Map::GetAreaFlag(float x, float y ) const
|
uint16 Map::GetAreaFlag(float x, float y ) const
|
||||||
{
|
{
|
||||||
//local x,y coords
|
//local x,y coords
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
|
|||||||
// some calls like isInWater should not use vmaps due to processor power
|
// some calls like isInWater should not use vmaps due to processor power
|
||||||
// can return INVALID_HEIGHT if under z+2 z coord not found height
|
// 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;
|
float GetHeight(float x, float y, float z, bool pCheckVMap=true) const;
|
||||||
|
float GetVmapHeight(float x, float y, float z, bool useMaps) const;
|
||||||
bool IsInWater(float x, float y, float z) const; // does not use z pos. This is for future use
|
bool IsInWater(float x, float y, float z) const; // does not use z pos. This is for future use
|
||||||
|
|
||||||
uint16 GetAreaFlag(float x, float y ) const;
|
uint16 GetAreaFlag(float x, float y ) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user