Core/MMaps: Fix charge underwater/falling

Port From (https://github.com/TrinityCore/TrinityCore/commit/8d32849b3493d9e819be27945ef31488d8ba6dcf)
This commit is contained in:
hondacrx
2022-01-05 23:45:25 -05:00
parent b373fc6ced
commit 7c43adf9f8
2 changed files with 19 additions and 29 deletions
@@ -195,23 +195,21 @@ namespace Game.Movement
Log.outDebug(LogFilter.Maps, "++ BuildPolyPath . farFromPoly distToStartPoly={0:F3} distToEndPoly={1:F3}\n", distToStartPoly, distToEndPoly); Log.outDebug(LogFilter.Maps, "++ BuildPolyPath . farFromPoly distToStartPoly={0:F3} distToEndPoly={1:F3}\n", distToStartPoly, distToEndPoly);
bool buildShotrcut = false; bool buildShotrcut = false;
if (_sourceUnit.IsTypeId(TypeId.Unit)) var p = (distToStartPoly > 7.0f) ? startPos : endPos;
if (_sourceUnit.GetMap().IsUnderWater(_sourceUnit.GetPhaseShift(), p.X, p.Y, p.Z))
{ {
Creature owner = _sourceUnit.ToCreature(); Log.outDebug(LogFilter.Maps, "++ BuildPolyPath :: underWater case");
if (_sourceUnit.CanSwim())
Vector3 p = (distToStartPoly > 7.0f) ? startPos : endPos; buildShotrcut = true;
if (_sourceUnit.GetMap().IsUnderWater(_sourceUnit.GetPhaseShift(), p.X, p.Y, p.Z)) }
{ else
Log.outDebug(LogFilter.Maps, "++ BuildPolyPath . underWater case\n"); {
if (owner.CanSwim()) Log.outDebug(LogFilter.Maps, "++ BuildPolyPath :: flying case");
buildShotrcut = true; if (_sourceUnit.CanFly())
} buildShotrcut = true;
else // Allow to build a shortcut if the unit is falling and it's trying to move downwards towards a target (i.e. charging)
{ else if (_sourceUnit.IsFalling() && endPos.Z < startPos.Z)
Log.outDebug(LogFilter.Maps, "++ BuildPolyPath . flying case\n"); buildShotrcut = true;
if (owner.CanFly())
buildShotrcut = true;
}
} }
if (buildShotrcut) if (buildShotrcut)
+5 -13
View File
@@ -4921,22 +4921,14 @@ namespace Game.Spells
m_preGeneratedPath = new(unitCaster); m_preGeneratedPath = new(unitCaster);
m_preGeneratedPath.SetPathLengthLimit(range); m_preGeneratedPath.SetPathLengthLimit(range);
//first try with raycast, if it fails fall back to normal path
float targetObjectSize = Math.Min(target.GetCombatReach(), 4.0f); // first try with raycast, if it fails fall back to normal path
bool result = m_preGeneratedPath.CalculatePath(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ() + targetObjectSize, false, true); bool result = m_preGeneratedPath.CalculatePath(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), false, false);
if (m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.Short)) if (m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.Short))
return SpellCastResult.OutOfRange; return SpellCastResult.OutOfRange;
else if (!result || m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.NoPath | PathType.Incomplete)) else if (!result || m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.NoPath | PathType.Incomplete))
{ return SpellCastResult.NoPath;
result = m_preGeneratedPath.CalculatePath(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ() + targetObjectSize, false, false); else if (m_preGeneratedPath.IsInvalidDestinationZ(target)) // Check position z, if not in a straight line
if (m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.Short))
return SpellCastResult.OutOfRange;
else if (!result || m_preGeneratedPath.GetPathType().HasAnyFlag(PathType.NoPath | PathType.Incomplete))
return SpellCastResult.NoPath;
else if (m_preGeneratedPath.IsInvalidDestinationZ(target)) // Check position z, if not in a straight line
return SpellCastResult.NoPath;
}
else if (m_preGeneratedPath.IsInvalidDestinationZ(target)) // Check position z, if in a straight line
return SpellCastResult.NoPath; return SpellCastResult.NoPath;
m_preGeneratedPath.ShortenPathUntilDist(target, objSize); //move back m_preGeneratedPath.ShortenPathUntilDist(target, objSize); //move back