Fix quest system for Classic/Turtle: correct packet formats and log stride

- CMSG_QUESTGIVER_QUERY_QUEST: Classic override omits trailing unk1 byte
  (WotLK sends 13 bytes, Classic servers expect 12 — extra byte caused
  server to silently drop the packet, preventing quest details dialog)
- SMSG_QUESTGIVER_QUEST_DETAILS: Classic override skips informUnit GUID
  (WotLK prepends 8-byte informUnit before questId; Vanilla does not)
- Quest log UPDATE_OBJECT stride: use packetParsers_->questLogStride()
  (WotLK=5 fields/slot, Classic=3 fields/slot)
- handleQuestDetails: route through packetParsers_->parseQuestDetails()
- selectGossipQuest: route through packetParsers_->buildQueryQuestPacket()
This commit is contained in:
Kelsi 2026-02-18 04:56:23 -08:00
parent 2dffba63d8
commit dd3149e3c1
3 changed files with 92 additions and 4 deletions

View file

@ -148,6 +148,24 @@ public:
return GossipMessageParser::parse(packet, data);
}
// --- Quest details ---
/** Build CMSG_QUESTGIVER_QUERY_QUEST.
* WotLK appends a trailing unk1 byte; Vanilla/Classic do not. */
virtual network::Packet buildQueryQuestPacket(uint64_t npcGuid, uint32_t questId) {
return QuestgiverQueryQuestPacket::build(npcGuid, questId); // includes unk1
}
/** Parse SMSG_QUESTGIVER_QUEST_DETAILS.
* WotLK has an extra informUnit GUID before questId; Vanilla/Classic do not. */
virtual bool parseQuestDetails(network::Packet& packet, QuestDetailsData& data) {
return QuestDetailsParser::parse(packet, data); // WotLK auto-detect
}
/** Stride of PLAYER_QUEST_LOG fields in update-object blocks.
* WotLK: 5 fields per slot, Classic/Vanilla: 3. */
virtual uint8_t questLogStride() const { return 5; }
// --- Quest Giver Status ---
/** Read quest giver status from packet.
@ -304,6 +322,9 @@ public:
network::Packet buildItemQuery(uint32_t entry, uint64_t guid) override;
bool parseItemQueryResponse(network::Packet& packet, ItemQueryResponseData& data) override;
uint8_t readQuestGiverStatus(network::Packet& packet) override;
network::Packet buildQueryQuestPacket(uint64_t npcGuid, uint32_t questId) override;
bool parseQuestDetails(network::Packet& packet, QuestDetailsData& data) override;
uint8_t questLogStride() const override { return 3; }
};
/**