mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 18:36:31 +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());
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user