From 888ed91c824420f318fd8dbf9188be519b832242 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 13 Mar 2023 03:20:01 -0400 Subject: [PATCH] Core/Movement: Allow specifying timeout for follow movement Port From (https://github.com/TrinityCore/TrinityCore/commit/39b76cfbc2022b9ba21786d235927fa3bbdf04eb) --- .../Generators/FollowMovementGenerator.cs | 17 ++++++++++++++++- Source/Game/Movement/MotionMaster.cs | 8 ++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Source/Game/Movement/Generators/FollowMovementGenerator.cs b/Source/Game/Movement/Generators/FollowMovementGenerator.cs index d8c40562f..833541fe5 100644 --- a/Source/Game/Movement/Generators/FollowMovementGenerator.cs +++ b/Source/Game/Movement/Generators/FollowMovementGenerator.cs @@ -17,12 +17,13 @@ namespace Game.Movement ChaseAngle _angle; TimeTracker _checkTimer; + TimeTracker _duration; PathGenerator _path; Position _lastTargetPosition; AbstractFollower _abstractFollower; - public FollowMovementGenerator(Unit target, float range, ChaseAngle angle) + public FollowMovementGenerator(Unit target, float range, ChaseAngle angle, TimeSpan? duration) { _abstractFollower = new AbstractFollower(target); _range = range; @@ -33,6 +34,9 @@ namespace Game.Movement Flags = MovementGeneratorFlags.InitializationPending; BaseUnitState = UnitState.Follow; + if (duration.HasValue) + _duration = new(duration.Value); + _checkTimer = new(CHECK_INTERVAL); } @@ -64,6 +68,17 @@ namespace Game.Movement if (target == null || !target.IsInWorld) return false; + if (_duration != null) + { + _duration.Update(diff); + if (_duration.Passed()) + { + owner.StopMoving(); + DoMovementInform(owner, target); + return false; + } + } + if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) { _path = null; diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index f160d8457..84f85b3a5 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -542,7 +542,7 @@ namespace Game.Movement if (target == null) Add(new HomeMovementGenerator()); else - Add(new FollowMovementGenerator(target, SharedConst.PetFollowDist, new ChaseAngle(SharedConst.PetFollowAngle))); + Add(new FollowMovementGenerator(target, SharedConst.PetFollowDist, new ChaseAngle(SharedConst.PetFollowAngle), null)); } public void MoveRandom(float wanderDistance = 0.0f, TimeSpan? duration = null) @@ -551,15 +551,15 @@ namespace Game.Movement Add(new RandomMovementGenerator(wanderDistance, duration), MovementSlot.Default); } - public void MoveFollow(Unit target, float dist, float angle = 0.0f, MovementSlot slot = MovementSlot.Active) { MoveFollow(target, dist, new ChaseAngle(angle), slot); } + public void MoveFollow(Unit target, float dist, float angle = 0.0f, TimeSpan? duration = null, MovementSlot slot = MovementSlot.Active) { MoveFollow(target, dist, new ChaseAngle(angle), duration, slot); } - public void MoveFollow(Unit target, float dist, ChaseAngle angle, MovementSlot slot = MovementSlot.Active) + public void MoveFollow(Unit target, float dist, ChaseAngle angle, TimeSpan? duration = null, MovementSlot slot = MovementSlot.Active) { // Ignore movement request if target not exist if (!target || target == _owner) return; - Add(new FollowMovementGenerator(target, dist, angle), slot); + Add(new FollowMovementGenerator(target, dist, angle, duration), slot); } public void MoveChase(Unit target, float dist, float angle = 0.0f) { MoveChase(target, new ChaseRange(dist), new ChaseAngle(angle)); }