aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-06-18 11:37:07 +0200
committerShauren <shauren.trinity@gmail.com>2025-06-18 11:37:07 +0200
commitceb8d561b44579118b109a9ff71ba415df53bbdc (patch)
treeb2a6b87afa6a2b83b8040b8632a87cb9a8308775 /src/server/game/Movement
parente02e8a474244c229cc34c4efb987e24b6dd417f5 (diff)
Core: Updated to 11.1.7
Diffstat (limited to 'src/server/game/Movement')
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp16
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.h2
-rw-r--r--src/server/game/Movement/Spline/MoveSplineFlag.h6
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp6
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h12
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInitArgs.h8
-rw-r--r--src/server/game/Movement/Spline/enuminfo_MoveSplineFlag.cpp6
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;