Core/Movement: modify MovementInform trigger condition & checks in ChaseMovementGenerator

Port From (https://github.com/TrinityCore/TrinityCore/commit/b9bb07de03a7b413aef5d0ebc88428cee1577559)
This commit is contained in:
hondacrx
2022-02-22 13:38:35 -05:00
parent 7d66fdbfd3
commit d5281ebe14
2 changed files with 27 additions and 21 deletions
@@ -24,14 +24,14 @@ namespace Game.Movement
{ {
class ChaseMovementGenerator : MovementGenerator class ChaseMovementGenerator : MovementGenerator
{ {
static uint RANGE_CHECK_INTERVAL = 100; // time (ms) until we attempt to recalculate static int RANGE_CHECK_INTERVAL = 100; // time (ms) until we attempt to recalculate
ChaseRange? _range; ChaseRange? _range;
ChaseAngle? _angle; ChaseAngle? _angle;
PathGenerator _path; PathGenerator _path;
Position _lastTargetPosition; Position _lastTargetPosition;
uint _rangeCheckTimer = RANGE_CHECK_INTERVAL; TimeTrackerSmall _rangeCheckTimer;
bool _movingTowards = true; bool _movingTowards = true;
bool _mutualChase = true; bool _mutualChase = true;
@@ -47,12 +47,14 @@ namespace Game.Movement
Priority = MovementGeneratorPriority.Normal; Priority = MovementGeneratorPriority.Normal;
Flags = MovementGeneratorFlags.InitializationPending; Flags = MovementGeneratorFlags.InitializationPending;
BaseUnitState = UnitState.Chase; BaseUnitState = UnitState.Chase;
_rangeCheckTimer = new(RANGE_CHECK_INTERVAL);
} }
public override void Initialize(Unit owner) public override void Initialize(Unit owner)
{ {
RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Deactivated); RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Deactivated);
AddFlag(MovementGeneratorFlags.Initialized); AddFlag(MovementGeneratorFlags.Initialized | MovementGeneratorFlags.InformEnabled);
_path = null; _path = null;
_lastTargetPosition = null; _lastTargetPosition = null;
@@ -94,28 +96,31 @@ namespace Game.Movement
float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum; float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum;
ChaseAngle? angle = mutualChase ? null : _angle; ChaseAngle? angle = mutualChase ? null : _angle;
// if we're already moving, periodically check if we're already in the expected range... // periodically check if we're already in the expected range...
if (owner.HasUnitState(UnitState.ChaseMove)) _rangeCheckTimer.Update((int)diff);
if (_rangeCheckTimer.Passed())
{ {
if (_rangeCheckTimer > diff) _rangeCheckTimer.Reset(RANGE_CHECK_INTERVAL);
_rangeCheckTimer -= diff; if (HasFlag(MovementGeneratorFlags.InformEnabled) && PositionOkay(owner, target, _movingTowards ? null : minTarget, _movingTowards ? maxTarget : null, angle))
else
{ {
_rangeCheckTimer = RANGE_CHECK_INTERVAL; RemoveFlag(MovementGeneratorFlags.InformEnabled);
if (PositionOkay(owner, target, _movingTowards ? null : minTarget, _movingTowards ? maxTarget : null, angle)) _path = null;
{
_path = null; Creature cOwner = owner.ToCreature();
owner.StopMoving(); if (cOwner != null)
owner.SetInFront(target); cOwner.SetCannotReachTarget(false);
DoMovementInform(owner, target);
return true; owner.StopMoving();
} owner.SetInFront(target);
DoMovementInform(owner, target);
return true;
} }
} }
// if we're done moving, we want to clean up // if we're done moving, we want to clean up
if (owner.HasUnitState(UnitState.ChaseMove) && owner.MoveSpline.Finalized()) if (owner.HasUnitState(UnitState.ChaseMove) && owner.MoveSpline.Finalized())
{ {
RemoveFlag(MovementGeneratorFlags.InformEnabled);
_path = null; _path = null;
Creature cOwner = owner.ToCreature(); Creature cOwner = owner.ToCreature();
if (cOwner != null) if (cOwner != null)
@@ -184,8 +189,6 @@ namespace Game.Movement
if (cOwner) if (cOwner)
cOwner.SetCannotReachTarget(false); cOwner.SetCannotReachTarget(false);
owner.AddUnitState(UnitState.ChaseMove);
bool walk = false; bool walk = false;
if (cOwner && !cOwner.IsPet()) if (cOwner && !cOwner.IsPet())
{ {
@@ -202,11 +205,13 @@ namespace Game.Movement
} }
} }
owner.AddUnitState(UnitState.ChaseMove);
AddFlag(MovementGeneratorFlags.InformEnabled);
MoveSplineInit init = new(owner); MoveSplineInit init = new(owner);
init.MovebyPath(_path.GetPath()); init.MovebyPath(_path.GetPath());
init.SetWalk(walk); init.SetWalk(walk);
init.SetFacing(target); init.SetFacing(target);
init.Launch(); init.Launch();
} }
} }
@@ -218,6 +223,7 @@ namespace Game.Movement
public override void Deactivate(Unit owner) public override void Deactivate(Unit owner)
{ {
AddFlag(MovementGeneratorFlags.Deactivated); AddFlag(MovementGeneratorFlags.Deactivated);
RemoveFlag(MovementGeneratorFlags.Transitory | MovementGeneratorFlags.InformEnabled);
owner.ClearUnitState(UnitState.ChaseMove); owner.ClearUnitState(UnitState.ChaseMove);
Creature cOwner = owner.ToCreature(); Creature cOwner = owner.ToCreature();
if (cOwner != null) if (cOwner != null)
@@ -24,7 +24,7 @@ namespace Game.Movement
{ {
public class FollowMovementGenerator : MovementGenerator public class FollowMovementGenerator : MovementGenerator
{ {
static int CHECK_INTERVAL = 250; static int CHECK_INTERVAL = 100;
static float FOLLOW_RANGE_TOLERANCE = 1.0f; static float FOLLOW_RANGE_TOLERANCE = 1.0f;
float _range; float _range;