mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Movement: modify MovementInform trigger condition & checks in ChaseMovementGenerator
(cherry picked from commit ac12bd1391)
This commit is contained in:
@@ -60,8 +60,8 @@ static void DoMovementInform(Unit* owner, Unit* target)
|
||||
AI->MovementInform(CHASE_MOTION_TYPE, target->GetGUID().GetCounter());
|
||||
}
|
||||
|
||||
ChaseMovementGenerator::ChaseMovementGenerator(Unit *target, Optional<ChaseRange> range, Optional<ChaseAngle> angle)
|
||||
: AbstractFollower(ASSERT_NOTNULL(target)), _range(range), _angle(angle)
|
||||
ChaseMovementGenerator::ChaseMovementGenerator(Unit *target, Optional<ChaseRange> range, Optional<ChaseAngle> angle) : AbstractFollower(ASSERT_NOTNULL(target)), _range(range),
|
||||
_angle(angle), _rangeCheckTimer(RANGE_CHECK_INTERVAL)
|
||||
{
|
||||
Mode = MOTION_MODE_DEFAULT;
|
||||
Priority = MOTION_PRIORITY_NORMAL;
|
||||
@@ -73,7 +73,7 @@ ChaseMovementGenerator::~ChaseMovementGenerator() = default;
|
||||
void ChaseMovementGenerator::Initialize(Unit* /*owner*/)
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
|
||||
_path = nullptr;
|
||||
_lastTargetPosition.reset();
|
||||
@@ -107,36 +107,36 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool const mutualChase = IsMutualChase(owner, target);
|
||||
float const hitboxSum = owner->GetCombatReach() + target->GetCombatReach();
|
||||
float const minRange = _range ? _range->MinRange + hitboxSum : CONTACT_DISTANCE;
|
||||
float const minTarget = (_range ? _range->MinTolerance : 0.0f) + hitboxSum;
|
||||
float const maxRange = _range ? _range->MaxRange + hitboxSum : owner->GetMeleeRange(target); // melee range already includes hitboxes
|
||||
float const maxTarget = _range ? _range->MaxTolerance + hitboxSum : CONTACT_DISTANCE + hitboxSum;
|
||||
bool const mutualChase = IsMutualChase(owner, target);
|
||||
float const hitboxSum = owner->GetCombatReach() + target->GetCombatReach();
|
||||
float const minRange = _range ? _range->MinRange + hitboxSum : CONTACT_DISTANCE;
|
||||
float const minTarget = (_range ? _range->MinTolerance : 0.0f) + hitboxSum;
|
||||
float const maxRange = _range ? _range->MaxRange + hitboxSum : owner->GetMeleeRange(target); // melee range already includes hitboxes
|
||||
float const maxTarget = _range ? _range->MaxTolerance + hitboxSum : CONTACT_DISTANCE + hitboxSum;
|
||||
Optional<ChaseAngle> angle = mutualChase ? Optional<ChaseAngle>() : _angle;
|
||||
|
||||
// if we're already moving, periodically check if we're already in the expected range...
|
||||
if (owner->HasUnitState(UNIT_STATE_CHASE_MOVE))
|
||||
// periodically check if we're already in the expected range...
|
||||
_rangeCheckTimer.Update(diff);
|
||||
if (_rangeCheckTimer.Passed())
|
||||
{
|
||||
if (_rangeCheckTimer > diff)
|
||||
_rangeCheckTimer -= diff;
|
||||
else
|
||||
_rangeCheckTimer.Reset(RANGE_CHECK_INTERVAL);
|
||||
if (HasFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED) && PositionOkay(owner, target, _movingTowards ? Optional<float>() : minTarget, _movingTowards ? maxTarget : Optional<float>(), angle))
|
||||
{
|
||||
_rangeCheckTimer = RANGE_CHECK_INTERVAL;
|
||||
if (PositionOkay(owner, target, _movingTowards ? Optional<float>() : minTarget, _movingTowards ? maxTarget : Optional<float>(), angle))
|
||||
{
|
||||
_path = nullptr;
|
||||
owner->StopMoving();
|
||||
owner->SetInFront(target);
|
||||
DoMovementInform(owner, target);
|
||||
return true;
|
||||
}
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
_path = nullptr;
|
||||
if (Creature* cOwner = owner->ToCreature())
|
||||
cOwner->SetCannotReachTarget(false);
|
||||
owner->StopMoving();
|
||||
owner->SetInFront(target);
|
||||
DoMovementInform(owner, target);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// if we're done moving, we want to clean up
|
||||
if (owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && owner->movespline->Finalized())
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
_path = nullptr;
|
||||
if (Creature* cOwner = owner->ToCreature())
|
||||
cOwner->SetCannotReachTarget(false);
|
||||
@@ -203,8 +203,6 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
if (cOwner)
|
||||
cOwner->SetCannotReachTarget(false);
|
||||
|
||||
owner->AddUnitState(UNIT_STATE_CHASE_MOVE);
|
||||
|
||||
bool walk = false;
|
||||
if (cOwner && !cOwner->IsPet())
|
||||
{
|
||||
@@ -221,11 +219,13 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
}
|
||||
}
|
||||
|
||||
owner->AddUnitState(UNIT_STATE_CHASE_MOVE);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
|
||||
Movement::MoveSplineInit init(owner);
|
||||
init.MovebyPath(_path->GetPath());
|
||||
init.SetWalk(walk);
|
||||
init.SetFacing(target);
|
||||
|
||||
init.Launch();
|
||||
}
|
||||
}
|
||||
@@ -237,6 +237,7 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
void ChaseMovementGenerator::Deactivate(Unit* owner)
|
||||
{
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
owner->ClearUnitState(UNIT_STATE_CHASE_MOVE);
|
||||
if (Creature* cOwner = owner->ToCreature())
|
||||
cOwner->SetCannotReachTarget(false);
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "MovementGenerator.h"
|
||||
#include "Optional.h"
|
||||
#include "Position.h"
|
||||
#include "Timer.h"
|
||||
|
||||
class PathGenerator;
|
||||
class Unit;
|
||||
@@ -50,7 +51,7 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower
|
||||
|
||||
std::unique_ptr<PathGenerator> _path;
|
||||
Optional<Position> _lastTargetPosition;
|
||||
uint32 _rangeCheckTimer = RANGE_CHECK_INTERVAL;
|
||||
TimeTrackerSmall _rangeCheckTimer;
|
||||
bool _movingTowards = true;
|
||||
bool _mutualChase = true;
|
||||
};
|
||||
|
||||
@@ -46,7 +46,7 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe
|
||||
void UnitSpeedChanged() override { _lastTargetPosition.reset(); }
|
||||
|
||||
private:
|
||||
static constexpr uint32 CHECK_INTERVAL = 250;
|
||||
static constexpr uint32 CHECK_INTERVAL = 100;
|
||||
|
||||
void UpdatePetSpeed(Unit* owner);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user