From 470421879a40ee263985bf6e93b04a0107ff0370 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Thu, 12 Mar 2026 21:08:40 -0700 Subject: [PATCH] feat: implement SMSG_GROUP_SET_LEADER and BG player join/leave notifications - SMSG_GROUP_SET_LEADER: parse leader name, update partyData.leaderGuid by name lookup, display system message announcing the new leader - SMSG_BATTLEGROUND_PLAYER_JOINED: parse guid, show named entry message when player is in nameCache - SMSG_BATTLEGROUND_PLAYER_LEFT: parse guid, show named exit message when player is in nameCache Replaces three LOG_INFO/ignore stubs with functional packet handlers. --- src/game/game_handler.cpp | 44 +++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 00e2fd2f..450c6f27 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -4890,9 +4890,23 @@ void GameHandler::handlePacket(network::Packet& packet) { case Opcode::SMSG_QUESTGIVER_OFFER_REWARD: handleQuestOfferReward(packet); break; - case Opcode::SMSG_GROUP_SET_LEADER: - LOG_DEBUG("Ignoring known opcode: 0x", std::hex, opcode, std::dec); + case Opcode::SMSG_GROUP_SET_LEADER: { + // SMSG_GROUP_SET_LEADER: string leaderName (null-terminated) + if (packet.getSize() > packet.getReadPos()) { + std::string leaderName = packet.readString(); + // Update leaderGuid by name lookup in party members + for (const auto& m : partyData.members) { + if (m.name == leaderName) { + partyData.leaderGuid = m.guid; + break; + } + } + if (!leaderName.empty()) + addSystemChatMessage(leaderName + " is now the group leader."); + LOG_INFO("SMSG_GROUP_SET_LEADER: ", leaderName); + } break; + } // ---- Teleport / Transfer ---- case Opcode::MSG_MOVE_TELEPORT_ACK: @@ -4983,12 +4997,30 @@ void GameHandler::handlePacket(network::Packet& packet) { case Opcode::SMSG_JOINED_BATTLEGROUND_QUEUE: addSystemChatMessage("You have joined the battleground queue."); break; - case Opcode::SMSG_BATTLEGROUND_PLAYER_JOINED: - LOG_INFO("Battleground player joined"); + case Opcode::SMSG_BATTLEGROUND_PLAYER_JOINED: { + // SMSG_BATTLEGROUND_PLAYER_JOINED: uint64 guid + if (packet.getSize() - packet.getReadPos() >= 8) { + uint64_t guid = packet.readUInt64(); + auto it = playerNameCache.find(guid); + std::string name = (it != playerNameCache.end()) ? it->second : ""; + if (!name.empty()) + addSystemChatMessage(name + " has entered the battleground."); + LOG_INFO("SMSG_BATTLEGROUND_PLAYER_JOINED: guid=0x", std::hex, guid, std::dec); + } break; - case Opcode::SMSG_BATTLEGROUND_PLAYER_LEFT: - LOG_INFO("Battleground player left"); + } + case Opcode::SMSG_BATTLEGROUND_PLAYER_LEFT: { + // SMSG_BATTLEGROUND_PLAYER_LEFT: uint64 guid + if (packet.getSize() - packet.getReadPos() >= 8) { + uint64_t guid = packet.readUInt64(); + auto it = playerNameCache.find(guid); + std::string name = (it != playerNameCache.end()) ? it->second : ""; + if (!name.empty()) + addSystemChatMessage(name + " has left the battleground."); + LOG_INFO("SMSG_BATTLEGROUND_PLAYER_LEFT: guid=0x", std::hex, guid, std::dec); + } break; + } case Opcode::SMSG_INSTANCE_DIFFICULTY: case Opcode::MSG_SET_DUNGEON_DIFFICULTY: handleInstanceDifficulty(packet);