From 8fa43cd0bdf360ebc3dab5d80850cb3d2fa11c2b Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 22 Feb 2022 19:20:18 -0500 Subject: [PATCH] Core/Objects: fixed destination calculation for destination based spells casted by flying units Port From (https://github.com/TrinityCore/TrinityCore/commit/0c15b2ac7cd8f57004b009a99ec357ef2eefecb3) --- Source/Game/Entities/Object/WorldObject.cs | 36 +++++++++++-------- .../Game/Movement/Generators/PathGenerator.cs | 4 +-- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 28a20e941..7920e9e16 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -3428,8 +3428,9 @@ namespace Game.Entities path.CalculatePath(destx, desty, destz, false); // We have a invalid path result. Skip further processing. - if ((path.GetPathType() & ~(PathType.Normal | PathType.Shortcut | PathType.Incomplete | PathType.FarFromPoly | PathType.NotUsingPath)) != 0) - return; + if (!path.GetPathType().HasFlag(PathType.NotUsingPath)) + if ((path.GetPathType() & ~(PathType.Normal | PathType.Shortcut | PathType.Incomplete | PathType.FarFromPoly)) != 0) + return; Vector3 result = path.GetPath()[path.GetPath().Length - 1]; destx = result.X; @@ -3438,22 +3439,27 @@ namespace Game.Entities // check static LOS float halfHeight = GetCollisionHeight() * 0.5f; - bool col; - /*col = Global.VMapMgr.GetObjectHitPos(PhasingHandler.GetTerrainMapId(GetPhaseShift(), GetMap(), pos.posX, pos.posY), - pos.posX, pos.posY, pos.posZ + halfHeight, - destx, desty, destz + halfHeight, - out destx, out desty, out destz, -0.5f); + bool col = false; - destz -= halfHeight; - - // Collided with static LOS object, move back to collision point - if (col) + // Unit is flying, check for potential collision via vmaps + if (path.GetPathType().HasFlag(PathType.NotUsingPath)) { - destx -= SharedConst.ContactDistance * MathF.Cos(angle); - desty -= SharedConst.ContactDistance * MathF.Sin(angle); - dist = MathF.Sqrt((pos.posX - destx) * (pos.posX - destx) + (pos.posY - desty) * (pos.posY - desty)); - }*/ + col = Global.VMapMgr.GetObjectHitPos(PhasingHandler.GetTerrainMapId(GetPhaseShift(), GetMap(), pos.posX, pos.posY), + pos.posX, pos.posY, pos.posZ + halfHeight, + destx, desty, destz + halfHeight, + out destx, out desty, out destz, -0.5f); + destz -= halfHeight; + + // Collided with static LOS object, move back to collision point + if (col) + { + destx -= SharedConst.ContactDistance * MathF.Cos(angle); + desty -= SharedConst.ContactDistance * MathF.Sin(angle); + dist = MathF.Sqrt((pos.posX - destx) * (pos.posX - destx) + (pos.posY - desty) * (pos.posY - desty)); + } + } + // check dynamic collision col = GetMap().GetObjectHitPos(GetPhaseShift(), pos.posX, pos.posY, pos.posZ + halfHeight, destx, desty, destz + halfHeight, out destx, out desty, out destz, -0.5f); diff --git a/Source/Game/Movement/Generators/PathGenerator.cs b/Source/Game/Movement/Generators/PathGenerator.cs index abe3f9e33..7ef3466a3 100644 --- a/Source/Game/Movement/Generators/PathGenerator.cs +++ b/Source/Game/Movement/Generators/PathGenerator.cs @@ -169,7 +169,7 @@ namespace Game.Movement { Log.outDebug(LogFilter.Maps, "++ BuildPolyPath . (startPoly == 0 || endPoly == 0)\n"); BuildShortcut(); - bool path = _source.IsTypeId(TypeId.Unit) && _source.ToCreature().CanFly(); + bool path = _source.IsTypeId(TypeId.Unit) && _source.ToCreature().IsFlying(); bool waterPath = _source.IsTypeId(TypeId.Unit) && _source.ToCreature().CanSwim(); if (waterPath) @@ -224,7 +224,7 @@ namespace Game.Movement Unit _sourceUnit = _source.ToUnit(); if (_sourceUnit != null) { - if (_sourceUnit.CanFly()) + if (_sourceUnit.IsFlying()) buildShotrcut = true; // 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)