Skip to content

Commit fa4d455

Browse files
ccrsShauren
authored andcommitted
Core/Movement: Move facing splines into MotionMaster
1 parent 76fe8ba commit fa4d455

6 files changed

Lines changed: 45 additions & 20 deletions

File tree

src/server/game/Entities/Unit/Unit.cpp

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13245,35 +13245,22 @@ void Unit::SetInFront(WorldObject const* target)
1324513245
SetOrientation(GetAbsoluteAngle(target));
1324613246
}
1324713247

13248-
void Unit::SetFacingTo(float ori, bool force)
13248+
void Unit::SetFacingTo(float ori, bool force /*= true*/, uint32 movementId /*= EVENT_FACE*/)
1324913249
{
1325013250
// do not face when already moving
1325113251
if (!force && (!IsStopped() || !movespline->Finalized()))
1325213252
return;
1325313253

13254-
Movement::MoveSplineInit init(this);
13255-
init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
13256-
if (HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && !GetTransGUID().IsEmpty())
13257-
init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
13258-
init.SetFacing(ori);
13259-
13260-
//GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_FACE, MOTION_PRIORITY_HIGHEST);
13261-
init.Launch();
13254+
GetMotionMaster()->MoveFace(ori, movementId);
1326213255
}
1326313256

13264-
void Unit::SetFacingToObject(WorldObject const* object, bool force)
13257+
void Unit::SetFacingToObject(WorldObject const* object, bool force /*= true*/, uint32 movementId /*= EVENT_FACE*/)
1326513258
{
1326613259
// do not face when already moving
1326713260
if (!force && (!IsStopped() || !movespline->Finalized()))
1326813261
return;
1326913262

13270-
/// @todo figure out under what conditions creature will move towards object instead of facing it where it currently is.
13271-
Movement::MoveSplineInit init(this);
13272-
init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
13273-
init.SetFacing(GetAbsoluteAngle(object)); // when on transport, GetAbsoluteAngle will still return global coordinates (and angle) that needs transforming
13274-
13275-
//GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_FACE, MOTION_PRIORITY_HIGHEST);
13276-
init.Launch();
13263+
GetMotionMaster()->MoveFace(object, movementId);
1327713264
}
1327813265

1327913266
bool Unit::SetWalk(bool enable)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,8 +1227,8 @@ class TC_GAME_API Unit : public WorldObject
12271227
bool SetHover(bool enable, bool updateAnimTier = true);
12281228

12291229
void SetInFront(WorldObject const* target);
1230-
void SetFacingTo(float const ori, bool force = true);
1231-
void SetFacingToObject(WorldObject const* object, bool force = true);
1230+
void SetFacingTo(float ori, bool force = true, uint32 movementId = EVENT_FACE);
1231+
void SetFacingToObject(WorldObject const* object, bool force = true, uint32 movementId = EVENT_FACE);
12321232

12331233
void BuildHeartBeatMsg(WorldPacket* data) const;
12341234

src/server/game/Movement/MotionMaster.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,37 @@ void MotionMaster::MoveFormation(Unit* leader, float range, float angle, uint32
10331033
}
10341034
}
10351035

