Fixing delayed sending of create/join game for network games.
This commit is contained in:
@@ -108,6 +108,7 @@ protected:
|
|||||||
void InitGame();
|
void InitGame();
|
||||||
|
|
||||||
void SendSessionPacket(boost::shared_ptr<NetPacket> packet);
|
void SendSessionPacket(boost::shared_ptr<NetPacket> packet);
|
||||||
|
void SendQueuedPackets();
|
||||||
|
|
||||||
bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const;
|
bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const;
|
||||||
void RequestPlayerInfo(unsigned id, bool requestAvatar = false);
|
void RequestPlayerInfo(unsigned id, bool requestAvatar = false);
|
||||||
|
|||||||
@@ -481,6 +481,13 @@ ClientThread::SendSessionPacket(boost::shared_ptr<NetPacket> packet)
|
|||||||
{
|
{
|
||||||
// Put packets in a buffer until the session is established.
|
// Put packets in a buffer until the session is established.
|
||||||
if (IsSessionEstablished())
|
if (IsSessionEstablished())
|
||||||
|
GetSender().Send(GetContext().GetSessionData(), packet);
|
||||||
|
else
|
||||||
|
m_outPacketList.push_back(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ClientThread::SendQueuedPackets()
|
||||||
{
|
{
|
||||||
if (!m_outPacketList.empty())
|
if (!m_outPacketList.empty())
|
||||||
{
|
{
|
||||||
@@ -494,10 +501,6 @@ ClientThread::SendSessionPacket(boost::shared_ptr<NetPacket> packet)
|
|||||||
}
|
}
|
||||||
m_outPacketList.clear();
|
m_outPacketList.clear();
|
||||||
}
|
}
|
||||||
GetSender().Send(GetContext().GetSessionData(), packet);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_outPacketList.push_back(packet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -1296,8 +1299,13 @@ ClientThread::IsSessionEstablished() const
|
|||||||
|
|
||||||
void
|
void
|
||||||
ClientThread::SetSessionEstablished(bool flag)
|
ClientThread::SetSessionEstablished(bool flag)
|
||||||
|
{
|
||||||
|
if (m_sessionEstablished != flag)
|
||||||
{
|
{
|
||||||
m_sessionEstablished = flag;
|
m_sessionEstablished = flag;
|
||||||
|
if (flag)
|
||||||
|
SendQueuedPackets();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|||||||
@@ -180,12 +180,9 @@ AbstractServerGameStateReceiving::~AbstractServerGameStateReceiving()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
||||||
{
|
{
|
||||||
// This is the receive loop for the server.
|
|
||||||
int retVal = MSG_SOCK_INTERNAL_PENDING;
|
|
||||||
|
|
||||||
if (packet->IsClientActivity())
|
if (packet->IsClientActivity())
|
||||||
session.sessionData->ResetActivityTimer();
|
session.sessionData->ResetActivityTimer();
|
||||||
if (packet->ToNetPacketRetrievePlayerInfo())
|
if (packet->ToNetPacketRetrievePlayerInfo())
|
||||||
@@ -267,10 +264,8 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr<ServerGame> se
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Packet processing in subclass.
|
// Packet processing in subclass.
|
||||||
retVal = InternalProcessPacket(server, session, packet);
|
InternalProcessPacket(server, session, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -423,11 +418,9 @@ ServerGameStateInit::TimerAdminTimeout(const boost::system::error_code &ec, boos
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
ServerGameStateInit::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
ServerGameStateInit::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
||||||
{
|
{
|
||||||
int retVal = MSG_SOCK_INTERNAL_PENDING;
|
|
||||||
|
|
||||||
if (packet->ToNetPacketStartEvent())
|
if (packet->ToNetPacketStartEvent())
|
||||||
{
|
{
|
||||||
// Only admins are allowed to start the game.
|
// Only admins are allowed to start the game.
|
||||||
@@ -476,8 +469,6 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr<ServerGame> server,
|
|||||||
{
|
{
|
||||||
server->SessionError(session, ERR_SOCK_INVALID_PACKET);
|
server->SessionError(session, ERR_SOCK_INVALID_PACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<NetPacket>
|
boost::shared_ptr<NetPacket>
|
||||||
@@ -532,11 +523,9 @@ ServerGameStateStartGame::HandleNewSession(boost::shared_ptr<ServerGame> server,
|
|||||||
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
|
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
||||||
{
|
{
|
||||||
int retVal = MSG_SOCK_INTERNAL_PENDING;
|
|
||||||
|
|
||||||
if (packet->ToNetPacketStartEventAck())
|
if (packet->ToNetPacketStartEventAck())
|
||||||
{
|
{
|
||||||
session.sessionData->SetReadyFlag();
|
session.sessionData->SetReadyFlag();
|
||||||
@@ -545,11 +534,8 @@ ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr<ServerGame> se
|
|||||||
// Everyone is ready.
|
// Everyone is ready.
|
||||||
server->GetSessionManager().ResetAllReadyFlags();
|
server->GetSessionManager().ResetAllReadyFlags();
|
||||||
DoStart(server);
|
DoStart(server);
|
||||||
retVal = MSG_SOCK_INIT_DONE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -651,11 +637,10 @@ ServerGameStateHand::HandleNewSession(boost::shared_ptr<ServerGame> server, Sess
|
|||||||
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
|
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
ServerGameStateHand::InternalProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/)
|
ServerGameStateHand::InternalProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/)
|
||||||
{
|
{
|
||||||
// TODO: maybe reject packet.
|
// TODO: maybe reject packet.
|
||||||
return MSG_SOCK_INTERNAL_PENDING;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1116,11 +1101,9 @@ ServerGameStateWaitPlayerAction::HandleNewSession(boost::shared_ptr<ServerGame>
|
|||||||
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
|
server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet)
|
||||||
{
|
{
|
||||||
int retVal = MSG_SOCK_INTERNAL_PENDING;
|
|
||||||
|
|
||||||
if (packet->ToNetPacketPlayersAction())
|
if (packet->ToNetPacketPlayersAction())
|
||||||
{
|
{
|
||||||
NetPacketPlayersAction::Data actionData;
|
NetPacketPlayersAction::Data actionData;
|
||||||
@@ -1171,7 +1154,6 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerG
|
|||||||
{
|
{
|
||||||
PerformPlayerAction(*server, tmpPlayer, actionData.playerAction, actionData.playerBet);
|
PerformPlayerAction(*server, tmpPlayer, actionData.playerAction, actionData.playerBet);
|
||||||
server->SetState(ServerGameStateHand::Instance());
|
server->SetState(ServerGameStateHand::Instance());
|
||||||
retVal = MSG_NET_GAME_SERVER_ACTION;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1186,8 +1168,6 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr<ServerG
|
|||||||
server->GetLobbyThread().GetSender().Send(session.sessionData, reject);
|
server->GetLobbyThread().GetSender().Send(session.sessionData, reject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public:
|
|||||||
virtual void HandleNewSession(boost::shared_ptr<ServerGame> server, SessionWrapper session) = 0;
|
virtual void HandleNewSession(boost::shared_ptr<ServerGame> server, SessionWrapper session) = 0;
|
||||||
|
|
||||||
// Main processing function of the current state.
|
// Main processing function of the current state.
|
||||||
virtual int ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0;
|
virtual void ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Abstract State: Receiving.
|
// Abstract State: Receiving.
|
||||||
@@ -61,11 +61,11 @@ public:
|
|||||||
|
|
||||||
// Globally handle packets which are allowed in all running states.
|
// Globally handle packets which are allowed in all running states.
|
||||||
// Calls InternalProcess if packet has not been processed.
|
// Calls InternalProcess if packet has not been processed.
|
||||||
virtual int ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
virtual void ProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual int InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0;
|
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// State: Initialization.
|
// State: Initialization.
|
||||||
@@ -90,7 +90,7 @@ protected:
|
|||||||
void TimerAdminWarning(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
void TimerAdminWarning(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||||
void TimerAdminTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
void TimerAdminTimeout(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||||
|
|
||||||
virtual int InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
||||||
|
|
||||||
static boost::shared_ptr<NetPacket> CreateNetPacketPlayerJoined(const PlayerData &playerData);
|
static boost::shared_ptr<NetPacket> CreateNetPacketPlayerJoined(const PlayerData &playerData);
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
ServerGameStateStartGame();
|
ServerGameStateStartGame();
|
||||||
|
|
||||||
virtual int InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper 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 DoStart(boost::shared_ptr<ServerGame> server);
|
void DoStart(boost::shared_ptr<ServerGame> server);
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
ServerGameStateHand();
|
ServerGameStateHand();
|
||||||
|
|
||||||
virtual int InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
||||||
void TimerLoop(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
void TimerLoop(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||||
void EngineLoop(boost::shared_ptr<ServerGame> server);
|
void EngineLoop(boost::shared_ptr<ServerGame> server);
|
||||||
void TimerShowCards(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
void TimerShowCards(const boost::system::error_code &ec, boost::shared_ptr<ServerGame> server);
|
||||||
@@ -170,7 +170,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
ServerGameStateWaitPlayerAction();
|
ServerGameStateWaitPlayerAction();
|
||||||
|
|
||||||
virtual int InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper session, boost::shared_ptr<NetPacket> packet);
|
virtual void InternalProcessPacket(boost::shared_ptr<ServerGame> server, SessionWrapper 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);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -192,7 +192,7 @@ public:
|
|||||||
virtual void HandleNewSession(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/) {}
|
virtual void HandleNewSession(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/) {}
|
||||||
|
|
||||||
// Main processing function of the current state.
|
// Main processing function of the current state.
|
||||||
virtual int ProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/) {return 0;}
|
virtual void ProcessPacket(boost::shared_ptr<ServerGame> /*server*/, SessionWrapper /*session*/, boost::shared_ptr<NetPacket> /*packet*/) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ServerGameStateFinal() {}
|
ServerGameStateFinal() {}
|
||||||
|
|||||||
Reference in New Issue
Block a user