From e122d725f6b90a22b8a24e80ae3818633ad5a3dd Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 9 Mar 2026 23:51:01 -0700 Subject: [PATCH] game: fix expansion-gated GUIDs for HEALTH_UPDATE, POWER_UPDATE, COMBO_POINTS --- src/game/game_handler.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index f7244a7f..0cd7dca3 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -1644,9 +1644,12 @@ void GameHandler::handlePacket(network::Packet& packet) { // ---- Entity health/power delta updates ---- case Opcode::SMSG_HEALTH_UPDATE: { - // packed_guid + uint32 health - if (packet.getSize() - packet.getReadPos() < 2) break; - uint64_t guid = UpdateObjectParser::readPackedGuid(packet); + // WotLK: packed_guid + uint32 health + // TBC/Classic: uint64 + uint32 health + const bool huTbcLike = isClassicLikeExpansion() || isActiveExpansion("tbc"); + if (packet.getSize() - packet.getReadPos() < (huTbcLike ? 8u : 2u)) break; + uint64_t guid = huTbcLike + ? packet.readUInt64() : UpdateObjectParser::readPackedGuid(packet); if (packet.getSize() - packet.getReadPos() < 4) break; uint32_t hp = packet.readUInt32(); auto entity = entityManager.getEntity(guid); @@ -1656,9 +1659,12 @@ void GameHandler::handlePacket(network::Packet& packet) { break; } case Opcode::SMSG_POWER_UPDATE: { - // packed_guid + uint8 powerType + uint32 value - if (packet.getSize() - packet.getReadPos() < 2) break; - uint64_t guid = UpdateObjectParser::readPackedGuid(packet); + // WotLK: packed_guid + uint8 powerType + uint32 value + // TBC/Classic: uint64 + uint8 powerType + uint32 value + const bool puTbcLike = isClassicLikeExpansion() || isActiveExpansion("tbc"); + if (packet.getSize() - packet.getReadPos() < (puTbcLike ? 8u : 2u)) break; + uint64_t guid = puTbcLike + ? packet.readUInt64() : UpdateObjectParser::readPackedGuid(packet); if (packet.getSize() - packet.getReadPos() < 5) break; uint8_t powerType = packet.readUInt8(); uint32_t value = packet.readUInt32(); @@ -1703,9 +1709,12 @@ void GameHandler::handlePacket(network::Packet& packet) { // ---- Combo points ---- case Opcode::SMSG_UPDATE_COMBO_POINTS: { - // packed_guid (target) + uint8 points - if (packet.getSize() - packet.getReadPos() < 2) break; - uint64_t target = UpdateObjectParser::readPackedGuid(packet); + // WotLK: packed_guid (target) + uint8 points + // TBC/Classic: uint64 (target) + uint8 points + const bool cpTbcLike = isClassicLikeExpansion() || isActiveExpansion("tbc"); + if (packet.getSize() - packet.getReadPos() < (cpTbcLike ? 8u : 2u)) break; + uint64_t target = cpTbcLike + ? packet.readUInt64() : UpdateObjectParser::readPackedGuid(packet); if (packet.getSize() - packet.getReadPos() < 1) break; comboPoints_ = packet.readUInt8(); comboTarget_ = target;