From 011b1c82951cccc4435706d96bcaeed026a72510 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 9 Mar 2026 23:39:00 -0700 Subject: [PATCH] game: fix SMSG_SPELL_DELAYED to also extend non-player cast bars Previously SMSG_SPELL_DELAYED only adjusted the local player's cast bar. Now it also extends unitCastStates_ for any non-player caster (e.g. boss cast bar extends correctly when hit by a tank during cast). --- src/game/game_handler.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index fa55ee0e..7c6a956b 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -3176,12 +3176,19 @@ void GameHandler::handlePacket(network::Packet& packet) { case Opcode::SMSG_SET_PCT_SPELL_MODIFIER: case Opcode::SMSG_SPELL_DELAYED: { // packed_guid (caster) + uint32 delayMs — spell cast was pushed back - // Adjust cast bar if it's the player's spell - if (casting && packet.getSize() - packet.getReadPos() >= 1) { - uint64_t caster = UpdateObjectParser::readPackedGuid(packet); - if (caster == playerGuid && packet.getSize() - packet.getReadPos() >= 4) { - uint32_t delayMs = packet.readUInt32(); - castTimeRemaining += delayMs / 1000.0f; // Extend cast bar by delay + if (packet.getSize() - packet.getReadPos() < 1) break; + uint64_t caster = UpdateObjectParser::readPackedGuid(packet); + if (packet.getSize() - packet.getReadPos() < 4) break; + uint32_t delayMs = packet.readUInt32(); + if (delayMs == 0) break; + float delaySec = delayMs / 1000.0f; + if (caster == playerGuid) { + if (casting) castTimeRemaining += delaySec; + } else { + auto it = unitCastStates_.find(caster); + if (it != unitCastStates_.end() && it->second.casting) { + it->second.timeRemaining += delaySec; + it->second.timeTotal += delaySec; } } break;