From 39b76cfbc2022b9ba21786d235927fa3bbdf04eb Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 4 Mar 2023 14:57:17 +0100 Subject: Core/Movement: Allow specifying timeout for follow movement --- src/server/game/Movement/MotionMaster.cpp | 6 +++--- src/server/game/Movement/MotionMaster.h | 2 +- .../MovementGenerators/FollowMovementGenerator.cpp | 16 +++++++++++++++- .../MovementGenerators/FollowMovementGenerator.h | 3 ++- src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp | 2 +- src/server/scripts/Kalimdor/Firelands/firelands.cpp | 2 +- .../Northrend/IcecrownCitadel/boss_sister_svalna.cpp | 4 ++-- 7 files changed, 25 insertions(+), 10 deletions(-) (limited to 'src') 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 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 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 dist, Optional 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 duration = {}); - void MoveFollow(Unit* target, float dist, ChaseAngle angle, MovementSlot slot = MOTION_SLOT_ACTIVE); + void MoveFollow(Unit* target, float dist, ChaseAngle angle, Optional duration = {}, MovementSlot slot = MOTION_SLOT_ACTIVE); void MoveChase(Unit* target, Optional dist = {}, Optional 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 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 duration); ~FollowMovementGenerator(); void Initialize(Unit*) override; @@ -54,6 +54,7 @@ class FollowMovementGenerator : public MovementGenerator, public AbstractFollowe ChaseAngle const _angle; TimeTracker _checkTimer; + Optional _duration; std::unique_ptr _path; Optional _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(); -- cgit v1.2.3