mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-03 08:03:50 +00:00
fix: replace fragile heuristic in SMSG_INITIAL_SPELLS with explicit Classic format flag
Classic 1.12 uses uint16 spellId + uint16 slot (4 bytes/spell); TBC and WotLK use uint32 spellId + uint16 unknown (6 bytes/spell). The old size-based heuristic could misdetect TBC packets that happened to fit both layouts. Add a vanillaFormat parameter to InitialSpellsParser::parse and override parseInitialSpells in ClassicPacketParsers to always pass true, eliminating the ambiguity.
This commit is contained in:
parent
9d0da6242d
commit
ed48a3c425
3 changed files with 12 additions and 10 deletions
|
|
@ -419,6 +419,10 @@ public:
|
||||||
bool parseMonsterMove(network::Packet& packet, MonsterMoveData& data) override {
|
bool parseMonsterMove(network::Packet& packet, MonsterMoveData& data) override {
|
||||||
return MonsterMoveParser::parseVanilla(packet, data);
|
return MonsterMoveParser::parseVanilla(packet, data);
|
||||||
}
|
}
|
||||||
|
// Classic 1.12 SMSG_INITIAL_SPELLS: uint16 spellId + uint16 slot per entry (not uint32 + uint16)
|
||||||
|
bool parseInitialSpells(network::Packet& packet, InitialSpellsData& data) override {
|
||||||
|
return InitialSpellsParser::parse(packet, data, /*vanillaFormat=*/true);
|
||||||
|
}
|
||||||
// Classic 1.12 uses PackedGuid (not full uint64) and uint16 castFlags (not uint32)
|
// Classic 1.12 uses PackedGuid (not full uint64) and uint16 castFlags (not uint32)
|
||||||
bool parseSpellStart(network::Packet& packet, SpellStartData& data) override;
|
bool parseSpellStart(network::Packet& packet, SpellStartData& data) override;
|
||||||
bool parseSpellGo(network::Packet& packet, SpellGoData& data) override;
|
bool parseSpellGo(network::Packet& packet, SpellGoData& data) override;
|
||||||
|
|
|
||||||
|
|
@ -1758,7 +1758,10 @@ struct InitialSpellsData {
|
||||||
|
|
||||||
class InitialSpellsParser {
|
class InitialSpellsParser {
|
||||||
public:
|
public:
|
||||||
static bool parse(network::Packet& packet, InitialSpellsData& data);
|
// vanillaFormat=true: Classic 1.12 uint16 spellId + uint16 slot (4 bytes/spell)
|
||||||
|
// vanillaFormat=false: TBC/WotLK uint32 spellId + uint16 unk (6 bytes/spell)
|
||||||
|
static bool parse(network::Packet& packet, InitialSpellsData& data,
|
||||||
|
bool vanillaFormat = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** CMSG_CAST_SPELL packet builder */
|
/** CMSG_CAST_SPELL packet builder */
|
||||||
|
|
|
||||||
|
|
@ -2901,18 +2901,13 @@ bool XpGainParser::parse(network::Packet& packet, XpGainData& data) {
|
||||||
// Phase 3: Spells, Action Bar, Auras
|
// Phase 3: Spells, Action Bar, Auras
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
||||||
bool InitialSpellsParser::parse(network::Packet& packet, InitialSpellsData& data) {
|
bool InitialSpellsParser::parse(network::Packet& packet, InitialSpellsData& data,
|
||||||
size_t packetSize = packet.getSize();
|
bool vanillaFormat) {
|
||||||
data.talentSpec = packet.readUInt8();
|
data.talentSpec = packet.readUInt8();
|
||||||
uint16_t spellCount = packet.readUInt16();
|
uint16_t spellCount = packet.readUInt16();
|
||||||
|
|
||||||
// Detect vanilla (uint16 spellId) vs WotLK (uint32 spellId) format
|
LOG_DEBUG("SMSG_INITIAL_SPELLS: spellCount=", spellCount,
|
||||||
// Vanilla: 4 bytes/spell (uint16 id + uint16 slot), WotLK: 6 bytes/spell (uint32 id + uint16 unk)
|
vanillaFormat ? " (vanilla uint16 format)" : " (TBC/WotLK uint32 format)");
|
||||||
size_t remainingAfterHeader = packetSize - 3; // subtract talentSpec(1) + spellCount(2)
|
|
||||||
bool vanillaFormat = remainingAfterHeader < static_cast<size_t>(spellCount) * 6 + 2;
|
|
||||||
|
|
||||||
LOG_DEBUG("SMSG_INITIAL_SPELLS: packetSize=", packetSize, " bytes, spellCount=", spellCount,
|
|
||||||
vanillaFormat ? " (vanilla uint16 format)" : " (WotLK uint32 format)");
|
|
||||||
|
|
||||||
data.spellIds.reserve(spellCount);
|
data.spellIds.reserve(spellCount);
|
||||||
for (uint16_t i = 0; i < spellCount; ++i) {
|
for (uint16_t i = 0; i < spellCount; ++i) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue