[9188] Implement MoveGen::Interrupt call.

It can be used in time when need do some tasks before
another movement generator add on top to motion stack.
This just finish pair Interrupt->Reset similar Initilize->Finilize
In general movementgenerator have states:

Initilize=>Interrupt<=>[-some addition movegen->]<=>Reset=>Finalize
This commit is contained in:
VladimirMangos 2010-01-16 06:53:17 +03:00
parent cc062f16ac
commit 132b1cbabd
14 changed files with 61 additions and 24 deletions

View file

@ -86,8 +86,12 @@ ConfusedMovementGenerator<Player>::_InitSpecific(Player &, bool &is_water_ok, bo
}
template<class T>
void
ConfusedMovementGenerator<T>::Reset(T &unit)
void ConfusedMovementGenerator<T>::Interrupt(T &unit)
{
}
template<class T>
void ConfusedMovementGenerator<T>::Reset(T &unit)
{
i_nextMove = 1;
i_nextMoveTime.Reset(0);
@ -96,8 +100,7 @@ ConfusedMovementGenerator<T>::Reset(T &unit)
}
template<class T>
bool
ConfusedMovementGenerator<T>::Update(T &unit, const uint32 &diff)
bool ConfusedMovementGenerator<T>::Update(T &unit, const uint32 &diff)
{
if(!&unit)
return true;
@ -154,6 +157,8 @@ void ConfusedMovementGenerator<Creature>::Finalize(Creature &unit)
template void ConfusedMovementGenerator<Player>::Initialize(Player &player);
template void ConfusedMovementGenerator<Creature>::Initialize(Creature &creature);
template void ConfusedMovementGenerator<Player>::Interrupt(Player &player);
template void ConfusedMovementGenerator<Creature>::Interrupt(Creature &creature);
template void ConfusedMovementGenerator<Player>::Reset(Player &player);
template void ConfusedMovementGenerator<Creature>::Reset(Creature &creature);
template bool ConfusedMovementGenerator<Player>::Update(Player &player, const uint32 &diff);

View file

@ -34,6 +34,7 @@ class MANGOS_DLL_SPEC ConfusedMovementGenerator
void Initialize(T &);
void Finalize(T &);
void Interrupt(T &);
void Reset(T &);
bool Update(T &, const uint32 &);

View file

@ -341,15 +341,18 @@ void FleeingMovementGenerator<Creature>::Finalize(Creature &owner)
}
template<class T>
void
FleeingMovementGenerator<T>::Reset(T &owner)
void FleeingMovementGenerator<T>::Interrupt(T &owner)
{
}
template<class T>
void FleeingMovementGenerator<T>::Reset(T &owner)
{
Initialize(owner);
}
template<class T>
bool
FleeingMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
bool FleeingMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
{
if( !&owner || !owner.isAlive() )
return false;
@ -386,6 +389,8 @@ template bool FleeingMovementGenerator<Player>::_getPoint(Player &, float &, flo
template bool FleeingMovementGenerator<Creature>::_getPoint(Creature &, float &, float &, float &);
template void FleeingMovementGenerator<Player>::_setTargetLocation(Player &);
template void FleeingMovementGenerator<Creature>::_setTargetLocation(Creature &);
template void FleeingMovementGenerator<Player>::Interrupt(Player &);
template void FleeingMovementGenerator<Creature>::Interrupt(Creature &);
template void FleeingMovementGenerator<Player>::Reset(Player &);
template void FleeingMovementGenerator<Creature>::Reset(Creature &);
template bool FleeingMovementGenerator<Player>::Update(Player &, const uint32 &);

View file

@ -32,6 +32,7 @@ class MANGOS_DLL_SPEC FleeingMovementGenerator
void Initialize(T &);
void Finalize(T &);
void Interrupt(T &);
void Reset(T &);
bool Update(T &, const uint32 &);

View file

@ -39,6 +39,7 @@ class MANGOS_DLL_SPEC HomeMovementGenerator<Creature>
void Initialize(Creature &);
void Finalize(Creature &) {}
void Interrupt(Creature &) {}
void Reset(Creature &);
bool Update(Creature &, const uint32 &);
void modifyTravelTime(uint32 travel_time) { i_travel_timer = travel_time; }

View file

@ -25,8 +25,9 @@ class MANGOS_DLL_SPEC IdleMovementGenerator : public MovementGenerator
{
public:
void Initialize(Unit &) { }
void Finalize(Unit &) { }
void Initialize(Unit &) {}
void Finalize(Unit &) {}
void Interrupt(Unit &) {}
void Reset(Unit &);
bool Update(Unit &, const uint32 &) { return true; }
MovementGeneratorType GetMovementGeneratorType() { return IDLE_MOTION_TYPE; }
@ -41,6 +42,7 @@ class MANGOS_DLL_SPEC DistractMovementGenerator : public MovementGenerator
void Initialize(Unit& owner);
void Finalize(Unit& owner);
void Interrupt(Unit& ) {}
void Reset(Unit& owner) { Initialize(owner); }
bool Update(Unit& owner, const uint32& time_diff);
MovementGeneratorType GetMovementGeneratorType() { return DISTRACT_MOTION_TYPE; }

View file

@ -434,6 +434,9 @@ void MotionMaster::Mutate(MovementGenerator *m)
default:
break;
}
if (!empty())
top()->Interrupt(*i_owner);
}
m->Initialize(*i_owner);
push(m);

View file

@ -33,9 +33,14 @@ class MANGOS_DLL_SPEC MovementGenerator
public:
virtual ~MovementGenerator();
// called before adding movement generator to motion stack
virtual void Initialize(Unit &) = 0;
// called aftre remove movement generator from motion stack
virtual void Finalize(Unit &) = 0;
// called before lost top position (before push new movement generator above)
virtual void Interrupt(Unit &) = 0;
// called after return movement generator to top position (after remove above movement generator)
virtual void Reset(Unit &) = 0;
virtual bool Update(Unit &, const uint32 &time_diff) = 0;
@ -63,6 +68,11 @@ class MANGOS_DLL_SPEC MovementGeneratorMedium : public MovementGenerator
//u->AssertIsType<T>();
(static_cast<D*>(this))->Finalize(*((T*)&u));
}
void Interrupt(Unit &u)
{
//u->AssertIsType<T>();
(static_cast<D*>(this))->Interrupt(*((T*)&u));
}
void Reset(Unit &u)
{
//u->AssertIsType<T>();
@ -77,6 +87,7 @@ class MANGOS_DLL_SPEC MovementGeneratorMedium : public MovementGenerator
// will not link if not overridden in the generators
void Initialize(T &u);
void Finalize(T &u);
void Interrupt(T &u);
void Reset(T &u);
bool Update(T &u, const uint32 &time_diff);
};

