aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorccrs <ccrs@users.noreply.github.com>2020-05-03 17:20:37 +0200
committerccrs <ccrs@users.noreply.github.com>2020-05-03 17:20:37 +0200
commitac12bd1391933077e5ad2fa58c7026019853159a (patch)
tree26e622a2f27989681e169291038961739675ea1a
parent2284790d31fd50dedc84fba97725bd7477c5165d (diff)
Core/Movement: modify MovementInform trigger condition & checks in ChaseMovementGenerator
-rw-r--r--src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp53
-rw-r--r--src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h3
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h2
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);