Core/Movement: modify MovementInform trigger condition & checks in ChaseMovementGenerator
Port From (https://github.com/TrinityCore/TrinityCore/commit/b9bb07de03a7b413aef5d0ebc88428cee1577559)
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user