Deny ask kick if the player is not/no longer present.

This commit is contained in:
lotodore
2008-12-12 22:38:35 +00:00
parent 3fc9ee1729
commit 4bf9ceff6d
5 changed files with 50 additions and 24 deletions
+1
View File
@@ -830,6 +830,7 @@ Deny Reason:
0x0001: Kick not possible due to number of players. 0x0001: Kick not possible due to number of players.
0x0002: Another kick cannot be requested at this time. 0x0002: Another kick cannot be requested at this time.
0x0003: Kick request is already in progress. 0x0003: Kick request is already in progress.
0x0004: Invalid player ID.
0xFFFF: Other reason. 0xFFFF: Other reason.
+1
View File
@@ -72,6 +72,7 @@ enum DenyKickPlayerReason
KICK_DENIED_TOO_FEW_PLAYERS, KICK_DENIED_TOO_FEW_PLAYERS,
KICK_DENIED_TEMPORARY, KICK_DENIED_TEMPORARY,
KICK_DENIED_OTHER_IN_PROGRESS, KICK_DENIED_OTHER_IN_PROGRESS,
KICK_DENIED_INVALID_PLAYER_ID,
KICK_DENIED_OTHER_REASON KICK_DENIED_OTHER_REASON
}; };
+7
View File
@@ -125,6 +125,7 @@ using namespace std;
#define NET_ASK_KICK_DENIED_TOO_FEW_PLAYERS 0x0001 #define NET_ASK_KICK_DENIED_TOO_FEW_PLAYERS 0x0001
#define NET_ASK_KICK_DENIED_TEMPORARY 0x0002 #define NET_ASK_KICK_DENIED_TEMPORARY 0x0002
#define NET_ASK_KICK_DENIED_OTHER_IN_PROGRESS 0x0003 #define NET_ASK_KICK_DENIED_OTHER_IN_PROGRESS 0x0003
#define NET_ASK_KICK_DENIED_INVALID_PLAYER_ID 0x0004
#define NET_ASK_KICK_DENIED_OTHER_REASON 0xFFFF #define NET_ASK_KICK_DENIED_OTHER_REASON 0xFFFF
// Vote types // Vote types
@@ -4526,6 +4527,9 @@ NetPacketAskKickPlayerDenied::SetData(const NetPacketAskKickPlayerDenied::Data &
case KICK_DENIED_OTHER_IN_PROGRESS: case KICK_DENIED_OTHER_IN_PROGRESS:
tmpData->denyReason = htons(NET_ASK_KICK_DENIED_OTHER_IN_PROGRESS); tmpData->denyReason = htons(NET_ASK_KICK_DENIED_OTHER_IN_PROGRESS);
break; break;
case KICK_DENIED_INVALID_PLAYER_ID:
tmpData->denyReason = htons(NET_ASK_KICK_DENIED_INVALID_PLAYER_ID);
break;
default: default:
tmpData->denyReason = htons(NET_ASK_KICK_DENIED_OTHER_REASON); tmpData->denyReason = htons(NET_ASK_KICK_DENIED_OTHER_REASON);
break; break;
@@ -4555,6 +4559,9 @@ NetPacketAskKickPlayerDenied::GetData(NetPacketAskKickPlayerDenied::Data &outDat
case NET_ASK_KICK_DENIED_OTHER_IN_PROGRESS: case NET_ASK_KICK_DENIED_OTHER_IN_PROGRESS:
outData.denyReason = KICK_DENIED_OTHER_IN_PROGRESS; outData.denyReason = KICK_DENIED_OTHER_IN_PROGRESS;
break; break;
case NET_ASK_KICK_DENIED_INVALID_PLAYER_ID:
outData.denyReason = KICK_DENIED_INVALID_PLAYER_ID;
break;
default: default:
outData.denyReason = KICK_DENIED_OTHER_REASON; outData.denyReason = KICK_DENIED_OTHER_REASON;
break; break;
+40 -24
View File
@@ -220,7 +220,7 @@ ServerGameThread::VoteKickAction()
abortPetition = true; abortPetition = true;
} }
// 3. The kick has become invalid because the player to be kicked left. // 3. The kick has become invalid because the player to be kicked left.
else if (find(playerIds.begin(), playerIds.end(), m_voteKickData->kickPlayerId) == playerIds.end()) else if (!IsValidPlayer(m_voteKickData->kickPlayerId))
{ {
reason = PETITION_END_PLAYER_LEFT; reason = PETITION_END_PLAYER_LEFT;
abortPetition = true; abortPetition = true;
@@ -327,34 +327,40 @@ ServerGameThread::InternalAskVoteKick(SessionWrapper byWhom, unsigned playerIdWh
size_t numPlayers = GetSessionManager().GetPlayerIdList().size(); size_t numPlayers = GetSessionManager().GetPlayerIdList().size();
if (numPlayers > 2) if (numPlayers > 2)
{ {
// Lock the vote kick data. // Check whether the player to be kicked exists.
boost::mutex::scoped_lock lock(m_voteKickDataMutex); if (IsValidPlayer(playerIdWho))
if (!m_voteKickData)
{ {
// Initiate a vote kick. // Lock the vote kick data.
unsigned playerIdByWhom = byWhom.playerData->GetUniqueId(); boost::mutex::scoped_lock lock(m_voteKickDataMutex);
m_voteKickData.reset(new VoteKickData); if (!m_voteKickData)
m_voteKickData->petitionId = m_curPetitionId++; {
m_voteKickData->kickPlayerId = playerIdWho; // Initiate a vote kick.
m_voteKickData->numVotesToKick = static_cast<int>(ceil(numPlayers / 3. * 2.)); unsigned playerIdByWhom = byWhom.playerData->GetUniqueId();
m_voteKickData->timeLimitSec = timeoutSec + SERVER_KICK_TIMEOUT_ADD_DELAY_SEC; m_voteKickData.reset(new VoteKickData);
// Consider first vote. m_voteKickData->petitionId = m_curPetitionId++;
m_voteKickData->numVotesInFavourOfKicking = 1; m_voteKickData->kickPlayerId = playerIdWho;
m_voteKickData->votedPlayerIds.push_back(playerIdByWhom); m_voteKickData->numVotesToKick = static_cast<int>(ceil(numPlayers / 3. * 2.));
m_voteKickData->timeLimitSec = timeoutSec + SERVER_KICK_TIMEOUT_ADD_DELAY_SEC;
// Consider first vote.
m_voteKickData->numVotesInFavourOfKicking = 1;
m_voteKickData->votedPlayerIds.push_back(playerIdByWhom);
boost::shared_ptr<NetPacket> startPetition(new NetPacketStartKickPlayerPetition); boost::shared_ptr<NetPacket> startPetition(new NetPacketStartKickPlayerPetition);
NetPacketStartKickPlayerPetition::Data startPetitionData; NetPacketStartKickPlayerPetition::Data startPetitionData;
startPetitionData.petitionId = m_voteKickData->petitionId; startPetitionData.petitionId = m_voteKickData->petitionId;
startPetitionData.proposingPlayerId = playerIdByWhom; startPetitionData.proposingPlayerId = playerIdByWhom;
startPetitionData.kickPlayerId = m_voteKickData->kickPlayerId; startPetitionData.kickPlayerId = m_voteKickData->kickPlayerId;
startPetitionData.kickTimeoutSec = timeoutSec; startPetitionData.kickTimeoutSec = timeoutSec;
startPetitionData.numVotesNeededToKick = m_voteKickData->numVotesToKick; startPetitionData.numVotesNeededToKick = m_voteKickData->numVotesToKick;
static_cast<NetPacketStartKickPlayerPetition *>(startPetition.get())->SetData(startPetitionData); static_cast<NetPacketStartKickPlayerPetition *>(startPetition.get())->SetData(startPetitionData);
SendToAllPlayers(startPetition, SessionData::Game); SendToAllPlayers(startPetition, SessionData::Game);
}
else
InternalDenyAskVoteKick(byWhom, playerIdWho, KICK_DENIED_OTHER_IN_PROGRESS);
} }
else else
InternalDenyAskVoteKick(byWhom, playerIdWho, KICK_DENIED_OTHER_IN_PROGRESS); InternalDenyAskVoteKick(byWhom, playerIdWho, KICK_DENIED_INVALID_PLAYER_ID);
} }
else else
InternalDenyAskVoteKick(byWhom, playerIdWho, KICK_DENIED_TOO_FEW_PLAYERS); InternalDenyAskVoteKick(byWhom, playerIdWho, KICK_DENIED_TOO_FEW_PLAYERS);
@@ -693,6 +699,16 @@ ServerGameThread::AssignPlayerNumbers()
} }
} }
bool
ServerGameThread::IsValidPlayer(unsigned playerId) const
{
bool retVal = false;
const PlayerIdList list(GetPlayerIdList());
if (find(list.begin(), list.end(), playerId) != list.end())
retVal = true;
return retVal;
}
SessionManager & SessionManager &
ServerGameThread::GetSessionManager() ServerGameThread::GetSessionManager()
{ {
+1
View File
@@ -109,6 +109,7 @@ protected:
void RemoveDisconnectedPlayers(); void RemoveDisconnectedPlayers();
size_t GetCurNumberOfPlayers() const; size_t GetCurNumberOfPlayers() const;
void AssignPlayerNumbers(); void AssignPlayerNumbers();
bool IsValidPlayer(unsigned playerId) const;
ServerLobbyThread &GetLobbyThread(); ServerLobbyThread &GetLobbyThread();