aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/collision/Management/MMapManager.cpp2
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp4
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp4
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp41
-rw-r--r--src/server/game/Movement/PathGenerator.cpp8
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp20
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp5
8 files changed, 46 insertions, 40 deletions
diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp
index 8e6e2a3b6b4..c7dea358d92 100644
--- a/src/server/collision/Management/MMapManager.cpp
+++ b/src/server/collision/Management/MMapManager.cpp
@@ -295,4 +295,4 @@ namespace MMAP
return mmap->navMeshQueries[instanceId];
}
-} \ No newline at end of file
+}
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index fe5d32b9b95..2205efa8724 100755
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -2780,7 +2780,7 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle)
desty = pos.m_positionY + dist * sin(angle);
// Prevent invalid coordinates here, position is unchanged
- if (!Trinity::IsValidMapCoord(destx, desty))
+ if (!Trinity::IsValidMapCoord(destx, desty, pos.m_positionZ))
{
sLog->outFatal(LOG_FILTER_GENERAL, "WorldObject::MovePosition invalid coordinates X: %f and Y: %f were passed!", destx, desty);
return;
diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
index 32c6ec3858d..4c269a1024a 100755
--- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
@@ -78,8 +78,8 @@ bool ConfusedMovementGenerator<T>::Update(T* unit, const uint32& diff)
PathGenerator path(unit);
path.SetPathLengthLimit(30.0f);
- path.CalculatePath(x, y, z);
- if (path.GetPathType() & PATHFIND_NOPATH)
+ bool result = path.CalculatePath(x, y, z);
+ if (!result || path.GetPathType() & PATHFIND_NOPATH)
{
i_nextMoveTime.Reset(urand(800, 1000));
return true;
diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
index 8f4d78b34b1..29466ab9670 100755
--- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
@@ -45,8 +45,8 @@ void FleeingMovementGenerator<T>::_setTargetLocation(T* owner)
PathGenerator path(owner);
path.SetPathLengthLimit(30.0f);
- path.CalculatePath(x, y, z);
- if (path.GetPathType() & PATHFIND_NOPATH)
+ bool result = path.CalculatePath(x, y, z);
+ if (!result || path.GetPathType() & PATHFIND_NOPATH)
{
i_nextCheckTime.Reset(urand(1000, 1500));
return;
diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
index 4a8d15b8079..145251ec4aa 100755
--- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
@@ -35,30 +35,28 @@ void TargetedMovementGeneratorMedium<T,D>::_setTargetLocation(T* owner)
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE))
return;
+ if (owner->GetTypeId() == TYPEID_UNIT && !i_target->isInAccessiblePlaceFor(owner->ToCreature()))
+ return;
+
float x, y, z;
- //! Following block of code deleted by MrSmite in issue 4891
- //! Code kept for learning and diagnostical purposes
-//
-// if (i_offset && i_target->IsWithinDistInMap(&owner,2*i_offset))
-// {
-// if (!owner.movespline->Finalized())
-// return;
-//
-// owner.GetPosition(x, y, z);
-// }
-// else
+
if (!i_offset)
{
- if (i_target->IsWithinMeleeRange(owner))
- return;
+ float dist = 0.0f;
+
+ if (owner->getVictim() && owner->getVictim()->GetGUID() == i_target->GetGUID())
+ dist = owner->GetFloatValue(UNIT_FIELD_COMBATREACH) + i_target->GetFloatValue(UNIT_FIELD_COMBATREACH) - i_target->GetObjectSize() - owner->GetObjectSize() - 1.0f;
+
+ if (dist < 0.5f)
+ dist = 0.5f;
- // to nearest random contact position
- i_target->GetRandomContactPoint(owner, x, y, z, 0, MELEE_RANGE - 0.5f);
+ if (owner->IsWithinLOSInMap(owner->getVictim()))
+ i_target->GetContactPoint(owner, x, y, z, dist);
+ else
+ i_target->GetPosition(x, y, z);
}
else
{
- if (i_target->IsWithinDistInMap(owner, i_offset + 1.0f))
- return;
// to at i_offset distance from target and i_angle from target facing
i_target->GetClosePoint(x, y, z, owner->GetObjectSize(), i_offset, i_angle);
}
@@ -69,8 +67,9 @@ void TargetedMovementGeneratorMedium<T,D>::_setTargetLocation(T* owner)
// allow pets following their master to cheat while generating paths
bool forceDest = (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->isPet()
&& owner->HasUnitState(UNIT_STATE_FOLLOW));
- i_path->CalculatePath(x, y, z, forceDest);
- if (i_path->GetPathType() & PATHFIND_NOPATH)
+
+ bool result = i_path->CalculatePath(x, y, z, forceDest);
+ if (!result || i_path->GetPathType() & PATHFIND_NOPATH)
return;
D::_addUnitStateMove(owner);
@@ -117,7 +116,7 @@ bool TargetedMovementGeneratorMedium<T,D>::Update(T* owner, const uint32& time_d
return false;
if (!owner || !owner->isAlive())
- return true;
+ return false;
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE))
{
@@ -154,7 +153,7 @@ bool TargetedMovementGeneratorMedium<T,D>::Update(T* owner, const uint32& time_d
else
targetMoved = !i_target->IsWithinDist2d(dest.x, dest.y, allowed_dist);
- if (targetMoved)
+ if (targetMoved || !owner->IsWithinLOSInMap(owner->getVictim()))
_setTargetLocation(owner);
}
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index 165cc282e3a..68dd8f4057d 100644
--- a/src/server/game/Movement/PathGenerator.cpp
+++ b/src/server/game/Movement/PathGenerator.cpp
@@ -58,8 +58,12 @@ bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool fo
if (!Trinity::IsValidMapCoord(destX, destY, destZ) || !Trinity::IsValidMapCoord(x, y, z))
return false;
+ float newDestZ = _sourceUnit->GetBaseMap()->GetHeight(_sourceUnit->GetPhaseMask(), x, y, z, true, MAX_FALL_DISTANCE);
+ if (newDestZ >= INVALID_HEIGHT)
+ return false;
+
Vector3 oldDest = GetEndPosition();
- Vector3 dest(destX, destY, destZ);
+ Vector3 dest(destX, destY, newDestZ);
SetEndPosition(dest);
Vector3 start(x, y, z);
@@ -124,7 +128,7 @@ dtPolyRef PathGenerator::GetPathPolyByPosition(dtPolyRef const* polyPath, uint32
minDist3d = dtVdistSqr(point, closestPoint);
}
- if(minDist2d < 1.0f) // shortcut out - close enough for us
+ if (minDist2d < 1.0f) // shortcut out - close enough for us
break;
}
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index 2796e208e34..68201fcf275 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -153,16 +153,18 @@ namespace Movement
if (generatePath)
{
PathGenerator path(unit);
- path.CalculatePath(dest.x, dest.y, dest.z, forceDestination);
- MovebyPath(path.GetPath());
- }
- else
- {
- args.path_Idx_offset = 0;
- args.path.resize(2);
- TransportPathTransform transform(unit, args.TransformForTransport);
- args.path[1] = transform(dest);
+ bool result = path.CalculatePath(dest.x, dest.y, dest.z, forceDestination);
+ if (result && path.GetPathType() & ~PATHFIND_NOPATH)
+ {
+ MovebyPath(path.GetPath());
+ return;
+ }
}
+
+ args.path_Idx_offset = 0;
+ args.path.resize(2);
+ TransportPathTransform transform(unit, args.TransformForTransport);
+ args.path[1] = transform(dest);
}
Vector3 TransportPathTransform::operator()(Vector3 input)
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index d9a3e6a4b3c..a701b9d143e 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5162,10 +5162,11 @@ SpellCastResult Spell::CheckCast(bool strict)
target->GetFirstCollisionPosition(pos, CONTACT_DISTANCE, target->GetRelativeAngle(m_caster));
m_preGeneratedPath.SetPathLengthLimit(m_spellInfo->GetMaxRange(true) * 1.5f);
- m_preGeneratedPath.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ + target->GetObjectSize());
-
+ bool result = m_preGeneratedPath.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ + target->GetObjectSize());
if (m_preGeneratedPath.GetPathType() & PATHFIND_SHORT)
return SPELL_FAILED_OUT_OF_RANGE;
+ else if (!result)
+ return SPELL_FAILED_NOPATH;
break;
}