Core/MMaps: Give land priority during area merges over liquids

This commit is contained in:
hondacrx
2018-04-24 17:58:42 -04:00
parent 3da7c9d009
commit 62442d5ecb
2 changed files with 28 additions and 23 deletions
+1 -1
View File
@@ -68,7 +68,7 @@ namespace Framework.Constants
public const string MapLiquidMagic = "MLIQ";
public const string mmapMagic = "MMAP";
public const int mmapVersion = 8;
public const int mmapVersion = 9;
public const string VMapMagic = "VMAP_4.7";
public const float VMAPInvalidHeightValue = -200000.0f;
@@ -797,20 +797,21 @@ namespace Game.Movement
void CreateFilter()
{
NavTerrain includeFlags = 0;
NavTerrain excludeFlags = 0;
NavArea includeFlags = 0;
NavArea excludeFlags = 0;
if (_sourceUnit.IsTypeId(TypeId.Unit))
{
Creature creature = _sourceUnit.ToCreature();
if (creature.CanWalk())
includeFlags |= NavTerrain.Ground;
includeFlags |= NavArea.Ground;
// creatures don't take environmental damage
if (creature.CanSwim())
includeFlags |= (NavTerrain.Water | NavTerrain.Magma | NavTerrain.Slime);
includeFlags |= (NavArea.Water | NavArea.MagmaSlime);
}
else
includeFlags = (NavTerrain.Ground | NavTerrain.Water | NavTerrain.Magma | NavTerrain.Slime);
includeFlags = (NavArea.Ground | NavArea.Water | NavArea.MagmaSlime);
_filter.setIncludeFlags((ushort)includeFlags);
_filter.setExcludeFlags((ushort)excludeFlags);
@@ -824,32 +825,31 @@ namespace Game.Movement
// forcefully into terrain they can't normally move in
if (_sourceUnit.IsInWater() || _sourceUnit.IsUnderWater())
{
NavTerrain includedFlags = (NavTerrain)_filter.getIncludeFlags();
NavTerrainFlag includedFlags = (NavTerrainFlag)_filter.getIncludeFlags();
includedFlags |= GetNavTerrain(_sourceUnit.GetPositionX(), _sourceUnit.GetPositionY(), _sourceUnit.GetPositionZ());
_filter.setIncludeFlags((ushort)includedFlags);
}
}
NavTerrain GetNavTerrain(float x, float y, float z)
NavTerrainFlag GetNavTerrain(float x, float y, float z)
{
LiquidData data;
ZLiquidStatus liquidStatus = _sourceUnit.GetMap().getLiquidStatus(_sourceUnit.GetPhaseShift(), x, y, z, MapConst.MapAllLiquidTypes, out data);
if (liquidStatus == ZLiquidStatus.NoWater)
return NavTerrain.Ground;
return NavTerrainFlag.Ground;
data.type_flags &= ~MapConst.MapLiquidTypeDarkWater;
switch (data.type_flags)
{
case MapConst.MapLiquidTypeWater:
case MapConst.MapLiquidTypeOcean:
return NavTerrain.Water;
return NavTerrainFlag.Water;
case MapConst.MapLiquidTypeMagma:
return NavTerrain.Magma;
case MapConst.MapLiquidTypeSlime:
return NavTerrain.Slime;
return NavTerrainFlag.MagmaSlime;
default:
return NavTerrain.Ground;
return NavTerrainFlag.Ground;
}
}
@@ -987,18 +987,23 @@ namespace Game.Movement
NotUsingPath = 0x10, // used when we are either flying/swiming or on map w/o mmaps
Short = 0x20, // path is longer or equal to its limited path length
}
public enum NavTerrain
public enum NavArea
{
Empty = 0,
// areas 1-60 will be used for destructible areas (currently skipped in vmaps, WMO with flag 1)
// ground is the highest value to make recast choose ground over water when merging surfaces very close to each other (shallow water would be walkable)
MagmaSlime = 61, // don't need to differentiate between them
Water = 62,
Ground = 63,
}
public enum NavTerrainFlag
{
Empty = 0x00,
Ground = 0x01,
Magma = 0x02,
Slime = 0x04,
Water = 0x08,
Unused1 = 0x10,
Unused2 = 0x20,
Unused3 = 0x40,
Unused4 = 0x80
// we only have 8 bits
Ground = 1 << (63 - NavArea.Ground),
Water = 1 << (63 - NavArea.Water),
MagmaSlime = 1 << (63 - NavArea.MagmaSlime)
}
public enum PolyFlag