From c9041a93a5238e44b36eda1982a7b4c18b2db3cb Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Fri, 7 Aug 2020 23:52:05 +0200 Subject: [PATCH] Core/Movement: reverted the spline segment length validation until he path generation generates proper segments --- .../game/Movement/Spline/MoveSpline.cpp | 30 +++++++++++++------ src/server/game/Movement/Spline/MoveSpline.h | 1 - .../game/Movement/Spline/MoveSplineInitArgs.h | 2 +- .../Movement/Spline/MovementPacketBuilder.cpp | 6 ++-- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index 26348b36ab4..432e1e41fb8 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -186,7 +186,6 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) time_passed = 0; vertical_acceleration = 0.f; effect_start_time = 0; - splineIsFacingOnly = args.path.size() == 2 && args.flags & MoveSplineFlag::Mask_Final_Facing && ((args.path[1] - args.path[0]).length() < 0.1f); velocity = args.velocity; // Check if its a stop spline @@ -213,7 +212,7 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) 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) + onTransport(false) { splineflags.done = true; } @@ -245,21 +244,34 @@ bool MoveSplineInitArgs::Validate(Unit* unit) const CHECK(path.size() > 1); CHECK(velocity >= 0.01f); CHECK(time_perc >= 0.f && time_perc <= 1.f); - CHECK(_checkPathLengths()); + //CHECK(_checkPathLengths()); return true; #undef CHECK } -// check path lengths - why are we even starting such short movement? -bool MoveSplineInitArgs::_checkPathLengths() const +// MONSTER_MOVE packet format limitation for not CatmullRom movement: +// each vertex offset packed into 11 bytes +bool MoveSplineInitArgs::_checkPathBounds() const { - if (path.size() > 2 || !(flags & MoveSplineFlag::Mask_Final_Facing)) - for (uint32 i = 0; i < path.size() - 1; ++i) - if ((path[i + 1] - path[i]).length() < 0.1f) + if (!(flags & MoveSplineFlag::Catmullrom) && path.size() > 2) + { + enum{ + MAX_OFFSET = (1 << 11) / 2 + }; + Vector3 middle = (path.front()+path.back()) / 2; + Vector3 offset; + for (uint32 i = 1; i < path.size()-1; ++i) + { + offset = path[i] - middle; + if (std::fabs(offset.x) >= MAX_OFFSET || std::fabs(offset.y) >= MAX_OFFSET || std::fabs(offset.z) >= MAX_OFFSET) + { + TC_LOG_ERROR("misc", "MoveSplineInitArgs::_checkPathBounds check failed"); return false; + } + } + } return true; } - /// ============================================================================================ MoveSpline::UpdateResult MoveSpline::_updateState(int32& ms_time_diff) diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h index 826cc764d2f..1d1d8b3d476 100644 --- a/src/server/game/Movement/Spline/MoveSpline.h +++ b/src/server/game/Movement/Spline/MoveSpline.h @@ -144,7 +144,6 @@ namespace Movement AnimationTier GetAnimation() const { return static_cast(splineflags.animId); } bool onTransport; - bool splineIsFacingOnly; std::string ToString() const; }; } diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h index 1be1db40fee..ce55be7be68 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -63,7 +63,7 @@ namespace Movement bool Validate(Unit* unit) const; private: - bool _checkPathLengths() const; + bool _checkPathBounds() const; }; } diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp index 2ed78f61cbe..1f8364a5725 100644 --- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp +++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp @@ -35,8 +35,7 @@ namespace Movement void PacketBuilder::WriteCreateBits(MoveSpline const& moveSpline, ByteBuffer& data) { - bool hasSplineMove = data.WriteBit(!moveSpline.Finalized() && !moveSpline.splineIsFacingOnly); - if (!hasSplineMove) + if (!data.WriteBit(!moveSpline.Finalized())) return; data.WriteBits(uint8(moveSpline.spline.mode()), 2); @@ -75,8 +74,7 @@ namespace Movement void PacketBuilder::WriteCreateData(MoveSpline const& moveSpline, ByteBuffer& data) { - bool hasSplineMove = !moveSpline.Finalized() && !moveSpline.splineIsFacingOnly; - if (hasSplineMove) + if (!moveSpline.Finalized()) { MoveSplineFlag const& splineFlags = moveSpline.splineflags;