From d5281ebe14c19ca7a8136598e3554b7f75d0959a Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 22 Feb 2022 13:38:35 -0500 Subject: [PATCH] Core/Movement: modify MovementInform trigger condition & checks in ChaseMovementGenerator Port From (https://github.com/TrinityCore/TrinityCore/commit/b9bb07de03a7b413aef5d0ebc88428cee1577559) --- .../Generators/ChaseMovementGenerator.cs | 46 +++++++++++-------- .../Generators/FollowMovementGenerator.cs | 2 +- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs index b7cf6c335..e051ac3bc 100644 --- a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs +++ b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs @@ -24,14 +24,14 @@ namespace Game.Movement { 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; ChaseAngle? _angle; PathGenerator _path; Position _lastTargetPosition; - uint _rangeCheckTimer = RANGE_CHECK_INTERVAL; + TimeTrackerSmall _rangeCheckTimer; bool _movingTowards = true; bool _mutualChase = true; @@ -47,12 +47,14 @@ namespace Game.Movement Priority = MovementGeneratorPriority.Normal; Flags = MovementGeneratorFlags.InitializationPending; BaseUnitState = UnitState.Chase; + + _rangeCheckTimer = new(RANGE_CHECK_INTERVAL); } public override void Initialize(Unit owner) { RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Deactivated); - AddFlag(MovementGeneratorFlags.Initialized); + AddFlag(MovementGeneratorFlags.Initialized | MovementGeneratorFlags.InformEnabled); _path = null; _lastTargetPosition = null; @@ -94,28 +96,31 @@ namespace Game.Movement float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum; ChaseAngle? angle = mutualChase ? null : _angle; - // if we're already moving, periodically check if we're already in the expected range... - if (owner.HasUnitState(UnitState.ChaseMove)) + // periodically check if we're already in the expected range... + _rangeCheckTimer.Update((int)diff); + if (_rangeCheckTimer.Passed()) { - if (_rangeCheckTimer > diff) - _rangeCheckTimer -= diff; - else + _rangeCheckTimer.Reset(RANGE_CHECK_INTERVAL); + if (HasFlag(MovementGeneratorFlags.InformEnabled) && PositionOkay(owner, target, _movingTowards ? null : minTarget, _movingTowards ? maxTarget : null, angle)) { - _rangeCheckTimer = RANGE_CHECK_INTERVAL; - if (PositionOkay(owner, target, _movingTowards ? null : minTarget, _movingTowards ? maxTarget : null, angle)) - { - _path = null; - owner.StopMoving(); - owner.SetInFront(target); - DoMovementInform(owner, target); - return true; - } + RemoveFlag(MovementGeneratorFlags.InformEnabled); + _path = null; + + Creature cOwner = owner.ToCreature(); + if (cOwner != null) + cOwner.SetCannotReachTarget(false); + + owner.StopMoving(); + owner.SetInFront(target); + DoMovementInform(owner, target); + return true; } } // if we're done moving, we want to clean up if (owner.HasUnitState(UnitState.ChaseMove) && owner.MoveSpline.Finalized()) { + RemoveFlag(MovementGeneratorFlags.InformEnabled); _path = null; Creature cOwner = owner.ToCreature(); if (cOwner != null) @@ -184,8 +189,6 @@ namespace Game.Movement if (cOwner) cOwner.SetCannotReachTarget(false); - owner.AddUnitState(UnitState.ChaseMove); - bool walk = false; if (cOwner && !cOwner.IsPet()) { @@ -202,11 +205,13 @@ namespace Game.Movement } } + owner.AddUnitState(UnitState.ChaseMove); + AddFlag(MovementGeneratorFlags.InformEnabled); + MoveSplineInit init = new(owner); init.MovebyPath(_path.GetPath()); init.SetWalk(walk); init.SetFacing(target); - init.Launch(); } } @@ -218,6 +223,7 @@ namespace Game.Movement public override void Deactivate(Unit owner) { AddFlag(MovementGeneratorFlags.Deactivated); + RemoveFlag(MovementGeneratorFlags.Transitory | MovementGeneratorFlags.InformEnabled); owner.ClearUnitState(UnitState.ChaseMove); Creature cOwner = owner.ToCreature(); if (cOwner != null) diff --git a/Source/Game/Movement/Generators/FollowMovementGenerator.cs b/Source/Game/Movement/Generators/FollowMovementGenerator.cs index cf8da54ce..3dc7c2e60 100644 --- a/Source/Game/Movement/Generators/FollowMovementGenerator.cs +++ b/Source/Game/Movement/Generators/FollowMovementGenerator.cs @@ -24,7 +24,7 @@ namespace Game.Movement { public class FollowMovementGenerator : MovementGenerator { - static int CHECK_INTERVAL = 250; + static int CHECK_INTERVAL = 100; static float FOLLOW_RANGE_TOLERANCE = 1.0f; float _range;