mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-23 07:40:14 +00:00
game: fix Classic/TBC SMSG_TEXT_EMOTE field order
Classic 1.12 and TBC 2.4.3 send SMSG_TEXT_EMOTE with the field order: textEmoteId(u32) + emoteNum(u32) + senderGuid(u64) + nameLen(u32) + name WotLK 3.3.5a swapped senderGuid to the front: senderGuid(u64) + textEmoteId(u32) + emoteNum(u32) + nameLen(u32) + name The previous TextEmoteParser always used the WotLK order, causing senderGuid to be read as a mashup of textEmoteId+emoteNum for Classic/TBC. Emote animations and chat entries were associated with wrong GUIDs. TextEmoteParser::parse now takes a legacyFormat parameter; handleTextEmote passes it based on expansion detection.
This commit is contained in:
parent
a0979b9cd8
commit
c19edd407a
3 changed files with 22 additions and 7 deletions
|
|
@ -717,7 +717,9 @@ struct TextEmoteData {
|
|||
*/
|
||||
class TextEmoteParser {
|
||||
public:
|
||||
static bool parse(network::Packet& packet, TextEmoteData& data);
|
||||
// legacyFormat: Classic 1.12 and TBC 2.4.3 send textEmoteId+emoteNum first, then senderGuid.
|
||||
// WotLK 3.3.5a reverses this: senderGuid first, then textEmoteId+emoteNum.
|
||||
static bool parse(network::Packet& packet, TextEmoteData& data, bool legacyFormat = false);
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
|
|
|
|||
|
|
@ -8560,8 +8560,11 @@ void GameHandler::sendTextEmote(uint32_t textEmoteId, uint64_t targetGuid) {
|
|||
}
|
||||
|
||||
void GameHandler::handleTextEmote(network::Packet& packet) {
|
||||
// Classic 1.12 and TBC 2.4.3 send: textEmoteId(u32) + emoteNum(u32) + senderGuid(u64) + nameLen(u32) + name
|
||||
// WotLK 3.3.5a reversed this to: senderGuid(u64) + textEmoteId(u32) + emoteNum(u32) + nameLen(u32) + name
|
||||
const bool legacyFormat = isClassicLikeExpansion() || isActiveExpansion("tbc");
|
||||
TextEmoteData data;
|
||||
if (!TextEmoteParser::parse(packet, data)) {
|
||||
if (!TextEmoteParser::parse(packet, data, legacyFormat)) {
|
||||
LOG_WARNING("Failed to parse SMSG_TEXT_EMOTE");
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1510,20 +1510,30 @@ network::Packet TextEmotePacket::build(uint32_t textEmoteId, uint64_t targetGuid
|
|||
return packet;
|
||||
}
|
||||
|
||||
bool TextEmoteParser::parse(network::Packet& packet, TextEmoteData& data) {
|
||||
bool TextEmoteParser::parse(network::Packet& packet, TextEmoteData& data, bool legacyFormat) {
|
||||
size_t bytesLeft = packet.getSize() - packet.getReadPos();
|
||||
if (bytesLeft < 20) {
|
||||
LOG_WARNING("SMSG_TEXT_EMOTE too short: ", bytesLeft, " bytes");
|
||||
return false;
|
||||
}
|
||||
data.senderGuid = packet.readUInt64();
|
||||
data.textEmoteId = packet.readUInt32();
|
||||
data.emoteNum = packet.readUInt32();
|
||||
|
||||
if (legacyFormat) {
|
||||
// Classic 1.12 / TBC 2.4.3: textEmoteId(u32) + emoteNum(u32) + senderGuid(u64)
|
||||
data.textEmoteId = packet.readUInt32();
|
||||
data.emoteNum = packet.readUInt32();
|
||||
data.senderGuid = packet.readUInt64();
|
||||
} else {
|
||||
// WotLK 3.3.5a: senderGuid(u64) + textEmoteId(u32) + emoteNum(u32)
|
||||
data.senderGuid = packet.readUInt64();
|
||||
data.textEmoteId = packet.readUInt32();
|
||||
data.emoteNum = packet.readUInt32();
|
||||
}
|
||||
|
||||
uint32_t nameLen = packet.readUInt32();
|
||||
if (nameLen > 0 && nameLen <= 256) {
|
||||
data.targetName = packet.readString();
|
||||
} else if (nameLen > 0) {
|
||||
// Skip garbage
|
||||
// Implausible name length — misaligned read
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue