fixed the bug that GetVmapHeight returns incorrect height on terrains(flying units fall below map etc)

also unlocked max ray lenght for getHeight, by default it's 10 yards

--HG--
branch : trunk
This commit is contained in:
silver1ce
2010-01-06 12:15:02 +02:00
parent 4a0af0314e
commit f82d5cb3fc
10 changed files with 29 additions and 30 deletions
@@ -1126,7 +1126,7 @@ struct mob_frost_wyrmAI : public hyjal_trashAI
float x,y,z; float x,y,z;
m_creature->GetPosition(x,y,z); m_creature->GetPosition(x,y,z);
z = m_creature->GetMap()->GetVmapHeight(x, y, z, true); z = m_creature->GetMap()->GetVmapHeight(x, y, z);
m_creature->GetMotionMaster()->MovePoint(0,x,y,z); m_creature->GetMotionMaster()->MovePoint(0,x,y,z);
m_creature->GetMap()->CreatureRelocation(m_creature, x,y,z,0); m_creature->GetMap()->CreatureRelocation(m_creature, x,y,z,0);
} }
@@ -1238,7 +1238,7 @@ struct mob_gargoyleAI : public hyjal_trashAI
{ {
float x,y,z; float x,y,z;
m_creature->GetPosition(x,y,z); m_creature->GetPosition(x,y,z);
z = m_creature->GetMap()->GetVmapHeight(x, y, z, true); z = m_creature->GetMap()->GetVmapHeight(x, y, z);
m_creature->GetMotionMaster()->MovePoint(0,x,y,z); m_creature->GetMotionMaster()->MovePoint(0,x,y,z);
m_creature->GetMap()->CreatureRelocation(m_creature, x,y,z,0); m_creature->GetMap()->CreatureRelocation(m_creature, x,y,z,0);
hyjal_trashAI::JustDied(victim); hyjal_trashAI::JustDied(victim);
@@ -399,7 +399,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
float X = CalculateRandomLocation(pTarget->GetPositionX(), 20); float X = CalculateRandomLocation(pTarget->GetPositionX(), 20);
float Y = CalculateRandomLocation(pTarget->GetPositionY(), 20); float Y = CalculateRandomLocation(pTarget->GetPositionY(), 20);
float Z = pTarget->GetPositionZ(); float Z = pTarget->GetPositionZ();
Z = m_creature->GetMap()->GetVmapHeight(X, Y, Z, true); Z = m_creature->GetMap()->GetVmapHeight(X, Y, Z);
Creature* DoomBlossom = m_creature->SummonCreature(CREATURE_DOOM_BLOSSOM, X, Y, Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000); Creature* DoomBlossom = m_creature->SummonCreature(CREATURE_DOOM_BLOSSOM, X, Y, Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000);
if (DoomBlossom) if (DoomBlossom)
{ {
+1 -1
View File
@@ -1477,7 +1477,7 @@ bool Creature::FallGround()
float x, y, z; float x, y, z;
GetPosition(x, y, z); GetPosition(x, y, z);
float ground_Z = GetMap()->GetVmapHeight(x, y, z, true); float ground_Z = GetMap()->GetVmapHeight(x, y, z);
if (fabs(ground_Z - z) < 0.1f) if (fabs(ground_Z - z) < 0.1f)
return false; return false;
+10 -11
View File
@@ -1994,24 +1994,23 @@ 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 Map::GetVmapHeight(float x, float y, float z) const
{ {
float mapHeight; float mapHeight;
float vmapHeight;
if (useMaps)
{
mapHeight = GetHeight(x, y, z, false); mapHeight = GetHeight(x, y, z, false);
if (fabs(mapHeight - z) < 0.1) if (fabs(mapHeight - z) < 0.1)
return mapHeight; return mapHeight;
}
else
mapHeight = INVALID_HEIGHT;
VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
if (vmgr->isLineOfSightCalcEnabled()) if (!vmgr->isLineOfSightCalcEnabled())
bool result = vmgr->getObjectHitPos(GetId(), x, y, z + 2.0f, x, y, mapHeight, x, y, vmapHeight, 0); return mapHeight;
else
return INVALID_HEIGHT; float vmapHeight = vmgr->getHeight(GetId(), x, y, z + 2.0f, z + 2.0f - mapHeight);
if (vmapHeight > VMAP_INVALID_HEIGHT_VALUE)
return vmapHeight; return vmapHeight;
return mapHeight;
} }
uint16 Map::GetAreaFlag(float x, float y, float z) const uint16 Map::GetAreaFlag(float x, float y, float z) const
+1 -1
View File
@@ -333,7 +333,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; float GetVmapHeight(float x, float y, float z) const;
bool IsInWater(float x, float y, float z, float min_depth = 2.0f) const; bool IsInWater(float x, float y, float z, float min_depth = 2.0f) const;
ZLiquidStatus getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData *data = 0) const; ZLiquidStatus getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData *data = 0) const;
+1 -1
View File
@@ -4476,7 +4476,7 @@ bool Player::FallGround(uint8 FallMode)
float x, y, z; float x, y, z;
GetPosition(x, y, z); GetPosition(x, y, z);
float ground_Z = GetMap()->GetVmapHeight(x, y, z, true); float ground_Z = GetMap()->GetVmapHeight(x, y, z);
float z_diff = 0.0f; float z_diff = 0.0f;
if ((z_diff = fabs(ground_Z - z)) < 0.1f) if ((z_diff = fabs(ground_Z - z)) < 0.1f)
return false; return false;
+1 -1
View File
@@ -5177,7 +5177,7 @@ SpellCastResult Spell::CheckCast(bool strict)
{ {
float x, y, z; float x, y, z;
m_caster->GetPosition(x, y, z); m_caster->GetPosition(x, y, z);
float ground_Z = m_caster->GetMap()->GetVmapHeight(x, y, z, true); float ground_Z = m_caster->GetMap()->GetVmapHeight(x, y, z);
if (fabs(ground_Z - z) < 0.1f) if (fabs(ground_Z - z) < 0.1f)
return SPELL_FAILED_DONT_REPORT; return SPELL_FAILED_DONT_REPORT;
break; break;
+2 -1
View File
@@ -22,6 +22,7 @@
#define _IVMAPMANAGER_H #define _IVMAPMANAGER_H
#include<string> #include<string>
#include "VMapDefinitions.h"
//=========================================================== //===========================================================
@@ -62,7 +63,7 @@ namespace VMAP
virtual void unloadMap(unsigned int pMapId) = 0; virtual void unloadMap(unsigned int pMapId) = 0;
virtual bool isInLineOfSight(unsigned int pMapId, float x1, float y1, float z1, float x2, float y2, float z2) = 0; virtual bool isInLineOfSight(unsigned int pMapId, float x1, float y1, float z1, float x2, float y2, float z2) = 0;
virtual float getHeight(unsigned int pMapId, float x, float y, float z) = 0; virtual float getHeight(unsigned int pMapId, float x, float y, float z, float ray_lenght = MAX_CAN_FALL_DISTANCE) = 0;
/** /**
test if we hit an object. return true if we hit one. rx,ry,rz will hold the hit position or the dest position, if no intersection was found test if we hit an object. return true if we hit one. rx,ry,rz will hold the hit position or the dest position, if no intersection was found
return a position, that is pReduceDist closer to the origin return a position, that is pReduceDist closer to the origin
+4 -5
View File
@@ -450,14 +450,14 @@ namespace VMAP
*/ */
//int gGetHeightCounter = 0; //int gGetHeightCounter = 0;
float VMapManager::getHeight(unsigned int pMapId, float x, float y, float z) float VMapManager::getHeight(unsigned int pMapId, float x, float y, float z, float ray_lenght)
{ {
float height = VMAP_INVALID_HEIGHT_VALUE; //no height float height = VMAP_INVALID_HEIGHT_VALUE; //no height
if(isHeightCalcEnabled() && iInstanceMapTrees.containsKey(pMapId)) if(isHeightCalcEnabled() && iInstanceMapTrees.containsKey(pMapId))
{ {
Vector3 pos = convertPositionToInternalRep(x,y,z); Vector3 pos = convertPositionToInternalRep(x,y,z);
MapTree* mapTree = iInstanceMapTrees.get(pMapId); MapTree* mapTree = iInstanceMapTrees.get(pMapId);
height = mapTree->getHeight(pos); height = mapTree->getHeight(pos, ray_lenght);
if(!(height < inf())) if(!(height < inf()))
{ {
height = VMAP_INVALID_HEIGHT_VALUE; //no height height = VMAP_INVALID_HEIGHT_VALUE; //no height
@@ -633,13 +633,12 @@ namespace VMAP
//========================================================= //=========================================================
float MapTree::getHeight(const Vector3& pPos) float MapTree::getHeight(const Vector3& pPos, float ray_lenght)
{ {
float height = inf(); float height = inf();
Vector3 dir = Vector3(0,-1,0); Vector3 dir = Vector3(0,-1,0);
Ray ray = Ray::fromOriginAndDirection(pPos, dir); // direction with length of 1 Ray ray = Ray::fromOriginAndDirection(pPos, dir); // direction with length of 1
float maxDist = VMapDefinitions::getMaxCanFallDistance(); float dist = getIntersectionTime(ray, ray_lenght, false);
float dist = getIntersectionTime(ray, maxDist, false);
if(dist < inf()) if(dist < inf())
{ {
height = (pPos + dir * dist).y; height = (pPos + dir * dist).y;
+2 -2
View File
@@ -105,7 +105,7 @@ namespace VMAP
bool isInLineOfSight(const G3D::Vector3& pos1, const G3D::Vector3& pos2); bool isInLineOfSight(const G3D::Vector3& pos1, const G3D::Vector3& pos2);
bool getObjectHitPos(const G3D::Vector3& pos1, const G3D::Vector3& pos2, G3D::Vector3& pResultHitPos, float pModifyDist); bool getObjectHitPos(const G3D::Vector3& pos1, const G3D::Vector3& pos2, G3D::Vector3& pResultHitPos, float pModifyDist);
float getHeight(const G3D::Vector3& pPos); float getHeight(const G3D::Vector3& pPos, float ray_lenght);
bool PrepareTree(); bool PrepareTree();
bool loadMap(const std::string& pDirFileName, unsigned int pMapTileIdent); bool loadMap(const std::string& pDirFileName, unsigned int pMapTileIdent);
@@ -165,7 +165,7 @@ namespace VMAP
fill the hit pos and return true, if an object was hit fill the hit pos and return true, if an object was hit
*/ */
bool getObjectHitPos(unsigned int pMapId, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float pModifyDist); bool getObjectHitPos(unsigned int pMapId, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float pModifyDist);
float getHeight(unsigned int pMapId, float x, float y, float z); float getHeight(unsigned int pMapId, float x, float y, float z, float ray_lenght);
bool processCommand(char *pCommand); // for debug and extensions bool processCommand(char *pCommand); // for debug and extensions