Core/Movement: Properly resume chase/follow movement if it was paused by a spell cast.

Port From (https://github.com/TrinityCore/TrinityCore/commit/6d2423b7334915c60225103863c3ffae3831719b)
This commit is contained in:
hondacrx
2021-10-17 09:25:04 -04:00
parent 6da7f7cb38
commit a4f115366b
2 changed files with 11 additions and 10 deletions
@@ -30,7 +30,7 @@ namespace Game.Movement
ChaseAngle? _angle; ChaseAngle? _angle;
PathGenerator _path; PathGenerator _path;
Position _lastTargetPosition = new(); Position _lastTargetPosition;
uint _rangeCheckTimer = RANGE_CHECK_INTERVAL; uint _rangeCheckTimer = RANGE_CHECK_INTERVAL;
bool _movingTowards = true; bool _movingTowards = true;
bool _mutualChase = true; bool _mutualChase = true;
@@ -56,7 +56,7 @@ namespace Game.Movement
owner.SetWalk(false); owner.SetWalk(false);
_path = null; _path = null;
_lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); _lastTargetPosition = null;
} }
public override void Reset(Unit owner) public override void Reset(Unit owner)
@@ -84,6 +84,7 @@ namespace Game.Movement
if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting())
{ {
owner.StopMoving(); owner.StopMoving();
_lastTargetPosition = null;
return true; return true;
} }
@@ -124,9 +125,9 @@ namespace Game.Movement
} }
// if the target moved, we have to consider whether to adjust // if the target moved, we have to consider whether to adjust
if (_lastTargetPosition != target.GetPosition() || mutualChase != _mutualChase) if (_lastTargetPosition == null || target.GetPosition() != _lastTargetPosition || mutualChase != _mutualChase)
{ {
_lastTargetPosition.Relocate(target.GetPosition()); _lastTargetPosition = new(target.GetPosition());
_mutualChase = mutualChase; _mutualChase = mutualChase;
if (owner.HasUnitState(UnitState.ChaseMove) || !PositionOkay(owner, target, minRange, maxRange, angle)) if (owner.HasUnitState(UnitState.ChaseMove) || !PositionOkay(owner, target, minRange, maxRange, angle))
{ {
@@ -216,7 +217,7 @@ namespace Game.Movement
public override MovementGeneratorType GetMovementGeneratorType() { return MovementGeneratorType.Chase; } public override MovementGeneratorType GetMovementGeneratorType() { return MovementGeneratorType.Chase; }
public override void UnitSpeedChanged() { _lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); } public override void UnitSpeedChanged() { _lastTargetPosition = null; }
static bool IsMutualChase(Unit owner, Unit target) static bool IsMutualChase(Unit owner, Unit target)
{ {
@@ -41,7 +41,6 @@ namespace Game.Movement
_abstractFollower = new AbstractFollower(target); _abstractFollower = new AbstractFollower(target);
_range = range; _range = range;
_angle = angle; _angle = angle;
_lastTargetPosition = new();
Mode = MovementGeneratorMode.Default; Mode = MovementGeneratorMode.Default;
Priority = MovementGeneratorPriority.Normal; Priority = MovementGeneratorPriority.Normal;
@@ -57,7 +56,7 @@ namespace Game.Movement
owner.StopMoving(); owner.StopMoving();
UpdatePetSpeed(owner); UpdatePetSpeed(owner);
_path = null; _path = null;
_lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); _lastTargetPosition = null;
} }
public override void Reset(Unit owner) public override void Reset(Unit owner)
@@ -80,6 +79,7 @@ namespace Game.Movement
if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting())
{ {
owner.StopMoving(); owner.StopMoving();
_lastTargetPosition = null;
return true; return true;
} }
@@ -107,9 +107,9 @@ namespace Game.Movement
DoMovementInform(owner, target); DoMovementInform(owner, target);
} }
if (_lastTargetPosition.GetExactDistSq(target.GetPosition()) > 0.0f) if (_lastTargetPosition == null || _lastTargetPosition.GetExactDistSq(target.GetPosition()) > 0.0f)
{ {
_lastTargetPosition = target.GetPosition(); _lastTargetPosition = new(target.GetPosition());
if (owner.HasUnitState(UnitState.FollowMove) || !PositionOkay(owner, target, _range + FOLLOW_RANGE_TOLERANCE)) if (owner.HasUnitState(UnitState.FollowMove) || !PositionOkay(owner, target, _range + FOLLOW_RANGE_TOLERANCE))
{ {
if (_path == null) if (_path == null)
@@ -202,7 +202,7 @@ namespace Game.Movement
public override MovementGeneratorType GetMovementGeneratorType() { return MovementGeneratorType.Follow; } public override MovementGeneratorType GetMovementGeneratorType() { return MovementGeneratorType.Follow; }
public override void UnitSpeedChanged() { _lastTargetPosition.Relocate(0.0f, 0.0f, 0.0f); } public override void UnitSpeedChanged() { _lastTargetPosition = null; }
static bool PositionOkay(Unit owner, Unit target, float range, ChaseAngle? angle = null) static bool PositionOkay(Unit owner, Unit target, float range, ChaseAngle? angle = null)
{ {