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

ref #24552
This commit is contained in:
ccrs
2020-05-03 16:53:21 +02:00
parent 829cf38c67
commit de832b6980
2 changed files with 18 additions and 23 deletions

View File

@@ -35,7 +35,7 @@ static void DoMovementInform(Unit* owner, Unit* target)
AI->MovementInform(FOLLOW_MOTION_TYPE, target->GetGUID().GetCounter());
}
FollowMovementGenerator::FollowMovementGenerator(Unit* target, float range, ChaseAngle angle) : AbstractFollower(ASSERT_NOTNULL(target)), _range(range), _angle(angle)
FollowMovementGenerator::FollowMovementGenerator(Unit* target, float range, ChaseAngle angle) : AbstractFollower(ASSERT_NOTNULL(target)), _range(range), _angle(angle), _checkTimer(CHECK_INTERVAL)
{
Mode = MOTION_MODE_DEFAULT;
Priority = MOTION_PRIORITY_NORMAL;
@@ -55,7 +55,7 @@ static bool PositionOkay(Unit* owner, Unit* target, float range, Optional<ChaseA
void FollowMovementGenerator::Initialize(Unit* owner)
{
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
owner->StopMoving();
UpdatePetSpeed(owner);
@@ -83,35 +83,27 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
{
_path = nullptr;
owner->StopMoving();
_lastTargetPosition.reset();
return true;
}
if (owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE))
_checkTimer.Update(diff);
if (_checkTimer.Passed())
{
if (_checkTimer > diff)
_checkTimer -= diff;
else
_checkTimer.Reset(CHECK_INTERVAL);
if (HasFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED) && PositionOkay(owner, target, _range, _angle))
{
_checkTimer = CHECK_INTERVAL;
if (PositionOkay(owner, target, _range, _angle))
{
_path = nullptr;
owner->StopMoving();
DoMovementInform(owner, target);
return true;
}
RemoveFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
_path = nullptr;
owner->StopMoving();
_lastTargetPosition.reset();
DoMovementInform(owner, target);
return true;
}
}
if (owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE) && owner->movespline->Finalized())
{
_path = nullptr;
owner->ClearUnitState(UNIT_STATE_FOLLOW_MOVE);
DoMovementInform(owner, target);
}
if (!_lastTargetPosition || _lastTargetPosition->GetExactDistSq(target->GetPosition()) > 0.0f)
{
_lastTargetPosition = target->GetPosition();
@@ -158,6 +150,7 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
}
owner->AddUnitState(UNIT_STATE_FOLLOW_MOVE);
AddFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
Movement::MoveSplineInit init(owner);
init.MovebyPath(_path->GetPath());
@@ -172,6 +165,7 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
void FollowMovementGenerator::Deactivate(Unit* owner)
{
AddFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
owner->ClearUnitState(UNIT_STATE_FOLLOW_MOVE);
}

View File

@@ -23,6 +23,7 @@
#include "MovementGenerator.h"
#include "Optional.h"
#include "Position.h"
#include "Timer.h"
class PathGenerator;
class Unit;
@@ -45,14 +46,14 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe
void UnitSpeedChanged() override { _lastTargetPosition.reset(); }
private:
static constexpr uint32 CHECK_INTERVAL = 500;
static constexpr uint32 CHECK_INTERVAL = 250;
void UpdatePetSpeed(Unit* owner);
float const _range;
ChaseAngle const _angle;
uint32 _checkTimer = CHECK_INTERVAL;
TimeTrackerSmall _checkTimer;
std::unique_ptr<PathGenerator> _path;
Optional<Position> _lastTargetPosition;
};