From f07b730473d04c62797b87d22d541353aee71ce2 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 14 Mar 2026 15:06:29 -0700 Subject: [PATCH] fix(combatlog): reject truncated resist logs --- src/game/game_handler.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 4780c372..40c4d34b 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -7146,19 +7146,18 @@ void GameHandler::handlePacket(network::Packet& packet) { ? packet.readUInt64() : UpdateObjectParser::readPackedGuid(packet); if (rl_rem() < 4) { packet.setReadPos(packet.getSize()); break; } uint32_t spellId = packet.readUInt32(); - int32_t resistedAmount = 0; // Resist payload includes: // float resistFactor + uint32 targetResistance + uint32 resistedValue. - // Some servers may truncate optional tail fields, so parse defensively. - if (rl_rem() >= 12) { - /*float resistFactor =*/ packet.readFloat(); - /*uint32_t targetRes =*/ packet.readUInt32(); - resistedAmount = static_cast(packet.readUInt32()); - } + // Require the full payload so truncated packets cannot synthesize + // zero-value resist events. + if (rl_rem() < 12) { packet.setReadPos(packet.getSize()); break; } + /*float resistFactor =*/ packet.readFloat(); + /*uint32_t targetRes =*/ packet.readUInt32(); + int32_t resistedAmount = static_cast(packet.readUInt32()); // Show RESIST when the player is involved on either side. - if (victimGuid == playerGuid) { + if (resistedAmount > 0 && victimGuid == playerGuid) { addCombatText(CombatTextEntry::RESIST, resistedAmount, spellId, false, 0, attackerGuid, victimGuid); - } else if (attackerGuid == playerGuid) { + } else if (resistedAmount > 0 && attackerGuid == playerGuid) { addCombatText(CombatTextEntry::RESIST, resistedAmount, spellId, true, 0, attackerGuid, victimGuid); } packet.setReadPos(packet.getSize());