add latereg timers
This commit is contained in:
@@ -71,10 +71,15 @@ ServerGame::ServerGame(boost::shared_ptr<ServerLobbyThread> lobbyThread, u_int32
|
||||
m_gameData(gameData), m_curState(NULL), m_id(id), m_name(name),
|
||||
m_password(pwd), m_creatorPlayerDBId(creatorPlayerDBId), m_playerConfig(playerConfig),
|
||||
m_gameNum(1), m_curPetitionId(1), m_voteKickTimer(lobbyThread->GetIOService()),
|
||||
m_stateTimer1(lobbyThread->GetIOService()), m_stateTimer2(lobbyThread->GetIOService()),
|
||||
m_isNameReported(false)
|
||||
m_stateTimer1(lobbyThread->GetIOService()), m_stateTimer2(lobbyThread->GetIOService()), m_allowEntryTimer(lobbyThread->GetIOService()),
|
||||
m_isNameReported(false), m_isLateRegAllowed(false)
|
||||
{
|
||||
LOG_VERBOSE("Game object " << GetId() << " created.");
|
||||
|
||||
// set late reg allowed
|
||||
if ((m_gameData.gameType == GAME_TYPE_NORMAL || m_gameData.gameType == GAME_TYPE_REGISTERED_ONLY) &&
|
||||
(m_gameData.allowLateReg || m_gameData.allowReentries) &&
|
||||
m_gameData.maxTimeLateReg > 0) m_isLateRegAllowed = true;
|
||||
}
|
||||
|
||||
ServerGame::~ServerGame()
|
||||
@@ -92,6 +97,7 @@ void
|
||||
ServerGame::Exit()
|
||||
{
|
||||
m_voteKickTimer.cancel();
|
||||
m_allowEntryTimer.cancel();
|
||||
SetState(ServerGameStateFinal::Instance());
|
||||
}
|
||||
|
||||
@@ -353,6 +359,8 @@ ServerGame::InternalStartGame()
|
||||
|
||||
if (GetGameData().gameType == GAME_TYPE_RANKING)
|
||||
StoreLastGames(playerData);
|
||||
|
||||
setEntries(playerData);
|
||||
|
||||
}
|
||||
return playerData;
|
||||
@@ -492,6 +500,7 @@ ServerGame::InternalEndGame()
|
||||
StoreAndResetRanking();
|
||||
m_game.reset();
|
||||
m_numJoinsPerPlayer.clear();
|
||||
m_numEntriesPlayer.clear();
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1119,6 +1128,12 @@ ServerGame::GetStateTimer2()
|
||||
return m_stateTimer2;
|
||||
}
|
||||
|
||||
boost::asio::steady_timer &
|
||||
ServerGame::GetAllowEntryTimer()
|
||||
{
|
||||
return m_allowEntryTimer;
|
||||
}
|
||||
|
||||
Game &
|
||||
ServerGame::GetGame()
|
||||
{
|
||||
@@ -1231,3 +1246,45 @@ ServerGame::GetNumJoinsPerPlayer(const std::string &playerName)
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
void
|
||||
ServerGame::setEntries(const PlayerDataList &playerDataList) {
|
||||
|
||||
PlayerDataList::const_iterator i = playerDataList.begin();
|
||||
PlayerDataList::const_iterator end = playerDataList.end();
|
||||
|
||||
while (i != end) {
|
||||
boost::shared_ptr<PlayerData> tmpPlayer(*i);
|
||||
m_numEntriesPlayer[tmpPlayer->GetName()] = 0;
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
ServerGame::admitReentries(boost::shared_ptr<PlayerData> player) { // FIXME: maybe set a reason, to return appropiate message. eg: uint32 &reason
|
||||
|
||||
bool retVal = false;
|
||||
const GameData &tmpGameData = GetGameData();
|
||||
|
||||
if (!m_isLateRegAllowed) return retVal;
|
||||
NumJoinsPerPlayerMap::iterator pos = m_numEntriesPlayer.find(player->GetName());
|
||||
if (pos != m_numEntriesPlayer.end()) { // is reentry
|
||||
if (!tmpGameData.allowReentries || pos->second++ >= tmpGameData.numReentries ) return retVal; // number of entries exceeded
|
||||
}
|
||||
else { // is late reg
|
||||
if (!tmpGameData.allowLateReg) return false; // does not allow late reg
|
||||
m_numEntriesPlayer[player->GetName()] = 0; // add player as new entry. Perhaps this should be set otherplace
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
ServerGame::CancelLateReg() {
|
||||
m_isLateRegAllowed = false;
|
||||
}
|
||||
|
||||
bool
|
||||
ServerGame::IsLateReg() {
|
||||
return m_isLateRegAllowed;
|
||||
}
|
||||
|
||||
@@ -825,6 +825,14 @@ ServerGameStateStartGame::TimerTimeout(const boost::system::error_code &ec, boos
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ServerGameStateStartGame::TimerAllowLateRegTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server)
|
||||
{
|
||||
if (!ec) { // ( && &server->GetState() != &ServerGameStateFinal::s_state ) I don't know how to check if state is not final
|
||||
server->CancelLateReg();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ServerGameStateStartGame::DoStart(boost::shared_ptr<ServerGame> server)
|
||||
{
|
||||
@@ -874,6 +882,15 @@ ServerGameStateStartGame::DoStart(boost::shared_ptr<ServerGame> server)
|
||||
|
||||
server->SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating);
|
||||
|
||||
// set late reg timer (if allowed)
|
||||
if (server->IsLateReg()) {
|
||||
server->GetAllowEntryTimer().expires_from_now(
|
||||
minutes(server->GetGameData().maxTimeLateReg));
|
||||
server->GetAllowEntryTimer().async_wait(
|
||||
boost::bind(
|
||||
&ServerGameStateStartGame::TimerAllowLateRegTimeout, this, boost::asio::placeholders::error, server));
|
||||
}
|
||||
|
||||
// Start the first hand.
|
||||
ServerGameStateHand::StartNewHand(server);
|
||||
server->SetState(ServerGameStateHand::Instance());
|
||||
@@ -909,7 +926,7 @@ AbstractServerGameStateRunning::HandleNewPlayer(boost::shared_ptr<ServerGame> se
|
||||
// Wait for rejoining player to confirm start of game.
|
||||
server->GetLobbyThread().GetSender().Send(session, packet);
|
||||
}
|
||||
else if (session && session->GetPlayerData() && server->GetGameData().gameType == GAME_TYPE_NORMAL) { // only normal games
|
||||
else if (session && session->GetPlayerData() && server->admitReentries(session->GetPlayerData())) {
|
||||
const GameData tmpGameData = server->GetGameData();
|
||||
|
||||
if (server->GetCurNumberOfPlayers() < tmpGameData.maxNumberOfPlayers) { // there is a seat available
|
||||
|
||||
@@ -128,6 +128,10 @@ public:
|
||||
|
||||
void AddPlayerToNumJoinsPerPlayer(const std::string &playerName);
|
||||
int GetNumJoinsPerPlayer(const std::string &playerName);
|
||||
bool admitReentries(boost::shared_ptr<PlayerData> player);
|
||||
|
||||
void CancelLateReg();
|
||||
bool IsLateReg();
|
||||
|
||||
protected:
|
||||
|
||||
@@ -184,6 +188,7 @@ protected:
|
||||
|
||||
boost::asio::steady_timer &GetStateTimer1();
|
||||
boost::asio::steady_timer &GetStateTimer2();
|
||||
boost::asio::steady_timer &GetAllowEntryTimer();
|
||||
|
||||
const StartData &GetStartData() const;
|
||||
void SetStartData(const StartData &startData);
|
||||
@@ -196,6 +201,8 @@ protected:
|
||||
SessionManager &GetSessionManager();
|
||||
ServerDBInterface &GetDatabase();
|
||||
|
||||
void setEntries(const PlayerDataList &playerData);
|
||||
|
||||
typedef std::map<std::string, int> NumJoinsPerPlayerMap;
|
||||
|
||||
private:
|
||||
@@ -247,7 +254,9 @@ private:
|
||||
boost::asio::steady_timer m_voteKickTimer;
|
||||
boost::asio::steady_timer m_stateTimer1;
|
||||
boost::asio::steady_timer m_stateTimer2;
|
||||
boost::asio::steady_timer m_allowEntryTimer;
|
||||
bool m_isNameReported;
|
||||
bool m_isLateRegAllowed;
|
||||
|
||||
friend class ServerLobbyThread;
|
||||
friend class AbstractServerGameStateReceiving;
|
||||
@@ -260,6 +269,7 @@ private:
|
||||
friend class ServerGameStateWaitNextHand;
|
||||
|
||||
NumJoinsPerPlayerMap m_numJoinsPerPlayer;
|
||||
NumJoinsPerPlayerMap m_numEntriesPlayer;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -145,6 +145,7 @@ protected:
|
||||
|
||||
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet);
|
||||
void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||
void TimerAllowLateRegTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||
void DoStart(boost::shared_ptr<ServerGame> server);
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user