Skip to content

Commit 17ecef7

Browse files
sogladevkillerwife
andauthored
fix(Core/Movement): followers match their target's motion speed (azerothcore#25085)
Co-authored-by: killerwife <killerwife@gmail.com>
1 parent e8d98df commit 17ecef7

File tree

5 files changed

+51
-35
lines changed

5 files changed

+51
-35
lines changed

src/server/game/Entities/Object/Object.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,30 @@ std::string Object::GetDebugInfo() const
995995
return sstr.str();
996996
}
997997

998+
UnitMoveType MovementInfo::GetSpeedType(uint32 moveFlags)
999+
{
1000+
if (moveFlags & MOVEMENTFLAG_FLYING)
1001+
{
1002+
if (moveFlags & MOVEMENTFLAG_BACKWARD)
1003+
return MOVE_FLIGHT_BACK;
1004+
1005+
return MOVE_FLIGHT;
1006+
}
1007+
else if (moveFlags & MOVEMENTFLAG_SWIMMING)
1008+
{
1009+
if (moveFlags & MOVEMENTFLAG_BACKWARD)
1010+
return MOVE_SWIM_BACK;
1011+
1012+
return MOVE_SWIM;
1013+
}
1014+
else if (moveFlags & MOVEMENTFLAG_WALKING)
1015+
return MOVE_WALK;
1016+
else if (moveFlags & MOVEMENTFLAG_BACKWARD)
1017+
return MOVE_RUN_BACK;
1018+
1019+
return MOVE_RUN;
1020+
}
1021+
9981022
void MovementInfo::OutDebug()
9991023
{
10001024
LOG_INFO("movement", "MOVEMENT INFO");

src/server/game/Entities/Object/Object.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "ObjectGuid.h"
3232
#include "Optional.h"
3333
#include "Position.h"
34+
#include "UnitDefines.h"
3435
#include "UpdateData.h"
3536
#include "UpdateMask.h"
3637
#include "ObjectVisibilityContainer.h"
@@ -344,6 +345,9 @@ struct MovementInfo
344345
void RemoveMovementFlag(uint32 flag) { flags &= ~flag; }
345346
[[nodiscard]] bool HasMovementFlag(uint32 flag) const { return flags & flag; }
346347

348+
[[nodiscard]] UnitMoveType GetSpeedType() const { return GetSpeedType(flags); }
349+
[[nodiscard]] static UnitMoveType GetSpeedType(uint32 moveFlags);
350+
347351
[[nodiscard]] uint16 GetExtraMovementFlags() const { return flags2; }
348352
void AddExtraMovementFlag(uint16 flag) { flags2 |= flag; }
349353
[[nodiscard]] bool HasExtraMovementFlag(uint16 flag) const { return flags2 & flag; }

src/server/game/Entities/Unit/UnitDefines.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
* with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717

18+
#ifndef ACORE_UNITDEFINES_H
19+
#define ACORE_UNITDEFINES_H
20+
1821
#include "Define.h"
1922
#include "EnumFlag.h"
2023

@@ -487,3 +490,5 @@ enum SplineType
487490
SPLINETYPE_FACING_TARGET = 3,
488491
SPLINETYPE_FACING_ANGLE = 4
489492
};
493+
494+
#endif // ACORE_UNITDEFINES_H

src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -430,20 +430,27 @@ void ChaseMovementGenerator<T>::MovementInform(T* owner)
430430

431431
//-----------------------------------------------//
432432

433+
static float GetTargetSpeedInMotion(Unit* target)
434+
{
435+
if (!target->movespline->Finalized())
436+
return target->movespline->Velocity();
437+
438+
return target->GetSpeed(target->m_movementInfo.GetSpeedType());
439+
}
440+
433441
static Optional<float> GetVelocity(Unit* owner, Unit* target, G3D::Vector3 const& dest, bool playerPet)
434442
{
435443
Optional<float> speed = {};
436-
if (!owner->IsInCombat() && !owner->IsVehicle() && !owner->HasUnitFlag(UNIT_FLAG_POSSESSED) &&
437-
(owner->IsPet() || owner->IsGuardian() || owner->GetGUID() == target->GetCritterGUID() || owner->GetCharmerOrOwnerGUID() == target->GetGUID()))
444+
if (owner->IsInCombat() || owner->IsVehicle() || owner->HasUnitFlag(UNIT_FLAG_POSSESSED))
445+
return speed;
446+
447+
bool isPetLike = owner->IsPet() || owner->IsGuardian() || owner->GetGUID() == target->GetCritterGUID() || owner->GetCharmerOrOwnerGUID() == target->GetGUID();
448+
449+
// For pets/guardians/critters or creature-to-creature follow: sync with target's speed
450+
if (isPetLike || (owner->IsCreature() && target->IsCreature()))
438451
{
439-
uint32 moveFlags = target->GetUnitMovementFlags();
440-
if (target->IsWalking())
441-
{
442-
moveFlags |= MOVEMENTFLAG_WALKING;
443-
}
452+
speed = GetTargetSpeedInMotion(target);
444453

445-
UnitMoveType moveType = Movement::SelectSpeedType(moveFlags);
446-
speed = target->GetSpeed(moveType);
447454
if (playerPet)
448455
{
449456
float distance = owner->GetDistance2d(dest.x, dest.y) - target->GetObjectSize() - (*speed / 2.f);
@@ -462,7 +469,7 @@ static Position const PredictPosition(Unit* target)
462469
{
463470
Position pos = target->GetPosition();
464471
// 0.5 - it's time (0.5 sec) between starting movement opcode (e.g. MSG_MOVE_START_FORWARD) and MSG_MOVE_HEARTBEAT sent by client
465-
float speed = target->GetSpeed(Movement::SelectSpeedType(target->GetUnitMovementFlags())) * 0.5f;
472+
float speed = target->GetSpeed(target->m_movementInfo.GetSpeedType()) * 0.5f;
466473
float orientation = target->GetOrientation();
467474

468475
if (target->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FORWARD))

src/server/game/Movement/Spline/MoveSplineInit.cpp

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,7 @@ namespace Movement
2929
{
3030
UnitMoveType SelectSpeedType(uint32 moveFlags)
3131
{
32-
if (moveFlags & MOVEMENTFLAG_FLYING)
33-
{
34-
if (moveFlags & MOVEMENTFLAG_BACKWARD /*&& speed_obj.flight >= speed_obj.flight_back*/)
35-
return MOVE_FLIGHT_BACK;
36-
else
37-
return MOVE_FLIGHT;
38-
}
39-
else if (moveFlags & MOVEMENTFLAG_SWIMMING)
40-
{
41-
if (moveFlags & MOVEMENTFLAG_BACKWARD /*&& speed_obj.swim >= speed_obj.swim_back*/)
42-
return MOVE_SWIM_BACK;
43-
else
44-
return MOVE_SWIM;
45-
}
46-
else if (moveFlags & MOVEMENTFLAG_WALKING)
47-
{
48-
//if (speed_obj.run > speed_obj.walk)
49-
return MOVE_WALK;
50-
}
51-
else if (moveFlags & MOVEMENTFLAG_BACKWARD /*&& speed_obj.run >= speed_obj.run_back*/)
52-
return MOVE_RUN_BACK;
53-
54-
// Flying creatures use MOVEMENTFLAG_CAN_FLY or MOVEMENTFLAG_DISABLE_GRAVITY
55-
// Run speed is their default flight speed.
56-
return MOVE_RUN;
32+
return MovementInfo::GetSpeedType(moveFlags);
5733
}
5834

5935
int32 MoveSplineInit::Launch()

0 commit comments

Comments
 (0)