[9207] Fixed chase/follow functions calls in movegen templates system.

This commit specially made indeepndent from other changes for show problem
in my prev. commit where 2 new movegens added.

For proper call Initilize/Finilize/Reset/Interrupt/Update functions _important_
set second template arg in MovementGeneratorMedium< T, D >
in _last_ class in class chain. In other case in chase/follow instead TargetedMovementGeneratorMedium
In other cases will called referenced functions from TargetedMovementGeneratorMedium
instead proper subclasses.
This commit is contained in:
VladimirMangos 2010-01-18 10:29:28 +03:00
parent 98adbbc3d3
commit 7d6b1b292e
3 changed files with 38 additions and 31 deletions

View file

@ -28,8 +28,8 @@
#include <cmath> #include <cmath>
//-----------------------------------------------// //-----------------------------------------------//
template<class T> template<class T, typename D>
void TargetedMovementGeneratorMedium<T>::_setTargetLocation(T &owner) void TargetedMovementGeneratorMedium<T,D>::_setTargetLocation(T &owner)
{ {
if (!i_target.isValid() || !i_target->IsInWorld()) if (!i_target.isValid() || !i_target->IsInWorld())
return; return;
@ -77,26 +77,33 @@ void TargetedMovementGeneratorMedium<T>::_setTargetLocation(T &owner)
} }
template<> template<>
void TargetedMovementGeneratorMedium<Player>::UpdateFinalDistance(float fDistance) void TargetedMovementGeneratorMedium<Player,ChaseMovementGenerator<Player> >::UpdateFinalDistance(float fDistance)
{ {
// nothing to do for Player // nothing to do for Player
} }
template<> template<>
void TargetedMovementGeneratorMedium<Creature>::UpdateFinalDistance(float fDistance) void TargetedMovementGeneratorMedium<Player,FollowMovementGenerator<Player> >::UpdateFinalDistance(float fDistance)
{
// nothing to do for Player
}
template<>
void TargetedMovementGeneratorMedium<Creature,ChaseMovementGenerator<Creature> >::UpdateFinalDistance(float fDistance)
{ {
i_offset = fDistance; i_offset = fDistance;
i_recalculateTravel = true; i_recalculateTravel = true;
} }
template<class T> template<>
Unit* TargetedMovementGeneratorMedium<T>::GetTarget() const void TargetedMovementGeneratorMedium<Creature,FollowMovementGenerator<Creature> >::UpdateFinalDistance(float fDistance)
{ {
return i_target.getTarget(); i_offset = fDistance;
i_recalculateTravel = true;
} }
template<class T> template<class T, typename D>
bool TargetedMovementGeneratorMedium<T>::Update(T &owner, const uint32 & time_diff) bool TargetedMovementGeneratorMedium<T,D>::Update(T &owner, const uint32 & time_diff)
{ {
if (!i_target.isValid() || !i_target->IsInWorld()) if (!i_target.isValid() || !i_target->IsInWorld())
return false; return false;
@ -236,10 +243,14 @@ void FollowMovementGenerator<T>::Reset(T &owner)
} }
//-----------------------------------------------// //-----------------------------------------------//
template Unit* TargetedMovementGeneratorMedium<Player>::GetTarget() const; template void TargetedMovementGeneratorMedium<Player,ChaseMovementGenerator<Player> >::_setTargetLocation(Player &);
template Unit* TargetedMovementGeneratorMedium<Creature>::GetTarget() const; template void TargetedMovementGeneratorMedium<Player,FollowMovementGenerator<Player> >::_setTargetLocation(Player &);
template bool TargetedMovementGeneratorMedium<Player>::Update(Player &, const uint32 &); template void TargetedMovementGeneratorMedium<Creature,ChaseMovementGenerator<Creature> >::_setTargetLocation(Creature &);
template bool TargetedMovementGeneratorMedium<Creature>::Update(Creature &, const uint32 &); template void TargetedMovementGeneratorMedium<Creature,FollowMovementGenerator<Creature> >::_setTargetLocation(Creature &);
template bool TargetedMovementGeneratorMedium<Player,ChaseMovementGenerator<Player> >::Update(Player &, const uint32 &);
template bool TargetedMovementGeneratorMedium<Player,FollowMovementGenerator<Player> >::Update(Player &, const uint32 &);
template bool TargetedMovementGeneratorMedium<Creature,ChaseMovementGenerator<Creature> >::Update(Creature &, const uint32 &);
template bool TargetedMovementGeneratorMedium<Creature,FollowMovementGenerator<Creature> >::Update(Creature &, const uint32 &);
template void ChaseMovementGenerator<Player>::Finalize(Player &); template void ChaseMovementGenerator<Player>::Finalize(Player &);
template void ChaseMovementGenerator<Creature>::Finalize(Creature &); template void ChaseMovementGenerator<Creature>::Finalize(Creature &);

View file

@ -33,13 +33,13 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorBase
FollowerReference i_target; FollowerReference i_target;
}; };
template<class T> template<class T, typename D>
class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium
: public MovementGeneratorMedium< T, TargetedMovementGeneratorMedium<T> >, public TargetedMovementGeneratorBase : public MovementGeneratorMedium< T, D >, public TargetedMovementGeneratorBase
{ {
protected: protected:
TargetedMovementGeneratorMedium() : MovementGeneratorMedium< T, TargetedMovementGeneratorMedium<T> >(), TargetedMovementGeneratorBase() {} TargetedMovementGeneratorMedium()
: TargetedMovementGeneratorBase(), i_offset(0), i_angle(0), i_recalculateTravel(false) {}
TargetedMovementGeneratorMedium(Unit &target) TargetedMovementGeneratorMedium(Unit &target)
: TargetedMovementGeneratorBase(target), i_offset(0), i_angle(0), i_recalculateTravel(false) {} : TargetedMovementGeneratorBase(target), i_offset(0), i_angle(0), i_recalculateTravel(false) {}
TargetedMovementGeneratorMedium(Unit &target, float offset, float angle) TargetedMovementGeneratorMedium(Unit &target, float offset, float angle)
@ -47,13 +47,9 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium
~TargetedMovementGeneratorMedium() {} ~TargetedMovementGeneratorMedium() {}
public: public:
void Initialize(T &) {}
void Finalize(T &) {}
void Interrupt(T &) {}
void Reset(T &) {}
bool Update(T &, const uint32 &); bool Update(T &, const uint32 &);
Unit* GetTarget() const; Unit* GetTarget() const { return i_target.getTarget(); }
bool GetDestination(float &x, float &y, float &z) const bool GetDestination(float &x, float &y, float &z) const
{ {
@ -76,12 +72,13 @@ class MANGOS_DLL_SPEC TargetedMovementGeneratorMedium
}; };
template<class T> template<class T>
class MANGOS_DLL_SPEC ChaseMovementGenerator : public TargetedMovementGeneratorMedium<T> class MANGOS_DLL_SPEC ChaseMovementGenerator : public TargetedMovementGeneratorMedium<T, ChaseMovementGenerator<T> >
{ {
public: public:
ChaseMovementGenerator(Unit &target) : TargetedMovementGeneratorMedium<T>(target) {} ChaseMovementGenerator(Unit &target)
: TargetedMovementGeneratorMedium<T, ChaseMovementGenerator<T> >(target) {}
ChaseMovementGenerator(Unit &target, float offset, float angle) ChaseMovementGenerator(Unit &target, float offset, float angle)
: TargetedMovementGeneratorMedium<T>(target, offset, angle) {} : TargetedMovementGeneratorMedium<T, ChaseMovementGenerator<T> >(target, offset, angle) {}
~ChaseMovementGenerator() {} ~ChaseMovementGenerator() {}
MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; } MovementGeneratorType GetMovementGeneratorType() { return CHASE_MOTION_TYPE; }
@ -90,16 +87,16 @@ class MANGOS_DLL_SPEC ChaseMovementGenerator : public TargetedMovementGeneratorM
void Finalize(T &); void Finalize(T &);
void Interrupt(T &); void Interrupt(T &);
void Reset(T &); void Reset(T &);
bool Update(T &, const uint32 &);
}; };
template<class T> template<class T>
class MANGOS_DLL_SPEC FollowMovementGenerator : public TargetedMovementGeneratorMedium<T> class MANGOS_DLL_SPEC FollowMovementGenerator : public TargetedMovementGeneratorMedium<T, FollowMovementGenerator<T> >
{ {
public: public:
FollowMovementGenerator(Unit &target) : TargetedMovementGeneratorMedium<T>(target) {} FollowMovementGenerator(Unit &target)
: TargetedMovementGeneratorMedium<T, FollowMovementGenerator<T> >(target){}
FollowMovementGenerator(Unit &target, float offset, float angle) FollowMovementGenerator(Unit &target, float offset, float angle)
: TargetedMovementGeneratorMedium<T>(target, offset, angle) {} : TargetedMovementGeneratorMedium<T, FollowMovementGenerator<T> >(target, offset, angle) {}
~FollowMovementGenerator() {} ~FollowMovementGenerator() {}
MovementGeneratorType GetMovementGeneratorType() { return FOLLOW_MOTION_TYPE; } MovementGeneratorType GetMovementGeneratorType() { return FOLLOW_MOTION_TYPE; }
@ -108,7 +105,6 @@ class MANGOS_DLL_SPEC FollowMovementGenerator : public TargetedMovementGenerator
void Finalize(T &); void Finalize(T &);
void Interrupt(T &); void Interrupt(T &);
void Reset(T &); void Reset(T &);
bool Update(T &, const uint32 &);
}; };
#endif #endif

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 "9206" #define REVISION_NR "9207"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__