aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-04-23 11:09:59 +0200
committerShauren <shauren.trinity@gmail.com>2024-04-23 11:09:59 +0200
commita02804fa0246851436bb195d8d06d991de523bb0 (patch)
treec59f40a8d2c7188b0599f3b62b8d0634dc4fe161 /src
parent1da162d71dd0dc7540db0384e45b7aaa7e6f0d64 (diff)
Core/Movement: Refactor MoveSplineFlag to get rid of undefined behavior (cast in raw()) and unify enum to string formatting for it
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp5
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h15
-rw-r--r--src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp261
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp36
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.h8
-rw-r--r--src/server/game/Movement/Spline/MoveSplineFlag.h223
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp22
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h26
-rw-r--r--src/server/game/Movement/Spline/MovementTypedefs.h9
-rw-r--r--src/server/game/Movement/Spline/MovementUtil.cpp128
-rw-r--r--src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp159
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp18
12 files changed, 635 insertions, 275 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 0a1f2b403ad..6a7075cfe4d 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -829,8 +829,9 @@ void MovementInfo::OutDebug()
{
TC_LOG_DEBUG("misc", "MOVEMENT INFO");
TC_LOG_DEBUG("misc", "{}", guid.ToString());
- TC_LOG_DEBUG("misc", "flags {} ({})", Movement::MovementFlags_ToString(flags), flags);
- TC_LOG_DEBUG("misc", "flags2 {} ({})", Movement::MovementFlagsExtra_ToString(flags2), flags2);
+ TC_LOG_DEBUG("misc", "flags {} ({})", Movement::MovementFlags_ToString(MovementFlags(flags)), flags);
+ TC_LOG_DEBUG("misc", "flags2 {} ({})", Movement::MovementFlags_ToString(MovementFlags2(flags2)), flags2);
+ TC_LOG_DEBUG("misc", "flags3 {} ({})", Movement::MovementFlags_ToString(MovementFlags3(flags3)), flags2);
TC_LOG_DEBUG("misc", "time {} current time {}", time, getMSTime());
TC_LOG_DEBUG("misc", "position: `{}`", pos.ToString());
if (!transport.guid.IsEmpty())
diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h
index 91a10a5b9c5..f19ef29ada0 100644
--- a/src/server/game/Entities/Unit/UnitDefines.h
+++ b/src/server/game/Entities/Unit/UnitDefines.h
@@ -353,6 +353,7 @@ enum NPCFlags2 : uint32
DEFINE_ENUM_FLAG(NPCFlags2);
+// EnumUtils: DESCRIBE THIS
enum MovementFlags : uint32
{
MOVEMENTFLAG_NONE = 0x00000000,
@@ -389,29 +390,30 @@ enum MovementFlags : uint32
MOVEMENTFLAG_MASK_MOVING =
MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT |
- MOVEMENTFLAG_FALLING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING,
+ MOVEMENTFLAG_FALLING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING,// SKIP
MOVEMENTFLAG_MASK_TURNING =
- MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT | MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN,
+ MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT | MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN, // SKIP
MOVEMENTFLAG_MASK_MOVING_FLY =
- MOVEMENTFLAG_FLYING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING,
+ MOVEMENTFLAG_FLYING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING, // SKIP
// Movement flags allowed for creature in CreateObject - we need to keep all other enabled serverside
// to properly calculate all movement
MOVEMENTFLAG_MASK_CREATURE_ALLOWED =
MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_ROOT | MOVEMENTFLAG_SWIMMING |
- MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_DISABLE_COLLISION,
+ MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_DISABLE_COLLISION, // SKIP
/// @todo if needed: add more flags to this masks that are exclusive to players
MOVEMENTFLAG_MASK_PLAYER_ONLY =
- MOVEMENTFLAG_FLYING,
+ MOVEMENTFLAG_FLYING, // SKIP
/// Movement flags that have change status opcodes associated for players
MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE = MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_ROOT |
- MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_DISABLE_COLLISION
+ MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_DISABLE_COLLISION // SKIP
};
+// EnumUtils: DESCRIBE THIS
enum MovementFlags2 : uint32
{
MOVEMENTFLAG2_NONE = 0x00000000,
@@ -436,6 +438,7 @@ enum MovementFlags2 : uint32
MOVEMENTFLAG2_INTERPOLATED_PITCHING = 0x00080000
};
+// EnumUtils: DESCRIBE THIS
enum MovementFlags3 : uint32
{
MOVEMENTFLAG3_NONE = 0x00000000,
diff --git a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp
index 3a9b8d1a5b0..af0544234ff 100644
--- a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp
+++ b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp
@@ -622,4 +622,265 @@ TC_API_EXPORT size_t EnumUtils<NPCFlags2>::ToIndex(NPCFlags2 value)
default: throw std::out_of_range("value");
}
}
+
+/*******************************************************************\
+|* data for enum 'MovementFlags' in 'UnitDefines.h' auto-generated *|
+\*******************************************************************/
+template <>
+TC_API_EXPORT EnumText EnumUtils<MovementFlags>::ToString(MovementFlags value)
+{
+ switch (value)
+ {
+ case MOVEMENTFLAG_NONE: return { "MOVEMENTFLAG_NONE", "MOVEMENTFLAG_NONE", "" };
+ case MOVEMENTFLAG_FORWARD: return { "MOVEMENTFLAG_FORWARD", "MOVEMENTFLAG_FORWARD", "" };
+ case MOVEMENTFLAG_BACKWARD: return { "MOVEMENTFLAG_BACKWARD", "MOVEMENTFLAG_BACKWARD", "" };
+ case MOVEMENTFLAG_STRAFE_LEFT: return { "MOVEMENTFLAG_STRAFE_LEFT", "MOVEMENTFLAG_STRAFE_LEFT", "" };
+ case MOVEMENTFLAG_STRAFE_RIGHT: return { "MOVEMENTFLAG_STRAFE_RIGHT", "MOVEMENTFLAG_STRAFE_RIGHT", "" };
+ case MOVEMENTFLAG_LEFT: return { "MOVEMENTFLAG_LEFT", "MOVEMENTFLAG_LEFT", "" };
+ case MOVEMENTFLAG_RIGHT: return { "MOVEMENTFLAG_RIGHT", "MOVEMENTFLAG_RIGHT", "" };
+ case MOVEMENTFLAG_PITCH_UP: return { "MOVEMENTFLAG_PITCH_UP", "MOVEMENTFLAG_PITCH_UP", "" };
+ case MOVEMENTFLAG_PITCH_DOWN: return { "MOVEMENTFLAG_PITCH_DOWN", "MOVEMENTFLAG_PITCH_DOWN", "" };
+ case MOVEMENTFLAG_WALKING: return { "MOVEMENTFLAG_WALKING", "MOVEMENTFLAG_WALKING", "Walking" };
+ case MOVEMENTFLAG_DISABLE_GRAVITY: return { "MOVEMENTFLAG_DISABLE_GRAVITY", "MOVEMENTFLAG_DISABLE_GRAVITY", "Former MOVEMENTFLAG_LEVITATING. This is used when walking is not possible." };
+ case MOVEMENTFLAG_ROOT: return { "MOVEMENTFLAG_ROOT", "MOVEMENTFLAG_ROOT", "Must not be set along with MOVEMENTFLAG_MASK_MOVING" };
+ case MOVEMENTFLAG_FALLING: return { "MOVEMENTFLAG_FALLING", "MOVEMENTFLAG_FALLING", "damage dealt on that type of falling" };
+ case MOVEMENTFLAG_FALLING_FAR: return { "MOVEMENTFLAG_FALLING_FAR", "MOVEMENTFLAG_FALLING_FAR", "" };
+ case MOVEMENTFLAG_PENDING_STOP: return { "MOVEMENTFLAG_PENDING_STOP", "MOVEMENTFLAG_PENDING_STOP", "" };
+ case MOVEMENTFLAG_PENDING_STRAFE_STOP: return { "MOVEMENTFLAG_PENDING_STRAFE_STOP", "MOVEMENTFLAG_PENDING_STRAFE_STOP", "" };
+ case MOVEMENTFLAG_PENDING_FORWARD: return { "MOVEMENTFLAG_PENDING_FORWARD", "MOVEMENTFLAG_PENDING_FORWARD", "" };
+ case MOVEMENTFLAG_PENDING_BACKWARD: return { "MOVEMENTFLAG_PENDING_BACKWARD", "MOVEMENTFLAG_PENDING_BACKWARD", "" };
+ case MOVEMENTFLAG_PENDING_STRAFE_LEFT: return { "MOVEMENTFLAG_PENDING_STRAFE_LEFT", "MOVEMENTFLAG_PENDING_STRAFE_LEFT", "" };
+ case MOVEMENTFLAG_PENDING_STRAFE_RIGHT: return { "MOVEMENTFLAG_PENDING_STRAFE_RIGHT", "MOVEMENTFLAG_PENDING_STRAFE_RIGHT", "" };
+ case MOVEMENTFLAG_PENDING_ROOT: return { "MOVEMENTFLAG_PENDING_ROOT", "MOVEMENTFLAG_PENDING_ROOT", "" };
+ case MOVEMENTFLAG_SWIMMING: return { "MOVEMENTFLAG_SWIMMING", "MOVEMENTFLAG_SWIMMING", "appears with fly flag also" };
+ case MOVEMENTFLAG_ASCENDING: return { "MOVEMENTFLAG_ASCENDING", "MOVEMENTFLAG_ASCENDING", "press \042space\042 when flying" };
+ case MOVEMENTFLAG_DESCENDING: return { "MOVEMENTFLAG_DESCENDING", "MOVEMENTFLAG_DESCENDING", "" };
+ case MOVEMENTFLAG_CAN_FLY: return { "MOVEMENTFLAG_CAN_FLY", "MOVEMENTFLAG_CAN_FLY", "Appears when unit can fly. For example, appears when a player sits on a mount." };
+ case MOVEMENTFLAG_FLYING: return { "MOVEMENTFLAG_FLYING", "MOVEMENTFLAG_FLYING", "unit is actually flying. pretty sure this is only used for players. creatures use disable_gravity" };
+ case MOVEMENTFLAG_SPLINE_ELEVATION: return { "MOVEMENTFLAG_SPLINE_ELEVATION", "MOVEMENTFLAG_SPLINE_ELEVATION", "used for flight paths" };
+ case MOVEMENTFLAG_WATERWALKING: return { "MOVEMENTFLAG_WATERWALKING", "MOVEMENTFLAG_WATERWALKING", "prevent unit from falling through water" };
+ case MOVEMENTFLAG_FALLING_SLOW: return { "MOVEMENTFLAG_FALLING_SLOW", "MOVEMENTFLAG_FALLING_SLOW", "active rogue safe fall spell (passive)" };
+ case MOVEMENTFLAG_HOVER: return { "MOVEMENTFLAG_HOVER", "MOVEMENTFLAG_HOVER", "hover, cannot jump" };
+ case MOVEMENTFLAG_DISABLE_COLLISION: return { "MOVEMENTFLAG_DISABLE_COLLISION", "MOVEMENTFLAG_DISABLE_COLLISION", "" };
+ default: throw std::out_of_range("value");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MovementFlags>::Count() { return 31; }
+
+template <>
+TC_API_EXPORT MovementFlags EnumUtils<MovementFlags>::FromIndex(size_t index)
+{
+ switch (index)
+ {
+ case 0: return MOVEMENTFLAG_NONE;
+ case 1: return MOVEMENTFLAG_FORWARD;
+ case 2: return MOVEMENTFLAG_BACKWARD;
+ case 3: return MOVEMENTFLAG_STRAFE_LEFT;
+ case 4: return MOVEMENTFLAG_STRAFE_RIGHT;
+ case 5: return MOVEMENTFLAG_LEFT;
+ case 6: return MOVEMENTFLAG_RIGHT;
+ case 7: return MOVEMENTFLAG_PITCH_UP;
+ case 8: return MOVEMENTFLAG_PITCH_DOWN;
+ case 9: return MOVEMENTFLAG_WALKING;
+ case 10: return MOVEMENTFLAG_DISABLE_GRAVITY;
+ case 11: return MOVEMENTFLAG_ROOT;
+ case 12: return MOVEMENTFLAG_FALLING;
+ case 13: return MOVEMENTFLAG_FALLING_FAR;
+ case 14: return MOVEMENTFLAG_PENDING_STOP;
+ case 15: return MOVEMENTFLAG_PENDING_STRAFE_STOP;
+ case 16: return MOVEMENTFLAG_PENDING_FORWARD;
+ case 17: return MOVEMENTFLAG_PENDING_BACKWARD;
+ case 18: return MOVEMENTFLAG_PENDING_STRAFE_LEFT;
+ case 19: return MOVEMENTFLAG_PENDING_STRAFE_RIGHT;
+ case 20: return MOVEMENTFLAG_PENDING_ROOT;
+ case 21: return MOVEMENTFLAG_SWIMMING;
+ case 22: return MOVEMENTFLAG_ASCENDING;
+ case 23: return MOVEMENTFLAG_DESCENDING;
+ case 24: return MOVEMENTFLAG_CAN_FLY;
+ case 25: return MOVEMENTFLAG_FLYING;
+ case 26: return MOVEMENTFLAG_SPLINE_ELEVATION;
+ case 27: return MOVEMENTFLAG_WATERWALKING;
+ case 28: return MOVEMENTFLAG_FALLING_SLOW;
+ case 29: return MOVEMENTFLAG_HOVER;
+ case 30: return MOVEMENTFLAG_DISABLE_COLLISION;
+ default: throw std::out_of_range("index");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MovementFlags>::ToIndex(MovementFlags value)
+{
+ switch (value)
+ {
+ case MOVEMENTFLAG_NONE: return 0;
+ case MOVEMENTFLAG_FORWARD: return 1;
+ case MOVEMENTFLAG_BACKWARD: return 2;
+ case MOVEMENTFLAG_STRAFE_LEFT: return 3;
+ case MOVEMENTFLAG_STRAFE_RIGHT: return 4;
+ case MOVEMENTFLAG_LEFT: return 5;
+ case MOVEMENTFLAG_RIGHT: return 6;
+ case MOVEMENTFLAG_PITCH_UP: return 7;
+ case MOVEMENTFLAG_PITCH_DOWN: return 8;
+ case MOVEMENTFLAG_WALKING: return 9;
+ case MOVEMENTFLAG_DISABLE_GRAVITY: return 10;
+ case MOVEMENTFLAG_ROOT: return 11;
+ case MOVEMENTFLAG_FALLING: return 12;
+ case MOVEMENTFLAG_FALLING_FAR: return 13;
+ case MOVEMENTFLAG_PENDING_STOP: return 14;
+ case MOVEMENTFLAG_PENDING_STRAFE_STOP: return 15;
+ case MOVEMENTFLAG_PENDING_FORWARD: return 16;
+ case MOVEMENTFLAG_PENDING_BACKWARD: return 17;
+ case MOVEMENTFLAG_PENDING_STRAFE_LEFT: return 18;
+ case MOVEMENTFLAG_PENDING_STRAFE_RIGHT: return 19;
+ case MOVEMENTFLAG_PENDING_ROOT: return 20;
+ case MOVEMENTFLAG_SWIMMING: return 21;
+ case MOVEMENTFLAG_ASCENDING: return 22;
+ case MOVEMENTFLAG_DESCENDING: return 23;
+ case MOVEMENTFLAG_CAN_FLY: return 24;
+ case MOVEMENTFLAG_FLYING: return 25;
+ case MOVEMENTFLAG_SPLINE_ELEVATION: return 26;
+ case MOVEMENTFLAG_WATERWALKING: return 27;
+ case MOVEMENTFLAG_FALLING_SLOW: return 28;
+ case MOVEMENTFLAG_HOVER: return 29;
+ case MOVEMENTFLAG_DISABLE_COLLISION: return 30;
+ default: throw std::out_of_range("value");
+ }
+}
+
+/********************************************************************\
+|* data for enum 'MovementFlags2' in 'UnitDefines.h' auto-generated *|
+\********************************************************************/
+template <>
+TC_API_EXPORT EnumText EnumUtils<MovementFlags2>::ToString(MovementFlags2 value)
+{
+ switch (value)
+ {
+ case MOVEMENTFLAG2_NONE: return { "MOVEMENTFLAG2_NONE", "MOVEMENTFLAG2_NONE", "" };
+ case MOVEMENTFLAG2_NO_STRAFE: return { "MOVEMENTFLAG2_NO_STRAFE", "MOVEMENTFLAG2_NO_STRAFE", "" };
+ case MOVEMENTFLAG2_NO_JUMPING: return { "MOVEMENTFLAG2_NO_JUMPING", "MOVEMENTFLAG2_NO_JUMPING", "" };
+ case MOVEMENTFLAG2_FULL_SPEED_TURNING: return { "MOVEMENTFLAG2_FULL_SPEED_TURNING", "MOVEMENTFLAG2_FULL_SPEED_TURNING", "" };
+ case MOVEMENTFLAG2_FULL_SPEED_PITCHING: return { "MOVEMENTFLAG2_FULL_SPEED_PITCHING", "MOVEMENTFLAG2_FULL_SPEED_PITCHING", "" };
+ case MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING: return { "MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING", "MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING", "" };
+ case MOVEMENTFLAG2_IS_VEHICLE_EXIT_VOLUNTARY: return { "MOVEMENTFLAG2_IS_VEHICLE_EXIT_VOLUNTARY", "MOVEMENTFLAG2_IS_VEHICLE_EXIT_VOLUNTARY", "" };
+ case MOVEMENTFLAG2_WATERWALKING_FULL_PITCH: return { "MOVEMENTFLAG2_WATERWALKING_FULL_PITCH", "MOVEMENTFLAG2_WATERWALKING_FULL_PITCH", "will always waterwalk, even if facing the camera directly down" };
+ case MOVEMENTFLAG2_VEHICLE_PASSENGER_IS_TRANSITION_ALLOWED: return { "MOVEMENTFLAG2_VEHICLE_PASSENGER_IS_TRANSITION_ALLOWED", "MOVEMENTFLAG2_VEHICLE_PASSENGER_IS_TRANSITION_ALLOWED", "" };
+ case MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS: return { "MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS", "MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS", "" };
+ case MOVEMENTFLAG2_UNK9: return { "MOVEMENTFLAG2_UNK9", "MOVEMENTFLAG2_UNK9", "terrain normal calculation is disabled if this flag is not present, client automatically handles setting this flag" };
+ case MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING: return { "MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING", "MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING", "" };
+ case MOVEMENTFLAG2_IGNORE_MOVEMENT_FORCES: return { "MOVEMENTFLAG2_IGNORE_MOVEMENT_FORCES", "MOVEMENTFLAG2_IGNORE_MOVEMENT_FORCES", "" };
+ case MOVEMENTFLAG2_CAN_DOUBLE_JUMP: return { "MOVEMENTFLAG2_CAN_DOUBLE_JUMP", "MOVEMENTFLAG2_CAN_DOUBLE_JUMP", "" };
+ case MOVEMENTFLAG2_DOUBLE_JUMP: return { "MOVEMENTFLAG2_DOUBLE_JUMP", "MOVEMENTFLAG2_DOUBLE_JUMP", "" };
+ case MOVEMENTFLAG2_AWAITING_LOAD: return { "MOVEMENTFLAG2_AWAITING_LOAD", "MOVEMENTFLAG2_AWAITING_LOAD", "" };
+ case MOVEMENTFLAG2_INTERPOLATED_MOVEMENT: return { "MOVEMENTFLAG2_INTERPOLATED_MOVEMENT", "MOVEMENTFLAG2_INTERPOLATED_MOVEMENT", "" };
+ case MOVEMENTFLAG2_INTERPOLATED_TURNING: return { "MOVEMENTFLAG2_INTERPOLATED_TURNING", "MOVEMENTFLAG2_INTERPOLATED_TURNING", "" };
+ case MOVEMENTFLAG2_INTERPOLATED_PITCHING: return { "MOVEMENTFLAG2_INTERPOLATED_PITCHING", "MOVEMENTFLAG2_INTERPOLATED_PITCHING", "" };
+ default: throw std::out_of_range("value");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MovementFlags2>::Count() { return 19; }
+
+template <>
+TC_API_EXPORT MovementFlags2 EnumUtils<MovementFlags2>::FromIndex(size_t index)
+{
+ switch (index)
+ {
+ case 0: return MOVEMENTFLAG2_NONE;
+ case 1: return MOVEMENTFLAG2_NO_STRAFE;
+ case 2: return MOVEMENTFLAG2_NO_JUMPING;
+ case 3: return MOVEMENTFLAG2_FULL_SPEED_TURNING;
+ case 4: return MOVEMENTFLAG2_FULL_SPEED_PITCHING;
+ case 5: return MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING;
+ case 6: return MOVEMENTFLAG2_IS_VEHICLE_EXIT_VOLUNTARY;
+ case 7: return MOVEMENTFLAG2_WATERWALKING_FULL_PITCH;
+ case 8: return MOVEMENTFLAG2_VEHICLE_PASSENGER_IS_TRANSITION_ALLOWED;
+ case 9: return MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS;
+ case 10: return MOVEMENTFLAG2_UNK9;
+ case 11: return MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING;
+ case 12: return MOVEMENTFLAG2_IGNORE_MOVEMENT_FORCES;
+ case 13: return MOVEMENTFLAG2_CAN_DOUBLE_JUMP;
+ case 14: return MOVEMENTFLAG2_DOUBLE_JUMP;
+ case 15: return MOVEMENTFLAG2_AWAITING_LOAD;
+ case 16: return MOVEMENTFLAG2_INTERPOLATED_MOVEMENT;
+ case 17: return MOVEMENTFLAG2_INTERPOLATED_TURNING;
+ case 18: return MOVEMENTFLAG2_INTERPOLATED_PITCHING;
+ default: throw std::out_of_range("index");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MovementFlags2>::ToIndex(MovementFlags2 value)
+{
+ switch (value)
+ {
+ case MOVEMENTFLAG2_NONE: return 0;
+ case MOVEMENTFLAG2_NO_STRAFE: return 1;
+ case MOVEMENTFLAG2_NO_JUMPING: return 2;
+ case MOVEMENTFLAG2_FULL_SPEED_TURNING: return 3;
+ case MOVEMENTFLAG2_FULL_SPEED_PITCHING: return 4;
+ case MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING: return 5;
+ case MOVEMENTFLAG2_IS_VEHICLE_EXIT_VOLUNTARY: return 6;
+ case MOVEMENTFLAG2_WATERWALKING_FULL_PITCH: return 7;
+ case MOVEMENTFLAG2_VEHICLE_PASSENGER_IS_TRANSITION_ALLOWED: return 8;
+ case MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS: return 9;
+ case MOVEMENTFLAG2_UNK9: return 10;
+ case MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING: return 11;
+ case MOVEMENTFLAG2_IGNORE_MOVEMENT_FORCES: return 12;
+ case MOVEMENTFLAG2_CAN_DOUBLE_JUMP: return 13;
+ case MOVEMENTFLAG2_DOUBLE_JUMP: return 14;
+ case MOVEMENTFLAG2_AWAITING_LOAD: return 15;
+ case MOVEMENTFLAG2_INTERPOLATED_MOVEMENT: return 16;
+ case MOVEMENTFLAG2_INTERPOLATED_TURNING: return 17;
+ case MOVEMENTFLAG2_INTERPOLATED_PITCHING: return 18;
+ default: throw std::out_of_range("value");
+ }
+}
+
+/********************************************************************\
+|* data for enum 'MovementFlags3' in 'UnitDefines.h' auto-generated *|
+\********************************************************************/
+template <>
+TC_API_EXPORT EnumText EnumUtils<MovementFlags3>::ToString(MovementFlags3 value)
+{
+ switch (value)
+ {
+ case MOVEMENTFLAG3_NONE: return { "MOVEMENTFLAG3_NONE", "MOVEMENTFLAG3_NONE", "" };
+ case MOVEMENTFLAG3_DISABLE_INERTIA: return { "MOVEMENTFLAG3_DISABLE_INERTIA", "MOVEMENTFLAG3_DISABLE_INERTIA", "" };
+ case MOVEMENTFLAG3_CAN_ADV_FLY: return { "MOVEMENTFLAG3_CAN_ADV_FLY", "MOVEMENTFLAG3_CAN_ADV_FLY", "" };
+ case MOVEMENTFLAG3_ADV_FLYING: return { "MOVEMENTFLAG3_ADV_FLYING", "MOVEMENTFLAG3_ADV_FLYING", "" };
+ default: throw std::out_of_range("value");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MovementFlags3>::Count() { return 4; }
+
+template <>
+TC_API_EXPORT MovementFlags3 EnumUtils<MovementFlags3>::FromIndex(size_t index)
+{
+ switch (index)
+ {
+ case 0: return MOVEMENTFLAG3_NONE;
+ case 1: return MOVEMENTFLAG3_DISABLE_INERTIA;
+ case 2: return MOVEMENTFLAG3_CAN_ADV_FLY;
+ case 3: return MOVEMENTFLAG3_ADV_FLYING;
+ default: throw std::out_of_range("index");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MovementFlags3>::ToIndex(MovementFlags3 value)
+{
+ switch (value)
+ {
+ case MOVEMENTFLAG3_NONE: return 0;
+ case MOVEMENTFLAG3_DISABLE_INERTIA: return 1;
+ case MOVEMENTFLAG3_CAN_ADV_FLY: return 2;
+ case MOVEMENTFLAG3_ADV_FLYING: return 3;
+ default: throw std::out_of_range("value");
+ }
+}
}
diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp
index fba77681236..e22c8c634b9 100644
--- a/src/server/game/Movement/Spline/MoveSpline.cpp
+++ b/src/server/game/Movement/Spline/MoveSpline.cpp
@@ -37,14 +37,14 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const
c.orientation = initialOrientation;
spline.evaluate_percent(point_index, u, c);
- if (splineflags.animation)
+ if (splineflags.Animation)
;// MoveSplineFlag::Animation disables falling or parabolic movement
- else if (splineflags.parabolic)
+ else if (splineflags.Parabolic)
computeParabolicElevation(time_point, c.z);
- else if (splineflags.falling)
+ else if (splineflags.Falling)
computeFallElevation(time_point, c.z);
- if (splineflags.done && facing.type != MONSTER_MOVE_NORMAL)
+ if (splineflags.Done && facing.type != MONSTER_MOVE_NORMAL)
{
if (facing.type == MONSTER_MOVE_FACING_ANGLE)
c.orientation = facing.angle;
@@ -54,7 +54,7 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const
}
else
{
- if (!splineflags.hasFlag(MoveSplineFlag::OrientationFixed | MoveSplineFlag::Falling | MoveSplineFlag::Unknown_0x8))
+ if (!splineflags.HasFlag(MoveSplineFlagEnum::OrientationFixed | MoveSplineFlagEnum::Falling | MoveSplineFlagEnum::Unknown_0x8))
{
Vector3 hermite;
spline.evaluate_derivative(point_Idx, u, hermite);
@@ -62,7 +62,7 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const
c.orientation = std::atan2(hermite.y, hermite.x);
}
- if (splineflags.backward)
+ if (splineflags.Backward)
c.orientation = c.orientation - float(M_PI);
}
return c;
@@ -148,10 +148,10 @@ struct CommonInitializer
void MoveSpline::init_spline(MoveSplineInitArgs const& args)
{
static SplineBase::EvaluationMode const modes[2] = { SplineBase::ModeLinear, SplineBase::ModeCatmullrom };
- if (args.flags.cyclic)
+ if (args.flags.Cyclic)
{
uint32 cyclic_point = 0;
- if (splineflags.enter_cycle)
+ if (splineflags.Enter_Cycle)
cyclic_point = 1; // shouldn't be modified, came from client
spline.init_cyclic_spline(&args.path[0], args.path.size(), modes[args.flags.isSmooth()], cyclic_point, args.initialOrientation);
}
@@ -159,7 +159,7 @@ void MoveSpline::init_spline(MoveSplineInitArgs const& args)
spline.init_spline(&args.path[0], args.path.size(), modes[args.flags.isSmooth()], args.initialOrientation);
// init spline timestamps
- if (splineflags.falling)
+ if (splineflags.Falling)
{
FallInitializer init(spline.getPoint(spline.first()).z);
spline.initLengths(init);
@@ -197,7 +197,7 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args)
velocity = args.velocity;
// Check if its a stop spline
- if (args.flags.done)
+ if (args.flags.Done)
{
spline.clear();
return;
@@ -207,14 +207,14 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args)
// init parabolic / animation
// spline initialized, duration known and i able to compute parabolic acceleration
- if (args.flags & (MoveSplineFlag::Parabolic | MoveSplineFlag::Animation | MoveSplineFlag::FadeObject))
+ if (args.flags.HasFlag(MoveSplineFlagEnum::Parabolic | MoveSplineFlagEnum::Animation | MoveSplineFlagEnum::FadeObject))
{
int32 spline_duration = Duration();
effect_start_time = spline_duration * args.effect_start_time_percent + args.effect_start_time.count();
if (effect_start_time > spline_duration)
effect_start_time = spline_duration;
- if (args.flags.parabolic && effect_start_time < spline_duration)
+ if (args.flags.Parabolic && effect_start_time < spline_duration)
{
if (args.parabolic_amplitude != 0.0f)
{
@@ -233,7 +233,7 @@ MoveSpline::MoveSpline() : m_Id(0), time_passed(0),
vertical_acceleration(0.f), initialOrientation(0.f), effect_start_time(0), point_Idx(0), point_Idx_offset(0), velocity(0.f),
onTransport(false), splineIsFacingOnly(false)
{
- splineflags.done = true;
+ splineflags.Done = true;
}
/// ============================================================================================
@@ -284,11 +284,11 @@ bool MoveSplineInitArgs::_checkPathLengths()
return false;
// when compression is enabled, each point coord is packed into 11 bits (10 for Z)
- if (!flags.uncompressedPath)
+ if (!flags.UncompressedPath)
if (!isValidPackedXYOffset(std::fabs(path[i].x - middle.x))
|| !isValidPackedXYOffset(std::fabs(path[i].y - middle.y))
|| !isValidPackedZOffset(std::fabs(path[i].z - middle.z)))
- flags.uncompressedPath = true;
+ flags.UncompressedPath = true;
}
}
return true;
@@ -340,9 +340,9 @@ MoveSpline::UpdateResult MoveSpline::_updateState(int32& ms_time_diff)
// Remove first point from the path after one full cycle.
// That point was the position of the unit prior to entering the cycle and it shouldn't be repeated with continuous cycles.
- if (splineflags.enter_cycle)
+ if (splineflags.Enter_Cycle)
{
- splineflags.enter_cycle = false;
+ splineflags.Enter_Cycle = false;
MoveSplineInitArgs args{ (size_t)spline.getPointCount() };
args.path.assign(spline.getPoints().begin() + spline.first() + 1, spline.getPoints().begin() + spline.last());
@@ -407,7 +407,7 @@ std::string MoveSpline::ToString() const
void MoveSpline::_Finalize()
{
- splineflags.done = true;
+ splineflags.Done = true;
point_Idx = spline.last() - 1;
time_passed = Duration();
}
diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h
index c37fbec0f52..df68e6c2369 100644
--- a/src/server/game/Movement/Spline/MoveSpline.h
+++ b/src/server/game/Movement/Spline/MoveSpline.h
@@ -106,7 +106,7 @@ namespace Movement
int32 _currentSplineIdx() const { return point_Idx; }
float Velocity() const { return velocity; }
void _Finalize();
- void _Interrupt() { splineflags.done = true; }
+ void _Interrupt() { splineflags.Done = true; }
public:
void Initialize(MoveSplineInitArgs const&);
@@ -134,9 +134,9 @@ namespace Movement
Location ComputePosition(int32 time_offset) const;
uint32 GetId() const { return m_Id; }
- bool Finalized() const { return splineflags.done; }
- bool isCyclic() const { return splineflags.cyclic; }
- bool isFalling() const { return splineflags.falling; }
+ bool Finalized() const { return splineflags.Done; }
+ bool isCyclic() const { return splineflags.Cyclic; }
+ bool isFalling() const { return splineflags.Falling; }
Vector3 const& FinalDestination() const { return Initialized() ? spline.getPoint(spline.last()) : Vector3::zero(); }
Vector3 const& CurrentDestination() const { return Initialized() ? spline.getPoint(point_Idx + 1) : Vector3::zero(); }
int32 currentPathIdx() const;
diff --git a/src/server/game/Movement/Spline/MoveSplineFlag.h b/src/server/game/Movement/Spline/MoveSplineFlag.h
index 5936f8d7067..0434657df25 100644
--- a/src/server/game/Movement/Spline/MoveSplineFlag.h
+++ b/src/server/game/Movement/Spline/MoveSplineFlag.h
@@ -19,124 +19,145 @@
#define TRINITYSERVER_MOVESPLINEFLAG_H
#include "Define.h"
+#include "EnumFlag.h"
#include <string>
namespace Movement
{
-#pragma pack(push, 1)
+ // EnumUtils: DESCRIBE THIS
+ enum class MoveSplineFlagEnum : uint32
+ {
+ None = 0x00000000,
+ Unknown_0x1 = 0x00000001, // NOT VERIFIED
+ Unknown_0x2 = 0x00000002, // NOT VERIFIED
+ Unknown_0x4 = 0x00000004, // NOT VERIFIED
+ Unknown_0x8 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation
+ FallingSlow = 0x00000010,
+ Done = 0x00000020,
+ Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag
+ No_Spline = 0x00000080,
+ Unknown_0x100 = 0x00000100, // NOT VERIFIED
+ Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation
+ OrientationFixed = 0x00000400, // Model orientation fixed
+ Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
+ Cyclic = 0x00001000, // Movement by cycled spline
+ Enter_Cycle = 0x00002000, // Everytimes appears with cyclic flag in monster move packet, erases first spline vertex after first cycle done
+ Frozen = 0x00004000, // Will never arrive
+ TransportEnter = 0x00008000,
+ TransportExit = 0x00010000,
+ Unknown_0x20000 = 0x00020000, // NOT VERIFIED
+ Unknown_0x40000 = 0x00040000, // NOT VERIFIED
+ Backward = 0x00080000,
+ SmoothGroundPath = 0x00100000,
+ CanSwim = 0x00200000,
+ UncompressedPath = 0x00400000,
+ Unknown_0x800000 = 0x00800000, // NOT VERIFIED
+ FastSteering = 0x01000000, // Predicts spline only 500ms into the future for smoothing instead of 1s (making turns sharper) and turns off clientside obstacle detection
+ Animation = 0x02000000, // Plays animation after some time passed
+ Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag
+ FadeObject = 0x08000000,
+ Steering = 0x10000000,
+ UnlimitedSpeed = 0x20000000,
+ Unknown_0x40000000 = 0x40000000, // NOT VERIFIED
+ Unknown_0x80000000 = 0x80000000, // NOT VERIFIED
+
+ // Masks
+ // flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
+ Mask_No_Monster_Move = Done, // SKIP
+ // Unused, not suported flags
+ Mask_Unused = No_Spline | Enter_Cycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
+ | Unknown_0x800000 | FastSteering | FadeObject | UnlimitedSpeed | Unknown_0x40000000 | Unknown_0x80000000 // SKIP
+ };
+
+ DEFINE_ENUM_FLAG(MoveSplineFlagEnum);
- class MoveSplineFlag
+ consteval MoveSplineFlagEnum GetDisallowedFlagsFor(MoveSplineFlagEnum flag)
{
- public:
- enum eFlags : uint32
+ switch (flag)
{
- None = 0x00000000,
- Unknown_0x1 = 0x00000001, // NOT VERIFIED
- Unknown_0x2 = 0x00000002, // NOT VERIFIED
- Unknown_0x4 = 0x00000004, // NOT VERIFIED
- Unknown_0x8 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation
- FallingSlow = 0x00000010,
- Done = 0x00000020,
- Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag
- No_Spline = 0x00000080,
- Unknown_0x100 = 0x00000100, // NOT VERIFIED
- Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation
- OrientationFixed = 0x00000400, // Model orientation fixed
- Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
- Cyclic = 0x00001000, // Movement by cycled spline
- Enter_Cycle = 0x00002000, // Everytimes appears with cyclic flag in monster move packet, erases first spline vertex after first cycle done
- Frozen = 0x00004000, // Will never arrive
- TransportEnter = 0x00008000,
- TransportExit = 0x00010000,
- Unknown_0x20000 = 0x00020000, // NOT VERIFIED
- Unknown_0x40000 = 0x00040000, // NOT VERIFIED
- Backward = 0x00080000,
- SmoothGroundPath = 0x00100000,
- CanSwim = 0x00200000,
- UncompressedPath = 0x00400000,
- Unknown_0x800000 = 0x00800000, // NOT VERIFIED
- FastSteering = 0x01000000, // Predicts spline only 500ms into the future for smoothing instead of 1s (making turns sharper) and turns off clientside obstacle detection
- Animation = 0x02000000, // Plays animation after some time passed
- Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag
- FadeObject = 0x08000000,
- Steering = 0x10000000,
- UnlimitedSpeed = 0x20000000,
- Unknown_0x40000000 = 0x40000000, // NOT VERIFIED
- Unknown_0x80000000 = 0x80000000, // NOT VERIFIED
-
- // Masks
- // flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
- Mask_No_Monster_Move = Done,
- // Unused, not suported flags
- Mask_Unused = No_Spline | Enter_Cycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
- | Unknown_0x800000 | FastSteering | FadeObject | UnlimitedSpeed | Unknown_0x40000000 | Unknown_0x80000000
- };
-
- inline uint32& raw() { return (uint32&)*this; }
- inline uint32 const& raw() const { return (uint32 const&)*this; }
+ case MoveSplineFlagEnum::Falling: return MoveSplineFlagEnum::Parabolic | MoveSplineFlagEnum::Animation | MoveSplineFlagEnum::Flying;
+ case MoveSplineFlagEnum::Flying: return MoveSplineFlagEnum::FallingSlow | MoveSplineFlagEnum::Falling;
+ case MoveSplineFlagEnum::Catmullrom: return MoveSplineFlagEnum::SmoothGroundPath;
+ case MoveSplineFlagEnum::TransportEnter: return MoveSplineFlagEnum::TransportExit;
+ case MoveSplineFlagEnum::TransportExit: return MoveSplineFlagEnum::TransportEnter;
+ case MoveSplineFlagEnum::SmoothGroundPath: return MoveSplineFlagEnum::Steering;
+ case MoveSplineFlagEnum::Animation: return MoveSplineFlagEnum::Falling | MoveSplineFlagEnum::Parabolic | MoveSplineFlagEnum::FallingSlow | MoveSplineFlagEnum::FadeObject;
+ case MoveSplineFlagEnum::Parabolic: return MoveSplineFlagEnum::Falling | MoveSplineFlagEnum::Animation | MoveSplineFlagEnum::FallingSlow | MoveSplineFlagEnum::FadeObject;
+ case MoveSplineFlagEnum::FadeObject: return MoveSplineFlagEnum::Falling | MoveSplineFlagEnum::Parabolic | MoveSplineFlagEnum::FallingSlow | MoveSplineFlagEnum::Animation;
+ case MoveSplineFlagEnum::Steering: return MoveSplineFlagEnum::SmoothGroundPath;
+ default: break;
+ }
+ return MoveSplineFlagEnum::None;
+ }
- MoveSplineFlag() { raw() = 0; }
- MoveSplineFlag(uint32 f) { raw() = f; }
+ union MoveSplineFlag
+ {
+ constexpr MoveSplineFlag() : Raw(MoveSplineFlagEnum::None) { }
+ constexpr MoveSplineFlag(MoveSplineFlagEnum f) : Raw(f) { }
// Constant interface
- bool isSmooth() const { return (raw() & Catmullrom) != 0; }
- bool isLinear() const { return !isSmooth(); }
+ constexpr bool isSmooth() const { return Raw.HasFlag(MoveSplineFlagEnum::Catmullrom); }
+ constexpr bool isLinear() const { return !isSmooth(); }
- bool hasAllFlags(uint32 f) const { return (raw() & f) == f; }
- bool hasFlag(uint32 f) const { return (raw() & f) != 0; }
- uint32 operator & (uint32 f) const { return (raw() & f); }
- uint32 operator | (uint32 f) const { return (raw() | f); }
+ constexpr bool HasAllFlags(MoveSplineFlagEnum f) const { return Raw.HasAllFlags(f); }
+ constexpr bool HasFlag(MoveSplineFlagEnum f) const { return Raw.HasFlag(f); }
+ constexpr MoveSplineFlagEnum operator&(MoveSplineFlagEnum f) const { return (Raw & f); }
+ constexpr MoveSplineFlagEnum operator|(MoveSplineFlagEnum f) const { return (Raw | f); }
std::string ToString() const;
// Not constant interface
- void operator &= (uint32 f) { raw() &= f; }
- void operator |= (uint32 f) { raw() |= f; }
-
- void EnableAnimation() { raw() = (raw() & ~(Falling | Parabolic | FallingSlow | FadeObject)) | Animation; }
- void EnableParabolic() { raw() = (raw() & ~(Falling | Animation | FallingSlow | FadeObject)) | Parabolic; }
- void EnableFlying() { raw() = (raw() & ~(Falling)) | Flying; }
- void EnableFalling() { raw() = (raw() & ~(Parabolic | Animation | Flying)) | Falling; }
- void EnableCatmullRom() { raw() = (raw() & ~SmoothGroundPath) | Catmullrom; }
- void EnableTransportEnter() { raw() = (raw() & ~TransportExit) | TransportEnter; }
- void EnableTransportExit() { raw() = (raw() & ~TransportEnter) | TransportExit; }
- void EnableSteering() { raw() = (raw() & ~SmoothGroundPath) | Steering; }
-
- bool unknown0x1 : 1;
- bool unknown0x2 : 1;
- bool unknown0x4 : 1;
- bool unknown0x8 : 1;
- bool fallingSlow : 1;
- bool done : 1;
- bool falling : 1;
- bool no_spline : 1;
- bool unknown0x100 : 1;
- bool flying : 1;
- bool orientationFixed : 1;
- bool catmullrom : 1;
- bool cyclic : 1;
- bool enter_cycle : 1;
- bool frozen : 1;
- bool transportEnter : 1;
- bool transportExit : 1;
- bool unknown0x20000 : 1;
- bool unknown0x40000 : 1;
- bool backward : 1;
- bool smoothGroundPath : 1;
- bool canSwim : 1;
- bool uncompressedPath : 1;
- bool unknown0x800000 : 1;
- bool fastSteering : 1;
- bool animation : 1;
- bool parabolic : 1;
- bool fadeObject : 1;
- bool steering : 1;
- bool unlimitedSpeed : 1;
- bool unknown0x40000000 : 1;
- bool unknown0x80000000 : 1;
+ constexpr MoveSplineFlag& operator&=(MoveSplineFlagEnum f) { Raw &= f; return *this; }
+ constexpr MoveSplineFlag& operator|=(MoveSplineFlagEnum f) { Raw |= f; return *this; }
+
+ EnumFlag<MoveSplineFlagEnum> Raw;
+
+ template <MoveSplineFlagEnum Flag>
+ struct FlagAccessor
+ {
+ constexpr operator bool() const { return (Raw & Flag) != MoveSplineFlagEnum::None; }
+ constexpr FlagAccessor& operator=(bool val) { if (val) { Raw = Raw & ~GetDisallowedFlagsFor(Flag) | Flag; } else Raw &= ~Flag; return *this; }
+ MoveSplineFlagEnum Raw;
+ };
+
+#define MAKE_FLAG_ACCESSOR_FIELD(flag) FlagAccessor<MoveSplineFlagEnum::flag> flag
+
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x1);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x2);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x4);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x8);
+ MAKE_FLAG_ACCESSOR_FIELD(FallingSlow);
+ MAKE_FLAG_ACCESSOR_FIELD(Done);
+ MAKE_FLAG_ACCESSOR_FIELD(Falling);
+ MAKE_FLAG_ACCESSOR_FIELD(No_Spline);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x100);
+ MAKE_FLAG_ACCESSOR_FIELD(Flying);
+ MAKE_FLAG_ACCESSOR_FIELD(OrientationFixed);
+ MAKE_FLAG_ACCESSOR_FIELD(Catmullrom);
+ MAKE_FLAG_ACCESSOR_FIELD(Cyclic);
+ MAKE_FLAG_ACCESSOR_FIELD(Enter_Cycle);
+ MAKE_FLAG_ACCESSOR_FIELD(Frozen);
+ MAKE_FLAG_ACCESSOR_FIELD(TransportEnter);
+ MAKE_FLAG_ACCESSOR_FIELD(TransportExit);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x20000);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x40000);
+ MAKE_FLAG_ACCESSOR_FIELD(Backward);
+ MAKE_FLAG_ACCESSOR_FIELD(SmoothGroundPath);
+ MAKE_FLAG_ACCESSOR_FIELD(CanSwim);
+ MAKE_FLAG_ACCESSOR_FIELD(UncompressedPath);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x800000);
+ MAKE_FLAG_ACCESSOR_FIELD(FastSteering);
+ MAKE_FLAG_ACCESSOR_FIELD(Animation);
+ MAKE_FLAG_ACCESSOR_FIELD(Parabolic);
+ MAKE_FLAG_ACCESSOR_FIELD(FadeObject);
+ MAKE_FLAG_ACCESSOR_FIELD(Steering);
+ MAKE_FLAG_ACCESSOR_FIELD(UnlimitedSpeed);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x40000000);
+ MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x80000000);
+
+#undef MAKE_FLAG_ACCESSOR_FIELD
};
-#pragma pack(pop)
}
#endif // TRINITYSERVER_MOVESPLINEFLAG_H
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index 2fb04440358..decaf4fb4b8 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -86,11 +86,11 @@ namespace Movement
// correct first vertex
args.path[0] = real_position;
args.initialOrientation = real_position.orientation;
- args.flags.enter_cycle = args.flags.cyclic;
+ args.flags.Enter_Cycle = args.flags.Cyclic;
move_spline.onTransport = transport;
uint32 moveFlags = unit->m_movementInfo.GetMovementFlags();
- if (!args.flags.backward)
+ if (!args.flags.Backward)
moveFlags = (moveFlags & ~MOVEMENTFLAG_BACKWARD) | MOVEMENTFLAG_FORWARD;
else
moveFlags = (moveFlags & ~MOVEMENTFLAG_FORWARD) | MOVEMENTFLAG_BACKWARD;
@@ -117,10 +117,10 @@ namespace Movement
// limit the speed in the same way the client does
float speedLimit = [&]()
{
- if (args.flags.unlimitedSpeed)
+ if (args.flags.UnlimitedSpeed)
return std::numeric_limits<float>::max();
- if (args.flags.falling || args.flags.catmullrom || args.flags.flying || args.flags.parabolic)
+ if (args.flags.Falling || args.flags.Catmullrom || args.flags.Flying || args.flags.Parabolic)
return 50.0f;
return std::max(28.0f, unit->GetSpeed(MOVE_RUN) * 4.0f);
@@ -175,7 +175,7 @@ namespace Movement
loc.orientation = unit->GetOrientation();
}
- args.flags = MoveSplineFlag::Done;
+ args.flags = MoveSplineFlagEnum::Done;
unit->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD);
move_spline.onTransport = transport;
move_spline.Initialize(args);
@@ -201,11 +201,11 @@ namespace Movement
// Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes
args.TransformForTransport = !unit->GetTransGUID().IsEmpty();
// mix existing state into new
- args.flags.canSwim = unit->CanSwim();
args.walk = unit->HasUnitMovementFlag(MOVEMENTFLAG_WALKING);
- args.flags.flying = unit->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY));
- args.flags.steering = unit->HasNpcFlag2(UNIT_NPC_FLAG_2_STEERING);
- args.flags.smoothGroundPath = !args.flags.flying && !args.flags.steering; // enabled by default, CatmullRom mode or client config "pathSmoothing" will disable this
+ args.flags.CanSwim = unit->CanSwim();
+ args.flags.Flying = unit->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY));
+ args.flags.Steering = unit->HasNpcFlag2(UNIT_NPC_FLAG_2_STEERING);
+ args.flags.SmoothGroundPath = !args.flags.Flying && !args.flags.Steering; // enabled by default, CatmullRom mode or client config "pathSmoothing" will disable this
}
MoveSplineInit::~MoveSplineInit() = default;
@@ -279,8 +279,8 @@ namespace Movement
void MoveSplineInit::SetFall()
{
- args.flags.EnableFalling();
- args.flags.fallingSlow = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW);
+ args.flags.Falling = true;
+ args.flags.FallingSlow = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW);
}
Vector3 TransportPathTransform::operator()(Vector3 input)
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h
index 02642e06846..880ada0c33d 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.h
+++ b/src/server/game/Movement/Spline/MoveSplineInit.h
@@ -176,25 +176,25 @@ namespace Movement
Unit* unit;
};
- inline void MoveSplineInit::SetFly() { args.flags.EnableFlying(); }
+ inline void MoveSplineInit::SetFly() { args.flags.Flying = true; }
inline void MoveSplineInit::SetWalk(bool enable) { args.walk = enable; }
- inline void MoveSplineInit::SetSmooth() { args.flags.EnableCatmullRom(); }
- inline void MoveSplineInit::SetUncompressed() { args.flags.uncompressedPath = true; }
- inline void MoveSplineInit::SetCyclic() { args.flags.cyclic = true; }
+ inline void MoveSplineInit::SetSmooth() { args.flags.Catmullrom = true; }
+ inline void MoveSplineInit::SetUncompressed() { args.flags.UncompressedPath = true; }
+ inline void MoveSplineInit::SetCyclic() { args.flags.Cyclic = true; }
inline void MoveSplineInit::SetVelocity(float vel) { args.velocity = vel; args.HasVelocity = true; }
- inline void MoveSplineInit::SetBackward() { args.flags.backward = true; }
- inline void MoveSplineInit::SetTransportEnter() { args.flags.EnableTransportEnter(); }
- inline void MoveSplineInit::SetTransportExit() { args.flags.EnableTransportExit(); }
- inline void MoveSplineInit::SetOrientationFixed(bool enable) { args.flags.orientationFixed = enable; }
- inline void MoveSplineInit::SetSteering() { args.flags.EnableSteering(); }
- inline void MoveSplineInit::SetUnlimitedSpeed() { args.flags.unlimitedSpeed = true; }
+ inline void MoveSplineInit::SetBackward() { args.flags.Backward = true; }
+ inline void MoveSplineInit::SetTransportEnter() { args.flags.TransportEnter = true; }
+ inline void MoveSplineInit::SetTransportExit() { args.flags.TransportExit = true; }
+ inline void MoveSplineInit::SetOrientationFixed(bool enable) { args.flags.OrientationFixed = enable; }
+ inline void MoveSplineInit::SetSteering() { args.flags.Steering = true; }
+ inline void MoveSplineInit::SetUnlimitedSpeed() { args.flags.UnlimitedSpeed = true; }
inline void MoveSplineInit::SetParabolic(float amplitude, float time_shift)
{
args.effect_start_time_percent = time_shift;
args.parabolic_amplitude = amplitude;
args.vertical_acceleration = 0.0f;
- args.flags.EnableParabolic();
+ args.flags.Parabolic = true;
}
inline void MoveSplineInit::SetParabolicVerticalAcceleration(float vertical_acceleration, float time_shift)
@@ -202,7 +202,7 @@ namespace Movement
args.effect_start_time_percent = time_shift;
args.parabolic_amplitude = 0.0f;
args.vertical_acceleration = vertical_acceleration;
- args.flags.EnableParabolic();
+ args.flags.Parabolic = true;
}
inline void MoveSplineInit::SetAnimation(AnimTier anim, uint32 tierTransitionId /*= 0*/, Milliseconds transitionStartTime /*= 0ms*/)
@@ -213,7 +213,7 @@ namespace Movement
args.animTier->TierTransitionId = tierTransitionId;
args.animTier->AnimTier = anim;
if (!tierTransitionId)
- args.flags.EnableAnimation();
+ args.flags.Animation = true;
}
inline void MoveSplineInit::DisableTransportPathTransformations() { args.TransformForTransport = false; }
diff --git a/src/server/game/Movement/Spline/MovementTypedefs.h b/src/server/game/Movement/Spline/MovementTypedefs.h
index 31760ff01ce..8fae9bb4d95 100644
--- a/src/server/game/Movement/Spline/MovementTypedefs.h
+++ b/src/server/game/Movement/Spline/MovementTypedefs.h
@@ -20,6 +20,10 @@
#include "Common.h"
+enum MovementFlags : uint32;
+enum MovementFlags2 : uint32;
+enum MovementFlags3 : uint32;
+
namespace G3D
{
class Vector3;
@@ -78,8 +82,9 @@ namespace Movement
float constexpr gravity = static_cast<float>(19.29110527038574);
TC_GAME_API extern UInt32Counter splineIdGen;
- TC_GAME_API extern std::string MovementFlags_ToString(uint32 flags);
- TC_GAME_API extern std::string MovementFlagsExtra_ToString(uint32 flags);
+ TC_GAME_API extern std::string MovementFlags_ToString(MovementFlags flags);
+ TC_GAME_API extern std::string MovementFlags_ToString(MovementFlags2 flags);
+ TC_GAME_API extern std::string MovementFlags_ToString(MovementFlags3 flags);
}
#endif // TRINITYSERVER_TYPEDEFS_H
diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp
index 15b9fbe2ab6..71fc20db485 100644
--- a/src/server/game/Movement/Spline/MovementUtil.cpp
+++ b/src/server/game/Movement/Spline/MovementUtil.cpp
@@ -15,8 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "MovementTypedefs.h"
#include "MoveSplineFlag.h"
+#include "MovementTypedefs.h"
+#include "SmartEnum.h"
#include <cmath>
namespace Movement
@@ -83,130 +84,39 @@ namespace Movement
return result;
}
- char const* MovementFlagNames[] =
- {
- STRINGIZE(Forward ), // 0x00000001
- STRINGIZE(Backward ), // 0x00000002
- STRINGIZE(Strafe_Left ), // 0x00000004
- STRINGIZE(Strafe_Right ), // 0x00000008
- STRINGIZE(Turn_Left ), // 0x00000010
- STRINGIZE(Turn_Right ), // 0x00000020
- STRINGIZE(Pitch_Up ), // 0x00000040
- STRINGIZE(Pitch_Down ), // 0x00000080
- STRINGIZE(Walking ), // 0x00000100 // Walking
- STRINGIZE(DisableGravity ), // 0x00000200
- STRINGIZE(Root ), // 0x00000400
- STRINGIZE(Falling ), // 0x00000800
- STRINGIZE(FallingFar ), // 0x00001000
- STRINGIZE(PendingStop ), // 0x00002000
- STRINGIZE(PendingStrafeStop ), // 0x00004000
- STRINGIZE(PendingForward ), // 0x00008000
- STRINGIZE(PendingBackward ), // 0x00010000
- STRINGIZE(PendingStrafeLeft ), // 0x00020000
- STRINGIZE(PendingStrafeRight), // 0x00040000
- STRINGIZE(PendingRoot ), // 0x00080000
- STRINGIZE(Swimming ), // 0x00100000 // Appears With Fly Flag Also
- STRINGIZE(Ascending ), // 0x00200000 // Swim Up Also
- STRINGIZE(Descending ), // 0x00400000 // Swim Down Also
- STRINGIZE(Can_Fly ), // 0x00800000 // Can Fly In 3.3?
- STRINGIZE(Flying ), // 0x01000000 // Actual Flying Mode
- STRINGIZE(Spline_Elevation ), // 0x02000000 // Used For Flight Paths
- STRINGIZE(Waterwalking ), // 0x04000000 // Prevent Unit From Falling Through Water
- STRINGIZE(Safe_Fall ), // 0x08000000 // Active Rogue Safe Fall Spell (Passive)
- STRINGIZE(Hover ), // 0x10000000
- STRINGIZE(Local_Dirty ), // 0x20000000
- STRINGIZE(None31 ), // 0x40000000
- STRINGIZE(None32 ), // 0x80000000
- };
-
- char const* MovementFlagExtraNames[] =
+ template<class Flags>
+ void PrintFlags(Flags t, std::string& str)
{
- STRINGIZE(NoStrafe ), // 0x00000001
- STRINGIZE(NoJump ), // 0x00000002
- STRINGIZE(FullSpeedTurning ), // 0x00000004
- STRINGIZE(FullSpeedPitching ), // 0x00000008
- STRINGIZE(Allow_Pitching ), // 0x00000010
- STRINGIZE(VehicleExitVoluntary ), // 0x00000020
- STRINGIZE(WaterwalkingFullPitch ), // 0x00000040
- STRINGIZE(VehiclePassengerIsTransitionAllowed), // 0x00000080
- STRINGIZE(CanSwimToFlyTrans ), // 0x00000100
- STRINGIZE(Unk9 ), // 0x00000200
- STRINGIZE(CanTurnWhileFalling ), // 0x00000400
- STRINGIZE(IgnoreMovementForces ), // 0x00000800
- STRINGIZE(CanDoubleJump ), // 0x00001000
- STRINGIZE(DoubleJump ), // 0x00002000
- STRINGIZE(Unk14 ), // 0x00004000
- STRINGIZE(Unk15 ), // 0x00008000
- STRINGIZE(AwaitingLoad ), // 0x00010000
- STRINGIZE(InterpolatedMovement ), // 0x00020000
- STRINGIZE(InterpolatedTurning ), // 0x00040000
- STRINGIZE(InterpolatedPitching ), // 0x00080000
- };
-
- char const* SplineFlagNames[32] =
- {
- STRINGIZE(Unknown_0x1 ), // 0x00000001
- STRINGIZE(Unknown_0x2 ), // 0x00000002
- STRINGIZE(Unknown_0x4 ), // 0x00000004
- STRINGIZE(Unknown_0x8 ), // 0x00000008
- STRINGIZE(FallingSlow ), // 0x00000010
- STRINGIZE(Done ), // 0x00000020
- STRINGIZE(Falling ), // 0x00000040 // Not Compartible With Trajectory Movement
- STRINGIZE(No_Spline ), // 0x00000080
- STRINGIZE(Unknown_0x100 ), // 0x00000100
- STRINGIZE(Flying ), // 0x00000200 // Smooth Movement(Catmullrom Interpolation Mode), Flying Animation
- STRINGIZE(OrientationFixed ), // 0x00000400 // Model Orientation Fixed
- STRINGIZE(Catmullrom ), // 0x00000800 // Used Catmullrom Interpolation Mode
- STRINGIZE(Cyclic ), // 0x00001000 // Movement By Cycled Spline
- STRINGIZE(Enter_Cycle ), // 0x00002000 // Everytime Appears With Cyclic Flag In Monster Move Packet
- STRINGIZE(Frozen ), // 0x00004000
- STRINGIZE(TransportEnter ), // 0x00008000
- STRINGIZE(TransportExit ), // 0x00010000
- STRINGIZE(Unknown_0x20000 ), // 0x00020000
- STRINGIZE(Unknown_0x40000 ), // 0x00040000
- STRINGIZE(Backward ), // 0x00080000 // Appears With Runmode Flag, Nodes ), // 1, Handles Orientation
- STRINGIZE(SmoothGroundPath ), // 0x00100000
- STRINGIZE(CanSwim ), // 0x00200000
- STRINGIZE(UncompressedPath ), // 0x00400000
- STRINGIZE(Unknown_0x800000 ), // 0x00800000
- STRINGIZE(FastSteering ), // 0x01000000 // Predicts spline only 500ms into the future for smoothing instead of 1s and turns off clientside obstacle detection
- STRINGIZE(Animation ), // 0x02000000 // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement
- STRINGIZE(Parabolic ), // 0x04000000 // Not Compartible With Fall Movement
- STRINGIZE(FadeObject ), // 0x08000000
- STRINGIZE(Steering ), // 0x10000000
- STRINGIZE(UnlimitedSpeed ), // 0x20000000
- STRINGIZE(Unknown_0x40000000), // 0x40000000
- STRINGIZE(Unknown_0x80000000), // 0x80000000
- };
-
- template<class Flags, int N>
- void PrintFlags(Flags t, char const* (&names)[N], std::string& str)
- {
- for (int i = 0; i < N; ++i)
- {
- if ((t & Flags(1 << i)) && names[i] != nullptr)
- str.append(" ").append(names[i]);
- }
+ for (Flags flag : EnumUtils::Iterate<Flags>())
+ if ((t & flag) != Flags(0))
+ str.append(" ").append(EnumUtils::ToConstant(flag));
}
std::string MoveSplineFlag::ToString() const
{
std::string str;
- PrintFlags(raw(), SplineFlagNames, str);
+ PrintFlags<MoveSplineFlagEnum>(Raw, str);
+ return str;
+ }
+
+ std::string MovementFlags_ToString(MovementFlags flags)
+ {
+ std::string str;
+ PrintFlags(flags, str);
return str;
}
- std::string MovementFlags_ToString(uint32 flags)
+ std::string MovementFlags_ToString(MovementFlags2 flags)
{
std::string str;
- PrintFlags(flags, MovementFlagNames, str);
+ PrintFlags(flags, str);
return str;
}
- std::string MovementFlagsExtra_ToString(uint32 flags)
+ std::string MovementFlags_ToString(MovementFlags3 flags)
{
std::string str;
- PrintFlags(flags, MovementFlagExtraNames, str);
+ PrintFlags(flags, str);
return str;
}
}
diff --git a/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp b/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp
new file mode 100644
index 00000000000..41fd7622ed0
--- /dev/null
+++ b/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp
@@ -0,0 +1,159 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "MoveSplineFlag.h"
+#include "Define.h"
+#include "SmartEnum.h"
+#include <stdexcept>
+
+using Movement::MoveSplineFlagEnum;
+
+namespace Trinity::Impl::EnumUtilsImpl
+{
+
+/***************************************************************************\
+|* data for enum 'MoveSplineFlagEnum' in 'MoveSplineFlag.h' auto-generated *|
+\***************************************************************************/
+template <>
+TC_API_EXPORT EnumText EnumUtils<MoveSplineFlagEnum>::ToString(MoveSplineFlagEnum value)
+{
+ switch (value)
+ {
+ case MoveSplineFlagEnum::None: return { "None", "None", "" };
+ case MoveSplineFlagEnum::Unknown_0x1: return { "Unknown_0x1", "Unknown_0x1", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::Unknown_0x2: return { "Unknown_0x2", "Unknown_0x2", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::Unknown_0x4: return { "Unknown_0x4", "Unknown_0x4", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::Unknown_0x8: return { "Unknown_0x8", "Unknown_0x8", "NOT VERIFIED - does someting related to falling/fixed orientation" };
+ case MoveSplineFlagEnum::FallingSlow: return { "FallingSlow", "FallingSlow", "" };
+ case MoveSplineFlagEnum::Done: return { "Done", "Done", "" };
+ case MoveSplineFlagEnum::Falling: return { "Falling", "Falling", "Affects elevation computation, can't be combined with Parabolic flag" };
+ case MoveSplineFlagEnum::No_Spline: return { "No_Spline", "No_Spline", "" };
+ case MoveSplineFlagEnum::Unknown_0x100: return { "Unknown_0x100", "Unknown_0x100", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::Flying: return { "Flying", "Flying", "Smooth movement(Catmullrom interpolation mode), flying animation" };
+ case MoveSplineFlagEnum::OrientationFixed: return { "OrientationFixed", "OrientationFixed", "Model orientation fixed" };
+ case MoveSplineFlagEnum::Catmullrom: return { "Catmullrom", "Catmullrom", "Used Catmullrom interpolation mode" };
+ case MoveSplineFlagEnum::Cyclic: return { "Cyclic", "Cyclic", "Movement by cycled spline" };
+ case MoveSplineFlagEnum::Enter_Cycle: return { "Enter_Cycle", "Enter_Cycle", "Everytimes appears with cyclic flag in monster move packet, erases first spline vertex after first cycle done" };
+ case MoveSplineFlagEnum::Frozen: return { "Frozen", "Frozen", "Will never arrive" };
+ case MoveSplineFlagEnum::TransportEnter: return { "TransportEnter", "TransportEnter", "" };
+ case MoveSplineFlagEnum::TransportExit: return { "TransportExit", "TransportExit", "" };
+ case MoveSplineFlagEnum::Unknown_0x20000: return { "Unknown_0x20000", "Unknown_0x20000", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::Unknown_0x40000: return { "Unknown_0x40000", "Unknown_0x40000", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::Backward: return { "Backward", "Backward", "" };
+ case MoveSplineFlagEnum::SmoothGroundPath: return { "SmoothGroundPath", "SmoothGroundPath", "" };
+ case MoveSplineFlagEnum::CanSwim: return { "CanSwim", "CanSwim", "" };
+ case MoveSplineFlagEnum::UncompressedPath: return { "UncompressedPath", "UncompressedPath", "" };
+ case MoveSplineFlagEnum::Unknown_0x800000: return { "Unknown_0x800000", "Unknown_0x800000", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::FastSteering: return { "FastSteering", "FastSteering", "Predicts spline only 500ms into the future for smoothing instead of 1s (making turns sharper) and turns off clientside obstacle detection" };
+ case MoveSplineFlagEnum::Animation: return { "Animation", "Animation", "Plays animation after some time passed" };
+ case MoveSplineFlagEnum::Parabolic: return { "Parabolic", "Parabolic", "Affects elevation computation, can't be combined with Falling flag" };
+ case MoveSplineFlagEnum::FadeObject: return { "FadeObject", "FadeObject", "" };
+ case MoveSplineFlagEnum::Steering: return { "Steering", "Steering", "" };
+ case MoveSplineFlagEnum::UnlimitedSpeed: return { "UnlimitedSpeed", "UnlimitedSpeed", "" };
+ case MoveSplineFlagEnum::Unknown_0x40000000: return { "Unknown_0x40000000", "Unknown_0x40000000", "NOT VERIFIED" };
+ case MoveSplineFlagEnum::Unknown_0x80000000: return { "Unknown_0x80000000", "Unknown_0x80000000", "NOT VERIFIED" };
+ default: throw std::out_of_range("value");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MoveSplineFlagEnum>::Count() { return 33; }
+
+template <>
+TC_API_EXPORT MoveSplineFlagEnum EnumUtils<MoveSplineFlagEnum>::FromIndex(size_t index)
+{
+ switch (index)
+ {
+ case 0: return MoveSplineFlagEnum::None;
+ case 1: return MoveSplineFlagEnum::Unknown_0x1;
+ case 2: return MoveSplineFlagEnum::Unknown_0x2;
+ case 3: return MoveSplineFlagEnum::Unknown_0x4;
+ case 4: return MoveSplineFlagEnum::Unknown_0x8;
+ case 5: return MoveSplineFlagEnum::FallingSlow;
+ case 6: return MoveSplineFlagEnum::Done;
+ case 7: return MoveSplineFlagEnum::Falling;
+ case 8: return MoveSplineFlagEnum::No_Spline;
+ case 9: return MoveSplineFlagEnum::Unknown_0x100;
+ case 10: return MoveSplineFlagEnum::Flying;
+ case 11: return MoveSplineFlagEnum::OrientationFixed;
+ case 12: return MoveSplineFlagEnum::Catmullrom;
+ case 13: return MoveSplineFlagEnum::Cyclic;
+ case 14: return MoveSplineFlagEnum::Enter_Cycle;
+ case 15: return MoveSplineFlagEnum::Frozen;
+ case 16: return MoveSplineFlagEnum::TransportEnter;
+ case 17: return MoveSplineFlagEnum::TransportExit;
+ case 18: return MoveSplineFlagEnum::Unknown_0x20000;
+ case 19: return MoveSplineFlagEnum::Unknown_0x40000;
+ case 20: return MoveSplineFlagEnum::Backward;
+ case 21: return MoveSplineFlagEnum::SmoothGroundPath;
+ case 22: return MoveSplineFlagEnum::CanSwim;
+ case 23: return MoveSplineFlagEnum::UncompressedPath;
+ case 24: return MoveSplineFlagEnum::Unknown_0x800000;
+ case 25: return MoveSplineFlagEnum::FastSteering;
+ case 26: return MoveSplineFlagEnum::Animation;
+ case 27: return MoveSplineFlagEnum::Parabolic;
+ case 28: return MoveSplineFlagEnum::FadeObject;
+ case 29: return MoveSplineFlagEnum::Steering;
+ case 30: return MoveSplineFlagEnum::UnlimitedSpeed;
+ case 31: return MoveSplineFlagEnum::Unknown_0x40000000;
+ case 32: return MoveSplineFlagEnum::Unknown_0x80000000;
+ default: throw std::out_of_range("index");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<MoveSplineFlagEnum>::ToIndex(MoveSplineFlagEnum value)
+{
+ switch (value)
+ {
+ case MoveSplineFlagEnum::None: return 0;
+ case MoveSplineFlagEnum::Unknown_0x1: return 1;
+ case MoveSplineFlagEnum::Unknown_0x2: return 2;
+ case MoveSplineFlagEnum::Unknown_0x4: return 3;
+ case MoveSplineFlagEnum::Unknown_0x8: return 4;
+ case MoveSplineFlagEnum::FallingSlow: return 5;
+ case MoveSplineFlagEnum::Done: return 6;
+ case MoveSplineFlagEnum::Falling: return 7;
+ case MoveSplineFlagEnum::No_Spline: return 8;
+ case MoveSplineFlagEnum::Unknown_0x100: return 9;
+ case MoveSplineFlagEnum::Flying: return 10;
+ case MoveSplineFlagEnum::OrientationFixed: return 11;
+ case MoveSplineFlagEnum::Catmullrom: return 12;
+ case MoveSplineFlagEnum::Cyclic: return 13;
+ case MoveSplineFlagEnum::Enter_Cycle: return 14;
+ case MoveSplineFlagEnum::Frozen: return 15;
+ case MoveSplineFlagEnum::TransportEnter: return 16;
+ case MoveSplineFlagEnum::TransportExit: return 17;
+ case MoveSplineFlagEnum::Unknown_0x20000: return 18;
+ case MoveSplineFlagEnum::Unknown_0x40000: return 19;
+ case MoveSplineFlagEnum::Backward: return 20;
+ case MoveSplineFlagEnum::SmoothGroundPath: return 21;
+ case MoveSplineFlagEnum::CanSwim: return 22;
+ case MoveSplineFlagEnum::UncompressedPath: return 23;
+ case MoveSplineFlagEnum::Unknown_0x800000: return 24;
+ case MoveSplineFlagEnum::FastSteering: return 25;
+ case MoveSplineFlagEnum::Animation: return 26;
+ case MoveSplineFlagEnum::Parabolic: return 27;
+ case MoveSplineFlagEnum::FadeObject: return 28;
+ case MoveSplineFlagEnum::Steering: return 29;
+ case MoveSplineFlagEnum::UnlimitedSpeed: return 30;
+ case MoveSplineFlagEnum::Unknown_0x40000000: return 31;
+ case MoveSplineFlagEnum::Unknown_0x80000000: return 32;
+ default: throw std::out_of_range("value");
+ }
+}
+}
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index 8545ac6e59d..895c12fb704 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -381,17 +381,17 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(::
if (hasSplineMove) // MovementSplineMove
{
- data << uint32(moveSpline.splineflags.raw()); // SplineFlags
+ data << uint32(moveSpline.splineflags.Raw.AsUnderlyingType()); // SplineFlags
data << int32(moveSpline.timePassed()); // Elapsed
data << uint32(moveSpline.Duration()); // Duration
data << float(1.0f); // DurationModifier
data << float(1.0f); // NextDurationModifier
data.WriteBits(moveSpline.facing.type, 2); // Face
- bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.fadeObject && moveSpline.effect_start_time < moveSpline.Duration());
+ bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.FadeObject && moveSpline.effect_start_time < moveSpline.Duration());
data.WriteBits(moveSpline.getPath().size(), 16);
data.WriteBit(false); // HasSplineFilter
data.WriteBit(moveSpline.spell_effect_extra.has_value()); // HasSpellEffectExtraData
- bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time));
+ bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.Parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time));
data.WriteBit(moveSpline.anim_tier.has_value()); // HasAnimTierTransition
data.WriteBit(false); // HasUnknown901
data.FlushBits();
@@ -522,7 +522,7 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS
WorldPackets::Movement::MovementSpline& movementSpline = SplineData.Move;
::Movement::MoveSplineFlag splineFlags = moveSpline.splineflags;
- movementSpline.Flags = uint32(splineFlags & uint32(~::Movement::MoveSplineFlag::Mask_No_Monster_Move));
+ movementSpline.Flags = uint32(splineFlags & ~::Movement::MoveSplineFlagEnum::Mask_No_Monster_Move);
movementSpline.Face = moveSpline.facing.type;
movementSpline.FaceDirection = moveSpline.facing.angle;
movementSpline.FaceGUID = moveSpline.facing.target;
@@ -538,14 +538,14 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS
movementSpline.MoveTime = moveSpline.Duration();
- if (splineFlags.parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time))
+ if (splineFlags.Parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time))
{
movementSpline.JumpExtraData.emplace();
movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration;
movementSpline.JumpExtraData->StartTime = moveSpline.effect_start_time;
}
- if (splineFlags.fadeObject)
+ if (splineFlags.FadeObject)
movementSpline.FadeObjectTime = moveSpline.effect_start_time;
if (moveSpline.spell_effect_extra)
@@ -561,15 +561,15 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS
::Movement::Spline<int32> const& spline = moveSpline.spline;
std::vector<G3D::Vector3> const& array = spline.getPoints();
- if (splineFlags & ::Movement::MoveSplineFlag::UncompressedPath)
+ if (splineFlags.UncompressedPath)
{
- uint32 count = spline.getPointCount() - (splineFlags.cyclic ? 4 : 3);
+ uint32 count = spline.getPointCount() - (splineFlags.Cyclic ? 4 : 3);
for (uint32 i = 0; i < count; ++i)
movementSpline.Points.emplace_back(array[i + 2].x, array[i + 2].y, array[i + 2].z);
}
else
{
- uint32 lastIdx = spline.getPointCount() - (splineFlags.cyclic ? 4 : 3);
+ uint32 lastIdx = spline.getPointCount() - (splineFlags.Cyclic ? 4 : 3);
G3D::Vector3 const* realPath = &array[1];
movementSpline.Points.emplace_back(realPath[lastIdx].x, realPath[lastIdx].y, realPath[lastIdx].z);