diff --git a/src/game/HomeMovementGenerator.cpp b/src/game/HomeMovementGenerator.cpp index 1cbf03966..94d59fa3b 100644 --- a/src/game/HomeMovementGenerator.cpp +++ b/src/game/HomeMovementGenerator.cpp @@ -24,20 +24,17 @@ #include "ObjectMgr.h" #include "WorldPacket.h" -void -HomeMovementGenerator::Initialize(Creature & owner) +void HomeMovementGenerator::Initialize(Creature & owner) { owner.RemoveSplineFlag(SPLINEFLAG_WALKMODE); _setTargetLocation(owner); } -void -HomeMovementGenerator::Reset(Creature &) +void HomeMovementGenerator::Reset(Creature &) { } -void -HomeMovementGenerator::_setTargetLocation(Creature & owner) +void HomeMovementGenerator::_setTargetLocation(Creature & owner) { if (owner.hasUnitState(UNIT_STAT_NOT_MOVE)) return; @@ -55,8 +52,7 @@ HomeMovementGenerator::_setTargetLocation(Creature & owner) owner.clearUnitState(UNIT_STAT_ALL_STATE); } -bool -HomeMovementGenerator::Update(Creature &owner, const uint32& time_diff) +bool HomeMovementGenerator::Update(Creature &owner, const uint32& time_diff) { CreatureTraveller traveller( owner); if (i_destinationHolder.UpdateTraveller(traveller, time_diff, false)) @@ -65,7 +61,20 @@ HomeMovementGenerator::Update(Creature &owner, const uint32& time_diff return true; // not expire now, but already lost } - if (time_diff > i_travel_timer) + if (time_diff >= i_travel_timer) + { + i_travel_timer = 0; // Used as check in Finalize + return false; + } + + i_travel_timer -= time_diff; + + return true; +} + +void HomeMovementGenerator::Finalize(Creature& owner) +{ + if (i_travel_timer == 0) { owner.AddSplineFlag(SPLINEFLAG_WALKMODE); @@ -85,10 +94,5 @@ HomeMovementGenerator::Update(Creature &owner, const uint32& time_diff owner.LoadCreatureAddon(true); owner.AI()->JustReachedHome(); - return false; } - - i_travel_timer -= time_diff; - - return true; } diff --git a/src/game/HomeMovementGenerator.h b/src/game/HomeMovementGenerator.h index 77bfac888..20f2707d0 100644 --- a/src/game/HomeMovementGenerator.h +++ b/src/game/HomeMovementGenerator.h @@ -38,7 +38,7 @@ class MANGOS_DLL_SPEC HomeMovementGenerator ~HomeMovementGenerator() {} void Initialize(Creature &); - void Finalize(Creature &) {} + void Finalize(Creature &); void Interrupt(Creature &) {} void Reset(Creature &); bool Update(Creature &, const uint32 &); diff --git a/src/game/MotionMaster.cpp b/src/game/MotionMaster.cpp index 0de87e9a4..b01c3241d 100644 --- a/src/game/MotionMaster.cpp +++ b/src/game/MotionMaster.cpp @@ -162,6 +162,8 @@ void MotionMaster::DirectExpire(bool reset) delete temp; } + // Store current top MMGen, as Finalize might push a new MMGen + MovementGenerator* nowTop = empty() ? NULL : top(); // it can add another motions instead curr->Finalize(*m_owner); @@ -171,7 +173,8 @@ void MotionMaster::DirectExpire(bool reset) if (empty()) Initialize(); - if (reset) + // Prevent reseting possible new pushed MMGen + if (reset && top() == nowTop) top()->Reset(*m_owner); } diff --git a/src/game/PointMovementGenerator.cpp b/src/game/PointMovementGenerator.cpp index 88d5e736b..cee9f163f 100644 --- a/src/game/PointMovementGenerator.cpp +++ b/src/game/PointMovementGenerator.cpp @@ -44,6 +44,9 @@ template void PointMovementGenerator::Finalize(T &unit) { unit.clearUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); + + if (i_destinationHolder.HasArrived()) + MovementInform(unit); } template @@ -82,16 +85,8 @@ bool PointMovementGenerator::Update(T &unit, const uint32 &diff) return true; // not expire now, but already lost } - if(i_destinationHolder.HasArrived()) - { - unit.clearUnitState(UNIT_STAT_ROAMING_MOVE); - MovementInform(unit); - - if (!IsActive(unit)) - return true; - + if (i_destinationHolder.HasArrived()) return false; - } return true; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 6e7df895f..c21f4c9e1 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "11335" + #define REVISION_NR "11336" #endif // __REVISION_NR_H__