From c6d6ece1c7a450145598d5ac3c83b399cc731ee9 Mon Sep 17 00:00:00 2001 From: Kittnz Date: Sat, 23 Dec 2017 16:12:24 +0100 Subject: Core/Movement: Add MovePoint with facing (#20779) (cherry picked from commit cd88406de9467127e988e4b0f7e2ba0ec787636b) --- src/server/game/Movement/MotionMaster.cpp | 6 +++--- src/server/game/Movement/MotionMaster.h | 7 ++++--- .../game/Movement/MovementGenerators/PointMovementGenerator.cpp | 3 +++ .../game/Movement/MovementGenerators/PointMovementGenerator.h | 5 ++++- 4 files changed, 14 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 939a60d575f..210658b9210 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -317,18 +317,18 @@ void MotionMaster::MoveFleeing(Unit* enemy, uint32 time) } } -void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generatePath) +void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generatePath, Optional finalOrient) { if (_owner->GetTypeId() == TYPEID_PLAYER) { TC_LOG_DEBUG("misc", "Player (%s) targeted point (Id: %u X: %f Y: %f Z: %f).", _owner->GetGUID().ToString().c_str(), id, x, y, z); - Mutate(new PointMovementGenerator(id, x, y, z, generatePath), MOTION_SLOT_ACTIVE); + Mutate(new PointMovementGenerator(id, x, y, z, generatePath, 0.0f, nullptr, nullptr, finalOrient), MOTION_SLOT_ACTIVE); } else { TC_LOG_DEBUG("misc", "Creature (Entry: %u %s) targeted point (ID: %u X: %f Y: %f Z: %f).", _owner->GetEntry(), _owner->GetGUID().ToString().c_str(), id, x, y, z); - Mutate(new PointMovementGenerator(id, x, y, z, generatePath), MOTION_SLOT_ACTIVE); + Mutate(new PointMovementGenerator(id, x, y, z, generatePath, 0.0f, nullptr, nullptr, finalOrient), MOTION_SLOT_ACTIVE); } } diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 87700c6aec1..79050edadd5 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -21,6 +21,7 @@ #include "Common.h" #include "Errors.h" #include "ObjectGuid.h" +#include "Optional.h" #include "Position.h" #include "SharedDefines.h" #include @@ -139,11 +140,11 @@ class TC_GAME_API MotionMaster void MoveChase(Unit* target, float dist = 0.0f, float angle = 0.0f); void MoveConfused(); void MoveFleeing(Unit* enemy, uint32 time = 0); - void MovePoint(uint32 id, Position const& pos, bool generatePath = true) + void MovePoint(uint32 id, Position const& pos, bool generatePath = true, Optional finalOrient = {}) { - MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath); + MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath, finalOrient); } - void MovePoint(uint32 id, float x, float y, float z, bool generatePath = true); + void MovePoint(uint32 id, float x, float y, float z, bool generatePath = true, Optional finalOrient = {}); /* Makes the unit move toward the target until it is at a certain distance from it. The unit then stops. Only works in 2D. diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index 0a6b1e7ffe0..5a75ba7340c 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -54,6 +54,9 @@ void PointMovementGenerator::DoInitialize(T* owner) init.SetFacing(i_faceTarget); if (i_spellEffectExtra) init.SetSpellEffectExtraData(*i_spellEffectExtra); + if (_finalOrient) + init.SetFacing(*_finalOrient); + init.Launch(); // Call for creature group update diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h index 4f5bcbc6e17..47570092744 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h @@ -19,6 +19,7 @@ #define TRINITY_POINTMOVEMENTGENERATOR_H #include "MovementGenerator.h" +#include "Optional.h" class Creature; namespace Movement @@ -30,7 +31,7 @@ template class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementGenerator > { public: - explicit PointMovementGenerator(uint32 id, float x, float y, float z, bool generatePath, float speed = 0.0f, Unit const* faceTarget = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr) : _movementId(id), _destination(x, y, z), _speed(speed), i_faceTarget(faceTarget), i_spellEffectExtra(spellEffectExtraData), _generatePath(generatePath), _recalculateSpeed(false), _interrupt(false) { } + explicit PointMovementGenerator(uint32 id, float x, float y, float z, bool generatePath, float speed = 0.0f, Unit const* faceTarget = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr, Optional finalOrient = {}) : _movementId(id), _destination(x, y, z), _speed(speed), i_faceTarget(faceTarget), i_spellEffectExtra(spellEffectExtraData), _generatePath(generatePath), _recalculateSpeed(false), _interrupt(false), _finalOrient(finalOrient) { } MovementGeneratorType GetMovementGeneratorType() const override { return POINT_MOTION_TYPE; } @@ -52,6 +53,8 @@ class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementG bool _generatePath; bool _recalculateSpeed; bool _interrupt; + //! if set then unit will turn to specified _orient in provided _pos + Optional _finalOrient; }; class AssistanceMovementGenerator : public PointMovementGenerator -- cgit v1.2.3