View file

@ -34,7 +34,8 @@ class MANGOS_DLL_SPEC PointMovementGenerator
void Initialize(T &);
void Finalize(T &){}
void Reset(T &unit){unit.StopMoving();}
void Interrupt(T &) {}
void Reset(T &unit){ unit.StopMoving(); }
bool Update(T &, const uint32 &diff);
void MovementInform(T &);

View file

@ -33,6 +33,7 @@ class MANGOS_DLL_SPEC RandomMovementGenerator
void _setRandomLocation(T &);
void Initialize(T &);
void Finalize(T &) {}
void Interrupt(T &) {}
void Reset(T &);
bool Update(T &, const uint32 &);
void UpdateMapPosition(uint32 mapid, float &x ,float &y, float &z)

View file

@ -88,6 +88,12 @@ TargetedMovementGenerator<T>::_setTargetLocation(T &owner)
((Creature&)owner).AddMonsterMoveFlag(MONSTER_MOVE_FLY);
}
template<>
void TargetedMovementGenerator<Player>::Initialize(Player &owner)
{
_setTargetLocation(owner);
}
template<>
void TargetedMovementGenerator<Creature>::Initialize(Creature &owner)
{
@ -113,29 +119,25 @@ void TargetedMovementGenerator<Creature>::UpdateFinalDistance(float fDistance)
i_recalculateTravel = true;
}
template<>
void TargetedMovementGenerator<Player>::Initialize(Player &owner)
template<class T>
void TargetedMovementGenerator<T>::Finalize(T &owner)
{
_setTargetLocation(owner);
owner.clearUnitState(UNIT_STAT_CHASE | UNIT_STAT_FOLLOW);
}
template<class T>
void
TargetedMovementGenerator<T>::Finalize(T &owner)
void TargetedMovementGenerator<T>::Interrupt(T &owner)
{
owner.clearUnitState(UNIT_STAT_CHASE);
}
template<class T>
void
TargetedMovementGenerator<T>::Reset(T &owner)
void TargetedMovementGenerator<T>::Reset(T &owner)
{
Initialize(owner);
}
template<class T>
bool
TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
bool TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
{
if (!i_target.isValid() || !i_target->IsInWorld())
return false;
@ -207,8 +209,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
}
template<class T>
Unit*
TargetedMovementGenerator<T>::GetTarget() const
Unit* TargetedMovementGenerator<T>::GetTarget() const
{
return i_target.getTarget();
}
@ -217,6 +218,8 @@ template void TargetedMovementGenerator<Player>::_setTargetLocation(Player &);
template void TargetedMovementGenerator<Creature>::_setTargetLocation(Creature &);
template void TargetedMovementGenerator<Player>::Finalize(Player &);
template void TargetedMovementGenerator<Creature>::Finalize(Creature &);
template void TargetedMovementGenerator<Player>::Interrupt(Player &);
template void TargetedMovementGenerator<Creature>::Interrupt(Creature &);
template void TargetedMovementGenerator<Player>::Reset(Player &);
template void TargetedMovementGenerator<Creature>::Reset(Creature &);
template bool TargetedMovementGenerator<Player>::Update(Player &, const uint32 &);

View file

@ -47,6 +47,7 @@ class MANGOS_DLL_SPEC TargetedMovementGenerator
void Initialize(T &);
void Finalize(T &);
void Interrupt(T &);
void Reset(T &);
bool Update(T &, const uint32 &);
MovementGeneratorType GetMovementGeneratorType() { return TARGETED_MOTION_TYPE; }

View file

@ -82,6 +82,7 @@ public PathMovementBase<Creature, WaypointPath*>
u.StopMoving();
LoadPath(u);
}
void Interrupt(Creature &) {}
void Finalize(Creature &) {}
void Reset(Creature &u)
{
@ -130,6 +131,7 @@ public PathMovementBase<Player>
explicit FlightPathMovementGenerator(uint32 id, uint32 startNode = 0) : i_pathId(id) { i_currentNode = startNode; }
void Initialize(Player &);
void Finalize(Player &);
void Interrupt(Player &) {}
void Reset(Player &) {}
bool Update(Player &, const uint32 &);
MovementGeneratorType GetMovementGeneratorType() { return FLIGHT_MOTION_TYPE; }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "9187"
#define REVISION_NR "9188"
#endif // __REVISION_NR_H__