Core/Movement: Fix some undermap issues with random movement/fear/blink

Port From (https://github.com/TrinityCore/TrinityCore/commit/4fcc4a330044e84baa1f58ff13e1b4ea7775eb66)
This commit is contained in:
hondacrx
2021-11-29 17:46:46 -05:00
parent b44d086d37
commit 334720dafe
7 changed files with 60 additions and 20 deletions
+40 -7
View File
@@ -3042,10 +3042,19 @@ namespace Game.Entities
} }
public void UpdateAllowedPositionZ(float x, float y, ref float z) public void UpdateAllowedPositionZ(float x, float y, ref float z)
{
float unused = 0f;
UpdateAllowedPositionZ(x, y, ref z, ref unused);
}
public void UpdateAllowedPositionZ(float x, float y, ref float z, ref float groundZ)
{ {
// TODO: Allow transports to be part of dynamic vmap tree // TODO: Allow transports to be part of dynamic vmap tree
if (GetTransport()) if (GetTransport())
{
groundZ = z;
return; return;
}
Unit unit = ToUnit(); Unit unit = ToUnit();
if (unit != null) if (unit != null)
@@ -3053,31 +3062,35 @@ namespace Game.Entities
if (!unit.CanFly()) if (!unit.CanFly())
{ {
bool canSwim = unit.CanSwim(); bool canSwim = unit.CanSwim();
float groundZ = z; float ground_z = z;
float max_z; float max_z;
if (canSwim) if (canSwim)
max_z = GetMapWaterOrGroundLevel(x, y, z, ref groundZ); max_z = GetMapWaterOrGroundLevel(x, y, z, ref ground_z);
else else
max_z = groundZ = GetMapHeight(x, y, z); max_z = ground_z = GetMapHeight(x, y, z);
if (max_z > MapConst.InvalidHeight) if (max_z > MapConst.InvalidHeight)
{ {
// hovering units cannot go below their hover height // hovering units cannot go below their hover height
float hoverOffset = unit.GetHoverOffset(); float hoverOffset = unit.GetHoverOffset();
max_z += hoverOffset; max_z += hoverOffset;
groundZ += hoverOffset; ground_z += hoverOffset;
if (z > max_z) if (z > max_z)
z = max_z; z = max_z;
else if (z < groundZ) else if (z < ground_z)
z = groundZ; z = ground_z;
} }
groundZ = ground_z;
} }
else else
{ {
float ground_z = GetMapHeight(x, y, z) + unit.GetHoverOffset(); float ground_z = GetMapHeight(x, y, z) + unit.GetHoverOffset();
if (z < ground_z) if (z < ground_z)
z = ground_z; z = ground_z;
groundZ = ground_z;
} }
} }
else else
@@ -3085,6 +3098,8 @@ namespace Game.Entities
float ground_z = GetMapHeight(x, y, z); float ground_z = GetMapHeight(x, y, z);
if (ground_z > MapConst.InvalidHeight) if (ground_z > MapConst.InvalidHeight)
z = ground_z; z = ground_z;
groundZ = ground_z;
} }
} }
@@ -3295,10 +3310,28 @@ namespace Game.Entities
} }
} }
float groundZ = MapConst.VMAPInvalidHeightValue;
GridDefines.NormalizeMapCoord(ref pos.posX); GridDefines.NormalizeMapCoord(ref pos.posX);
GridDefines.NormalizeMapCoord(ref pos.posY); GridDefines.NormalizeMapCoord(ref pos.posY);
UpdateAllowedPositionZ(destx, desty, ref pos.posZ); UpdateAllowedPositionZ(destx, desty, ref pos.posZ, ref groundZ);
pos.SetOrientation(GetOrientation()); pos.SetOrientation(GetOrientation());
// position has no ground under it (or is too far away)
if (groundZ <= MapConst.InvalidHeight)
{
Unit unit = ToUnit();
if (unit != null)
{
// unit can fly, ignore.
if (unit.CanFly())
return;
// fall back to gridHeight if any
float gridHeight = GetMap().GetGridHeight(GetPhaseShift(), pos.posX, pos.posY);
if (gridHeight > MapConst.InvalidHeight)
pos.posZ = gridHeight + unit.GetHoverOffset();
}
}
} }
public float GetFloorZ() public float GetFloorZ()
+14 -7
View File
@@ -1719,13 +1719,9 @@ namespace Game.Maps
// find raw .map surface under Z coordinates // find raw .map surface under Z coordinates
float mapHeight = MapConst.VMAPInvalidHeightValue; float mapHeight = MapConst.VMAPInvalidHeightValue;
uint terrainMapId = PhasingHandler.GetTerrainMapId(phaseShift, this, x, y); uint terrainMapId = PhasingHandler.GetTerrainMapId(phaseShift, this, x, y);
GridMap gmap = GetGridMap(terrainMapId, x, y); float gridHeight = GetGridHeight(phaseShift, x, y);
if (gmap != null) if (MathFunctions.fuzzyGe(z, gridHeight - MapConst.GroundHeightTolerance))
{ mapHeight = gridHeight;
float gridHeight = gmap.GetHeight(x, y);
if (MathFunctions.fuzzyGe(z, gridHeight - MapConst.GroundHeightTolerance))
mapHeight = gridHeight;
}
float vmapHeight = MapConst.VMAPInvalidHeightValue; float vmapHeight = MapConst.VMAPInvalidHeightValue;
if (checkVMap) if (checkVMap)
@@ -1746,8 +1742,10 @@ namespace Game.Maps
// or if the distance of the vmap height is less the land height distance // or if the distance of the vmap height is less the land height distance
if (vmapHeight > mapHeight || Math.Abs(mapHeight - z) > Math.Abs(vmapHeight - z)) if (vmapHeight > mapHeight || Math.Abs(mapHeight - z) > Math.Abs(vmapHeight - z))
return vmapHeight; return vmapHeight;
return mapHeight; // better use .map surface height return mapHeight; // better use .map surface height
} }
return vmapHeight; // we have only vmapHeight (if have) return vmapHeight; // we have only vmapHeight (if have)
} }
@@ -1764,6 +1762,15 @@ namespace Game.Maps
return GetHeight(phaseShift, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), vmap, maxSearchDist); return GetHeight(phaseShift, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), vmap, maxSearchDist);
} }
public float GetGridHeight(PhaseShift phaseShift, float x, float y)
{
GridMap gmap = GetGridMap(PhasingHandler.GetTerrainMapId(phaseShift, this, x, y), x, y);
if (gmap != null)
return gmap.GetHeight(x, y);
return MapConst.VMAPInvalidHeightValue;
}
public float GetMinHeight(PhaseShift phaseShift, float x, float y) public float GetMinHeight(PhaseShift phaseShift, float x, float y)
{ {
GridMap grid = GetGridMap(PhasingHandler.GetTerrainMapId(phaseShift, this, x, y), x, y); GridMap grid = GetGridMap(PhasingHandler.GetTerrainMapId(phaseShift, this, x, y), x, y);
@@ -90,7 +90,7 @@ namespace Game.Movement
} }
bool result = _path.CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ()); bool result = _path.CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ());
if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath)) if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath) || _path.GetPathType().HasAnyFlag(PathType.Shortcut))
{ {
_timer.Reset(100); _timer.Reset(100);
return true; return true;
@@ -140,7 +140,7 @@ namespace Game.Movement
} }
bool result = _path.CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ()); bool result = _path.CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ());
if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath)) if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath) || _path.GetPathType().HasAnyFlag(PathType.Shortcut))
{ {
_timer.Reset(100); _timer.Reset(100);
return; return;
@@ -529,14 +529,14 @@ namespace Game.Movement
// @todo check the exact cases // @todo check the exact cases
Log.outDebug(LogFilter.Maps, "++ PathGenerator.BuildPointPath FAILED! path sized {0} returned\n", pointCount); Log.outDebug(LogFilter.Maps, "++ PathGenerator.BuildPointPath FAILED! path sized {0} returned\n", pointCount);
BuildShortcut(); BuildShortcut();
pathType = PathType.NoPath; pathType |= PathType.NoPath;
return; return;
} }
else if (pointCount == _pointPathLimit) else if (pointCount == _pointPathLimit)
{ {
Log.outDebug(LogFilter.Maps, "++ PathGenerator.BuildPointPath FAILED! path sized {0} returned, lower than limit set to {1}\n", pointCount, _pointPathLimit); Log.outDebug(LogFilter.Maps, "++ PathGenerator.BuildPointPath FAILED! path sized {0} returned, lower than limit set to {1}\n", pointCount, _pointPathLimit);
BuildShortcut(); BuildShortcut();
pathType = PathType.Short; pathType |= PathType.Short;
return; return;
} }
@@ -130,7 +130,7 @@ namespace Game.Movement
} }
bool result = _path.CalculatePath(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ()); bool result = _path.CalculatePath(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ());
if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath)) if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath) || _path.GetPathType().HasAnyFlag(PathType.Shortcut))
{ {
_timer.Reset(100); _timer.Reset(100);
return; return;
+1 -1
View File
@@ -900,9 +900,9 @@ namespace Game.Spells
pos.posX = m_preGeneratedPath.GetActualEndPosition().X; pos.posX = m_preGeneratedPath.GetActualEndPosition().X;
pos.posY = m_preGeneratedPath.GetActualEndPosition().Y; pos.posY = m_preGeneratedPath.GetActualEndPosition().Y;
pos.posZ = m_preGeneratedPath.GetActualEndPosition().Z; pos.posZ = m_preGeneratedPath.GetActualEndPosition().Z;
dest.Relocate(pos);
} }
dest.Relocate(pos);
break; break;
} }
case Targets.DestCasterGround: case Targets.DestCasterGround: