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_gameData(gameData), m_curState(NULL), m_id(id), m_name(name),
|
||||||
m_password(pwd), m_creatorPlayerDBId(creatorPlayerDBId), m_playerConfig(playerConfig),
|
m_password(pwd), m_creatorPlayerDBId(creatorPlayerDBId), m_playerConfig(playerConfig),
|
||||||
m_gameNum(1), m_curPetitionId(1), m_voteKickTimer(lobbyThread->GetIOService()),
|
m_gameNum(1), m_curPetitionId(1), m_voteKickTimer(lobbyThread->GetIOService()),
|
||||||
m_stateTimer1(lobbyThread->GetIOService()), m_stateTimer2(lobbyThread->GetIOService()),
|
m_stateTimer1(lobbyThread->GetIOService()), m_stateTimer2(lobbyThread->GetIOService()), m_allowEntryTimer(lobbyThread->GetIOService()),
|
||||||
m_isNameReported(false)
|
m_isNameReported(false), m_isLateRegAllowed(false)
|
||||||
{
|
{
|
||||||
LOG_VERBOSE("Game object " << GetId() << " created.");
|
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()
|
ServerGame::~ServerGame()
|
||||||
@@ -92,6 +97,7 @@ void
|
|||||||
ServerGame::Exit()
|
ServerGame::Exit()
|
||||||
{
|
{
|
||||||
m_voteKickTimer.cancel();
|
m_voteKickTimer.cancel();
|
||||||
|
m_allowEntryTimer.cancel();
|
||||||
SetState(ServerGameStateFinal::Instance());
|
SetState(ServerGameStateFinal::Instance());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,6 +360,8 @@ ServerGame::InternalStartGame()
|
|||||||
if (GetGameData().gameType == GAME_TYPE_RANKING)
|
if (GetGameData().gameType == GAME_TYPE_RANKING)
|
||||||
StoreLastGames(playerData);
|
StoreLastGames(playerData);
|
||||||
|
|
||||||
|
setEntries(playerData);
|
||||||
|
|
||||||
}
|
}
|
||||||
return playerData;
|
return playerData;
|
||||||
}
|
}
|
||||||
@@ -492,6 +500,7 @@ ServerGame::InternalEndGame()
|
|||||||
StoreAndResetRanking();
|
StoreAndResetRanking();
|
||||||
m_game.reset();
|
m_game.reset();
|
||||||
m_numJoinsPerPlayer.clear();
|
m_numJoinsPerPlayer.clear();
|
||||||
|
m_numEntriesPlayer.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1119,6 +1128,12 @@ ServerGame::GetStateTimer2()
|
|||||||
return m_stateTimer2;
|
return m_stateTimer2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::asio::steady_timer &
|
||||||
|
ServerGame::GetAllowEntryTimer()
|
||||||
|
{
|
||||||
|
return m_allowEntryTimer;
|
||||||
|
}
|
||||||
|
|
||||||
Game &
|
Game &
|
||||||
ServerGame::GetGame()
|
ServerGame::GetGame()
|
||||||
{
|
{
|
||||||
@@ -1231,3 +1246,45 @@ ServerGame::GetNumJoinsPerPlayer(const std::string &playerName)
|
|||||||
}
|
}
|
||||||
return num;
|
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
|
void
|
||||||
ServerGameStateStartGame::DoStart(boost::shared_ptr<ServerGame> server)
|
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);
|
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.
|
// Start the first hand.
|
||||||
ServerGameStateHand::StartNewHand(server);
|
ServerGameStateHand::StartNewHand(server);
|
||||||
server->SetState(ServerGameStateHand::Instance());
|
server->SetState(ServerGameStateHand::Instance());
|
||||||
@@ -909,7 +926,7 @@ AbstractServerGameStateRunning::HandleNewPlayer(boost::shared_ptr<ServerGame> se
|
|||||||
// Wait for rejoining player to confirm start of game.
|
// Wait for rejoining player to confirm start of game.
|
||||||
server->GetLobbyThread().GetSender().Send(session, packet);
|
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();
|
const GameData tmpGameData = server->GetGameData();
|
||||||
|
|
||||||
if (server->GetCurNumberOfPlayers() < tmpGameData.maxNumberOfPlayers) { // there is a seat available
|
if (server->GetCurNumberOfPlayers() < tmpGameData.maxNumberOfPlayers) { // there is a seat available
|
||||||
|
|||||||
@@ -128,6 +128,10 @@ public:
|
|||||||
|
|
||||||
void AddPlayerToNumJoinsPerPlayer(const std::string &playerName);
|
void AddPlayerToNumJoinsPerPlayer(const std::string &playerName);
|
||||||
int GetNumJoinsPerPlayer(const std::string &playerName);
|
int GetNumJoinsPerPlayer(const std::string &playerName);
|
||||||
|
bool admitReentries(boost::shared_ptr<PlayerData> player);
|
||||||
|
|
||||||
|
void CancelLateReg();
|
||||||
|
bool IsLateReg();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@@ -184,6 +188,7 @@ protected:
|
|||||||
|
|
||||||
boost::asio::steady_timer &GetStateTimer1();
|
boost::asio::steady_timer &GetStateTimer1();
|
||||||
boost::asio::steady_timer &GetStateTimer2();
|
boost::asio::steady_timer &GetStateTimer2();
|
||||||
|
boost::asio::steady_timer &GetAllowEntryTimer();
|
||||||
|
|
||||||
const StartData &GetStartData() const;
|
const StartData &GetStartData() const;
|
||||||
void SetStartData(const StartData &startData);
|
void SetStartData(const StartData &startData);
|
||||||
@@ -196,6 +201,8 @@ protected:
|
|||||||
SessionManager &GetSessionManager();
|
SessionManager &GetSessionManager();
|
||||||
ServerDBInterface &GetDatabase();
|
ServerDBInterface &GetDatabase();
|
||||||
|
|
||||||
|
void setEntries(const PlayerDataList &playerData);
|
||||||
|
|
||||||
typedef std::map<std::string, int> NumJoinsPerPlayerMap;
|
typedef std::map<std::string, int> NumJoinsPerPlayerMap;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -247,7 +254,9 @@ private:
|
|||||||
boost::asio::steady_timer m_voteKickTimer;
|
boost::asio::steady_timer m_voteKickTimer;
|
||||||
boost::asio::steady_timer m_stateTimer1;
|
boost::asio::steady_timer m_stateTimer1;
|
||||||
boost::asio::steady_timer m_stateTimer2;
|
boost::asio::steady_timer m_stateTimer2;
|
||||||
|
boost::asio::steady_timer m_allowEntryTimer;
|
||||||
bool m_isNameReported;
|
bool m_isNameReported;
|
||||||
|
bool m_isLateRegAllowed;
|
||||||
|
|
||||||
friend class ServerLobbyThread;
|
friend class ServerLobbyThread;
|
||||||
friend class AbstractServerGameStateReceiving;
|
friend class AbstractServerGameStateReceiving;
|
||||||
@@ -260,6 +269,7 @@ private:
|
|||||||
friend class ServerGameStateWaitNextHand;
|
friend class ServerGameStateWaitNextHand;
|
||||||
|
|
||||||
NumJoinsPerPlayerMap m_numJoinsPerPlayer;
|
NumJoinsPerPlayerMap m_numJoinsPerPlayer;
|
||||||
|
NumJoinsPerPlayerMap m_numEntriesPlayer;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ protected:
|
|||||||
|
|
||||||
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet);
|
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 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);
|
void DoStart(boost::shared_ptr<ServerGame> server);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user