From 37300d65ce60341bc86744973e9b1b9a8f4bce2f Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 28 Mar 2026 10:55:46 -0700 Subject: [PATCH] fix: remove Classic spline fallback, add no-parabolic WotLK variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Classic fallback silently succeeded on WotLK data by false-positive matching, consuming wrong bytes and producing corrupt entity data that was silently dropped — resulting in zero other players/NPCs visible. Now tries 4 WotLK-only variants in order: 1. Full WotLK (durationMod+durationModNext+vertAccel+effectStart+compressed) 2. Full WotLK uncompressed 3. WotLK without parabolic fields (durationMod+durationModNext+points) 4. WotLK without parabolic, compressed This covers servers that don't unconditionally send vertAccel+effectStart (the MEMORY.md says AzerothCore does, but other cores may not). --- src/game/world_packets.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/game/world_packets.cpp b/src/game/world_packets.cpp index d514b685..742d5887 100644 --- a/src/game/world_packets.cpp +++ b/src/game/world_packets.cpp @@ -1044,16 +1044,26 @@ bool UpdateObjectParser::parseMovementBlock(network::Packet& packet, UpdateBlock } } - // Try 2: Classic/fallback format (uncompressed points immediately after splineId) if (!splineParsed) { + // WotLK compressed+uncompressed both failed. Try without the parabolic + // fields (some cores don't send vertAccel+effectStart unconditionally). packet.setReadPos(beforeSplineHeader); - splineParsed = tryParseSplinePoints(false, "classic-fallback"); + if (bytesAvailable(8)) { + packet.readFloat(); // durationMod + packet.readFloat(); // durationModNext + // Skip parabolic fields — try points directly + splineParsed = tryParseSplinePoints(false, "wotlk-no-parabolic"); + if (!splineParsed) { + bool useComp = (splineFlags & (0x00080000 | 0x00002000)) == 0; + splineParsed = tryParseSplinePoints(useComp, "wotlk-no-parabolic-compressed"); + } + } } if (!splineParsed) { - LOG_WARNING("Spline parse failed for guid=0x", std::hex, block.guid, std::dec, + LOG_WARNING("WotLK spline parse failed for guid=0x", std::hex, block.guid, std::dec, " splineFlags=0x", std::hex, splineFlags, std::dec, - " — aborting movement block"); + " remaining=", packet.getRemainingSize()); return false; } }