aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp17
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp5
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h1
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