mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 15:40:45 +01:00
Core/Movement: modify MovementInform trigger condition & checks in FollowMovementGenerator
ref #24552
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user