aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-03-04 14:57:17 +0100
committerShauren <shauren.trinity@gmail.com>2023-03-04 14:57:17 +0100
commit39b76cfbc2022b9ba21786d235927fa3bbdf04eb (patch)
tree68b05079944d8fd0fa27d7a5ce9f018e5c504537 /src
parent1baa2f4f3993e7269f72fd143bea36d1a7ffd9f8 (diff)
Core/Movement: Allow specifying timeout for follow movement
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Movement/MotionMaster.cpp6
-rw-r--r--src/server/game/Movement/MotionMaster.h2
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp16
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.h3
-rw-r--r--src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp2
-rw-r--r--src/server/scripts/Kalimdor/Firelands/firelands.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp4
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();