TrinityCore
Loading...
Searching...
No Matches
MovementInfo.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 TRINITYCORE_MOVEMENT_INFO_H
19#define TRINITYCORE_MOVEMENT_INFO_H
20
21#include "EnumFlag.h"
22#include "ObjectGuid.h"
23#include "Optional.h"
24#include "Position.h"
25#include <algorithm>
26#include <vector>
27
28// EnumUtils: DESCRIBE THIS
30{
31 MOVEMENTFLAG_NONE = 0x0000000000000000, // SKIP
32 MOVEMENTFLAG_FORWARD = 0x0000000000000001,
33 MOVEMENTFLAG_BACKWARD = 0x0000000000000002,
34 MOVEMENTFLAG_STRAFE_LEFT = 0x0000000000000004,
35 MOVEMENTFLAG_STRAFE_RIGHT = 0x0000000000000008,
36 MOVEMENTFLAG_LEFT = 0x0000000000000010,
37 MOVEMENTFLAG_RIGHT = 0x0000000000000020,
38 MOVEMENTFLAG_PITCH_UP = 0x0000000000000040,
39 MOVEMENTFLAG_PITCH_DOWN = 0x0000000000000080,
40 MOVEMENTFLAG_WALKING = 0x0000000000000100, // Walking
41 MOVEMENTFLAG_DISABLE_GRAVITY = 0x0000000000000200, // Former MOVEMENTFLAG_LEVITATING. This is used when walking is not possible.
42 MOVEMENTFLAG_ROOT = 0x0000000000000400, // Must not be set along with MOVEMENTFLAG_MASK_MOVING
43 MOVEMENTFLAG_FALLING = 0x0000000000000800, // damage dealt on that type of falling
44 MOVEMENTFLAG_FALLING_FAR = 0x0000000000001000,
45 MOVEMENTFLAG_PENDING_STOP = 0x0000000000002000,
47 MOVEMENTFLAG_PENDING_FORWARD = 0x0000000000008000,
48 MOVEMENTFLAG_PENDING_BACKWARD = 0x0000000000010000,
51 MOVEMENTFLAG_PENDING_ROOT = 0x0000000000080000,
52 MOVEMENTFLAG_SWIMMING = 0x0000000000100000, // appears with fly flag also
53 MOVEMENTFLAG_ASCENDING = 0x0000000000200000, // press "space" when flying
54 MOVEMENTFLAG_DESCENDING = 0x0000000000400000,
55 MOVEMENTFLAG_CAN_FLY = 0x0000000000800000, // Appears when unit can fly. For example, appears when a player sits on a mount.
56 MOVEMENTFLAG_FLYING = 0x0000000001000000, // unit is actually flying. pretty sure this is only used for players. creatures use disable_gravity
57 MOVEMENTFLAG_SPLINE_ELEVATION = 0x0000000002000000, // used for flight paths
58 MOVEMENTFLAG_WATERWALKING = 0x0000000004000000, // prevent unit from falling through water
59 MOVEMENTFLAG_FALLING_SLOW = 0x0000000008000000, // active rogue safe fall spell (passive)
60 MOVEMENTFLAG_CANNOT_SWIM = 0x0000000010000000,
61 MOVEMENTFLAG_DISABLE_COLLISION = 0x0000000020000000,
62 MOVEMENTFLAG_KNOCKBACK = 0x0000000040000000,
63 MOVEMENTFLAG_TOUCHING_GROUND = 0x0000000080000000, // terrain normal calculation is disabled if this flag is not present, client automatically handles setting this flag
64 MOVEMENTFLAG_NO_STRAFE = 0x0000000100000000,
65 MOVEMENTFLAG_NO_JUMPING = 0x0000000200000000,
66 MOVEMENTFLAG_FULL_SPEED_TURNING = 0x0000000400000000,
73 MOVEMENTFLAG_CAN_DOUBLE_JUMP = 0x0000020000000000,
74 MOVEMENTFLAG_DOUBLE_JUMP = 0x0000040000000000,
75 MOVEMENTFLAG_UNK43 = 0x0000080000000000, // old MovementFlags2 0x8000
76 MOVEMENTFLAG_DISABLE_INERTIA = 0x0000100000000000,
77 MOVEMENTFLAG_CAN_ADV_FLY = 0x0000200000000000,
78 MOVEMENTFLAG_ADV_FLYING = 0x0000400000000000,
79 MOVEMENTFLAG_UNK47 = 0x0000800000000000, // old MovementFlags3 0x8
80 MOVEMENTFLAG_UNK48 = 0x0001000000000000, // old MovementFlags3 0x10
81 MOVEMENTFLAG_FALLING_ADV_FLY_DISMOUNT = 0x0002000000000000, // falling after dismounting while adv flying
82 MOVEMENTFLAG_UNK50 = 0x0004000000000000, // old MovementFlags3 0x200
83 MOVEMENTFLAG_WALKING_ON_WATER = 0x0008000000000000, // currently on water surface
84 MOVEMENTFLAG_CAN_DRIVE = 0x0010000000000000,
85 MOVEMENTFLAG_DRIVING_FORWARD = 0x0020000000000000,
86 MOVEMENTFLAG_DRIVING_BACKWARD = 0x0040000000000000,
87 MOVEMENTFLAG_UNK55 = 0x0080000000000000, // old MovementFlags3 0x20000
88 MOVEMENTFLAG_UNK56 = 0x0100000000000000, // old MovementFlags3 0x40000
89 MOVEMENTFLAG_UNK57 = 0x0200000000000000, // old MovementFlags3 0x80000
90 MOVEMENTFLAG_UNK58 = 0x0400000000000000,
91 MOVEMENTFLAG_HOVER = 0x0800000000000000,
92
96
99
102
103 // Movement flags allowed for creature in CreateObject - we need to keep all other enabled serverside
104 // to properly calculate all movement
108
112
117
119
121{
122 // common
127
128 // transport
130 {
131 void Reset()
132 {
133 guid.Clear();
134 pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
135 seat = -1;
136 time = 0;
137 prevTime = 0;
138 vehicleId = 0;
139 }
140
143 int8 seat = -1;
148
149 // swimming/flying
150 float pitch = 0.0f;
151
152 struct Inertia
153 {
154 Inertia() : id(0), lifetime(0) { }
155
159 };
160
162
163 // jumping
164 struct JumpInfo
165 {
166 void Reset()
167 {
168 fallTime = 0;
169 zspeed = sinAngle = cosAngle = xyspeed = 0.0f;
170 }
171
173
174 float zspeed = 0.0f;
175 float sinAngle = 0.0f;
176 float cosAngle = 0.0f;
177 float xyspeed = 0.0f;
178
180
182
183 // advflying
185 {
187
190 };
191
192 struct Drive
193 {
194 Drive() : speed(0.0f), movementAngle(0.0f), accelerating(false), drifting(false) { }
195
196 float speed;
200 };
201
203
205
206 float gravityModifier = 1.0f;
207
209
211 void SetMovementFlags(MovementFlags flag) { flags = flag; }
212 void AddMovementFlag(MovementFlags flag) { flags |= flag; }
213 void RemoveMovementFlag(MovementFlags flag) { flags &= ~flag; }
214 bool HasMovementFlag(MovementFlags flag) const { return (flags & flag) != 0; }
215
216 uint32 GetFallTime() const { return jump.fallTime; }
217 void SetFallTime(uint32 fallTime) { jump.fallTime = fallTime; }
218
220 {
222 }
223
225 {
226 jump.Reset();
227 }
228
229 void OutDebug();
230};
231
233{
234 SingleDirectional = 0, // always in a single direction
235 Gravity = 1 // pushes/pulls away from a single point
236};
237
251
253{
254public:
255 using Container = std::vector<MovementForce>;
256
257 Container const* GetForces() const { return &_forces; }
258 bool Add(MovementForce const& newForce)
259 {
260 auto itr = FindMovementForce(newForce.ID);
261 if (itr == _forces.end())
262 {
263 _forces.push_back(newForce);
264 return true;
265 }
266
267 return false;
268 }
269
271 {
272 auto itr = FindMovementForce(id);
273 if (itr != _forces.end())
274 {
275 _forces.erase(itr);
276 return true;
277 }
278
279 return false;
280 }
281
282 float GetModMagnitude() const { return _modMagnitude; }
283 void SetModMagnitude(float modMagnitude) { _modMagnitude = modMagnitude; }
284
285 bool IsEmpty() const { return _forces.empty() && _modMagnitude == 1.0f; }
286
287private:
288 Container::iterator FindMovementForce(ObjectGuid id)
289 {
290 return std::find_if(_forces.begin(), _forces.end(), [id](MovementForce const& force) { return force.ID == id; });
291 }
292
294 float _modMagnitude = 1.0f;
295};
296
297#endif // TRINITYCORE_MOVEMENT_INFO_H
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
#define DEFINE_ENUM_FLAG(enumType)
Definition EnumFlag.h:26
MovementFlags
@ MOVEMENTFLAG_MASK_PLAYER_ONLY
@ MOVEMENTFLAG_DESCENDING
@ MOVEMENTFLAG_MASK_CREATURE_ALLOWED
@ MOVEMENTFLAG_UNK43
@ MOVEMENTFLAG_CAN_TURN_WHILE_FALLING
@ MOVEMENTFLAG_PITCH_DOWN
@ MOVEMENTFLAG_PENDING_STRAFE_STOP
@ MOVEMENTFLAG_PITCH_UP
@ MOVEMENTFLAG_CAN_SWIM_TO_FLY_TRANS
@ MOVEMENTFLAG_UNK50
@ MOVEMENTFLAG_RIGHT
@ MOVEMENTFLAG_PENDING_STOP
@ MOVEMENTFLAG_TOUCHING_GROUND
@ MOVEMENTFLAG_DOUBLE_JUMP
@ MOVEMENTFLAG_FORWARD
@ MOVEMENTFLAG_PENDING_STRAFE_LEFT
@ MOVEMENTFLAG_NONE
@ MOVEMENTFLAG_STRAFE_LEFT
@ MOVEMENTFLAG_UNK48
@ MOVEMENTFLAG_BACKWARD
@ MOVEMENTFLAG_WATERWALKING
@ MOVEMENTFLAG_UNK57
@ MOVEMENTFLAG_MASK_MOVING
@ MOVEMENTFLAG_FULL_SPEED_PITCHING
@ MOVEMENTFLAG_CAN_DRIVE
@ MOVEMENTFLAG_UNK58
@ MOVEMENTFLAG_DISABLE_GRAVITY
@ MOVEMENTFLAG_KNOCKBACK
@ MOVEMENTFLAG_WALKING_ON_WATER
@ MOVEMENTFLAG_PENDING_BACKWARD
@ MOVEMENTFLAG_FLYING
@ MOVEMENTFLAG_FALLING_SLOW
@ MOVEMENTFLAG_PENDING_STRAFE_RIGHT
@ MOVEMENTFLAG_CAN_FLY
@ MOVEMENTFLAG_FULL_SPEED_TURNING
@ MOVEMENTFLAG_NO_STRAFE
@ MOVEMENTFLAG_ROOT
@ MOVEMENTFLAG_DRIVING_FORWARD
@ MOVEMENTFLAG_CANNOT_SWIM
@ MOVEMENTFLAG_MASK_TURNING
@ MOVEMENTFLAG_FALLING
@ MOVEMENTFLAG_WATERWALKING_FULL_PITCH
@ MOVEMENTFLAG_FALLING_ADV_FLY_DISMOUNT
@ MOVEMENTFLAG_UNK47
@ MOVEMENTFLAG_LEFT
@ MOVEMENTFLAG_IGNORE_MOVEMENT_FORCES
@ MOVEMENTFLAG_MASK_MOVING_FLY
@ MOVEMENTFLAG_NO_JUMPING
@ MOVEMENTFLAG_STRAFE_RIGHT
@ MOVEMENTFLAG_FALLING_FAR
@ MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE
Movement flags that have change status opcodes associated for players.
@ MOVEMENTFLAG_SWIMMING
@ MOVEMENTFLAG_ASCENDING
@ MOVEMENTFLAG_PENDING_FORWARD
@ MOVEMENTFLAG_HOVER
@ MOVEMENTFLAG_DRIVING_BACKWARD
@ MOVEMENTFLAG_UNK55
@ MOVEMENTFLAG_SPLINE_ELEVATION
@ MOVEMENTFLAG_CAN_ADV_FLY
@ MOVEMENTFLAG_CAN_DOUBLE_JUMP
@ MOVEMENTFLAG_PENDING_ROOT
@ MOVEMENTFLAG_WALKING
@ MOVEMENTFLAG_ALWAYS_ALLOW_PITCHING
@ MOVEMENTFLAG_DISABLE_COLLISION
@ MOVEMENTFLAG_DISABLE_INERTIA
@ MOVEMENTFLAG_UNK56
@ MOVEMENTFLAG_ADV_FLYING
MovementForceType
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
Container const * GetForces() const
float GetModMagnitude() const
bool Remove(ObjectGuid id)
void SetModMagnitude(float modMagnitude)
Container::iterator FindMovementForce(ObjectGuid id)
bool IsEmpty() const
std::vector< MovementForce > Container
bool Add(MovementForce const &newForce)
Container _forces
void Clear()
Definition ObjectGuid.h:329
MovementForceType Type
TaggedPosition< Position::XYZ > Origin
uint32 EndTimestamp
ObjectGuid ID
int32 MovementForceID
TaggedPosition< Position::XYZ > Direction
bool HasMovementFlag(MovementFlags flag) const
ObjectGuid guid
void ResetTransport()
MovementFlags GetMovementFlags() const
Optional< Inertia > inertia
Optional< Drive > driveStatus
void RemoveMovementFlag(MovementFlags flag)
float gravityModifier
void AddMovementFlag(MovementFlags flag)
void SetFallTime(uint32 fallTime)
Optional< ObjectGuid > standingOnGameObjectGUID
uint32 GetFallTime() const
struct MovementInfo::JumpInfo jump
float stepUpStartElevation
void SetMovementFlags(MovementFlags flag)
struct MovementInfo::TransportInfo transport
MovementFlags flags
void OutDebug()
Definition Object.cpp:167
Optional< AdvFlying > advFlying
constexpr void Relocate(float x, float y)
Definition Position.h:74