TrinityCore
MovementGenerator.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITY_MOVEMENTGENERATOR_H
19#define TRINITY_MOVEMENTGENERATOR_H
20
21#include "Define.h"
22#include "FactoryHolder.h"
23#include "MovementDefines.h"
24#include "ObjectRegistry.h"
25
26class Creature;
27class Unit;
28
30
32{
44
46};
47
49{
50 public:
51 explicit MovementGenerator() : Mode(0), Priority(0), Flags(MOVEMENTGENERATOR_FLAG_NONE), BaseUnitState(0) { }
56 virtual ~MovementGenerator();
57
58 // on top first update
59 virtual void Initialize(Unit* owner) = 0;
60 // on top reassign
61 virtual void Reset(Unit* owner) = 0;
62 // on top on MotionMaster::Update
63 virtual bool Update(Unit* owner, uint32 diff) = 0;
64 // on current top if another movement replaces
65 virtual void Deactivate(Unit* owner) = 0;
66 // on movement delete
67 virtual void Finalize(Unit* owner, bool active, bool movementInform) = 0;
69
70 virtual void UnitSpeedChanged() { }
71 // timer in ms
72 virtual void Pause(uint32/* timer*/) { }
73 // timer in ms
74 virtual void Resume(uint32/* overrideTimer*/) { }
75 // used by Evade code for select point to evade with expected restart default movement
76 virtual bool GetResetPosition(Unit*, float&/* x*/, float&/* y*/, float&/* z*/) { return false; }
77
78 void AddFlag(uint16 const flag) { Flags |= flag; }
79 bool HasFlag(uint16 const flag) const { return (Flags & flag) != 0; }
80 void RemoveFlag(uint16 const flag) { Flags &= ~flag; }
81
82 virtual std::string GetDebugInfo() const;
83
88};
89
90template<class T, class D>
92{
93 public:
94 void Initialize(Unit* owner) override
95 {
96 (static_cast<D*>(this))->DoInitialize(static_cast<T*>(owner));
97 }
98
99 void Reset(Unit* owner) override
100 {
101 (static_cast<D*>(this))->DoReset(static_cast<T*>(owner));
102 }
103
104 bool Update(Unit* owner, uint32 diff) override
105 {
106 return (static_cast<D*>(this))->DoUpdate(static_cast<T*>(owner), diff);
107 }
108
109 void Deactivate(Unit* owner) override
110 {
111 (static_cast<D*>(this))->DoDeactivate(static_cast<T*>(owner));
112 }
113
114 void Finalize(Unit* owner, bool active, bool movementInform) override
115 {
116 (static_cast<D*>(this))->DoFinalize(static_cast<T*>(owner), active, movementInform);
117 }
118};
119
121
122template<class Movement>
124{
125 MovementGeneratorFactory(MovementGeneratorType movementGeneratorType) : MovementGeneratorCreator(movementGeneratorType) { }
126
127 MovementGenerator* Create(Unit* /*object*/) const override
128 {
129 return new Movement();
130 }
131};
132
134{
136
137 MovementGenerator* Create(Unit* object) const override;
138};
139
141{
143
144 MovementGenerator* Create(Unit* object) const override;
145};
146
148{
150
151 MovementGenerator* Create(Unit* object) const override;
152};
153
155
156#define sMovementGeneratorRegistry MovementGeneratorRegistry::instance()
157
158#endif
#define TC_GAME_API
Definition: Define.h:123
uint8_t uint8
Definition: Define.h:144
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
std::string GetDebugInfo()
Definition: Errors.cpp:157
MovementGeneratorType
MovementGeneratorFlags
@ MOVEMENTGENERATOR_FLAG_TIMED_PAUSED
@ MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING
@ MOVEMENTGENERATOR_FLAG_PAUSED
@ MOVEMENTGENERATOR_FLAG_DEACTIVATED
@ MOVEMENTGENERATOR_FLAG_FINALIZED
@ MOVEMENTGENERATOR_FLAG_TRANSITORY
@ MOVEMENTGENERATOR_FLAG_INTERRUPTED
@ MOVEMENTGENERATOR_FLAG_INFORM_ENABLED
@ MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH
@ MOVEMENTGENERATOR_FLAG_INITIALIZED
@ MOVEMENTGENERATOR_FLAG_NONE
@ MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING
MovementGeneratorCreator::FactoryHolderRegistry MovementGeneratorRegistry
FactoryHolder< MovementGenerator, Unit, MovementGeneratorType > MovementGeneratorCreator
void Deactivate(Unit *owner) override
void Reset(Unit *owner) override
void Initialize(Unit *owner) override
void Finalize(Unit *owner, bool active, bool movementInform) override
bool Update(Unit *owner, uint32 diff) override
virtual void Initialize(Unit *owner)=0
MovementGenerator(MovementGenerator const &)=delete
virtual void Pause(uint32)
virtual bool GetResetPosition(Unit *, float &, float &, float &)
MovementGenerator & operator=(MovementGenerator const &)=delete
MovementGenerator & operator=(MovementGenerator &&)=delete
virtual void Resume(uint32)
virtual bool Update(Unit *owner, uint32 diff)=0
virtual void Deactivate(Unit *owner)=0
void AddFlag(uint16 const flag)
virtual void Finalize(Unit *owner, bool active, bool movementInform)=0
bool HasFlag(uint16 const flag) const
MovementGenerator(MovementGenerator &&)=delete
virtual void Reset(Unit *owner)=0
virtual void UnitSpeedChanged()
void RemoveFlag(uint16 const flag)
virtual MovementGeneratorType GetMovementGeneratorType() const =0
Definition: Unit.h:627
MovementGenerator * Create(Unit *object) const override
MovementGenerator * Create(Unit *) const override
MovementGeneratorFactory(MovementGeneratorType movementGeneratorType)
MovementGenerator * Create(Unit *object) const override
MovementGenerator * Create(Unit *object) const override