diff --git a/src/net/clientthread.h b/src/net/clientthread.h index 720993f5..5db936f0 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -151,6 +151,7 @@ protected: void ClearGameInfoMap(); void StartPetition(unsigned petitionId, unsigned proposingPlayerId, unsigned kickPlayerId, int timeoutSec, int numVotesToKick); + void EndPetition(unsigned petitionId); void UpdateStatData(const ServerStats &stats); diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 10de84e0..03cdcd07 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -771,10 +771,16 @@ AbstractClientStateReceiving::Process(ClientThread &client) } else if (tmpPacket->ToNetPacketStartKickPlayerPetition()) { - NetPacketStartKickPlayerPetition::Data petitionData; - tmpPacket->ToNetPacketStartKickPlayerPetition()->GetData(petitionData); - client.StartPetition(petitionData.petitionId, petitionData.proposingPlayerId, - petitionData.kickPlayerId, petitionData.kickTimeoutSec, petitionData.numVotesNeededToKick); + NetPacketStartKickPlayerPetition::Data startPetitionData; + tmpPacket->ToNetPacketStartKickPlayerPetition()->GetData(startPetitionData); + client.StartPetition(startPetitionData.petitionId, startPetitionData.proposingPlayerId, + startPetitionData.kickPlayerId, startPetitionData.kickTimeoutSec, startPetitionData.numVotesNeededToKick); + } + else if (tmpPacket->ToNetPacketEndKickPlayerPetition()) + { + NetPacketEndKickPlayerPetition::Data endPetitionData; + tmpPacket->ToNetPacketEndKickPlayerPetition()->GetData(endPetitionData); + client.EndPetition(endPetitionData.petitionId); } else if (tmpPacket->ToNetPacketAvatarHeader()) { diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index c0a578ec..a4081be1 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -1037,6 +1037,18 @@ ClientThread::StartPetition(unsigned petitionId, unsigned proposingPlayerId, uns } } +void +ClientThread::EndPetition(unsigned petitionId) +{ + bool isCurPetition; + { + boost::mutex::scoped_lock lock(m_curPetitionIdMutex); + isCurPetition = m_curPetitionId == petitionId; + } + if (isCurPetition) + GetGui().endVoteOnKick(); +} + void ClientThread::UpdateStatData(const ServerStats &stats) { diff --git a/src/net/common/servergamethread.cpp b/src/net/common/servergamethread.cpp index d3ce01a4..1d1920a8 100644 --- a/src/net/common/servergamethread.cpp +++ b/src/net/common/servergamethread.cpp @@ -33,6 +33,7 @@ #define SERVER_CHECK_VOTE_KICK_INTERVAL_MSEC 500 +#define SERVER_KICK_TIMEOUT_ADD_DELAY_SEC 2 using namespace std; @@ -239,7 +240,6 @@ ServerGameThread::VoteKickAction() endPetitionData.numVotesInFavourOfKicking = m_voteKickData->numVotesInFavourOfKicking; endPetitionData.playerKicked = doKick; endPetitionData.endReason = reason; - m_voteKickData.reset(); static_cast(endPetition.get())->SetData(endPetitionData); SendToAllPlayers(endPetition, SessionData::Game); @@ -247,6 +247,8 @@ ServerGameThread::VoteKickAction() // Perform kick. if (doKick) InternalKickPlayer(m_voteKickData->kickPlayerId); + // This petition has ended. + m_voteKickData.reset(); } } } @@ -328,7 +330,7 @@ ServerGameThread::InternalAskVoteKick(SessionWrapper byWhom, unsigned playerIdWh m_voteKickData->petitionId = m_curPetitionId++; m_voteKickData->kickPlayerId = playerIdWho; m_voteKickData->numVotesToKick = static_cast(ceil(numPlayers / 3. * 2.)); - m_voteKickData->timeLimitSec = timeoutSec; + m_voteKickData->timeLimitSec = timeoutSec + SERVER_KICK_TIMEOUT_ADD_DELAY_SEC; // Consider first vote. m_voteKickData->numVotesInFavourOfKicking = 1; m_voteKickData->votedPlayerIds.push_back(playerIdByWhom); @@ -338,7 +340,7 @@ ServerGameThread::InternalAskVoteKick(SessionWrapper byWhom, unsigned playerIdWh startPetitionData.petitionId = m_voteKickData->petitionId; startPetitionData.proposingPlayerId = playerIdByWhom; startPetitionData.kickPlayerId = m_voteKickData->kickPlayerId; - startPetitionData.kickTimeoutSec = m_voteKickData->timeLimitSec; + startPetitionData.kickTimeoutSec = timeoutSec; startPetitionData.numVotesNeededToKick = m_voteKickData->numVotesToKick; static_cast(startPetition.get())->SetData(startPetitionData);