limit enter-leave game done.

This commit is contained in:
Kai Philipp
2016-06-18 18:34:25 +02:00
parent cf280f0478
commit cd085bf8be
3 changed files with 55 additions and 0 deletions
+33
View File
@@ -457,6 +457,8 @@ ServerGame::InternalEndGame()
{ {
StoreAndResetRanking(); StoreAndResetRanking();
m_game.reset(); m_game.reset();
// @XXX: reset NumJoinsPerPlayerMap (if a game restarts, the number of joins will be set to 0 for each player)
ResetNumJoinsPerPlayer();
} }
void void
@@ -1164,3 +1166,34 @@ ServerGame::GetNextGameNum()
return m_gameNum++; return m_gameNum++;
} }
void
ServerGame::AddPlayerToNumJoinsPerPlayer(const std::string &playerName)
{
if(m_numjoinsp.find(playerName) != m_numjoinsp.end()){
m_numjoinsp[playerName] = m_numjoinsp[playerName] + 1;
}else{
m_numjoinsp[playerName] = 1;
}
}
int
ServerGame::GetNumJoinsPerPlayer(const std::string &playerName)
{
int num = 0;
if(m_numjoinsp.find(playerName) != m_numjoinsp.end()){
num = m_numjoinsp[playerName];
}
return num;
}
void
ServerGame::ResetNumJoinsPerPlayer()
{
NumJoinsPerPlayerMap::const_iterator numj_i = m_numjoinsp.begin();
NumJoinsPerPlayerMap::const_iterator numj_end = m_numjoinsp.end();
while (numj_i != numj_end) {
m_numjoinsp[numj_i->first] = 0;
++numj_i;
}
}
+14
View File
@@ -537,10 +537,24 @@ ServerGameStateInit::HandleNewPlayer(boost::shared_ptr<ServerGame> server, boost
{ {
if (session && session->GetPlayerData()) { if (session && session->GetPlayerData()) {
const GameData &tmpGameData = server->GetGameData(); const GameData &tmpGameData = server->GetGameData();
// @XXX: debug
//LOG_ERROR("New Player: " << session->GetPlayerData()->GetName() << ".");
//server->AddPlayerToNumJoinsPerPlayer(session->GetPlayerData()->GetName());
//LOG_ERROR("Num joins of " << session->GetPlayerData()->GetName() << " = " << server->GetNumJoinsPerPlayer(session->GetPlayerData()->GetName()) << ".");
// @XXX: check if player joined the game more than 9 times - decline if > 9
if (server->GetNumJoinsPerPlayer(session->GetPlayerData()->GetName()) > 9) {
server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL);
return;
}
// Check the number of players. // Check the number of players.
if (server->GetCurNumberOfPlayers() >= tmpGameData.maxNumberOfPlayers) { if (server->GetCurNumberOfPlayers() >= tmpGameData.maxNumberOfPlayers) {
server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL); server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL);
} else { } else {
// @XXX: add player to NumJoinsPerPlayerMap
server->AddPlayerToNumJoinsPerPlayer(session->GetPlayerData()->GetName());
AcceptNewSession(server, session, false); AcceptNewSession(server, session, false);
+8
View File
@@ -125,6 +125,10 @@ public:
void KickPlayer(unsigned playerId); void KickPlayer(unsigned playerId);
void AddPlayerToNumJoinsPerPlayer(const std::string &playerName);
int GetNumJoinsPerPlayer(const std::string &playerName);
void ResetNumJoinsPerPlayer();
protected: protected:
struct RankingData { struct RankingData {
@@ -191,6 +195,8 @@ protected:
SessionManager &GetSessionManager(); SessionManager &GetSessionManager();
ServerDBInterface &GetDatabase(); ServerDBInterface &GetDatabase();
typedef std::map<std::string, int> NumJoinsPerPlayerMap;
private: private:
ServerGame(const ServerGame &other); ServerGame(const ServerGame &other);
@@ -251,6 +257,8 @@ private:
friend class ServerGameStateHand; friend class ServerGameStateHand;
friend class ServerGameStateWaitPlayerAction; friend class ServerGameStateWaitPlayerAction;
friend class ServerGameStateWaitNextHand; friend class ServerGameStateWaitNextHand;
NumJoinsPerPlayerMap m_numjoinsp;
}; };
#endif #endif