diff options
Diffstat (limited to 'src/server/game/Movement/MotionMaster.h')
| -rw-r--r-- | src/server/game/Movement/MotionMaster.h | 174 |
1 files changed, 63 insertions, 111 deletions
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index d376f6aa58f..ccc9d8b4e5a 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -16,8 +16,8 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef TRINITY_MOTIONMASTER_H -#define TRINITY_MOTIONMASTER_H +#ifndef MOTIONMASTER_H +#define MOTIONMASTER_H #include "Common.h" #include <vector> @@ -32,31 +32,32 @@ class PathGenerator; // Creature Entry ID used for waypoints show, visible only for GMs #define VISUAL_WAYPOINT 1 +// assume it is 25 yard per 0.6 second +#define SPEED_CHARGE 42.0f -// values 0 ... MAX_DB_MOTION_TYPE-1 used in DB enum MovementGeneratorType { - IDLE_MOTION_TYPE = 0, // IdleMovementGenerator.h - RANDOM_MOTION_TYPE = 1, // RandomMovementGenerator.h - WAYPOINT_MOTION_TYPE = 2, // WaypointMovementGenerator.h - MAX_DB_MOTION_TYPE = 3, // *** this and below motion types can't be set in DB. - ANIMAL_RANDOM_MOTION_TYPE = MAX_DB_MOTION_TYPE, // AnimalRandomMovementGenerator.h - CONFUSED_MOTION_TYPE = 4, // ConfusedMovementGenerator.h - CHASE_MOTION_TYPE = 5, // TargetedMovementGenerator.h - HOME_MOTION_TYPE = 6, // HomeMovementGenerator.h - FLIGHT_MOTION_TYPE = 7, // WaypointMovementGenerator.h - POINT_MOTION_TYPE = 8, // PointMovementGenerator.h - FLEEING_MOTION_TYPE = 9, // FleeingMovementGenerator.h - DISTRACT_MOTION_TYPE = 10, // IdleMovementGenerator.h - ASSISTANCE_MOTION_TYPE= 11, // PointMovementGenerator.h (first part of flee for assistance) - ASSISTANCE_DISTRACT_MOTION_TYPE = 12, // IdleMovementGenerator.h (second part of flee for assistance) - TIMED_FLEEING_MOTION_TYPE = 13, // FleeingMovementGenerator.h (alt.second part of flee for assistance) - FOLLOW_MOTION_TYPE = 14, - ROTATE_MOTION_TYPE = 15, - EFFECT_MOTION_TYPE = 16, - NULL_MOTION_TYPE = 17, - SPLINE_CHAIN_MOTION_TYPE = 18, // SplineChainMovementGenerator.h - MAX_MOTION_TYPE // limit + IDLE_MOTION_TYPE = 0, // IdleMovementGenerator.h + RANDOM_MOTION_TYPE = 1, // RandomMovementGenerator.h + WAYPOINT_MOTION_TYPE = 2, // WaypointMovementGenerator.h + MAX_DB_MOTION_TYPE = 3, // Below motion types can't be set in DB. + ANIMAL_RANDOM_MOTION_TYPE = MAX_DB_MOTION_TYPE, // AnimalRandomMovementGenerator.h + CONFUSED_MOTION_TYPE = 4, // ConfusedMovementGenerator.h + CHASE_MOTION_TYPE = 5, // TargetedMovementGenerator.h + HOME_MOTION_TYPE = 6, // HomeMovementGenerator.h + FLIGHT_MOTION_TYPE = 7, // WaypointMovementGenerator.h + POINT_MOTION_TYPE = 8, // PointMovementGenerator.h + FLEEING_MOTION_TYPE = 9, // FleeingMovementGenerator.h + DISTRACT_MOTION_TYPE = 10, // IdleMovementGenerator.h + ASSISTANCE_MOTION_TYPE = 11, // PointMovementGenerator.h (first part of flee for assistance) + ASSISTANCE_DISTRACT_MOTION_TYPE = 12, // IdleMovementGenerator.h (second part of flee for assistance) + TIMED_FLEEING_MOTION_TYPE = 13, // FleeingMovementGenerator.h (alt.second part of flee for assistance) + FOLLOW_MOTION_TYPE = 14, + ROTATE_MOTION_TYPE = 15, + EFFECT_MOTION_TYPE = 16, + NULL_MOTION_TYPE = 17, + SPLINE_CHAIN_MOTION_TYPE = 18, // SplineChainMovementGenerator.h + MAX_MOTION_TYPE // limit }; enum MovementSlot @@ -80,91 +81,41 @@ enum RotateDirection ROTATE_DIRECTION_RIGHT }; -// assume it is 25 yard per 0.6 second -#define SPEED_CHARGE 42.0f - -class TC_GAME_API MotionMaster //: private std::stack<MovementGenerator *> +class TC_GAME_API MotionMaster { private: - //typedef std::stack<MovementGenerator *> Impl; - typedef MovementGenerator* _Ty; - - void pop() - { - if (empty()) - return; - - Impl[_top] = NULL; - while (!empty() && !top()) - --_top; - } - void push(_Ty _Val) { ++_top; Impl[_top] = _Val; } + typedef std::vector<MovementGenerator*> ExpireList; - bool needInitTop() const - { - if (empty()) - return false; - return _needInit[_top]; - } - void InitTop(); public: - - explicit MotionMaster(Unit* unit) : _expList(NULL), _top(-1), _owner(unit), _cleanFlag(MMCF_NONE) + explicit MotionMaster(Unit* unit) : m_expireList(nullptr), m_top(-1), m_owner(unit), m_cleanFlag(MMCF_NONE) { for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i) { - Impl[i] = NULL; - _needInit[i] = true; + m_slot[i] = NULL; + m_initialize[i] = true; } } ~MotionMaster(); + bool empty() const { return (m_top < 0); } + int size() const { return m_top + 1; } + MovementGenerator* top() const { ASSERT(!empty()); return m_slot[m_top]; } + void Initialize(); void InitDefault(); - bool empty() const { return (_top < 0); } - int size() const { return _top + 1; } - _Ty top() const - { - ASSERT(!empty()); - return Impl[_top]; - } - _Ty GetMotionSlot(int slot) const - { - ASSERT(slot >= 0); - return Impl[slot]; - } + void UpdateMotion(uint32 diff); - void DirectDelete(_Ty curr); - void DelayedDelete(_Ty curr); + void Clear(bool reset = true); + void MovementExpired(bool reset = true); - void UpdateMotion(uint32 diff); - void Clear(bool reset = true) - { - if (_cleanFlag & MMCF_UPDATE) - { - if (reset) - _cleanFlag |= MMCF_RESET; - else - _cleanFlag &= ~MMCF_RESET; - DelayedClean(); - } - else - DirectClean(reset); - } - void MovementExpired(bool reset = true) - { - if (_cleanFlag & MMCF_UPDATE) - { - if (reset) - _cleanFlag |= MMCF_RESET; - else - _cleanFlag &= ~MMCF_RESET; - DelayedExpire(); - } - else - DirectExpire(reset); - } + MovementGeneratorType GetCurrentMovementGeneratorType() const; + MovementGeneratorType GetMotionSlotType(int slot) const; + MovementGenerator* GetMotionSlot(int slot) const; + + void propagateSpeedChange(); + + bool GetDestination(float &x, float &y, float &z); void MoveIdle(); void MoveTargetedHome(); @@ -174,7 +125,9 @@ class TC_GAME_API MotionMaster //: private std::stack<MovementGenerator *> void MoveConfused(); void MoveFleeing(Unit* enemy, uint32 time = 0); void MovePoint(uint32 id, Position const& pos, bool generatePath = true) - { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath); } + { + MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath); + } void MovePoint(uint32 id, float x, float y, float z, bool generatePath = true); /* Makes the unit move toward the target until it is at a certain distance from it. The unit then stops. @@ -212,27 +165,26 @@ class TC_GAME_API MotionMaster //: private std::stack<MovementGenerator *> void MovePath(uint32 path_id, bool repeatable); void MoveRotate(uint32 time, RotateDirection direction); - MovementGeneratorType GetCurrentMovementGeneratorType() const; - MovementGeneratorType GetMotionSlotType(int slot) const; - - void propagateSpeedChange(); - - bool GetDestination(float &x, float &y, float &z); private: - void Mutate(MovementGenerator *m, MovementSlot slot); // use Move* functions instead + bool NeedInitTop() const; + void InitTop(); + void Pop(); + + void Mutate(MovementGenerator *m, MovementSlot slot); void DirectClean(bool reset); void DelayedClean(); - void DirectExpire(bool reset); void DelayedExpire(); - - typedef std::vector<_Ty> ExpireList; - ExpireList* _expList; - _Ty Impl[MAX_MOTION_SLOT]; - int _top; - Unit* _owner; - bool _needInit[MAX_MOTION_SLOT]; - uint8 _cleanFlag; + void DirectDelete(MovementGenerator* curr); + void DelayedDelete(MovementGenerator* curr); + + ExpireList* m_expireList; + MovementGenerator* m_slot[MAX_MOTION_SLOT]; + int m_top; + Unit* m_owner; + bool m_initialize[MAX_MOTION_SLOT]; + uint8 m_cleanFlag; }; -#endif + +#endif // MOTIONMASTER_H |