1036+
void MotionMaster::MoveFace(float orientation, uint32 id /*= EVENT_FACE*/)
1037+
{
1038+
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFace: '{}', faces '{}'", _owner->GetGUID(), orientation);
1039+
1040+
std::function<void(Movement::MoveSplineInit&)> initializer = [owner = _owner, orientation](Movement::MoveSplineInit& init)
1041+
{
1042+
init.MoveTo(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), false);
1043+
if (owner->GetTransport())
1044+
init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
1045+
init.SetFacing(orientation);
1046+
};
1047+
1048+
Add(new ImmediateMovementGenerator(std::move(initializer), FACE_MOTION_TYPE, id));
1049+
}
1050+
1051+
void MotionMaster::MoveFace(WorldObject const* object, uint32 id /*= EVENT_FACE*/)
1052+
{
1053+
if (!object)
1054+
return;
1055+
1056+
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFace: '{}', faces '{}'", _owner->GetGUID(), object->GetGUID());
1057+
1058+
std::function<void(Movement::MoveSplineInit&)> initializer = [owner = _owner, object](Movement::MoveSplineInit& init)
1059+
{
1060+
init.MoveTo(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), false);
1061+
init.SetFacing(owner->GetAbsoluteAngle(object)); // when on transport, GetAbsoluteAngle will still return global coordinates (and angle) that needs transforming
1062+
};
1063+
1064+
Add(new ImmediateMovementGenerator(std::move(initializer), FACE_MOTION_TYPE, id));
1065+
}
1066+
10361067
void MotionMaster::LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id/*= 0*/, MovementGeneratorPriority priority/* = MOTION_PRIORITY_NORMAL*/, MovementGeneratorType type/*= EFFECT_MOTION_TYPE*/)
10371068
{
10381069
if (IsInvalidMovementGeneratorType(type))

src/server/game/Movement/MotionMaster.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
class PathGenerator;
3434
class Unit;
35+
class WorldObject;
3536
struct Position;
3637
struct SplineChainLink;
3738
struct SplineChainResumeInfo;
@@ -189,6 +190,8 @@ class TC_GAME_API MotionMaster
189190
void MovePath(WaypointPath& path, bool repeatable);
190191
void MoveRotate(uint32 id, uint32 time, RotateDirection direction);
191192
void MoveFormation(Unit* leader, float range, float angle, uint32 point1, uint32 point2);
193+
void MoveFace(float orientation, uint32 id = EVENT_FACE);
194+
void MoveFace(WorldObject const* object, uint32 id = EVENT_FACE);
192195

193196
void LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id = 0, MovementGeneratorPriority priority = MOTION_PRIORITY_NORMAL, MovementGeneratorType type = EFFECT_MOTION_TYPE);
194197
private:

src/server/game/Movement/MovementDefines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ enum MovementGeneratorType : uint8
4444
EFFECT_MOTION_TYPE = 16,
4545
SPLINE_CHAIN_MOTION_TYPE = 17, // SplineChainMovementGenerator.h
4646
FORMATION_MOTION_TYPE = 18, // FormationMovementGenerator.h
47+
FACE_MOTION_TYPE = 19,
4748
MAX_MOTION_TYPE // SKIP
4849
};
4950

src/server/game/Movement/enuminfo_MovementDefines.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ TC_API_EXPORT EnumText EnumUtils<MovementGeneratorType>::ToString(MovementGenera
5050
case EFFECT_MOTION_TYPE: return { "EFFECT_MOTION_TYPE", "EFFECT_MOTION_TYPE", "" };
5151
case SPLINE_CHAIN_MOTION_TYPE: return { "SPLINE_CHAIN_MOTION_TYPE", "SPLINE_CHAIN_MOTION_TYPE", "SplineChainMovementGenerator.h" };
5252
case FORMATION_MOTION_TYPE: return { "FORMATION_MOTION_TYPE", "FORMATION_MOTION_TYPE", "FormationMovementGenerator.h" };
53+
case FACE_MOTION_TYPE: return { "FACE_MOTION_TYPE", "FACE_MOTION_TYPE", "" };
5354
default: throw std::out_of_range("value");
5455
}
5556
}
5657

5758
template <>
58-
TC_API_EXPORT size_t EnumUtils<MovementGeneratorType>::Count() { return 19; }
59+
TC_API_EXPORT size_t EnumUtils<MovementGeneratorType>::Count() { return 20; }
5960

6061
template <>
6162
TC_API_EXPORT MovementGeneratorType EnumUtils<MovementGeneratorType>::FromIndex(size_t index)
@@ -81,6 +82,7 @@ TC_API_EXPORT MovementGeneratorType EnumUtils<MovementGeneratorType>::FromIndex(
8182
case 16: return EFFECT_MOTION_TYPE;
8283
case 17: return SPLINE_CHAIN_MOTION_TYPE;
8384
case 18: return FORMATION_MOTION_TYPE;
85+
case 19: return FACE_MOTION_TYPE;
8486
default: throw std::out_of_range("index");
8587
}
8688
}
@@ -109,6 +111,7 @@ TC_API_EXPORT size_t EnumUtils<MovementGeneratorType>::ToIndex(MovementGenerator
109111
case EFFECT_MOTION_TYPE: return 16;
110112
case SPLINE_CHAIN_MOTION_TYPE: return 17;
111113
case FORMATION_MOTION_TYPE: return 18;
114+
case FACE_MOTION_TYPE: return 19;
112115
default: throw std::out_of_range("value");
113116
}
114117
}

0 commit comments

Comments
 (0)