From 05d4b67a50ddbac842aef0502df05530aed74307 Mon Sep 17 00:00:00 2001 From: lotodore Date: Sun, 18 Dec 2011 20:34:04 +0000 Subject: [PATCH] Send timeout warning when autofold is active. --- src/net/common/servergamestate.cpp | 40 ++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 6f4a5ac4..10966c82 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -183,17 +183,6 @@ static void PerformPlayerAction(ServerGame &server, boost::shared_ptrgetTimeSecSinceLastRemoteAction() >= actionTimeout * SERVER_GAME_AUTOFOLD_TIMEOUT_FACTOR) { - player->setIsSessionActive(false); - if (player->getTimeSecSinceLastRemoteAction() >= actionTimeout * SERVER_GAME_FORCED_TIMEOUT_FACTOR) { - server.KickPlayer(player->getMyUniqueID()); - } - } - } } static void @@ -365,6 +354,13 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se netReportAck->reportResult = reportResult_avatarReportInvalid; server->GetLobbyThread().GetSender().Send(session, packet); } + } else if (packet->GetMsg()->present == PokerTHMessage_PR_resetTimeoutMessage) { + // Reactivate session. + if (server->IsRunning()) { + boost::shared_ptr tmpPlayer = server->GetGame().getPlayerByUniqueId(session->GetPlayerData()->GetUniqueId()); + if (tmpPlayer) { + tmpPlayer->setIsSessionActive(true); + } } else { // Packet processing in subclass. InternalProcessPacket(server, session, packet); @@ -954,6 +950,28 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr server) &ServerGameStateHand::TimerComputerAction, this, boost::asio::placeholders::error, server)); } else { + // Check timeout. + int actionTimeout = server->GetGameData().playerActionTimeoutSec; + if (actionTimeout) { + if (curPlayer->getTimeSecSinceLastRemoteAction() >= actionTimeout * SERVER_GAME_AUTOFOLD_TIMEOUT_FACTOR) { + if (curPlayer->isSessionActive()) { + curPlayer->setIsSessionActive(false); + boost::shared_ptr session = server->GetSessionManager().GetSessionByUniquePlayerId(server->GetAdminPlayerId()); + if (session) { + boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); + packet->GetMsg()->present = PokerTHMessage_PR_timeoutWarningMessage; + TimeoutWarningMessage_t *netWarning = &packet->GetMsg()->choice.timeoutWarningMessage; + netWarning->timeoutReason = NETWORK_TIMEOUT_GENERIC; + netWarning->remainingSeconds = actionTimeout * SERVER_GAME_FORCED_TIMEOUT_FACTOR - curPlayer->getTimeSecSinceLastRemoteAction(); + server->GetLobbyThread().GetSender().Send(session, packet); + } + } + if (curPlayer->getTimeSecSinceLastRemoteAction() >= actionTimeout * SERVER_GAME_FORCED_TIMEOUT_FACTOR) { + server->KickPlayer(curPlayer->getMyUniqueID()); + } + } + } + // If the player we are waiting for left, continue without him. if (!server->GetSessionManager().IsPlayerConnected(curPlayer->getMyUniqueID()) || !curPlayer->isSessionActive()) {