mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Movement: Allow specifying timeout for follow movement
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)); }
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user