diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index a2864e81b..7da31fc8e 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1375,8 +1375,8 @@ bool Creature::FallGround() 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); + // use larger distance for vmap height search than in most other cases + float tz = GetMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZ(), true, MAX_FALL_DISTANCE); // Abort too if the ground is very near if (fabs(GetPositionZ() - tz) < 0.1f) @@ -1815,7 +1815,7 @@ bool Creature::LoadCreaturesAddon(bool reload) } SpellAuraHolder *holder = GetSpellAuraHolder(cAura->spell_id, GetGUID()); - + bool addedToExisting = true; if (!holder) { @@ -1834,7 +1834,7 @@ bool Creature::LoadCreaturesAddon(bool reload) } else AddSpellAuraHolder(holder); - + DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "Spell: %u - Aura %u added to creature (GUIDLow: %u Entry: %u )", cAura->spell_id, AdditionalSpellInfo->EffectApplyAuraName[EFFECT_INDEX_0],GetGUIDLow(),GetEntry()); } } @@ -2213,4 +2213,4 @@ void Creature::RelocationNotify() MaNGOS::CreatureRelocationNotifier relocationNotifier(*this); float radius = MAX_CREATURE_ATTACK_RADIUS * sWorld.getConfig(CONFIG_FLOAT_RATE_CREATURE_AGGRO); Cell::VisitAllObjects(this, relocationNotifier, radius); -} \ No newline at end of file +} diff --git a/src/game/Map.cpp b/src/game/Map.cpp index c36f81b89..ea76558ef 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -1012,7 +1012,7 @@ inline GridMap *Map::GetGrid(float x, float y) return GridMaps[gx][gy]; } -float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const +float Map::GetHeight(float x, float y, float z, bool pUseVmaps, float maxSearchDist) const { // find raw .map surface under Z coordinates float mapHeight; @@ -1036,7 +1036,7 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const if(vmgr->isHeightCalcEnabled()) { // look from a bit higher pos to find the floor - vmapHeight = vmgr->getHeight(GetId(), x, y, z + 2.0f); + vmapHeight = vmgr->getHeight(GetId(), x, y, z + 2.0f, maxSearchDist); } else vmapHeight = VMAP_INVALID_HEIGHT_VALUE; diff --git a/src/game/Map.h b/src/game/Map.h index c798c614a..6d5535102 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -79,6 +79,8 @@ enum LevelRequirementVsMode #define MAX_HEIGHT 100000.0f // can be use for find ground height at surface #define INVALID_HEIGHT -100000.0f // for check, must be equal to VMAP_INVALID_HEIGHT, real value for unknown height is VMAP_INVALID_HEIGHT_VALUE +#define MAX_FALL_DISTANCE 250000.0f // "unlimited fall" to find VMap ground if it is available, just larger than MAX_HEIGHT - INVALID_HEIGHT +#define DEFAULT_HEIGHT_SEARCH 10.0f // default search distance to find height at nearby locations #define MIN_UNLOAD_DELAY 1 // immediate unload class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::ObjectLevelLockable @@ -150,7 +152,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj // 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 - float GetHeight(float x, float y, float z, bool pCheckVMap=true) const; + float GetHeight(float x, float y, float z, bool pCheckVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const; bool IsInWater(float x, float y, float z, GridMapLiquidData *data = 0) const; GridMapLiquidStatus getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, GridMapLiquidData *data = 0) const; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index ad0aa2629..d1d384b88 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10271" + #define REVISION_NR "10272" #endif // __REVISION_NR_H__ diff --git a/src/shared/vmap/IVMapManager.h b/src/shared/vmap/IVMapManager.h index fb5f866c6..4ca38154b 100644 --- a/src/shared/vmap/IVMapManager.h +++ b/src/shared/vmap/IVMapManager.h @@ -61,7 +61,7 @@ namespace VMAP 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 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 maxSearchDist) = 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 return a position, that is pReduceDist closer to the origin diff --git a/src/shared/vmap/MapTree.cpp b/src/shared/vmap/MapTree.cpp index c4905d74e..bce4b9dea 100644 --- a/src/shared/vmap/MapTree.cpp +++ b/src/shared/vmap/MapTree.cpp @@ -217,12 +217,12 @@ namespace VMAP //========================================================= - float StaticMapTree::getHeight(const Vector3& pPos) const + float StaticMapTree::getHeight(const Vector3& pPos, float maxSearchDist) const { float height = G3D::inf(); Vector3 dir = Vector3(0,0,-1); G3D::Ray ray(pPos, dir); // direction with length of 1 - float maxDist = VMapDefinitions::getMaxCanFallDistance(); + float maxDist = maxSearchDist; if (getIntersectionTime(ray, maxDist, false)) { height = pPos.z - maxDist; diff --git a/src/shared/vmap/MapTree.h b/src/shared/vmap/MapTree.h index 9b4124eb4..5e017c4ce 100644 --- a/src/shared/vmap/MapTree.h +++ b/src/shared/vmap/MapTree.h @@ -70,7 +70,7 @@ namespace VMAP bool isInLineOfSight(const G3D::Vector3& pos1, const G3D::Vector3& pos2) const; bool getObjectHitPos(const G3D::Vector3& pos1, const G3D::Vector3& pos2, G3D::Vector3& pResultHitPos, float pModifyDist) const; - float getHeight(const G3D::Vector3& pPos) const; + float getHeight(const G3D::Vector3& pPos, float maxSearchDist) const; bool getAreaInfo(G3D::Vector3 &pos, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const; bool GetLocationInfo(const Vector3 &pos, LocationInfo &info) const; diff --git a/src/shared/vmap/VMapDefinitions.h b/src/shared/vmap/VMapDefinitions.h index 7844efe24..602b0ef3c 100644 --- a/src/shared/vmap/VMapDefinitions.h +++ b/src/shared/vmap/VMapDefinitions.h @@ -24,18 +24,8 @@ namespace VMAP { - //===================================== - #define MAX_CAN_FALL_DISTANCE 10.0f const char VMAP_MAGIC[] = "VMAP_3.0"; - class VMapDefinitions - { - public: - static float getMaxCanFallDistance() { return MAX_CAN_FALL_DISTANCE; } - }; - - //====================================== - // defined in TileAssembler.cpp currently... bool readChunk(FILE *rf, char *dest, const char *compare, uint32 len); } diff --git a/src/shared/vmap/VMapManager2.cpp b/src/shared/vmap/VMapManager2.cpp index 616e263cb..829c1d98d 100644 --- a/src/shared/vmap/VMapManager2.cpp +++ b/src/shared/vmap/VMapManager2.cpp @@ -234,7 +234,7 @@ namespace VMAP get height or INVALID_HEIGHT if no height available */ - float VMapManager2::getHeight(unsigned int pMapId, float x, float y, float z) + float VMapManager2::getHeight(unsigned int pMapId, float x, float y, float z, float maxSearchDist) { float height = VMAP_INVALID_HEIGHT_VALUE; //no height if (isHeightCalcEnabled()) @@ -243,7 +243,7 @@ namespace VMAP if (instanceTree != iInstanceMapTrees.end()) { Vector3 pos = convertPositionToInternalRep(x,y,z); - height = instanceTree->second->getHeight(pos); + height = instanceTree->second->getHeight(pos, maxSearchDist); if (!(height < G3D::inf())) { height = VMAP_INVALID_HEIGHT_VALUE; //no height diff --git a/src/shared/vmap/VMapManager2.h b/src/shared/vmap/VMapManager2.h index 401b92f9e..92b3fd424 100644 --- a/src/shared/vmap/VMapManager2.h +++ b/src/shared/vmap/VMapManager2.h @@ -92,7 +92,7 @@ namespace VMAP 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); - float getHeight(unsigned int pMapId, float x, float y, float z); + float getHeight(unsigned int pMapId, float x, float y, float z, float maxSearchDist); bool processCommand(char *pCommand) { return false; } // for debug and extensions