diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-04-23 11:09:59 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-04-23 11:09:59 +0200 |
commit | a02804fa0246851436bb195d8d06d991de523bb0 (patch) | |
tree | c59f40a8d2c7188b0599f3b62b8d0634dc4fe161 /src | |
parent | 1da162d71dd0dc7540db0384e45b7aaa7e6f0d64 (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.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/UnitDefines.h | 15 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp | 261 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSpline.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSpline.h | 8 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineFlag.h | 223 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.h | 26 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MovementTypedefs.h | 9 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MovementUtil.cpp | 128 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp | 159 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 18 |
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); |