diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.h | 1 |
4 files changed, 24 insertions, 0 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index bbe4e973e27..329ff633801 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12679,6 +12679,23 @@ void Unit::SetFacingToObject(WorldObject const* object, bool force) init.Launch(); } +void Unit::SetFacingToPoint(Position const& point, bool force) +{ + // do not face when already moving + if (!force && (!IsStopped() || !movespline->Finalized())) + return; + + /// @todo figure out under what conditions creature will move towards object instead of facing it where it currently is. + Movement::MoveSplineInit init(this); + init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false); + if (GetTransport()) + init.DisableTransportPathTransformations(); // It makes no sense to target global orientation + init.SetFacing(point.GetPositionX(), point.GetPositionY(), point.GetPositionZ()); + + //GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_FACE, MOTION_PRIORITY_HIGHEST); + init.Launch(); +} + bool Unit::SetWalk(bool enable) { if (enable == IsWalking()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 0d831aa45f3..79b3a07c5e8 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1248,6 +1248,7 @@ class TC_GAME_API Unit : public WorldObject void SetInFront(WorldObject const* target); void SetFacingTo(float const ori, bool force = true); void SetFacingToObject(WorldObject const* object, bool force = true); + void SetFacingToPoint(Position const& point, bool force = true); bool IsAlive() const { return (m_deathState == ALIVE); } bool isDying() const { return (m_deathState == JUST_DIED); } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index fbbdc22c8d0..56d6951760c 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -220,6 +220,11 @@ namespace Movement args.facing.type = MONSTER_MOVE_FACING_SPOT; } + void MoveSplineInit::SetFacing(float x, float y, float z) + { + SetFacing({ x, y, z }); + } + void MoveSplineInit::SetFacing(Unit const* target) { args.facing.angle = unit->GetAbsoluteAngle(target); diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 7145d9fcc65..eda06366387 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -87,6 +87,7 @@ namespace Movement */ void SetFacing(float angle); void SetFacing(Vector3 const& point); + void SetFacing(float x, float y, float z); void SetFacing(Unit const* target); /* Initializes movement by path |