[11336] Use movgen Finilize for code applied at normal movegen expire

This let resolve porblems for casts/etc that before happens
before real movgen stop from code logic.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
Schmoozerd 2011-04-12 15:28:37 +04:00 committed by VladimirMangos
parent ea516bef45
commit 328bd68350
5 changed files with 28 additions and 26 deletions

View file

@ -24,20 +24,17 @@
#include "ObjectMgr.h" #include "ObjectMgr.h"
#include "WorldPacket.h" #include "WorldPacket.h"
void void HomeMovementGenerator<Creature>::Initialize(Creature & owner)
HomeMovementGenerator<Creature>::Initialize(Creature & owner)
{ {
owner.RemoveSplineFlag(SPLINEFLAG_WALKMODE); owner.RemoveSplineFlag(SPLINEFLAG_WALKMODE);
_setTargetLocation(owner); _setTargetLocation(owner);
} }
void void HomeMovementGenerator<Creature>::Reset(Creature &)
HomeMovementGenerator<Creature>::Reset(Creature &)
{ {
} }
void void HomeMovementGenerator<Creature>::_setTargetLocation(Creature & owner)
HomeMovementGenerator<Creature>::_setTargetLocation(Creature & owner)
{ {
if (owner.hasUnitState(UNIT_STAT_NOT_MOVE)) if (owner.hasUnitState(UNIT_STAT_NOT_MOVE))
return; return;
@ -55,8 +52,7 @@ HomeMovementGenerator<Creature>::_setTargetLocation(Creature & owner)
owner.clearUnitState(UNIT_STAT_ALL_STATE); owner.clearUnitState(UNIT_STAT_ALL_STATE);
} }
bool bool HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff)
HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff)
{ {
CreatureTraveller traveller( owner); CreatureTraveller traveller( owner);
if (i_destinationHolder.UpdateTraveller(traveller, time_diff, false)) if (i_destinationHolder.UpdateTraveller(traveller, time_diff, false))
@ -65,7 +61,20 @@ HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff
return true; // not expire now, but already lost 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<Creature>::Finalize(Creature& owner)
{
if (i_travel_timer == 0)
{ {
owner.AddSplineFlag(SPLINEFLAG_WALKMODE); owner.AddSplineFlag(SPLINEFLAG_WALKMODE);
@ -85,10 +94,5 @@ HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff
owner.LoadCreatureAddon(true); owner.LoadCreatureAddon(true);
owner.AI()->JustReachedHome(); owner.AI()->JustReachedHome();
return false;
} }
i_travel_timer -= time_diff;
return true;
} }

View file

@ -38,7 +38,7 @@ class MANGOS_DLL_SPEC HomeMovementGenerator<Creature>
~HomeMovementGenerator() {} ~HomeMovementGenerator() {}
void Initialize(Creature &); void Initialize(Creature &);
void Finalize(Creature &) {} void Finalize(Creature &);
void Interrupt(Creature &) {} void Interrupt(Creature &) {}
void Reset(Creature &); void Reset(Creature &);
bool Update(Creature &, const uint32 &); bool Update(Creature &, const uint32 &);

View file

@ -162,6 +162,8 @@ void MotionMaster::DirectExpire(bool reset)
delete temp; delete temp;
} }
// Store current top MMGen, as Finalize might push a new MMGen
MovementGenerator* nowTop = empty() ? NULL : top();
// it can add another motions instead // it can add another motions instead
curr->Finalize(*m_owner); curr->Finalize(*m_owner);
@ -171,7 +173,8 @@ void MotionMaster::DirectExpire(bool reset)
if (empty()) if (empty())
Initialize(); Initialize();
if (reset) // Prevent reseting possible new pushed MMGen
if (reset && top() == nowTop)
top()->Reset(*m_owner); top()->Reset(*m_owner);
} }

View file

@ -44,6 +44,9 @@ template<class T>
void PointMovementGenerator<T>::Finalize(T &unit) void PointMovementGenerator<T>::Finalize(T &unit)
{ {
unit.clearUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); unit.clearUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE);
if (i_destinationHolder.HasArrived())
MovementInform(unit);
} }
template<class T> template<class T>
@ -83,15 +86,7 @@ bool PointMovementGenerator<T>::Update(T &unit, const uint32 &diff)
} }
if (i_destinationHolder.HasArrived()) if (i_destinationHolder.HasArrived())
{
unit.clearUnitState(UNIT_STAT_ROAMING_MOVE);
MovementInform(unit);
if (!IsActive(unit))
return true;
return false; return false;
}
return true; return true;
} }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "11335" #define REVISION_NR "11336"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__