diff options
4 files changed, 23 insertions, 0 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 898e4841559..651efa7f940 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -505,6 +505,11 @@ void MotionMaster::MoveAlongSplineChain(uint32 pointId, SplineChain const& chain void MotionMaster::ResumeSplineChain(SplineChainResumeInfo const& info) { + if (info.Empty()) + { + TC_LOG_ERROR("misc", "MotionMaster::ResumeSplineChain: unit with entry %u tried to resume a spline chain from empty info.", _owner->GetEntry()); + return; + } Mutate(new SplineChainMovementGenerator(info), MOTION_SLOT_ACTIVE); } diff --git a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp index 551bc3e0283..43b4c6b029e 100644 --- a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.cpp @@ -138,3 +138,16 @@ SplineChainResumeInfo SplineChainMovementGenerator::GetResumeInfo(Unit const* me return SplineChainResumeInfo(_id, &_chain, _walk, _nextIndex, 0, 1u); return SplineChainResumeInfo(_id, &_chain, _walk, uint8(_nextIndex - 1), uint8(me->movespline->_currentSplineIdx()), _msToNext); } + +/* static */ void SplineChainMovementGenerator::GetResumeInfo(Unit const* me, SplineChainResumeInfo& info) +{ + if (MovementGenerator const* activeGen = me->GetMotionMaster()->GetMotionSlot(MOTION_SLOT_ACTIVE)) + { + if (activeGen->GetMovementGeneratorType() == SPLINE_CHAIN_MOTION_TYPE) + { + info = reinterpret_cast<SplineChainMovementGenerator const*>(activeGen)->GetResumeInfo(me); + return; + } + } + info.Chain = nullptr; +} diff --git a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h index 8d64bf14562..2892dc3e5c6 100644 --- a/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/SplineChainMovementGenerator.h @@ -32,6 +32,9 @@ class TC_GAME_API SplineChainMovementGenerator : public MovementGenerator bool Update(Unit* me, uint32 diff) override; MovementGeneratorType GetMovementGeneratorType() const override { return SPLINE_CHAIN_MOTION_TYPE; } // Builds info that can later be used to resume this spline chain movement at the current position + static void GetResumeInfo(Unit const* me, SplineChainResumeInfo& info); + // Leaving the object method public for people that know what they're doing to use + // But really, 99% of the time you should be using the static one instead SplineChainResumeInfo GetResumeInfo(Unit const* me) const; private: diff --git a/src/server/game/Movement/Spline/SplineChain.h b/src/server/game/Movement/Spline/SplineChain.h index bfb66eb7fee..33d816712b7 100644 --- a/src/server/game/Movement/Spline/SplineChain.h +++ b/src/server/game/Movement/Spline/SplineChain.h @@ -36,6 +36,8 @@ struct TC_GAME_API SplineChainResumeInfo SplineChainResumeInfo() : PointID(0), Chain(nullptr), IsWalkMode(false), SplineIndex(0), PointIndex(0), TimeToNext(0) { } SplineChainResumeInfo(uint32 id, SplineChain const* chain, bool walk, uint8 splineIndex, uint8 wpIndex, uint32 msToNext) : PointID(id), Chain(chain), IsWalkMode(walk), SplineIndex(splineIndex), PointIndex(wpIndex), TimeToNext(msToNext) { } + bool Empty() const { return Chain == nullptr; } + void Clear() { Chain = nullptr; } uint32 PointID; SplineChain const* Chain; bool IsWalkMode; |