diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index baa745a3..166d2573 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -944,6 +944,7 @@ public: void lfgJoin(uint32_t dungeonId, uint8_t roles); void lfgLeave(); void lfgAcceptProposal(uint32_t proposalId, bool accept); + void lfgSetBootVote(bool vote); void lfgTeleport(bool toLfgDungeon = true); LfgState getLfgState() const { return lfgState_; } bool isLfgQueued() const { return lfgState_ == LfgState::Queued; } diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 96044e4a..91c7372c 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -11952,13 +11952,18 @@ void GameHandler::handleLfgBootProposalUpdate(network::Packet& packet) { (void)myVote; (void)totalVotes; (void)bootVotes; (void)timeLeft; (void)votesNeeded; if (inProgress) { + lfgState_ = LfgState::Boot; addSystemChatMessage( std::string("Dungeon Finder: Vote to kick in progress (") + std::to_string(timeLeft) + "s remaining)."); - } else if (myAnswer) { - addSystemChatMessage("Dungeon Finder: Vote kick passed — member removed."); } else { - addSystemChatMessage("Dungeon Finder: Vote kick failed."); + // Boot vote ended — return to InDungeon state regardless of outcome + lfgState_ = LfgState::InDungeon; + if (myAnswer) { + addSystemChatMessage("Dungeon Finder: Vote kick passed — member removed."); + } else { + addSystemChatMessage("Dungeon Finder: Vote kick failed."); + } } LOG_INFO("SMSG_LFG_BOOT_PROPOSAL_UPDATE: inProgress=", inProgress, @@ -12027,6 +12032,18 @@ void GameHandler::lfgTeleport(bool toLfgDungeon) { LOG_INFO("Sent CMSG_LFG_TELEPORT: toLfgDungeon=", toLfgDungeon); } +void GameHandler::lfgSetBootVote(bool vote) { + if (!socket) return; + uint16_t wireOp = wireOpcode(Opcode::CMSG_LFG_SET_BOOT_VOTE); + if (wireOp == 0xFFFF) return; + + network::Packet pkt(wireOp); + pkt.writeUInt8(vote ? 1 : 0); + + socket->send(pkt); + LOG_INFO("Sent CMSG_LFG_SET_BOOT_VOTE: vote=", vote); +} + void GameHandler::loadAreaTriggerDbc() { if (areaTriggerDbcLoaded_) return; areaTriggerDbcLoaded_ = true; diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 1a7ac0e1..14d78caf 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -10583,6 +10583,20 @@ void GameScreen::renderDungeonFinderWindow(game::GameHandler& gameHandler) { ImGui::Separator(); } + // ---- Vote-to-kick buttons ---- + if (state == LfgState::Boot) { + ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), "Vote to kick in progress:"); + ImGui::Spacing(); + if (ImGui::Button("Vote Yes (kick)", ImVec2(140, 0))) { + gameHandler.lfgSetBootVote(true); + } + ImGui::SameLine(); + if (ImGui::Button("Vote No (keep)", ImVec2(140, 0))) { + gameHandler.lfgSetBootVote(false); + } + ImGui::Separator(); + } + // ---- Teleport button (in dungeon) ---- if (state == LfgState::InDungeon) { if (ImGui::Button("Teleport to Dungeon", ImVec2(-1, 0))) {