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

View File

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