diff --git a/data/gui/online/create_server.stkgui b/data/gui/online/create_server.stkgui index 007498a92..9f5fce33e 100644 --- a/data/gui/online/create_server.stkgui +++ b/data/gui/online/create_server.stkgui @@ -15,9 +15,9 @@
- +
diff --git a/src/config/user_config.hpp b/src/config/user_config.hpp index ead7a1a73..32c33127f 100644 --- a/src/config/user_config.hpp +++ b/src/config/user_config.hpp @@ -205,7 +205,7 @@ public: irr::core::stringc toString() const; void revertToDefaults() { m_value = m_default_value; } - + int getDefaultValue() { return m_default_value; } operator int() const { return m_value; } int& operator++(int dummy) { m_value++; return m_value; } int& operator=(const int& v) { m_value = v; return m_value; } @@ -713,7 +713,7 @@ namespace UserConfigParams // ---- Networking PARAM_PREFIX IntUserConfigParam m_server_max_players - PARAM_DEFAULT( IntUserConfigParam(16, "server_max_players", + PARAM_DEFAULT( IntUserConfigParam(12, "server_max_players", "Maximum number of players on the server.") ); PARAM_PREFIX StringListUserConfigParam m_stun_servers diff --git a/src/main.cpp b/src/main.cpp index bd495f47b..38411b6e2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -986,10 +986,67 @@ int handleCmdLine() UserConfigParams::m_check_debug=true; } + if (CommandLine::has( "--difficulty", &s)) + { + int n = atoi(s.c_str()); + if(n<0 || n>RaceManager::DIFFICULTY_LAST) + Log::warn("main", "Invalid difficulty '%s' - ignored.\n", + s.c_str()); + else + race_manager->setDifficulty(RaceManager::Difficulty(n)); + } // --mode + + if (CommandLine::has("--type", &n)) + { + switch (n) + { + case 0: race_manager->setMinorMode(RaceManager::MINOR_MODE_NORMAL_RACE); + break; + case 1: race_manager->setMinorMode(RaceManager::MINOR_MODE_TIME_TRIAL); + break; + case 2: race_manager->setMinorMode(RaceManager::MINOR_MODE_FOLLOW_LEADER); + break; + case 3: race_manager->setMinorMode(RaceManager::MINOR_MODE_3_STRIKES); + break; + case 4: race_manager->setMinorMode(RaceManager::MINOR_MODE_SOCCER); + break; + default: + Log::warn("main", "Invalid race type '%d' - ignored.", n); + } + } // --type + + + if(CommandLine::has("--login", &s) ) + { + login = s.c_str(); + try_login = true; + } // --login + + if(CommandLine::has("--password", &s)) + password = s.c_str(); + if (try_login) + { + irr::core::stringw s; + Online::XMLRequest* request = + PlayerManager::requestSignIn(login, password); + + if (request->isSuccess()) + { + Log::info("Main", "Logged in from command-line."); + } + } + // Networking command lines if(CommandLine::has("--start-console")) STKHost::m_enable_console = true; + if (CommandLine::has("--server-password", &s)) + { + NetworkConfig::get()->setPassword(s); + } + + if(CommandLine::has("--max-players", &n)) + UserConfigParams::m_server_max_players=n; NetworkConfig::get()-> setMaxPlayers(UserConfigParams::m_server_max_players); if (CommandLine::has("--port", &n)) @@ -1051,25 +1108,10 @@ int handleCmdLine() STKHost::create(); Log::info("main", "Creating a LAN server '%s'.", s.c_str()); } - if (CommandLine::has("--server-password", &s)) - { - NetworkConfig::get()->setPassword(s); - } if (CommandLine::has("--auto-connect")) { NetworkConfig::get()->setAutoConnect(true); } - if(CommandLine::has("--max-players", &n)) - UserConfigParams::m_server_max_players=n; - - if(CommandLine::has("--login", &s) ) - { - login = s.c_str(); - try_login = true; - } // --login - - if(CommandLine::has("--password", &s)) - password = s.c_str(); /** Disable detection of LAN connection when connecting via WAN. This is * mostly a debugging feature to force using WAN connection. */ @@ -1128,31 +1170,6 @@ int handleCmdLine() race_manager->setNumKarts((int)l.size()+1); } // --ai - if(CommandLine::has( "--mode", &s) || CommandLine::has( "--difficulty", &s)) - { - int n = atoi(s.c_str()); - if(n<0 || n>RaceManager::DIFFICULTY_LAST) - Log::warn("main", "Invalid difficulty '%s' - ignored.\n", - s.c_str()); - else - race_manager->setDifficulty(RaceManager::Difficulty(n)); - } // --mode - - if(CommandLine::has("--type", &n)) - { - switch (n) - { - case 0: race_manager->setMinorMode(RaceManager::MINOR_MODE_NORMAL_RACE); - break; - case 1: race_manager->setMinorMode(RaceManager::MINOR_MODE_TIME_TRIAL); - break; - case 2: race_manager->setMinorMode(RaceManager::MINOR_MODE_FOLLOW_LEADER); - break; - default: - Log::warn("main", "Invalid race type '%d' - ignored.", n); - } - } // --type - if(CommandLine::has("--track", &s) || CommandLine::has("-t", &s)) { race_manager->setTrack(s); @@ -1341,24 +1358,12 @@ int handleCmdLine() CommandLine::reportInvalidParameters(); - if(ProfileWorld::isProfileMode()) + if (ProfileWorld::isProfileMode() || ProfileWorld::isNoGraphics()) { UserConfigParams::m_sfx = false; // Disable sound effects UserConfigParams::m_music = false;// and music when profiling } - if (try_login) - { - irr::core::stringw s; - Online::XMLRequest* request = - PlayerManager::requestSignIn(login, password); - - if (request->isSuccess()) - { - Log::info("Main", "Logged in from command-line."); - } - } - return 1; } // handleCmdLine diff --git a/src/network/network_config.cpp b/src/network/network_config.cpp index 87fb75a91..d89780a2f 100644 --- a/src/network/network_config.cpp +++ b/src/network/network_config.cpp @@ -48,7 +48,7 @@ NetworkConfig::NetworkConfig() m_client_port = 2759; } // NetworkConfig -// -------------------------------------------------------------------- +// ---------------------------------------------------------------------------- /** Sets if this instance is a server or client. It also assigns the * private port depending if this is a server or client. */ @@ -56,3 +56,53 @@ void NetworkConfig::setIsServer(bool b) { m_is_server = b; } // setIsServer + +// ---------------------------------------------------------------------------- +unsigned NetworkConfig::getServerGameMode(RaceManager::MinorRaceModeType mode, + bool gp) +{ + if (gp) + { + if (mode == RaceManager::MINOR_MODE_NORMAL_RACE) + return 0; + else if (mode == RaceManager::MINOR_MODE_TIME_TRIAL) + return 1; + } + else + { + if (mode == RaceManager::MINOR_MODE_NORMAL_RACE) + return 2; + else if (mode == RaceManager::MINOR_MODE_TIME_TRIAL) + return 3; + else if (mode == RaceManager::MINOR_MODE_3_STRIKES) + return 4; + else if (mode == RaceManager::MINOR_MODE_SOCCER) + return 5; + } + return 0; +} // getServerGameMode + +// ---------------------------------------------------------------------------- +std::pair + NetworkConfig::getLocalGameMode(unsigned id) +{ + switch(id) + { + case 0: + return { RaceManager::MINOR_MODE_NORMAL_RACE, true }; + case 1: + return { RaceManager::MINOR_MODE_TIME_TRIAL, true }; + case 2: + return { RaceManager::MINOR_MODE_NORMAL_RACE, false }; + case 3: + return { RaceManager::MINOR_MODE_TIME_TRIAL, false }; + case 4: + return { RaceManager::MINOR_MODE_3_STRIKES, false }; + case 5: + return { RaceManager::MINOR_MODE_SOCCER, false }; + default: + break; + } + return { RaceManager::MINOR_MODE_NORMAL_RACE, false }; + +} // getLocalGameMode diff --git a/src/network/network_config.hpp b/src/network/network_config.hpp index 80e2d83a7..2abab2009 100644 --- a/src/network/network_config.hpp +++ b/src/network/network_config.hpp @@ -23,6 +23,7 @@ #define HEADER_NETWORK_CONFIG #include "network/transport_address.hpp" +#include "race/race_manager.hpp" #include "utils/synchronised.hpp" #include "irrString.h" @@ -154,35 +155,41 @@ public: // ------------------------------------------------------------------------ /** Sets the maximum number of players for this server. */ void setMaxPlayers(int n) { m_max_players = n; } - // -------------------------------------------------------------------- + // ------------------------------------------------------------------------ /** Returns the maximum number of players for this server. */ int getMaxPlayers() const { return m_max_players; } - // -------------------------------------------------------------------- + // ------------------------------------------------------------------------ /** Returns if this instance is a server. */ bool isServer() const { return m_is_server; } - // -------------------------------------------------------------------- + // ------------------------------------------------------------------------ /** Returns if this instance is a client. */ bool isClient() const { return !m_is_server; } - // -------------------------------------------------------------------- + // ------------------------------------------------------------------------ /** Sets the name of this server. */ void setServerName(const irr::core::stringw &name) { m_server_name = name; } // setServerName - // -------------------------------------------------------------------- + // ------------------------------------------------------------------------ /** Returns the server name. */ const irr::core::stringw& getServerName() const { assert(isServer()); return m_server_name; } // getServerName - // -------------------------------------------------------------------- + // ------------------------------------------------------------------------ /** Sets if a client should immediately connect to the first server. */ void setAutoConnect(bool b) { m_auto_connect = b; } - // -------------------------------------------------------------------- + // ------------------------------------------------------------------------ /** Returns if an immediate connection to the first server was * requested. */ bool isAutoConnect() const { return m_auto_connect; } + // ------------------------------------------------------------------------ + /** Returns the game mode id for server database. */ + unsigned getServerGameMode(RaceManager::MinorRaceModeType mode, bool gp); + // ------------------------------------------------------------------------ + /** Returns the game mode id and if grandprix from server database id. */ + std::pair getLocalGameMode(unsigned); }; // class NetworkConfig diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 6db382669..b0f0b0a76 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -33,6 +33,7 @@ #include "network/stk_peer.hpp" #include "online/online_profile.hpp" #include "online/request_manager.hpp" +#include "race/race_manager.hpp" #include "states_screens/networking_lobby.hpp" #include "states_screens/race_result_gui.hpp" #include "states_screens/waiting_for_others.hpp" @@ -355,10 +356,14 @@ void ServerLobby::registerServer() request->addParameter("private_port", STKHost::get()->getPrivatePort() ); request->addParameter("name", NetworkConfig::get()->getServerName() ); - request->addParameter("max_players", - UserConfigParams::m_server_max_players ); + request->addParameter("max_players", + NetworkConfig::get()->getMaxPlayers()); + request->addParameter("difficulty", race_manager->getDifficulty()); + request->addParameter("game_mode", + NetworkConfig::get()->getServerGameMode(race_manager->getMinorMode(), + race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX)); Log::info("ServerLobby", "Public server addr %s", addr.toString().c_str()); - + request->executeNow(); const XMLNode * result = request->getXMLData(); @@ -520,6 +525,7 @@ void ServerLobby::checkIncomingConnectionRequests() const TransportAddress &addr = STKHost::get()->getPublicAddress(); request->addParameter("address", addr.getIP() ); request->addParameter("port", addr.getPort()); + request->addParameter("current_players", STKHost::get()->getPeerCount()); request->executeNow(); assert(request->isDone()); diff --git a/src/network/server.cpp b/src/network/server.cpp index a0754ddd1..cad39ed5f 100644 --- a/src/network/server.cpp +++ b/src/network/server.cpp @@ -16,7 +16,7 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "network/server.hpp" - +#include "network/network_config.hpp" #include "io/xml_node.hpp" #include "utils/constants.hpp" #include "utils/string_utils.hpp" @@ -38,8 +38,11 @@ Server::Server(const XMLNode & xml, bool is_lan) m_current_players = 0; m_max_players = 0; m_is_lan = is_lan; - m_minor_mode = RaceManager::MINOR_MODE_NORMAL_RACE; - m_difficulty = RaceManager::DIFFICULTY_HARD; + unsigned server_data = 0; + xml.get("game_mode", &server_data); + m_minor_mode = NetworkConfig::get()->getLocalGameMode(server_data).first; + xml.get("difficulty", &server_data); + m_difficulty = (RaceManager::Difficulty)server_data; xml.get("name", &m_lower_case_name); m_name = StringUtils::xmlDecode(m_lower_case_name); diff --git a/src/network/server.hpp b/src/network/server.hpp index 9ee7506eb..aacd0ccbd 100644 --- a/src/network/server.hpp +++ b/src/network/server.hpp @@ -44,9 +44,12 @@ public: /** Set the sort order used in the comparison function. */ enum SortOrder { - SO_SCORE = 1, // Sorted on satisfaction score - SO_NAME = 2, // Sorted alphabetically by name - SO_PLAYERS = 4 + SO_NAME = 0, // Sorted alphabetically by name + SO_PLAYERS = 1, + SO_DIFFICULTY = 2, + SO_GAME_MODE = 3, + SO_SCORE = 4 // Sorted on satisfaction score (unused) + }; protected: @@ -142,6 +145,12 @@ public: case SO_PLAYERS: return m_current_players < server.m_current_players; break; + case SO_DIFFICULTY: + return m_difficulty < server.m_difficulty; + break; + case SO_GAME_MODE: + return m_minor_mode < server.m_minor_mode; + break; } // switch return true; diff --git a/src/race/race_manager.hpp b/src/race/race_manager.hpp index 029fe7765..cde562ebf 100644 --- a/src/race/race_manager.hpp +++ b/src/race/race_manager.hpp @@ -227,7 +227,7 @@ public: #undef BATTLE_ARENA /** Game difficulty. */ - enum Difficulty { DIFFICULTY_EASY, + enum Difficulty { DIFFICULTY_EASY = 0, DIFFICULTY_FIRST = DIFFICULTY_EASY, DIFFICULTY_MEDIUM, DIFFICULTY_HARD, diff --git a/src/states_screens/create_server_screen.cpp b/src/states_screens/create_server_screen.cpp index 2d268a14d..c8b8e3774 100644 --- a/src/states_screens/create_server_screen.cpp +++ b/src/states_screens/create_server_screen.cpp @@ -59,7 +59,9 @@ void CreateServerScreen::loadedFromFile() m_max_players_widget = getWidget("max_players"); assert(m_max_players_widget != NULL); - m_max_players_widget->setValue(8); + m_max_players_widget + ->setMax(UserConfigParams::m_server_max_players.getDefaultValue()); + m_max_players_widget->setValue(UserConfigParams::m_server_max_players); m_info_widget = getWidget("info"); assert(m_info_widget != NULL); @@ -162,15 +164,10 @@ void CreateServerScreen::createServer() SFXManager::get()->quickSound("anvil"); return; } - else if (max_players < 2 || max_players > 12) - { - m_info_widget->setText( - _("The maxinum number of players has to be between 2 and 12."), - false); - SFXManager::get()->quickSound("anvil"); - return; - } + assert(max_players > 1 && + max_players <= UserConfigParams::m_server_max_players.getDefaultValue()); + UserConfigParams::m_server_max_players = max_players; // In case of a LAN game, we can create the new server object now if (NetworkConfig::get()->isLAN()) { diff --git a/src/states_screens/server_selection.cpp b/src/states_screens/server_selection.cpp index ce2be0fbe..95d6163f4 100644 --- a/src/states_screens/server_selection.cpp +++ b/src/states_screens/server_selection.cpp @@ -162,6 +162,8 @@ void ServerSelection::onColumnClicked(int column_id) { case 0: Server::setSortOrder(Server::SO_NAME); break; case 1: Server::setSortOrder(Server::SO_PLAYERS); break; + case 2: Server::setSortOrder(Server::SO_DIFFICULTY); break; + case 3: Server::setSortOrder(Server::SO_GAME_MODE); break; default: assert(0); break; } // switch /** \brief Toggle the sort order after column click **/