add latereg timers

This commit is contained in:
Albert Medela
2020-05-24 21:24:15 +02:00
parent 2827f7d36c
commit 1e3253a18d
4 changed files with 88 additions and 3 deletions
+59 -2
View File
@@ -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;
}
+18 -1
View File
@@ -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
+10
View File
@@ -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
+1
View File
@@ -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: