void WorldSession::HandleLfgSetBootVoteOpcode(WorldPacket &recv_data) { bool agree; // Agree to kick player recv_data >> agree; DEBUG_LOG("CMSG_LFG_SET_BOOT_VOTE %u agree: %u", GetPlayer()->GetObjectGuid().GetCounter(), agree ? 1 : 0); sLFGMgr.UpdateBoot(GetPlayer(), LFGAnswer(agree)); }
void LFGMgr::UpdateBoot(Player* player, bool accept) { Group* group = player ? player->GetGroup() : NULL; if (!group) return; LFGPlayerBoot* pBoot = GetBoot(group->GetObjectGuid()); if (!pBoot) return; if (pBoot->votes[player->GetObjectGuid()] != LFG_ANSWER_PENDING) // Cheat check: Player can't vote twice return; Player* victim = sObjectMgr.GetPlayer(pBoot->victim); if (!victim) return; pBoot->votes[player->GetObjectGuid()] = LFGAnswer(accept); uint8 votesNum = 0; uint8 agreeNum = 0; for (LFGAnswerMap::const_iterator itVotes = pBoot->votes.begin(); itVotes != pBoot->votes.end(); ++itVotes) { if (itVotes->second != LFG_ANSWER_PENDING) { ++votesNum; if (itVotes->second == LFG_ANSWER_AGREE) ++agreeNum; } } if (agreeNum >= pBoot->votedNeeded || // Vote passed votesNum >= pBoot->votes.size() || // All voted but not passed (pBoot->votes.size() - votesNum + agreeNum) < pBoot->votedNeeded) // Vote didnt passed { // Send update info to all players pBoot->inProgress = false; for (LFGAnswerMap::const_iterator itVotes = pBoot->votes.begin(); itVotes != pBoot->votes.end(); ++itVotes) { Player* pPlayer = sObjectMgr.GetPlayer(itVotes->first); if (pPlayer && (pPlayer != victim)) { pPlayer->GetLFGState()->SetState(LFG_STATE_DUNGEON); pPlayer->GetSession()->SendLfgBootPlayer(pBoot); } } group->GetLFGState()->SetState(LFG_STATE_DUNGEON); if (agreeNum == pBoot->votedNeeded) // Vote passed - Kick player { Player::RemoveFromGroup(group, victim->GetObjectGuid()); TeleportPlayer(victim, true, false); victim->GetLFGState()->Clear(); OfferContinue(group); group->GetLFGState()->DecreaseKicksLeft(); } DeleteBoot(group->GetObjectGuid()); } }