From: <geo...@us...> - 2011-07-05 21:02:06
|
Revision: 4020 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4020&view=rev Author: geoffthemedio Date: 2011-07-05 21:01:59 +0000 (Tue, 05 Jul 2011) Log Message: ----------- -Added reactions in ServerFSM MPLobby to host MP or SP game messages, which are rejected and the requesting connection dropped. The client that attempted to double-host then sees a message that the server is already hosting a game. -Added server reaction to MPLobby updates in which a player was marked as "Drop". The reaction is to drop that player from the game. A bug with this remains in that if the host is dropped, then no alternate host is selected. Modified Paths: -------------- trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/msvc2010/src/Version.cpp trunk/FreeOrion/server/ServerFSM.cpp trunk/FreeOrion/server/ServerFSM.h Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2011-07-05 20:27:26 UTC (rev 4019) +++ trunk/FreeOrion/default/eng_stringtable.txt 2011-07-05 21:01:59 UTC (rev 4020) @@ -298,6 +298,9 @@ ORDERS_FOR_WRONG_EMPIRE Orders were sent for an empire you do not control. +SERVER_ALREADY_HOSTING_GAME +This server is already hosting a game. + ###################################### # Command Line and OptionsDB Options # ###################################### Modified: trunk/FreeOrion/msvc2010/src/Version.cpp =================================================================== --- trunk/FreeOrion/msvc2010/src/Version.cpp 2011-07-05 20:27:26 UTC (rev 4019) +++ trunk/FreeOrion/msvc2010/src/Version.cpp 2011-07-05 21:01:59 UTC (rev 4020) @@ -1,7 +1,7 @@ #include "../../util/Version.h" namespace { - static const std::string retval = "post-v0.3.15 [SVN 4013] MSVC 2010"; + static const std::string retval = "post-v0.3.15 [SVN 4020] MSVC 2010"; } const std::string& FreeOrionVersionString() Modified: trunk/FreeOrion/server/ServerFSM.cpp =================================================================== --- trunk/FreeOrion/server/ServerFSM.cpp 2011-07-05 20:27:26 UTC (rev 4019) +++ trunk/FreeOrion/server/ServerFSM.cpp 2011-07-05 21:01:59 UTC (rev 4020) @@ -446,6 +446,8 @@ m_lobby_data->m_new_game = incoming_lobby_data.m_new_game; m_lobby_data->m_players = incoming_lobby_data.m_players; + std::vector<PlayerConnectionPtr> player_connections_to_drop; + // update player connection types according to modified lobby selections for (ServerNetworking::const_established_iterator player_connection_it = server.m_networking.established_begin(); player_connection_it != server.m_networking.established_end(); ++player_connection_it) @@ -456,12 +458,28 @@ std::map<int, PlayerSetupData>::iterator player_setup_it = m_lobby_data->m_players.find(player_id); if (player_setup_it == m_lobby_data->m_players.end()) { Logger().errorStream() << "No player setup data for player " << player_id << " in MPLobby::react(const LobbyUpdate& msg)"; + player_connections_to_drop.push_back(player_connection); continue; } Networking::ClientType client_type = player_setup_it->second.m_client_type; - player_connection->SetClientType(client_type); + + if (client_type != Networking::INVALID_CLIENT_TYPE) { + // update player connection type for lobby change + player_connection->SetClientType(client_type); + } else { + // drop connections for players who were dropped from lobby + m_lobby_data->m_players.erase(player_setup_it); + player_connections_to_drop.push_back(player_connection); + } } + // drop players to be dropped. Doing this in separate loop to avoid messing up iteration above + for (std::vector<PlayerConnectionPtr>::iterator drop_con_it = player_connections_to_drop.begin(); + drop_con_it != player_connections_to_drop.end(); ++drop_con_it) + { + server.m_networking.Disconnect(*drop_con_it); + } + // to determine if a new save file was selected, check if the selected file // index is different, and the new file index is in the valid range bool new_save_file_selected = false; @@ -590,7 +608,23 @@ return transit<WaitingForMPGameJoiners>(); } +sc::result MPLobby::react(const HostMPGame& msg) +{ + Logger().errorStream() << "MPLobby::react(const HostMPGame& msg) recived HostMPGame message but is already in the MP Lobby. Aborting connection"; + msg.m_player_connection->SendMessage(ErrorMessage("SERVER_ALREADY_HOSTING_GAME", true)); + Server().m_networking.Disconnect(msg.m_player_connection); + return discard_event(); +} +sc::result MPLobby::react(const HostSPGame& msg) +{ + Logger().errorStream() << "MPLobby::react(const HostSPGame& msg) recived HostSPGame message but is already in the MP Lobby. Aborting connection"; + msg.m_player_connection->SendMessage(ErrorMessage("SERVER_ALREADY_HOSTING_GAME", true)); + Server().m_networking.Disconnect(msg.m_player_connection); + return discard_event(); +} + + //////////////////////////////////////////////////////////// // WaitingForSPGameJoiners //////////////////////////////////////////////////////////// Modified: trunk/FreeOrion/server/ServerFSM.h =================================================================== --- trunk/FreeOrion/server/ServerFSM.h 2011-07-05 20:27:26 UTC (rev 4019) +++ trunk/FreeOrion/server/ServerFSM.h 2011-07-05 21:01:59 UTC (rev 4020) @@ -161,7 +161,9 @@ sc::custom_reaction<JoinGame>, sc::custom_reaction<LobbyUpdate>, sc::custom_reaction<LobbyChat>, - sc::custom_reaction<StartMPGame> + sc::custom_reaction<StartMPGame>, + sc::custom_reaction<HostMPGame>, + sc::custom_reaction<HostSPGame> > reactions; MPLobby(my_context c); @@ -172,6 +174,8 @@ sc::result react(const LobbyUpdate& msg); sc::result react(const LobbyChat& msg); sc::result react(const StartMPGame& msg); + sc::result react(const HostMPGame& msg); + sc::result react(const HostSPGame& msg); boost::shared_ptr<MultiplayerLobbyData> m_lobby_data; std::vector<PlayerSaveGameData> m_player_save_game_data; |