From e26ed39da8998d26bf0799af9537b22b8e477db9 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 5 Apr 2026 18:54:01 -0700 Subject: [PATCH] fix(combat): add diagnostic logging to handleAttackerStateUpdate Log parse failures with remaining packet size and successful parses with attacker/target/player GUIDs, damage, and callback status to diagnose why meleeSwingCallback is never invoked during auto-attack. --- src/game/combat_handler.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/game/combat_handler.cpp b/src/game/combat_handler.cpp index 48f0b2fd..e64c9841 100644 --- a/src/game/combat_handler.cpp +++ b/src/game/combat_handler.cpp @@ -433,10 +433,19 @@ void CombatHandler::handleAttackStop(network::Packet& packet) { void CombatHandler::handleAttackerStateUpdate(network::Packet& packet) { AttackerStateUpdateData data; - if (!owner_.packetParsers_->parseAttackerStateUpdate(packet, data)) return; + if (!owner_.packetParsers_->parseAttackerStateUpdate(packet, data)) { + LOG_WARNING("ATTACKER_STATE_UPDATE: parse failed, remaining=", packet.getRemainingSize()); + return; + } bool isPlayerAttacker = (data.attackerGuid == owner_.playerGuid); bool isPlayerTarget = (data.targetGuid == owner_.playerGuid); + + LOG_WARNING("ATTACKER_STATE_UPDATE: attacker=0x", std::hex, data.attackerGuid, + " target=0x", data.targetGuid, " player=0x", owner_.playerGuid, std::dec, + " isPlayerAttacker=", isPlayerAttacker, " isPlayerTarget=", isPlayerTarget, + " dmg=", data.totalDamage, " hasCallback=", (owner_.meleeSwingCallback_ ? 1 : 0)); + if (!isPlayerAttacker && !isPlayerTarget) return; // Not our combat if (isPlayerAttacker) {