diff options
-rw-r--r-- | src/common/Collision/Maps/MapDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/PathGenerator.cpp | 26 | ||||
-rw-r--r-- | src/tools/mmaps_generator/TerrainBuilder.cpp | 4 |
4 files changed, 20 insertions, 14 deletions
diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h index 84373b6d85..94f926c8c1 100644 --- a/src/common/Collision/Maps/MapDefines.h +++ b/src/common/Collision/Maps/MapDefines.h @@ -13,7 +13,7 @@ #define SIZE_OF_GRIDS 533.3333f #define MMAP_MAGIC 0x4d4d4150 // 'MMAP' -#define MMAP_VERSION 15 +#define MMAP_VERSION 16 struct MmapTileHeader { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b9e0047223..99ea6471c8 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4166,7 +4166,7 @@ bool Unit::isInAccessiblePlaceFor(Creature const* c) const } LiquidStatus liquidStatus = GetLiquidData().Status; - bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_SWIMMING) != 0; + bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0; // In water or jumping in water if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling())))) diff --git a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp index b07a0c9e41..0a8bbb5660 100644 --- a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp @@ -209,25 +209,29 @@ void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 con // we just need to remove/normalize paths between 2 adjacent points if (startFarFromPoly || endFarFromPoly) { - bool buildShotrcut = false; + bool buildShortcut = false; - bool isUnderWaterStart = _source->GetMap()->IsUnderWater(_source->GetPhaseMask(), startPos.x, startPos.y, startPos.z, _source->GetCollisionHeight()); - bool isUnderWaterEnd = _source->GetMap()->IsUnderWater(_source->GetPhaseMask(), endPos.x, endPos.y, endPos.z, _source->GetCollisionHeight()); - bool isFarUnderWater = startFarFromPoly ? isUnderWaterStart : isUnderWaterEnd; + auto liquidDataStart = _source->GetMap()->GetLiquidData(_source->GetPhaseMask(), startPos.x, startPos.y, startPos.z, _source->GetCollisionHeight(), MAP_ALL_LIQUIDS); + auto liquidDataEnd = _source->GetMap()->GetLiquidData(_source->GetPhaseMask(), endPos.x, endPos.y, endPos.z, _source->GetCollisionHeight(), MAP_ALL_LIQUIDS); + bool startUnderWaterEndInWater = liquidDataStart.Status == LIQUID_MAP_UNDER_WATER && + (liquidDataEnd.Status & MAP_LIQUID_STATUS_IN_CONTACT) != 0; + bool startInWaterEndUnderWater = (liquidDataStart.Status & MAP_LIQUID_STATUS_IN_CONTACT) != 0 && + liquidDataEnd.Status == LIQUID_MAP_UNDER_WATER; + bool waterPath = startUnderWaterEndInWater || startInWaterEndUnderWater; Unit const* _sourceUnit = _source->ToUnit(); if (_sourceUnit) { - bool isUnderWater = (_sourceUnit->CanSwim() && isUnderWaterStart && isUnderWaterEnd) || (isFarUnderWater && _useRaycast); + bool isWater = (_sourceUnit->CanSwim() && waterPath); - if (isUnderWater || _sourceUnit->CanFly() || (_sourceUnit->IsFalling() && endPos.z < startPos.z)) + if (isWater || _sourceUnit->CanFly() || (_sourceUnit->IsFalling() && endPos.z < startPos.z)) { - buildShotrcut = true; + buildShortcut = true; } } - if (buildShotrcut) + if (buildShortcut) { BuildShortcut(); _type = PathType(PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH); @@ -236,8 +240,7 @@ void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 con return; } - - if (!isFarUnderWater) + else { float closestPoint[VERTEX_SIZE]; // we may want to use closestPointOnPolyBoundary instead @@ -679,12 +682,11 @@ void PathGenerator::UpdateFilter() NavTerrain PathGenerator::GetNavTerrain(float x, float y, float z) const { - LiquidData data; LiquidData const& liquidData = _source->GetMap()->GetLiquidData(_source->GetPhaseMask(), x, y, z, _source->GetCollisionHeight(), MAP_ALL_LIQUIDS); if (liquidData.Status == LIQUID_MAP_NO_WATER) return NAV_GROUND; - switch (data.Flags) + switch (liquidData.Flags) { case MAP_LIQUID_TYPE_WATER: case MAP_LIQUID_TYPE_OCEAN: diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index ce791f0458..0e394488ce 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -504,6 +504,10 @@ namespace MMAP minTLevel = h; } + // terrain under the liquid? + if (minLLevel > maxTLevel) + useTerrain = false; + //liquid under the terrain? if (minTLevel > maxLLevel) useLiquid = false; |