From 3082df2ac0923ec54e93fd916c6a1ca34de21b1b Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 11 Mar 2026 02:27:57 -0700 Subject: [PATCH] fix: use packed guids in SMSG_SPELLDAMAGESHIELD for WotLK and read absorbed field WotLK 3.3.5a format uses packed guids (not full uint64) for victim and caster, and adds an absorbed(4) field before schoolMask. Classic/TBC use full uint64 guids. Previously the handler always read full uint64 guids, causing misparse on WotLK (e.g. Thorns and Shield Spike damage shield combat text was garbled/wrong). --- src/game/game_handler.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 0fd1afd8..28ac2ae8 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -5129,14 +5129,24 @@ void GameHandler::handlePacket(network::Packet& packet) { case Opcode::SMSG_AURACASTLOG: case Opcode::SMSG_SPELLBREAKLOG: case Opcode::SMSG_SPELLDAMAGESHIELD: { - // victimGuid(8) + casterGuid(8) + spellId(4) + damage(4) + schoolMask(4) - if (packet.getSize() - packet.getReadPos() < 24) { + // Classic/TBC: uint64 victim + uint64 caster + spellId(4) + damage(4) + schoolMask(4) + // WotLK: packed_guid victim + packed_guid caster + spellId(4) + damage(4) + absorbed(4) + schoolMask(4) + const bool shieldClassicLike = isClassicLikeExpansion() || isActiveExpansion("tbc"); + const size_t shieldMinSz = shieldClassicLike ? 24u : 2u; + if (packet.getSize() - packet.getReadPos() < shieldMinSz) { + packet.setReadPos(packet.getSize()); break; + } + uint64_t victimGuid = shieldClassicLike + ? packet.readUInt64() : UpdateObjectParser::readPackedGuid(packet); + uint64_t casterGuid = shieldClassicLike + ? packet.readUInt64() : UpdateObjectParser::readPackedGuid(packet); + if (packet.getSize() - packet.getReadPos() < 12) { packet.setReadPos(packet.getSize()); break; } - uint64_t victimGuid = packet.readUInt64(); - uint64_t casterGuid = packet.readUInt64(); /*uint32_t spellId =*/ packet.readUInt32(); uint32_t damage = packet.readUInt32(); + if (!shieldClassicLike && packet.getSize() - packet.getReadPos() >= 4) + /*uint32_t absorbed =*/ packet.readUInt32(); /*uint32_t school =*/ packet.readUInt32(); // Show combat text: damage shield reflect if (casterGuid == playerGuid) {