mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-19 03:45:43 +00:00
feat(Core/Mmaps): Handle different slopes in mmaps and Add some more input parameters to improve (#10974)
This commit is contained in:
committed by
GitHub
parent
090cc5e2c6
commit
b544eb420e
@@ -26,7 +26,7 @@
|
||||
|
||||
namespace MMAP
|
||||
{
|
||||
MapBuilder::MapBuilder(float maxWalkableAngle, bool skipLiquid,
|
||||
MapBuilder::MapBuilder(Optional<float> maxWalkableAngle, Optional<float> maxWalkableAngleNotSteep, bool skipLiquid,
|
||||
bool skipContinents, bool skipJunkMaps, bool skipBattlegrounds,
|
||||
bool debugOutput, bool bigBaseUnit, int mapid, const char* offMeshFilePath) :
|
||||
|
||||
@@ -36,6 +36,7 @@ namespace MMAP
|
||||
m_skipJunkMaps (skipJunkMaps),
|
||||
m_skipBattlegrounds (skipBattlegrounds),
|
||||
m_maxWalkableAngle (maxWalkableAngle),
|
||||
m_maxWalkableAngleNotSteep (maxWalkableAngleNotSteep),
|
||||
m_bigBaseUnit (bigBaseUnit),
|
||||
m_mapid (mapid),
|
||||
m_totalTiles (0u),
|
||||
@@ -587,9 +588,17 @@ namespace MMAP
|
||||
}
|
||||
|
||||
// mark all walkable tiles, both liquids and solids
|
||||
|
||||
/* we want to have triangles with slope less than walkableSlopeAngleNotSteep (<= 55) to have NAV_AREA_GROUND
|
||||
* and with slope between walkableSlopeAngleNotSteep and walkableSlopeAngle (55 < .. <= 70) to have NAV_AREA_GROUND_STEEP.
|
||||
* we achieve this using recast API: memset everything to NAV_AREA_GROUND_STEEP, call rcClearUnwalkableTriangles with 70 so
|
||||
* any area above that will get RC_NULL_AREA (unwalkable), then call rcMarkWalkableTriangles with 55 to set NAV_AREA_GROUND
|
||||
* on anything below 55 . Players and idle Creatures can use NAV_AREA_GROUND, while Creatures in combat can use NAV_AREA_GROUND_STEEP.
|
||||
*/
|
||||
unsigned char* triFlags = new unsigned char[tTriCount];
|
||||
memset(triFlags, NAV_GROUND, tTriCount * sizeof(unsigned char));
|
||||
memset(triFlags, NAV_AREA_GROUND_STEEP, tTriCount * sizeof(unsigned char));
|
||||
rcClearUnwalkableTriangles(m_rcContext, tileCfg.walkableSlopeAngle, tVerts, tVertCount, tTris, tTriCount, triFlags);
|
||||
rcMarkWalkableTriangles(m_rcContext, tileCfg.walkableSlopeAngleNotSteep, tVerts, tVertCount, tTris, tTriCount, triFlags, NAV_AREA_GROUND);
|
||||
rcRasterizeTriangles(m_rcContext, tVerts, tVertCount, tTris, triFlags, tTriCount, *tile.solid, config.walkableClimb);
|
||||
delete[] triFlags;
|
||||
|
||||
@@ -597,6 +606,7 @@ namespace MMAP
|
||||
rcFilterLedgeSpans(m_rcContext, tileCfg.walkableHeight, tileCfg.walkableClimb, *tile.solid);
|
||||
rcFilterWalkableLowHeightSpans(m_rcContext, tileCfg.walkableHeight, *tile.solid);
|
||||
|
||||
// add liquid triangles
|
||||
rcRasterizeTriangles(m_rcContext, lVerts, lVertCount, lTris, lTriFlags, lTriCount, *tile.solid, config.walkableClimb);
|
||||
|
||||
// compact heightfield spans
|
||||
@@ -694,8 +704,15 @@ namespace MMAP
|
||||
// set polygons as walkable
|
||||
// TODO: special flags for DYNAMIC polygons, ie surfaces that can be turned on and off
|
||||
for (int i = 0; i < iv.polyMesh->npolys; ++i)
|
||||
if (iv.polyMesh->areas[i] & RC_WALKABLE_AREA)
|
||||
iv.polyMesh->flags[i] = iv.polyMesh->areas[i];
|
||||
{
|
||||
if (uint8 area = iv.polyMesh->areas[i] & NAV_AREA_ALL_MASK)
|
||||
{
|
||||
if (area >= NAV_AREA_MIN_VALUE)
|
||||
iv.polyMesh->flags[i] = 1 << (NAV_AREA_MAX_VALUE - area);
|
||||
else
|
||||
iv.polyMesh->flags[i] = NAV_GROUND; // TODO: these will be dynamic in future
|
||||
}
|
||||
}
|
||||
|
||||
// setup mesh parameters
|
||||
dtNavMeshCreateParams params;
|
||||
@@ -984,7 +1001,10 @@ namespace MMAP
|
||||
config.maxVertsPerPoly = DT_VERTS_PER_POLYGON;
|
||||
config.cs = tileConfig.BASE_UNIT_DIM;
|
||||
config.ch = tileConfig.BASE_UNIT_DIM;
|
||||
config.walkableSlopeAngle = m_maxWalkableAngle;
|
||||
// Keeping these 2 slope angles the same reduces a lot the number of polys.
|
||||
// 55 should be the minimum, maybe 70 is ok (keep in mind blink uses mmaps), 85 is too much for players
|
||||
config.walkableSlopeAngle = m_maxWalkableAngle ? *m_maxWalkableAngle : 55;
|
||||
config.walkableSlopeAngleNotSteep = m_maxWalkableAngleNotSteep ? *m_maxWalkableAngleNotSteep : 55;
|
||||
config.tileSize = tileConfig.VERTEX_PER_TILE;
|
||||
config.walkableRadius = m_bigBaseUnit ? 1 : 2;
|
||||
config.borderSize = config.walkableRadius + 3;
|
||||
@@ -992,7 +1012,7 @@ namespace MMAP
|
||||
config.walkableHeight = m_bigBaseUnit ? 3 : 6;
|
||||
// a value >= 3|6 allows npcs to walk over some fences
|
||||
// a value >= 4|8 allows npcs to walk over all fences
|
||||
config.walkableClimb = m_bigBaseUnit ? 4 : 8;
|
||||
config.walkableClimb = m_bigBaseUnit ? 3 : 6;
|
||||
config.minRegionArea = rcSqr(60);
|
||||
config.mergeRegionArea = rcSqr(50);
|
||||
config.maxSimplificationError = 1.8f; // eliminates most jagged edges (tiny polygons)
|
||||
@@ -1003,8 +1023,14 @@ namespace MMAP
|
||||
{
|
||||
// Blade's Edge Arena
|
||||
case 562:
|
||||
// This allows to walk on the ropes to the pillars
|
||||
config.walkableRadius = 0;
|
||||
break;
|
||||
// Blackfathom Deeps
|
||||
case 48:
|
||||
// Reduce the chance to have underground levels
|
||||
config.ch *= 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user