fix: remove Classic spline fallback, add no-parabolic WotLK variant

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).
This commit is contained in:
Kelsi 2026-03-28 10:55:46 -07:00
parent 559f100204
commit 37300d65ce

View file

@ -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;
}
}