summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMickaƫl Mauger <mikaisback@gmail.com>2023-01-02 22:26:12 +0100
committerGitHub <noreply@github.com>2023-01-02 22:26:12 +0100
commit24fa3ba82852c4321b8a6bd9991f22a3f3246ebe (patch)
tree30fb0023d708ed145a340ff521acceb09c5c755e
parentaae46cc8afebb113ccffc0c62722389ba2fe3991 (diff)
fix(MMAP/core/PathGenerator): Try to fix more water creatures (#13705)
Co-authored-by: jackpoz <giacomopoz@gmail.com>
-rw-r--r--src/common/Collision/Maps/MapDefines.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rw-r--r--src/server/game/Movement/MovementGenerators/PathGenerator.cpp26
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp4
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;