Vote kick kind of working. Only the forward case - no timeout, no error handling, no display update.

This commit is contained in:
lotodore
2008-11-25 22:18:17 +00:00
parent 10ba70291e
commit b236fa9d62
13 changed files with 109 additions and 15 deletions
+6
View File
@@ -69,6 +69,7 @@ public:
void SendCreateGame(const GameData &gameData, const std::string &name, const std::string &password);
void SendResetTimeout();
void SendAskKickPlayer(unsigned playerId);
void SendVoteKick(bool doKick);
GameInfo GetGameInfo(unsigned gameId) const;
PlayerInfo GetPlayerInfo(unsigned playerId) const;
@@ -149,6 +150,8 @@ protected:
void ModifyGameInfoRemovePlayer(unsigned gameId, unsigned playerId);
void ClearGameInfoMap();
void StartPetition(unsigned petitionId, unsigned proposingPlayerId, unsigned kickPlayerId, int timeoutSec, int numVotesToKick);
void UpdateStatData(const ServerStats &stats);
bool IsSessionEstablished() const;
@@ -189,6 +192,9 @@ private:
unsigned m_curGameId;
mutable boost::mutex m_curGameIdMutex;
unsigned m_curPetitionId;
mutable boost::mutex m_curPetitionIdMutex;
AvatarDataMap m_tempAvatarMap;
unsigned m_curGameNum;
+2 -1
View File
@@ -773,7 +773,8 @@ AbstractClientStateReceiving::Process(ClientThread &client)
{
NetPacketStartKickPlayerPetition::Data petitionData;
tmpPacket->ToNetPacketStartKickPlayerPetition()->GetData(petitionData);
client.GetGui().startVoteOnKick(petitionData.kickPlayerId, petitionData.kickTimeoutSec, petitionData.numVotesNeededToKick);
client.StartPetition(petitionData.petitionId, petitionData.proposingPlayerId,
petitionData.kickPlayerId, petitionData.kickTimeoutSec, petitionData.numVotesNeededToKick);
}
else if (tmpPacket->ToNetPacketAvatarHeader())
{
+30
View File
@@ -264,6 +264,21 @@ ClientThread::SendAskKickPlayer(unsigned playerId)
m_outPacketList.push_back(ask);
}
void
ClientThread::SendVoteKick(bool doKick)
{
boost::shared_ptr<NetPacket> vote(new NetPacketVoteKickPlayer);
NetPacketVoteKickPlayer::Data voteData;
{
boost::mutex::scoped_lock lock(m_curPetitionIdMutex);
voteData.petitionId = m_curPetitionId;
}
voteData.vote = doKick ? KICK_VOTE_IN_FAVOUR : KICK_VOTE_AGAINST;
static_cast<NetPacketVoteKickPlayer *>(vote.get())->SetData(voteData);
boost::mutex::scoped_lock lock(m_outPacketListMutex);
m_outPacketList.push_back(vote);
}
GameInfo
ClientThread::GetGameInfo(unsigned gameId) const
{
@@ -1007,6 +1022,21 @@ ClientThread::ClearGameInfoMap()
m_gameInfoMap.clear();
}
void
ClientThread::StartPetition(unsigned petitionId, unsigned proposingPlayerId, unsigned kickPlayerId, int timeoutSec, int numVotesToKick)
{
{
boost::mutex::scoped_lock lock(m_curPetitionIdMutex);
m_curPetitionId = petitionId;
}
GetGui().startVoteOnKick(kickPlayerId, timeoutSec, numVotesToKick);
if (GetGuiPlayerId() != kickPlayerId
&& GetGuiPlayerId() != proposingPlayerId)
{
GetGui().changeVoteOnKickButtonsState(true);
}
}
void
ClientThread::UpdateStatData(const ServerStats &stats)
{
+15 -4
View File
@@ -153,7 +153,7 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
int retVal = MSG_SOCK_INTERNAL_PENDING;
SessionWrapper session = server.GetSessionManager().Select(RECV_TIMEOUT_MSEC);
if (session.sessionData.get())
if (session.sessionData)
{
boost::shared_ptr<NetPacket> packet;
try
@@ -167,7 +167,7 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
}
// Process packet if one was received.
if (packet.get())
if (packet)
{
if (packet->IsClientActivity())
session.sessionData->ResetActivityTimer();
@@ -199,7 +199,7 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
}
else if (packet->ToNetPacketAskKickPlayer())
{
if (server.IsRunning() && session.playerData)
if (session.playerData)
{
NetPacketAskKickPlayer::Data askKickData;
packet->ToNetPacketAskKickPlayer()->GetData(askKickData);
@@ -213,12 +213,23 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
startPetitionData.proposingPlayerId = session.playerData->GetUniqueId();
startPetitionData.kickPlayerId = voteData->kickPlayerId;
startPetitionData.kickTimeoutSec = SERVER_VOTE_KICK_TIMEOUT_SEC;
startPetitionData.numVotesNeededToKick = voteData->numVotesToKick;
startPetitionData.numVotesNeededToKick = voteData->initialNumVotesToKick;
static_cast<NetPacketStartKickPlayerPetition *>(startPetition.get())->SetData(startPetitionData);
server.SendToAllPlayers(startPetition, SessionData::Game);
// TODO notify first vote.
}
}
}
else if (packet->ToNetPacketVoteKickPlayer())
{
if (session.playerData)
{
NetPacketVoteKickPlayer::Data voteData;
packet->ToNetPacketVoteKickPlayer()->GetData(voteData);
server.InternalVoteKick(voteData.petitionId, voteData.vote);
}
}
// Chat text is always allowed.
else if (packet->ToNetPacketSendChatText())
{
+32 -4
View File
@@ -229,24 +229,52 @@ ServerGameThread::InternalKickPlayer(unsigned playerId)
boost::shared_ptr<VoteKickData>
ServerGameThread::InternalAskVoteKick(unsigned playerIdByWhom, unsigned playerIdWho)
{
boost::mutex::scoped_lock lock(m_voteKickMapMutex);
// TODO: Check whether player is allowed to initiate vote.
// TODO: Check whether there are more than two players.
boost::shared_ptr<VoteKickData> voteData;
if (m_game)
if (IsRunning())
{
voteData.reset(new VoteKickData);
voteData->petitionId = m_curPetitionId++;
voteData->kickPlayerId = playerIdWho;
voteData->numVotesToKick = static_cast<unsigned>(ceil(GetCurNumberOfPlayers() / 3. * 2.));
voteData->initialNumVotesToKick = static_cast<unsigned>(ceil(GetCurNumberOfPlayers() / 3. * 2.));
// Consider first vote.
voteData->numVotesToKick--;
voteData->numVotesInFavourOfKicking = 1;
voteData->votedPlayerIds.push_back(playerIdByWhom);
boost::mutex::scoped_lock lock(m_voteKickMapMutex);
m_voteKickMap.insert(VoteKickMap::value_type(voteData->petitionId, voteData));
}
return voteData;
}
void
ServerGameThread::InternalVoteKick(unsigned petitionId, KickVote vote)
{
if (IsRunning())
{
boost::mutex::scoped_lock lock(m_voteKickMapMutex);
VoteKickMap::iterator pos = m_voteKickMap.find(petitionId);
if (pos != m_voteKickMap.end())
{
boost::shared_ptr<VoteKickData> curData(pos->second);
if (vote == KICK_VOTE_IN_FAVOUR)
{
curData->numVotesInFavourOfKicking++;
if (curData->numVotesInFavourOfKicking >= curData->initialNumVotesToKick)
{
// Perform kick.
InternalKickPlayer(curData->kickPlayerId);
}
}
else
curData->numVotesAgainstKicking++;
// TODO abort if no longer possible.
// TODO remove deprecated list entries.
// TODO error handling.
}
}
}
PlayerDataList
ServerGameThread::GetFullPlayerDataList() const
{
+1
View File
@@ -88,6 +88,7 @@ protected:
void InternalKickPlayer(unsigned playerId);
boost::shared_ptr<VoteKickData> InternalAskVoteKick(unsigned playerIdByWhom, unsigned playerIdWho);
void InternalVoteKick(unsigned petitionId, KickVote vote);
PlayerDataList GetFullPlayerDataList() const;