Core/Movement: Allow specifying timeout for follow movement

This commit is contained in:
Shauren
2023-03-04 14:57:17 +01:00
parent 1baa2f4f39
commit 39b76cfbc2
7 changed files with 25 additions and 10 deletions

View File

@@ -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)

View File

@@ -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)); }

View File

@@ -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;

View File

@@ -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;
};

View File

@@ -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

View File

@@ -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
{

View File

@@ -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();