Core/Movement: Allow specifying timeout for follow movement
Port From (https://github.com/TrinityCore/TrinityCore/commit/39b76cfbc2022b9ba21786d235927fa3bbdf04eb)
This commit is contained in:
@@ -17,12 +17,13 @@ namespace Game.Movement
|
|||||||
ChaseAngle _angle;
|
ChaseAngle _angle;
|
||||||
|
|
||||||
TimeTracker _checkTimer;
|
TimeTracker _checkTimer;
|
||||||
|
TimeTracker _duration;
|
||||||
PathGenerator _path;
|
PathGenerator _path;
|
||||||
Position _lastTargetPosition;
|
Position _lastTargetPosition;
|
||||||
|
|
||||||
AbstractFollower _abstractFollower;
|
AbstractFollower _abstractFollower;
|
||||||
|
|
||||||
public FollowMovementGenerator(Unit target, float range, ChaseAngle angle)
|
public FollowMovementGenerator(Unit target, float range, ChaseAngle angle, TimeSpan? duration)
|
||||||
{
|
{
|
||||||
_abstractFollower = new AbstractFollower(target);
|
_abstractFollower = new AbstractFollower(target);
|
||||||
_range = range;
|
_range = range;
|
||||||
@@ -33,6 +34,9 @@ namespace Game.Movement
|
|||||||
Flags = MovementGeneratorFlags.InitializationPending;
|
Flags = MovementGeneratorFlags.InitializationPending;
|
||||||
BaseUnitState = UnitState.Follow;
|
BaseUnitState = UnitState.Follow;
|
||||||
|
|
||||||
|
if (duration.HasValue)
|
||||||
|
_duration = new(duration.Value);
|
||||||
|
|
||||||
_checkTimer = new(CHECK_INTERVAL);
|
_checkTimer = new(CHECK_INTERVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,6 +68,17 @@ namespace Game.Movement
|
|||||||
if (target == null || !target.IsInWorld)
|
if (target == null || !target.IsInWorld)
|
||||||
return false;
|
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())
|
if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting())
|
||||||
{
|
{
|
||||||
_path = null;
|
_path = null;
|
||||||
|
|||||||
@@ -542,7 +542,7 @@ namespace Game.Movement
|
|||||||
if (target == null)
|
if (target == null)
|
||||||
Add(new HomeMovementGenerator<Creature>());
|
Add(new HomeMovementGenerator<Creature>());
|
||||||
else
|
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)
|
public void MoveRandom(float wanderDistance = 0.0f, TimeSpan? duration = null)
|
||||||
@@ -551,15 +551,15 @@ namespace Game.Movement
|
|||||||
Add(new RandomMovementGenerator(wanderDistance, duration), MovementSlot.Default);
|
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
|
// Ignore movement request if target not exist
|
||||||
if (!target || target == _owner)
|
if (!target || target == _owner)
|
||||||
return;
|
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)); }
|
public void MoveChase(Unit target, float dist, float angle = 0.0f) { MoveChase(target, new ChaseRange(dist), new ChaseAngle(angle)); }
|
||||||
|
|||||||
Reference in New Issue
Block a user