diff options
author | ccrs <ccrs@users.noreply.github.com> | 2020-05-03 17:20:37 +0200 |
---|---|---|
committer | ccrs <ccrs@users.noreply.github.com> | 2020-05-03 17:20:37 +0200 |
commit | ac12bd1391933077e5ad2fa58c7026019853159a (patch) | |
tree | 26e622a2f27989681e169291038961739675ea1a | |
parent | 2284790d31fd50dedc84fba97725bd7477c5165d (diff) |
Core/Movement: modify MovementInform trigger condition & checks in ChaseMovementGenerator
3 files changed, 30 insertions, 28 deletions
diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp index 9cd58ee0f82..056da0f5a5a 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp @@ -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); diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h index 2019d8f36e2..5c08a01965d 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h @@ -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; }; diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h index 7cd0fa3fcd3..e3661cef014 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h @@ -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); |