diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-06-18 11:37:07 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-06-18 11:37:07 +0200 |
| commit | ceb8d561b44579118b109a9ff71ba415df53bbdc (patch) | |
| tree | b2a6b87afa6a2b83b8040b8632a87cb9a8308775 /src/server/game/Movement | |
| parent | e02e8a474244c229cc34c4efb987e24b6dd417f5 (diff) | |
Core: Updated to 11.1.7
Diffstat (limited to 'src/server/game/Movement')
7 files changed, 48 insertions, 8 deletions
diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index d71287acf28..e5d9fb3d60b 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -29,9 +29,9 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const ASSERT(Initialized()); float u = 1.0f; - int32 seg_time = spline.length(point_index, point_index + 1); + float seg_time = float(spline.length(point_index, point_index + 1)); if (seg_time > 0) - u = (time_point - spline.length(point_index)) / (float)seg_time; + u = std::min(float(time_point - spline.length(point_index)) / seg_time, 1.0f); Location c; c.orientation = initialOrientation; @@ -52,6 +52,10 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const c.orientation = std::atan2(facing.f.y - c.y, facing.f.x - c.x); //nothing to do for MoveSplineFlag::Final_Target flag } + else if (splineflags.Turning) + { + c.orientation = Position::NormalizeOrientation(turn->StartFacing + float(time_point) / float(IN_MILLISECONDS) * turn->RadsPerSec); + } else { if (!splineflags.HasFlag(MoveSplineFlagEnum::OrientationFixed | MoveSplineFlagEnum::Falling | MoveSplineFlagEnum::JumpOrientationFixed)) @@ -171,6 +175,13 @@ void MoveSpline::init_spline(MoveSplineInitArgs const& args) TC_LOG_ERROR("misc", "MoveSpline::init_spline: zero length spline, wrong input data?"); spline.set_length(spline.last(), spline.isCyclic() ? 1000 : 1); } + + if (turn) + { + MySpline::LengthType totalTurnTime = static_cast<MySpline::LengthType>(turn->TotalTurnRads / turn->RadsPerSec * float(IN_MILLISECONDS)); + spline.set_length(spline.last(), std::max(spline.length(), totalTurnTime)); + } + point_Idx = spline.first(); } @@ -186,6 +197,7 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) vertical_acceleration = 0.f; effect_start_time = 0; spell_effect_extra = args.spellEffectExtra; + turn = args.turnData; anim_tier = args.animTier; splineIsFacingOnly = args.path.size() == 2 && args.facing.type != MONSTER_MOVE_NORMAL && ((args.path[1] - args.path[0]).length() < 0.1f); diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h index 45b0609378d..683198160d7 100644 --- a/src/server/game/Movement/Spline/MoveSpline.h +++ b/src/server/game/Movement/Spline/MoveSpline.h @@ -84,6 +84,7 @@ namespace Movement int32 point_Idx_offset; float velocity; Optional<SpellEffectExtraData> spell_effect_extra; + Optional<TurnData> turn; Optional<AnimTierTransition> anim_tier; void init_spline(MoveSplineInitArgs const& args); @@ -138,6 +139,7 @@ namespace Movement bool Finalized() const { return splineflags.Done; } bool isCyclic() const { return splineflags.Cyclic; } bool isFalling() const { return splineflags.Falling; } + bool isTurning() const { return splineflags.Turning; } 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 c33711c951c..62b8bb1cab0 100644 --- a/src/server/game/Movement/Spline/MoveSplineFlag.h +++ b/src/server/game/Movement/Spline/MoveSplineFlag.h @@ -42,7 +42,7 @@ namespace Movement 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 + Turning = 0x00004000, // Turns in place TransportEnter = 0x00008000, TransportExit = 0x00010000, Unknown_0x20000 = 0x00020000, // NOT VERIFIED @@ -65,7 +65,7 @@ namespace Movement // 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 | Frozen | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000 + Mask_Unused = No_Spline | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000 | Unknown_0x800000 | FadeObject | UnlimitedSpeed | Unknown_0x40000000 | Unknown_0x80000000 // SKIP }; @@ -142,7 +142,7 @@ namespace Movement 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(Turning); MAKE_FLAG_ACCESSOR_FIELD(TransportEnter); MAKE_FLAG_ACCESSOR_FIELD(TransportExit); MAKE_FLAG_ACCESSOR_FIELD(Unknown_0x20000); diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 0396cf4f0ef..9eb54f0ce73 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -202,6 +202,9 @@ namespace Movement loc.orientation = unit->GetOrientation(); } + if (move_spline.isTurning()) + SetFacing(loc.orientation); + args.flags = MoveSplineFlagEnum::Done; unit->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD); move_spline.onTransport = transport; @@ -212,6 +215,9 @@ namespace Movement packet.Pos = Position(loc.x, loc.y, loc.z, loc.orientation); packet.SplineData.StopSplineStyle = 2; packet.SplineData.ID = move_spline.GetId(); + packet.SplineData.StopUseFaceDirection = args.facing.type == MONSTER_MOVE_FACING_ANGLE; + packet.SplineData.Move.Face = args.facing.type; + packet.SplineData.Move.FaceDirection = args.facing.angle; if (transport) { diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index cea5adc4b83..5035bb38fb1 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -157,6 +157,8 @@ namespace Movement void SetSpellEffectExtraData(SpellEffectExtraData const& spellEffectExtraData); + void SetTurning(float startFacing, float totalTurnRads, float radsPerSec); + PointsArray& Path() { return args.path; } /* Disables transport coordinate transformations for cases where raw offsets are available @@ -216,6 +218,16 @@ namespace Movement args.spellEffectExtra = spellEffectExtraData; } + inline void MoveSplineInit::SetTurning(float startFacing, float totalTurnRads, float radsPerSec) + { + args.flags.Turning = true; + + TurnData& turn = args.turnData.emplace(); + turn.StartFacing = startFacing; + turn.TotalTurnRads = totalTurnRads; + turn.RadsPerSec = radsPerSec; + } + struct MoveSplineInitFacingVisitor { explicit MoveSplineInitFacingVisitor(MoveSplineInit& init) : _init(init) { } diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h index fe7bb527802..46cd0779e21 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -54,6 +54,13 @@ namespace Movement uint32 ParabolicCurveId = 0; }; + struct TurnData + { + float StartFacing = 0.0f; + float TotalTurnRads = 0.0f; + float RadsPerSec = 0.0f; + }; + struct AnimTierTransition { uint32 TierTransitionId = 0; @@ -78,6 +85,7 @@ namespace Movement uint32 splineId; float initialOrientation; Optional<SpellEffectExtraData> spellEffectExtra; + Optional<TurnData> turnData; Optional<AnimTierTransition> animTier; bool walk; bool HasVelocity; diff --git a/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp b/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp index 7e404624732..1984e9c3eb8 100644 --- a/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp +++ b/src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp @@ -48,7 +48,7 @@ TC_API_EXPORT EnumText EnumUtils<MoveSplineFlagEnum>::ToString(MoveSplineFlagEnu 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::Turning: return { "Turning", "Turning", "Turns in place" }; case MoveSplineFlagEnum::TransportEnter: return { "TransportEnter", "TransportEnter", "" }; case MoveSplineFlagEnum::TransportExit: return { "TransportExit", "TransportExit", "" }; case MoveSplineFlagEnum::Unknown_0x20000: return { "Unknown_0x20000", "Unknown_0x20000", "NOT VERIFIED" }; @@ -93,7 +93,7 @@ TC_API_EXPORT MoveSplineFlagEnum EnumUtils<MoveSplineFlagEnum>::FromIndex(size_t case 12: return MoveSplineFlagEnum::Catmullrom; case 13: return MoveSplineFlagEnum::Cyclic; case 14: return MoveSplineFlagEnum::Enter_Cycle; - case 15: return MoveSplineFlagEnum::Frozen; + case 15: return MoveSplineFlagEnum::Turning; case 16: return MoveSplineFlagEnum::TransportEnter; case 17: return MoveSplineFlagEnum::TransportExit; case 18: return MoveSplineFlagEnum::Unknown_0x20000; @@ -135,7 +135,7 @@ TC_API_EXPORT size_t EnumUtils<MoveSplineFlagEnum>::ToIndex(MoveSplineFlagEnum v case MoveSplineFlagEnum::Catmullrom: return 12; case MoveSplineFlagEnum::Cyclic: return 13; case MoveSplineFlagEnum::Enter_Cycle: return 14; - case MoveSplineFlagEnum::Frozen: return 15; + case MoveSplineFlagEnum::Turning: return 15; case MoveSplineFlagEnum::TransportEnter: return 16; case MoveSplineFlagEnum::TransportExit: return 17; case MoveSplineFlagEnum::Unknown_0x20000: return 18; |
