Major redesign: The game can not be left without disconnecting from the server. This happens if a player is kicked, if he wishes to leave, or for other reasons. Error packets from the server will always cause a disconnect, however.

If joining a game fails, there is a proper failure packet now.
This commit is contained in:
lotodore
2007-09-06 19:09:05 +00:00
parent 040aadda3c
commit 9d0edc5eee
24 changed files with 694 additions and 140 deletions
+7 -3
View File
@@ -142,7 +142,7 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
packet = server.GetReceiver().Recv(session.sessionData->GetSocket(), session.sessionData->GetReceiveBuffer());
} catch (const NetException &)
{
server.CloseSessionDelayed(session);
server.RemoveSession(session);
return retVal;
}
@@ -167,6 +167,10 @@ AbstractServerGameStateReceiving::Process(ServerGameThread &server)
server.GetSender().Send(session.sessionData->GetSocket(), info);
}
}
else if (packet->ToNetPacketLeaveCurrentGame())
{
server.MoveSessionToLobby(session, NTF_NET_REMOVED_ON_REQUEST);
}
// Chat text is always allowed.
else if (packet->ToNetPacketSendChatText())
{
@@ -243,7 +247,7 @@ ServerGameStateInit::HandleNewSession(ServerGameThread &server, SessionWrapper s
// Check the number of players.
if (curNumPlayers >= (size_t)server.GetGameData().maxNumberOfPlayers)
{
server.SessionError(session, ERR_NET_SERVER_FULL);
server.MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL);
}
else
{
@@ -359,7 +363,7 @@ void
AbstractServerGameStateRunning::HandleNewSession(ServerGameThread &server, SessionWrapper session)
{
// Do not accept new sessions in this state.
server.SessionError(session, ERR_NET_GAME_ALREADY_RUNNING);
server.MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING);
}
//-----------------------------------------------------------------------------