diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-03-04 14:57:17 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-03-04 14:57:17 +0100 |
commit | 39b76cfbc2022b9ba21786d235927fa3bbdf04eb (patch) | |
tree | 68b05079944d8fd0fa27d7a5ce9f018e5c504537 /src | |
parent | 1baa2f4f3993e7269f72fd143bea36d1a7ffd9f8 (diff) |
Core/Movement: Allow specifying timeout for follow movement
Diffstat (limited to 'src')
7 files changed, 25 insertions, 10 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 86f88038035..b2bd73830ec 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -592,7 +592,7 @@ void MotionMaster::MoveTargetedHome() else { TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveTargetedHome: '{}', starts following '{}'", _owner->GetGUID().ToString(), target->GetGUID().ToString()); - Add(new FollowMovementGenerator(target, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE)); + Add(new FollowMovementGenerator(target, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE, {})); } } @@ -605,14 +605,14 @@ void MotionMaster::MoveRandom(float wanderDistance, Optional<Milliseconds> durat } } -void MotionMaster::MoveFollow(Unit* target, float dist, ChaseAngle angle, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/) +void MotionMaster::MoveFollow(Unit* target, float dist, ChaseAngle angle, Optional<Milliseconds> duration /*= {}*/, MovementSlot slot/* = MOTION_SLOT_ACTIVE*/) { // Ignore movement request if target not exist if (!target || target == _owner) return; TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFollow: '{}', starts following '{}'", _owner->GetGUID().ToString(), target->GetGUID().ToString()); - Add(new FollowMovementGenerator(target, dist, angle), slot); + Add(new FollowMovementGenerator(target, dist, angle, duration), slot); } void MotionMaster::MoveChase(Unit* target, Optional<ChaseRange> dist, Optional<ChaseAngle> angle) diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index d40b9bae518..1716fb1a589 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -156,7 +156,7 @@ class TC_GAME_API MotionMaster void MoveIdle(); void MoveTargetedHome(); void MoveRandom(float wanderDistance = 0.0f, Optional<Milliseconds> duration = {}); - void MoveFollow(Unit* target, float dist, ChaseAngle angle, MovementSlot slot = MOTION_SLOT_ACTIVE); + void MoveFollow(Unit* target, float dist, ChaseAngle angle, Optional<Milliseconds> duration = {}, MovementSlot slot = MOTION_SLOT_ACTIVE); void MoveChase(Unit* target, Optional<ChaseRange> dist = {}, Optional<ChaseAngle> angle = {}); void MoveChase(Unit* target, float dist, float angle) { MoveChase(target, ChaseRange(dist), ChaseAngle(angle)); } void MoveChase(Unit* target, float dist) { MoveChase(target, ChaseRange(dist)); } diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp index ee789dc97d1..8185b743e3b 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp @@ -35,12 +35,15 @@ 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), _checkTimer(CHECK_INTERVAL) +FollowMovementGenerator::FollowMovementGenerator(Unit* target, float range, ChaseAngle angle, Optional<Milliseconds> duration) + : AbstractFollower(ASSERT_NOTNULL(target)), _range(range), _angle(angle), _checkTimer(CHECK_INTERVAL) { Mode = MOTION_MODE_DEFAULT; Priority = MOTION_PRIORITY_NORMAL; Flags = MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING; BaseUnitState = UNIT_STATE_FOLLOW; + if (duration) + _duration.emplace(*duration); } FollowMovementGenerator::~FollowMovementGenerator() = default; @@ -81,6 +84,17 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff) if (!target || !target->IsInWorld()) return false; + if (_duration) + { + _duration->Update(diff); + if (_duration->Passed()) + { + owner->StopMoving(); + DoMovementInform(owner, target); + return false; + } + } + if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting()) { _path = nullptr; diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h index 455a3535921..27c3bd3bcf5 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h @@ -33,7 +33,7 @@ class Unit; class FollowMovementGenerator : public MovementGenerator, public AbstractFollower { public: - explicit FollowMovementGenerator(Unit* target, float range, ChaseAngle angle); + explicit FollowMovementGenerator(Unit* target, float range, ChaseAngle angle, Optional<Milliseconds> duration); ~FollowMovementGenerator(); void Initialize(Unit*) override; @@ -54,6 +54,7 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe ChaseAngle const _angle; TimeTracker _checkTimer; + Optional<TimeTracker> _duration; std::unique_ptr<PathGenerator> _path; Optional<Position> _lastTargetPosition; }; diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp index 41ca41d2a98..79caac8dbab 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -368,7 +368,7 @@ class npc_molten_barrage : public CreatureScript void AttackStart(Unit* target) override { if (target) - me->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_DEFAULT); + me->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, {}, MOTION_SLOT_DEFAULT); } void IsSummonedBy(WorldObject* /*summoner*/) override diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.cpp b/src/server/scripts/Kalimdor/Firelands/firelands.cpp index 3bb16bd696e..fb24dae1445 100644 --- a/src/server/scripts/Kalimdor/Firelands/firelands.cpp +++ b/src/server/scripts/Kalimdor/Firelands/firelands.cpp @@ -80,7 +80,7 @@ void firelands_bossAI::EnterEvadeMode(EvadeReason why) if (Unit* owner = me->GetCharmerOrOwner()) { me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), {}, MOTION_SLOT_ACTIVE); } else { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp index df5e2ac773c..6bed41e5cc0 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp @@ -834,7 +834,7 @@ public: me->SetReactState(REACT_DEFENSIVE); FollowAngle = me->GetAbsoluteAngle(crok) + me->GetOrientation(); FollowDist = me->GetDistance2d(crok); - me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_DEFAULT); + me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, {}, MOTION_SLOT_DEFAULT); } me->setActive(true); @@ -875,7 +875,7 @@ public: { me->GetMotionMaster()->Clear(); if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CROK_SCOURGEBANE))) - me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_DEFAULT); + me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, {}, MOTION_SLOT_DEFAULT); } Reset(); |