From 323af45fbdce1ef199678c53d244a87cefcd2ade Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Thu, 13 Sep 2018 02:19:00 +0200 Subject: [PATCH 001/140] Change profile folder to avoid compatibilities issues As discussed on IRC with Auria. This removes the several issues already noticed when switching between 0.9.3 and git versions (forgotten challenges and settings ; and more recently a crash with highscores). Reminder for git users : you can migrate your data by copying it from the previous folder to the new one, so you won't have to redo your settings/profiles. --- src/io/file_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/file_manager.cpp b/src/io/file_manager.cpp index c8e9e506e..96e7fef19 100644 --- a/src/io/file_manager.cpp +++ b/src/io/file_manager.cpp @@ -921,7 +921,7 @@ void FileManager::checkAndCreateConfigDir() if(m_user_config_dir.size()>0 && *m_user_config_dir.rbegin()!='/') m_user_config_dir += "/"; - m_user_config_dir +="0.8.2/"; + m_user_config_dir +="0.10-git/"; if(!checkAndCreateDirectoryP(m_user_config_dir)) { Log::warn("FileManager", "Can not create config dir '%s', " From 3b070cdaad39d0ebd56292f9ba5d0ef778e2108e Mon Sep 17 00:00:00 2001 From: Benau Date: Thu, 13 Sep 2018 10:46:37 +0800 Subject: [PATCH 002/140] Fix ranked server player reconnection handling --- src/network/protocols/server_lobby.cpp | 27 ++++++++++++++++++-------- src/network/stk_host.cpp | 2 ++ src/network/stk_peer.cpp | 4 ++++ src/network/stk_peer.hpp | 5 ++++- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 0b788efdc..40e3c0a3e 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -369,11 +369,13 @@ void ServerLobby::asynchronousUpdate() // Check if server owner has left updateServerOwner(); + if (ServerConfig::m_ranked && m_state.load() == WAITING_FOR_START_GAME) + clearDisconnectedRankedPlayer(); + if (allowJoinedPlayersWaiting() || (m_game_setup->isGrandPrix() && m_state.load() == WAITING_FOR_START_GAME)) { updateWaitingPlayers(); - clearDisconnectedRankedPlayer(); // Only poll the STK server if this is a WAN server. if (NetworkConfig::get()->isWAN()) checkIncomingConnectionRequests(); @@ -1460,13 +1462,17 @@ void ServerLobby::connectionRequested(Event* event) // Reject non-valiated player joinning if WAN server and not disabled // encforement of validation, unless it's player from localhost or lan // And no duplicated online id or split screen players in ranked server + bool duplicated_ranked_player = + m_ranked_players.find(online_id) != m_ranked_players.end() && + !m_ranked_players.at(online_id).expired(); + if (((encrypted_size == 0 || online_id == 0) && !(peer->getAddress().isPublicAddressLocalhost() || peer->getAddress().isLAN()) && NetworkConfig::get()->isWAN() && ServerConfig::m_validating_player) || - ((player_count != 1 || online_id == 0 || - m_scores.find(online_id) != m_scores.end()) && ServerConfig::m_ranked)) + (ServerConfig::m_ranked && + (player_count != 1 || online_id == 0 || duplicated_ranked_player))) { NetworkString* message = getNetworkString(2); message->setSynchronous(true); @@ -1516,9 +1522,11 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, return; } - // Check again for duplicated online id in ranked server - if (m_scores.find(online_id) != m_scores.end() && - ServerConfig::m_ranked) + // Check again for duplicated player in ranked server + bool duplicated_ranked_player = + m_ranked_players.find(online_id) != m_ranked_players.end() && + !m_ranked_players.at(online_id).expired(); + if (ServerConfig::m_ranked && duplicated_ranked_player) { NetworkString* message = getNetworkString(2); message->setSynchronous(true); @@ -2321,13 +2329,16 @@ void ServerLobby::addWaitingPlayersToGame() uint32_t online_id = npp->getOnlineId(); if (ServerConfig::m_ranked) { - if (m_scores.find(online_id) != m_scores.end()) + bool duplicated_ranked_player = + m_ranked_players.find(online_id) != m_ranked_players.end() && + !m_ranked_players.at(online_id).expired(); + if (duplicated_ranked_player) { NetworkString* message = getNetworkString(2); message->setSynchronous(true); message->addUInt8(LE_CONNECTION_REFUSED) .addUInt8(RR_INVALID_PLAYER); - peer->sendPacket(message, true/*reliable*/, false/*encrypted*/); + peer->sendPacket(message, true/*reliable*/); peer->reset(); delete message; Log::verbose("ServerLobby", "Player refused: invalid player"); diff --git a/src/network/stk_host.cpp b/src/network/stk_host.cpp index af6d5c122..10f7ede5c 100644 --- a/src/network/stk_host.cpp +++ b/src/network/stk_host.cpp @@ -1221,6 +1221,8 @@ std::vector > std::unique_lock lock(m_peers_mutex); for (auto peer : m_peers) { + if (peer.second->isDisconnected()) + continue; auto peer_profile = peer.second->getPlayerProfiles(); p.insert(p.end(), peer_profile.begin(), peer_profile.end()); } diff --git a/src/network/stk_peer.cpp b/src/network/stk_peer.cpp index fda50c719..d645d9eac 100644 --- a/src/network/stk_peer.cpp +++ b/src/network/stk_peer.cpp @@ -41,6 +41,7 @@ STKPeer::STKPeer(ENetPeer *enet_peer, STKHost* host, uint32_t host_id) m_validated.store(false); m_average_ping.store(0); m_waiting_for_game.store(true); + m_disconnected.store(false); } // STKPeer //----------------------------------------------------------------------------- @@ -55,6 +56,7 @@ void STKPeer::disconnect() if (m_enet_peer->state != ENET_PEER_STATE_CONNECTED || a != m_peer_address) return; + m_disconnected.store(true); m_host->addEnetCommand(m_enet_peer, NULL, PDI_NORMAL, ECT_DISCONNECT); } // disconnect @@ -67,6 +69,7 @@ void STKPeer::kick() if (m_enet_peer->state != ENET_PEER_STATE_CONNECTED || a != m_peer_address) return; + m_disconnected.store(true); m_host->addEnetCommand(m_enet_peer, NULL, PDI_KICK, ECT_DISCONNECT); } // kick @@ -79,6 +82,7 @@ void STKPeer::reset() if (m_enet_peer->state != ENET_PEER_STATE_CONNECTED || a != m_peer_address) return; + m_disconnected.store(true); m_host->addEnetCommand(m_enet_peer, NULL, 0, ECT_RESET); } // reset diff --git a/src/network/stk_peer.hpp b/src/network/stk_peer.hpp index 2e67db9a0..fbf6c45f4 100644 --- a/src/network/stk_peer.hpp +++ b/src/network/stk_peer.hpp @@ -67,6 +67,8 @@ protected: /** True if this peer is waiting for game. */ std::atomic_bool m_waiting_for_game; + std::atomic_bool m_disconnected; + /** Host id of this peer. */ uint32_t m_host_id; @@ -177,7 +179,8 @@ public: void setWaitingForGame(bool val) { m_waiting_for_game.store(val); } // ------------------------------------------------------------------------ bool isWaitingForGame() const { return m_waiting_for_game.load(); } - + // ------------------------------------------------------------------------ + bool isDisconnected() const { return m_disconnected.load(); } }; // STKPeer #endif // STK_PEER_HPP From f0a4b707efe9d57992f5f3cb1edc15d688fb4965 Mon Sep 17 00:00:00 2001 From: Benau Date: Thu, 13 Sep 2018 10:46:54 +0800 Subject: [PATCH 003/140] Print incorrect packet --- src/network/protocol_manager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/protocol_manager.cpp b/src/network/protocol_manager.cpp index 4fe3cb5a2..c69054fd4 100644 --- a/src/network/protocol_manager.cpp +++ b/src/network/protocol_manager.cpp @@ -442,6 +442,7 @@ void ProtocolManager::update(int ticks) { Log::error("ProtocolManager", "Synchronous event error: %s", e.what()); + Log::error("ProtocolManager", (*i)->data().getLogMessage().c_str()); } m_sync_events_to_process.lock(); if (can_be_deleted) @@ -497,6 +498,8 @@ void ProtocolManager::asynchronousUpdate() { Log::error("ProtocolManager", "Asynchronous event error: %s", e.what()); + Log::error("ProtocolManager", + (*i)->data().getLogMessage().c_str()); } m_all_protocols[(*i)->getType()].unlock(); From c8d56cc2b90a1079882015f557161d3e2cd9e7f0 Mon Sep 17 00:00:00 2001 From: Benau Date: Thu, 13 Sep 2018 16:29:50 +0800 Subject: [PATCH 004/140] Use absolute path of cert location --- src/io/file_manager.cpp | 2 ++ src/io/file_manager.hpp | 3 +++ src/online/http_request.cpp | 11 +++-------- src/online/http_request.hpp | 2 -- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/io/file_manager.cpp b/src/io/file_manager.cpp index 96e7fef19..5fcc09db2 100644 --- a/src/io/file_manager.cpp +++ b/src/io/file_manager.cpp @@ -346,6 +346,8 @@ void FileManager::init() for(int i=0;i<(int)dirs.size(); i++) pushMusicSearchPath(dirs[i]); } + m_cert_location = m_file_system->getAbsolutePath( + getAsset("addons.supertuxkart.net.pem").c_str()).c_str(); } // init //----------------------------------------------------------------------------- diff --git a/src/io/file_manager.hpp b/src/io/file_manager.hpp index 5c574e303..8084e50b3 100644 --- a/src/io/file_manager.hpp +++ b/src/io/file_manager.hpp @@ -99,6 +99,8 @@ private: /** Directory where user-defined grand prix are stored. */ std::string m_gp_dir; + std::string m_cert_location; + std::vector m_texture_search_path; std::vector @@ -225,6 +227,7 @@ public: { return m_subdir_name[SHADER]; } + const std::string& getCertLocation() const { return m_cert_location; } }; // FileManager extern FileManager* file_manager; diff --git a/src/online/http_request.cpp b/src/online/http_request.cpp index 252e93a70..efd95892f 100644 --- a/src/online/http_request.cpp +++ b/src/online/http_request.cpp @@ -30,7 +30,6 @@ namespace Online { - std::string HTTPRequest::m_cert_location; struct curl_slist* HTTPRequest::m_http_header = NULL; const std::string API::USER_PATH = "user/"; const std::string API::SERVER_PATH = "server/"; @@ -96,11 +95,6 @@ namespace Online m_parameters = ""; m_curl_code = CURLE_OK; m_progress.setAtomic(0); - if (m_cert_location.empty()) - { - m_cert_location = - file_manager->getAsset("addons.supertuxkart.net.pem"); - } if (m_http_header == NULL) { m_http_header = curl_slist_append(m_http_header, @@ -191,12 +185,13 @@ namespace Online assert(m_http_header != NULL); curl_easy_setopt(m_curl_session, CURLOPT_HTTPHEADER, m_http_header); + const std::string& ci = file_manager->getCertLocation(); CURLcode error = curl_easy_setopt(m_curl_session, CURLOPT_CAINFO, - m_cert_location.c_str()); + ci.c_str()); if (error != CURLE_OK) { Log::error("HTTPRequest", "Error setting CAINFO to '%s'", - m_cert_location.c_str()); + ci.c_str()); Log::error("HTTPRequest", "Error: '%s'.", error, curl_easy_strerror(error)); } diff --git a/src/online/http_request.hpp b/src/online/http_request.hpp index 72a143afa..19274c2e9 100644 --- a/src/online/http_request.hpp +++ b/src/online/http_request.hpp @@ -71,8 +71,6 @@ namespace Online /** String to store the received data in. */ std::string m_string_buffer; - static std::string m_cert_location; - static struct curl_slist* m_http_header; protected: bool m_disable_sending_log; From 803fae53201c93143b71268183ab87244b4e42b3 Mon Sep 17 00:00:00 2001 From: Benau Date: Thu, 13 Sep 2018 16:36:35 +0800 Subject: [PATCH 005/140] Use a correct way to decrypt GCM with openssl From http://patches.opendataplane.org/patch/7237/, use the correct order (set tag, than update, and than final) --- src/network/crypto_openssl.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/network/crypto_openssl.cpp b/src/network/crypto_openssl.cpp index 73777cf23..23adab48b 100644 --- a/src/network/crypto_openssl.cpp +++ b/src/network/crypto_openssl.cpp @@ -104,21 +104,22 @@ bool Crypto::decryptConnectionRequest(BareNetworkString& ns) return false; int dlen; - if (EVP_DecryptUpdate(m_decrypt, pt.data(), &dlen, ns.m_buffer.data() + 4, - (int)(ns.m_buffer.size() - 4)) != 1) - return false; if (!EVP_CIPHER_CTX_ctrl(m_decrypt, EVP_CTRL_GCM_SET_TAG, 4, ns.m_buffer.data())) return false; - if (!(EVP_DecryptFinal_ex(m_decrypt, pt.data() + dlen, &dlen) > 0)) + if (EVP_DecryptUpdate(m_decrypt, pt.data(), &dlen, ns.m_buffer.data() + 4, + (int)(ns.m_buffer.size() - 4)) != 1) + return false; + + if (EVP_DecryptFinal_ex(m_decrypt, pt.data() + dlen, &dlen) > 0) { assert(dlen == 0); - return false; + std::swap(ns.m_buffer, pt); + return true; } - std::swap(ns.m_buffer, pt); - return true; + return false; } // decryptConnectionRequest // ---------------------------------------------------------------------------- @@ -183,6 +184,10 @@ NetworkString* Crypto::decryptRecieve(ENetPacket* p) { throw std::runtime_error("Failed to set IV."); } + if (!EVP_CIPHER_CTX_ctrl(m_decrypt, EVP_CTRL_GCM_SET_TAG, 4, tag)) + { + throw std::runtime_error("Failed to set tag."); + } int dlen; if (EVP_DecryptUpdate(m_decrypt, ns->m_buffer.data(), &dlen, @@ -190,11 +195,7 @@ NetworkString* Crypto::decryptRecieve(ENetPacket* p) { throw std::runtime_error("Failed to decrypt."); } - if (!EVP_CIPHER_CTX_ctrl(m_decrypt, EVP_CTRL_GCM_SET_TAG, 4, tag)) - { - throw std::runtime_error("Failed to set tag."); - } - if (EVP_DecryptFinal_ex(m_decrypt, ns->m_buffer.data(), &dlen) > 0) + if (EVP_DecryptFinal_ex(m_decrypt, ns->m_buffer.data() + dlen, &dlen) > 0) { assert(dlen == 0); NetworkString* result = ns.get(); From b413d9ef24b6ebe8ed9ba039f63c5b77283df327 Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Thu, 13 Sep 2018 15:06:07 +0200 Subject: [PATCH 006/140] Remove useless time requirements Even with max rubberbanding effect (staying purposefully way behind), the first AI kart finishes around or under the required time. --- data/challenges/olivermath.challenge | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/challenges/olivermath.challenge b/data/challenges/olivermath.challenge index c6176c1c1..5d1644ded 100644 --- a/data/challenges/olivermath.challenge +++ b/data/challenges/olivermath.challenge @@ -15,10 +15,10 @@ - + - + From 3d14ae5bf1b9afffed40ae728e9098c5d2c7342a Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Thu, 13 Sep 2018 15:14:56 +0200 Subject: [PATCH 007/140] Move repeated code to a function --- .../dialogs/select_challenge.cpp | 48 +++++++------------ .../dialogs/select_challenge.hpp | 5 ++ 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/states_screens/dialogs/select_challenge.cpp b/src/states_screens/dialogs/select_challenge.cpp index e9ecd04dc..ed3f09e9d 100644 --- a/src/states_screens/dialogs/select_challenge.cpp +++ b/src/states_screens/dialogs/select_challenge.cpp @@ -111,35 +111,10 @@ SelectChallengeDialog::SelectChallengeDialog(const float percentWidth, const ChallengeStatus* c = PlayerManager::getCurrentPlayer() ->getChallengeStatus(challenge_id); - if (c->isSolved(RaceManager::DIFFICULTY_EASY)) - { - IconButtonWidget* btn = getWidget("novice"); - btn->setImage(file_manager->getAsset(FileManager::GUI, "cup_bronze.png"), - IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE); - } - - if (c->isSolved(RaceManager::DIFFICULTY_MEDIUM)) - { - IconButtonWidget* btn = getWidget("intermediate"); - btn->setImage(file_manager->getAsset(FileManager::GUI,"cup_silver.png"), - IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE); - } - - if (c->isSolved(RaceManager::DIFFICULTY_HARD)) - { - IconButtonWidget* btn = getWidget("expert"); - btn->setImage(file_manager->getAsset(FileManager::GUI,"cup_gold.png"), - IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE); - } - - if (c->isSolved(RaceManager::DIFFICULTY_BEST) - && !PlayerManager::getCurrentPlayer()->isLocked("difficulty_best")) - { - IconButtonWidget* btn = getWidget("supertux"); - btn->setImage(file_manager->getAsset(FileManager::GUI,"cup_platinum.png"), - IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE); - } - + updateSolvedIcon(c, RaceManager::DIFFICULTY_EASY, "novice", "cup_bronze.png"); + updateSolvedIcon(c, RaceManager::DIFFICULTY_MEDIUM, "intermediate", "cup_silver.png"); + updateSolvedIcon(c, RaceManager::DIFFICULTY_HARD, "expert", "cup_gold.png"); + updateSolvedIcon(c, RaceManager::DIFFICULTY_BEST, "supertux", "cup_platinum.png"); LabelWidget* novice_label = getWidget("novice_label"); LabelWidget* medium_label = getWidget("intermediate_label"); @@ -188,6 +163,19 @@ SelectChallengeDialog::~SelectChallengeDialog() // ---------------------------------------------------------------------------- +void SelectChallengeDialog::updateSolvedIcon(const ChallengeStatus* c, RaceManager::Difficulty diff, + const char* widget_name, const char* path) +{ + if (c->isSolved(diff)) + { + IconButtonWidget* btn = getWidget(widget_name); + btn->setImage(file_manager->getAsset(FileManager::GUI, path), + IconButtonWidget::ICON_PATH_TYPE_ABSOLUTE); + } +} //updateSolvedIcon + +// ---------------------------------------------------------------------------- + GUIEngine::EventPropagation SelectChallengeDialog::processEvent(const std::string& eventSourceParam) { std::string eventSource = eventSourceParam; @@ -237,7 +225,7 @@ GUIEngine::EventPropagation SelectChallengeDialog::processEvent(const std::strin // Initialise global data - necessary even in local games to avoid // many if tests in other places (e.g. if network_game call // network_manager else call race_manager). -// network_manager->initCharacterDataStructures(); + // network_manager->initCharacterDataStructures(); // Launch challenge if (eventSource == "novice") diff --git a/src/states_screens/dialogs/select_challenge.hpp b/src/states_screens/dialogs/select_challenge.hpp index e35dcc5e7..e6aaabb8b 100644 --- a/src/states_screens/dialogs/select_challenge.hpp +++ b/src/states_screens/dialogs/select_challenge.hpp @@ -18,8 +18,10 @@ #ifndef SELECT_CHALLENGE_HPP #define SELECT_CHALLENGE_HPP +#include "challenges/challenge_status.hpp" #include "guiengine/event_handler.hpp" #include "guiengine/modaldialog.hpp" +#include "race/race_manager.hpp" /** * \brief Dialog shown when starting a challenge @@ -27,7 +29,10 @@ */ class SelectChallengeDialog : public GUIEngine::ModalDialog { +private: std::string m_challenge_id; + void updateSolvedIcon(const ChallengeStatus* c, RaceManager::Difficulty diff, + const char* widget_name, const char* path); public: SelectChallengeDialog(const float percentWidth, const float percentHeight, From 3616e93201a2bf9fe08ae1752327096b8d6c690c Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Thu, 13 Sep 2018 15:51:33 +0200 Subject: [PATCH 008/140] Switch to position requirement for low difficulties The AI is slower than the required times in this challenge, so it makes it easier. The previous times were, without nitro/skidding, as hard if not harder than the expert challenge. --- data/challenges/scotland.challenge | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/challenges/scotland.challenge b/data/challenges/scotland.challenge index e0edd8743..d8a3227de 100644 --- a/data/challenges/scotland.challenge +++ b/data/challenges/scotland.challenge @@ -15,10 +15,10 @@ - + - + From 0b5d390c48515b4e37d5811be03266383131ba01 Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Thu, 13 Sep 2018 16:03:20 +0200 Subject: [PATCH 009/140] Switch to position requirements for intermediate/novice difficulties Finishing first should always result in challenge success in low difficulties, and the AI balancing should be more effective than per-challenge tweaking in achieving consistent difficulty across challenges. --- data/challenges/abyss.challenge | 4 ++-- data/challenges/cocoa_temple.challenge | 4 ++-- data/challenges/cornfield_crossing.challenge | 4 ++-- data/challenges/hacienda.challenge | 2 +- data/challenges/lighthouse.challenge | 2 +- data/challenges/mines.challenge | 4 ++-- data/challenges/snowmountain.challenge | 4 ++-- data/challenges/snowpeak.challenge | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/data/challenges/abyss.challenge b/data/challenges/abyss.challenge index e67359867..b13618dac 100644 --- a/data/challenges/abyss.challenge +++ b/data/challenges/abyss.challenge @@ -15,10 +15,10 @@ - + - + diff --git a/data/challenges/cocoa_temple.challenge b/data/challenges/cocoa_temple.challenge index 4df77a563..eafbeb555 100644 --- a/data/challenges/cocoa_temple.challenge +++ b/data/challenges/cocoa_temple.challenge @@ -15,10 +15,10 @@ - + - + diff --git a/data/challenges/cornfield_crossing.challenge b/data/challenges/cornfield_crossing.challenge index 39c48155c..58db84cb6 100644 --- a/data/challenges/cornfield_crossing.challenge +++ b/data/challenges/cornfield_crossing.challenge @@ -15,10 +15,10 @@ - + - + diff --git a/data/challenges/hacienda.challenge b/data/challenges/hacienda.challenge index eee7e9fcb..8e04b4f79 100644 --- a/data/challenges/hacienda.challenge +++ b/data/challenges/hacienda.challenge @@ -19,6 +19,6 @@ - + diff --git a/data/challenges/lighthouse.challenge b/data/challenges/lighthouse.challenge index d4679a061..213891a84 100644 --- a/data/challenges/lighthouse.challenge +++ b/data/challenges/lighthouse.challenge @@ -19,6 +19,6 @@ - + diff --git a/data/challenges/mines.challenge b/data/challenges/mines.challenge index 1e7c66f35..62549f914 100644 --- a/data/challenges/mines.challenge +++ b/data/challenges/mines.challenge @@ -15,10 +15,10 @@ - + - + diff --git a/data/challenges/snowmountain.challenge b/data/challenges/snowmountain.challenge index 1d3020764..7cd34fcd9 100644 --- a/data/challenges/snowmountain.challenge +++ b/data/challenges/snowmountain.challenge @@ -15,10 +15,10 @@ - + - + diff --git a/data/challenges/snowpeak.challenge b/data/challenges/snowpeak.challenge index 6d9f829fc..c69dc0763 100644 --- a/data/challenges/snowpeak.challenge +++ b/data/challenges/snowpeak.challenge @@ -15,10 +15,10 @@ - + - + From d7b6e4c33974ba57418726553eacedbdadc1ef52 Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Thu, 13 Sep 2018 16:17:35 +0200 Subject: [PATCH 010/140] More consistent balance in time requirements Time-trial records give a good idea of the relative length of different tracks. I tried to keep a similar balance to the one reached in Cornfield Crossing's challenge. --- data/challenges/abyss.challenge | 2 +- data/challenges/cocoa_temple.challenge | 4 ++-- data/challenges/lighthouse.challenge | 2 +- data/challenges/mines.challenge | 2 +- data/challenges/snowpeak.challenge | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/challenges/abyss.challenge b/data/challenges/abyss.challenge index b13618dac..4fce3ea31 100644 --- a/data/challenges/abyss.challenge +++ b/data/challenges/abyss.challenge @@ -7,7 +7,7 @@ - + diff --git a/data/challenges/cocoa_temple.challenge b/data/challenges/cocoa_temple.challenge index eafbeb555..fdff06bf5 100644 --- a/data/challenges/cocoa_temple.challenge +++ b/data/challenges/cocoa_temple.challenge @@ -7,11 +7,11 @@ - + - + diff --git a/data/challenges/lighthouse.challenge b/data/challenges/lighthouse.challenge index 213891a84..84a5c6943 100644 --- a/data/challenges/lighthouse.challenge +++ b/data/challenges/lighthouse.challenge @@ -7,7 +7,7 @@ - + diff --git a/data/challenges/mines.challenge b/data/challenges/mines.challenge index 62549f914..c316b8511 100644 --- a/data/challenges/mines.challenge +++ b/data/challenges/mines.challenge @@ -7,7 +7,7 @@ - + diff --git a/data/challenges/snowpeak.challenge b/data/challenges/snowpeak.challenge index c69dc0763..69125053e 100644 --- a/data/challenges/snowpeak.challenge +++ b/data/challenges/snowpeak.challenge @@ -7,7 +7,7 @@ - + From 0fd62c1ca7650f1bd6081a478d7b7d2a9bc7c928 Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Thu, 13 Sep 2018 16:27:17 +0200 Subject: [PATCH 011/140] Add Super Tux time requirements for challenges lacking it The AI is not yet good enough to be the sole factor ; the time requirement is necessary to not have these Super Tux challenges much easier than others. --- data/challenges/candela_city.challenge | 2 +- data/challenges/granparadiso_island.challenge | 2 +- data/challenges/minigolf.challenge | 2 +- data/challenges/stk_enterprise.challenge | 2 +- data/challenges/volcano_island.challenge | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/challenges/candela_city.challenge b/data/challenges/candela_city.challenge index b8a02ff3c..a07f67139 100644 --- a/data/challenges/candela_city.challenge +++ b/data/challenges/candela_city.challenge @@ -7,7 +7,7 @@ - + diff --git a/data/challenges/granparadiso_island.challenge b/data/challenges/granparadiso_island.challenge index a0a14f1a8..97aa1092a 100644 --- a/data/challenges/granparadiso_island.challenge +++ b/data/challenges/granparadiso_island.challenge @@ -7,7 +7,7 @@ - + diff --git a/data/challenges/minigolf.challenge b/data/challenges/minigolf.challenge index 1e6cc7fe4..a2f42b0b2 100644 --- a/data/challenges/minigolf.challenge +++ b/data/challenges/minigolf.challenge @@ -7,7 +7,7 @@ - + diff --git a/data/challenges/stk_enterprise.challenge b/data/challenges/stk_enterprise.challenge index fdf8b9d3e..a34d9026c 100644 --- a/data/challenges/stk_enterprise.challenge +++ b/data/challenges/stk_enterprise.challenge @@ -7,7 +7,7 @@ - + diff --git a/data/challenges/volcano_island.challenge b/data/challenges/volcano_island.challenge index 23eaa6716..3ebdd54e5 100644 --- a/data/challenges/volcano_island.challenge +++ b/data/challenges/volcano_island.challenge @@ -7,7 +7,7 @@ - + From 99a4fac85eda1f448a54a8650850637455fdddda Mon Sep 17 00:00:00 2001 From: Deve Date: Thu, 13 Sep 2018 21:07:19 +0200 Subject: [PATCH 012/140] Fixed a crash when server was created in GUI. Regression since 7d561de3fbb6c4c4c12ae9e8aa6e67d60f38c512 --- src/karts/kart.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index cacdbbe84..b218e465a 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -64,6 +64,7 @@ #include "modes/capture_the_flag.hpp" #include "modes/linear_world.hpp" #include "modes/overworld.hpp" +#include "modes/profile_world.hpp" #include "modes/soccer_world.hpp" #include "network/network_config.hpp" #include "network/race_event_manager.hpp" @@ -3136,6 +3137,9 @@ btQuaternion Kart::getVisualRotation() const void Kart::setOnScreenText(const wchar_t *text) { #ifndef SERVER_ONLY + if (ProfileWorld::isNoGraphics()) + return; + BoldFace* bold_face = font_manager->getFont(); core::dimension2d textsize = bold_face->getDimension(text); From ea3215aad631142af7360a91d73e820cc3ee8b76 Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 14 Sep 2018 09:06:03 +0800 Subject: [PATCH 013/140] Use "and" search for server --- src/network/server.cpp | 16 +++++------- src/network/server.hpp | 26 ++++++++----------- .../dialogs/server_info_dialog.cpp | 3 +-- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/network/server.cpp b/src/network/server.cpp index c96b28032..f0cf59067 100644 --- a/src/network/server.cpp +++ b/src/network/server.cpp @@ -75,30 +75,26 @@ Server::Server(const XMLNode& server_info) : m_supports_encrytion(true) const XMLNode* player_info = players->getNode(i); assert(player_info->getName() == "player-info"); std::string username; - std::pair > - p; - auto& t = p.second; + std::tuple t; // Default rank and scores if none std::get<0>(t) = -1; std::get<2>(t) = 2000.0; player_info->get("rank", &std::get<0>(t)); player_info->get("username", &username); std::get<1>(t) = StringUtils::utf8ToWide(username); - p.first = StringUtils::toLowerCase(username); + m_lower_case_player_names += StringUtils::toLowerCase(username); player_info->get("scores", &std::get<2>(t)); float time_played = 0.0f; player_info->get("time-played", &time_played); std::get<3>(t) = time_played; - m_players.emplace_back(std::move(p)); + m_players.push_back(t); } // Sort by rank std::sort(m_players.begin(), m_players.end(), - [](const std::pair >& a, - const std::pair >& b)->bool + [](const std::tuple& a, + const std::tuple& b)->bool { - return std::get<0>(a.second) < std::get<0>(b.second); + return std::get<0>(a) < std::get<0>(b); }); // Show owner name as Official right now if official server hoster account diff --git a/src/network/server.hpp b/src/network/server.hpp index 639516b16..ff9b56b86 100644 --- a/src/network/server.hpp +++ b/src/network/server.hpp @@ -52,6 +52,8 @@ protected: std::string m_server_owner_lower_case_name; + std::string m_lower_case_player_names; + uint32_t m_server_id; uint32_t m_server_owner; @@ -89,9 +91,9 @@ protected: bool m_game_started; - std::vector > > m_players; + > > m_players; public: @@ -145,9 +147,8 @@ public: // ------------------------------------------------------------------------ bool isGameStarted() const { return m_game_started; } // ------------------------------------------------------------------------ - const std::vector > >& getPlayers() const - { return m_players; } + const std::vector >& + getPlayers() const { return m_players; } // ------------------------------------------------------------------------ void setServerId(unsigned id) { m_server_id = id; } // ------------------------------------------------------------------------ @@ -158,18 +159,13 @@ public: bool searchByName(const std::string& lower_case_word) { auto list = StringUtils::split(lower_case_word, ' ', false); - bool server_name_found = false; + bool server_name_found = true; for (auto& word : list) { - server_name_found = - m_lower_case_name.find(word) != std::string::npos; - if (server_name_found) - break; - for (auto& p : m_players) - { - if (p.first.find(word) != std::string::npos) - return true; - } + const std::string& for_search = m_lower_case_name + + m_lower_case_player_names; + server_name_found = server_name_found && + for_search.find(word) != std::string::npos; } return server_name_found; } diff --git a/src/states_screens/dialogs/server_info_dialog.cpp b/src/states_screens/dialogs/server_info_dialog.cpp index 84e50b0e7..5acd5eb3d 100644 --- a/src/states_screens/dialogs/server_info_dialog.cpp +++ b/src/states_screens/dialogs/server_info_dialog.cpp @@ -108,9 +108,8 @@ ServerInfoDialog::ServerInfoDialog(std::shared_ptr server) row.push_back(ListWidget::ListCell(_("Time played"), -1, 1, true)); player_list->addItem("player", row); - for (auto& p : players) + for (auto& r : players) { - auto& r = p.second; row.clear(); row.push_back(ListWidget::ListCell( std::get<0>(r) == -1 ? L"-" : From a53307cc144d46dd04a6a2e0ac70e2ad2eb02a2d Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 14 Sep 2018 13:43:44 +0800 Subject: [PATCH 014/140] Reset only physical objects in onGo --- src/modes/world.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/modes/world.cpp b/src/modes/world.cpp index e28a55724..07de4475f 100644 --- a/src/modes/world.cpp +++ b/src/modes/world.cpp @@ -71,6 +71,7 @@ #include "tracks/check_manager.hpp" #include "tracks/track.hpp" #include "tracks/track_manager.hpp" +#include "tracks/track_object.hpp" #include "tracks/track_object_manager.hpp" #include "utils/constants.hpp" #include "utils/profiler.hpp" @@ -556,7 +557,18 @@ void World::onGo() // Reset track objects 1 more time to make sure all instances of moveable // fall at the same instant when race start in network if (NetworkConfig::get()->isNetworking()) - Track::getCurrentTrack()->getTrackObjectManager()->reset(); + { + PtrVector& objs = Track::getCurrentTrack() + ->getTrackObjectManager()->getObjects(); + for (TrackObject* curr : objs) + { + if (curr->getPhysicalObject()) + { + curr->reset(); + curr->resetEnabled(); + } + } + } } // onGo //----------------------------------------------------------------------------- From 83a456e835eeca9912706df038e2182f0ed0f10d Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 14 Sep 2018 21:42:35 +0800 Subject: [PATCH 015/140] Add kart id checking so that only peer with correct kart can control --- src/network/protocols/game_protocol.cpp | 8 +++++++- src/network/protocols/server_lobby.cpp | 6 +++++- src/network/stk_peer.hpp | 9 +++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/network/protocols/game_protocol.cpp b/src/network/protocols/game_protocol.cpp index e81da7f0e..dd379a06c 100644 --- a/src/network/protocols/game_protocol.cpp +++ b/src/network/protocols/game_protocol.cpp @@ -184,7 +184,13 @@ void GameProtocol::handleControllerAction(Event *event) //rewind_delta = not_rewound - cur_ticks; } uint8_t kart_id = data.getUInt8(); - assert(kart_id < World::getWorld()->getNumKarts()); + if (NetworkConfig::get()->isServer() && + !event->getPeer()->availableKartID(kart_id)) + { + Log::warn("GameProtocol", "Wrong kart id %d from %s.", + kart_id, event->getPeer()->getAddress().toString().c_str()); + return; + } PlayerAction action = (PlayerAction)(data.getUInt8()); int value = data.getUInt32(); diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 40e3c0a3e..7444d4e5b 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -496,13 +496,17 @@ void ServerLobby::asynchronousUpdate() m_game_setup->sortPlayersForGrandPrix(); m_game_setup->sortPlayersForTeamGame(); auto players = m_game_setup->getConnectedPlayers(); + for (auto& player : players) + player->getPeer()->clearAvailableKartIDs(); NetworkString* load_world = getNetworkString(); load_world->setSynchronous(true); load_world->addUInt8(LE_LOAD_WORLD).encodeString(std::get<0>(result)) .addUInt8(std::get<1>(result)).addUInt8(std::get<2>(result)) .addUInt8((uint8_t)players.size()); - for (auto player : players) + for (unsigned i = 0; i < players.size(); i++) { + std::shared_ptr& player = players[i]; + player->getPeer()->addAvailableKartID(i); load_world->encodeString(player->getName()) .addUInt32(player->getHostId()) .addFloat(player->getDefaultKartColor()) diff --git a/src/network/stk_peer.hpp b/src/network/stk_peer.hpp index fbf6c45f4..a6b931ef3 100644 --- a/src/network/stk_peer.hpp +++ b/src/network/stk_peer.hpp @@ -89,6 +89,8 @@ protected: std::atomic m_average_ping; + std::set m_available_kart_ids; + public: STKPeer(ENetPeer *enet_peer, STKHost* host, uint32_t host_id); // ------------------------------------------------------------------------ @@ -181,6 +183,13 @@ public: bool isWaitingForGame() const { return m_waiting_for_game.load(); } // ------------------------------------------------------------------------ bool isDisconnected() const { return m_disconnected.load(); } + // ------------------------------------------------------------------------ + void clearAvailableKartIDs() { m_available_kart_ids.clear(); } + // ------------------------------------------------------------------------ + void addAvailableKartID(unsigned id) { m_available_kart_ids.insert(id); } + // ------------------------------------------------------------------------ + bool availableKartID(unsigned id) + { return m_available_kart_ids.find(id) != m_available_kart_ids.end(); } }; // STKPeer #endif // STK_PEER_HPP From 641998be69638f4d94dbd5b15d98deda057cb9dc Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 14 Sep 2018 22:03:02 +0800 Subject: [PATCH 016/140] Move startup boost and penalty handling to set phase for local games --- data/stk_config.xml | 2 +- src/karts/abstract_kart.hpp | 7 +++- .../controller/local_player_controller.cpp | 17 ++++++++- .../controller/local_player_controller.hpp | 3 +- src/karts/controller/player_controller.cpp | 21 ++++------- src/karts/controller/skidding_ai.cpp | 7 +++- src/karts/controller/test_ai.cpp | 7 +++- src/karts/kart.cpp | 37 +++++++++---------- src/karts/kart.hpp | 10 ++--- src/karts/kart_rewinder.cpp | 4 +- src/modes/world_status.hpp | 3 ++ 11 files changed, 68 insertions(+), 50 deletions(-) diff --git a/data/stk_config.xml b/data/stk_config.xml index 65cfe175c..5db22bc09 100644 --- a/data/stk_config.xml +++ b/data/stk_config.xml @@ -75,7 +75,7 @@ time-per-kart="0" /> + Penalty: Penalty time if a kart accelerates before SET. --> + + + + + +
+
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
- - - - - - -
From 505a67a372d2abb07bf529f8c7b4822b77f44e3a Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Sat, 15 Sep 2018 03:32:51 +0200 Subject: [PATCH 020/140] More improvements for #3430 Now that the list is wider, time and version can fit with a smaller place, leaving more for the rest. --- .../dialogs/ghost_replay_info_dialog.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/states_screens/dialogs/ghost_replay_info_dialog.cpp b/src/states_screens/dialogs/ghost_replay_info_dialog.cpp index 06b103542..9b66245e7 100644 --- a/src/states_screens/dialogs/ghost_replay_info_dialog.cpp +++ b/src/states_screens/dialogs/ghost_replay_info_dialog.cpp @@ -35,7 +35,7 @@ using namespace irr::core; // ----------------------------------------------------------------------------- GhostReplayInfoDialog::GhostReplayInfoDialog(unsigned int replay_id, uint64_t compare_replay_uid, bool compare_ghost) - : ModalDialog(0.9f,0.75f), m_replay_id(replay_id) + : ModalDialog(0.95f,0.75f), m_replay_id(replay_id) { m_self_destroy = false; m_record_race = false; @@ -147,13 +147,13 @@ void GhostReplayInfoDialog::updateReplayDisplayedInfo() row.push_back(GUIEngine::ListWidget::ListCell (_("Laps"), -1, 3, true)); row.push_back(GUIEngine::ListWidget::ListCell - (_("Time"), -1, 4, true)); + (_("Time"), -1, 3, true)); row.push_back(GUIEngine::ListWidget::ListCell (_("Kart"), -1, 1, true)); row.push_back(GUIEngine::ListWidget::ListCell (_("User"), -1, 5, true)); row.push_back(GUIEngine::ListWidget::ListCell - (_("Version"), -1, 3, true)); + (_("Version"), -1, 2, true)); m_replay_info_widget->addItem(StringUtils::toString(0), row); @@ -203,13 +203,13 @@ void GhostReplayInfoDialog::updateReplayDisplayedInfo() row.push_back(GUIEngine::ListWidget::ListCell (StringUtils::toWString(rd.m_laps), -1, 3, true)); row.push_back(GUIEngine::ListWidget::ListCell - (StringUtils::toWString(rd.m_min_time) + L"s", -1, 4, true)); + (StringUtils::toWString(rd.m_min_time) + L"s", -1, 3, true)); row.push_back(GUIEngine::ListWidget::ListCell ("", icon, 1, true)); row.push_back(GUIEngine::ListWidget::ListCell (rd.m_user_name.empty() ? " " : rd.m_user_name, -1, 5, true)); row.push_back(GUIEngine::ListWidget::ListCell - (rd.m_stk_version.empty() ? " " : rd.m_stk_version, -1, 3, true)); + (rd.m_stk_version.empty() ? " " : rd.m_stk_version, -1, 2, true)); m_replay_info_widget->addItem(StringUtils::toString(i), row); } // for num_replays_to_list From f547753aaa28e9a8c54fad1dc2449788bf73a96f Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 09:43:37 +0800 Subject: [PATCH 021/140] Add seamless endcontroller transition in network --- src/karts/controller/end_controller.cpp | 2 +- src/karts/kart.cpp | 53 ++++++++++++++++++++++--- src/karts/kart.hpp | 2 + 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/karts/controller/end_controller.cpp b/src/karts/controller/end_controller.cpp index e961a9bd5..b8f614923 100644 --- a/src/karts/controller/end_controller.cpp +++ b/src/karts/controller/end_controller.cpp @@ -99,7 +99,6 @@ EndController::EndController(AbstractKart *kart, reset(); m_max_handicap_accel = 1.0f; - m_min_steps = 2; #ifdef AI_DEBUG m_debug_sphere = irr_driver->getSceneManager()->addSphereSceneNode(1); @@ -143,6 +142,7 @@ void EndController::reset() m_track_node = DriveGraph::get()->findOutOfRoadSector(m_kart->getXYZ()); } } + m_min_steps = 2; } // reset //----------------------------------------------------------------------------- diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index a8662bd16..def21671f 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -318,6 +318,7 @@ void Kart::reset() stopFlying(); } + m_network_finish_check_ticks = 0; // Add karts back in case that they have been removed (i.e. in battle // mode) - but only if they actually have a body (e.g. ghost karts // don't have one). @@ -917,6 +918,10 @@ void Kart::finishedRace(float time, bool from_server) // it would trigger a race end again. if (m_finished_race) return; + const bool is_linear_race = + race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE || + race_manager->getMinorMode() == RaceManager::MINOR_MODE_TIME_TRIAL || + race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER; if (NetworkConfig::get()->isNetworking() && !from_server) { if (NetworkConfig::get()->isServer()) @@ -928,6 +933,30 @@ void Kart::finishedRace(float time, bool from_server) // network game. else if (NetworkConfig::get()->isClient()) { + if (is_linear_race && m_saved_controller == NULL && + !RewindManager::get()->isRewinding()) + { + m_network_finish_check_ticks = + World::getWorld()->getTicksSinceStart() + + stk_config->time2Ticks(1.0f); + EndController* ec = new EndController(this, m_controller); + Controller* old_controller = m_controller; + setController(ec); + // Seamless endcontroller replay + RewindManager::get()->addRewindInfoEventFunction(new + RewindInfoEventFunction( + World::getWorld()->getTicksSinceStart(), + /*undo_function*/[old_controller, this]() + { + m_controller = old_controller; + }, + /*replay_function*/[ec, old_controller, this]() + { + m_saved_controller = old_controller; + ec->reset(); + m_controller = ec; + })); + } return; } } // !from_server @@ -943,10 +972,7 @@ void Kart::finishedRace(float time, bool from_server) // If this is spare tire kart, end now if (dynamic_cast(m_controller) != NULL) return; - if ((race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE || - race_manager->getMinorMode() == RaceManager::MINOR_MODE_TIME_TRIAL || - race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER) - && m_controller->isPlayerController()) + if (is_linear_race && m_controller->isPlayerController()) { RaceGUIBase* m = World::getWorld()->getRaceGUI(); if (m) @@ -976,7 +1002,12 @@ void Kart::finishedRace(float time, bool from_server) setRaceResult(); if (!isGhostKart()) { - setController(new EndController(this, m_controller)); + if (m_saved_controller == NULL) + { + setController(new EndController(this, m_controller)); + } + else + m_saved_controller->finishedRace(time); } // Skip animation if this kart is eliminated if (m_eliminated || isGhostKart()) return; @@ -1285,6 +1316,18 @@ void Kart::eliminate() */ void Kart::update(int ticks) { + if (m_network_finish_check_ticks != 0 && + World::getWorld()->getTicksSinceStart() > + m_network_finish_check_ticks && + !m_finished_race && m_saved_controller != NULL) + { + Log::warn("Kart", "Missing finish race from server."); + m_network_finish_check_ticks = 0; + delete m_controller; + m_controller = m_saved_controller; + m_saved_controller = NULL; + } + m_powerup->update(ticks); // Reset any instand speed increase in the bullet kart diff --git a/src/karts/kart.hpp b/src/karts/kart.hpp index f388a527a..361bce9cc 100644 --- a/src/karts/kart.hpp +++ b/src/karts/kart.hpp @@ -67,6 +67,8 @@ class TerrainInfo; class Kart : public AbstractKart { friend class Skidding; +private: + int m_network_finish_check_ticks; protected: /** Offset of the graphical kart chassis from the physical chassis. */ float m_graphical_y_offset; From 01b95d873e113bf66a1e43a63a81b052359babd0 Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 11:18:30 +0800 Subject: [PATCH 022/140] Header clean up --- src/graphics/slip_stream.cpp | 1 + src/items/attachment.cpp | 1 + src/items/plunger.cpp | 1 + src/items/powerup.cpp | 1 + src/items/rubber_ball.cpp | 2 + src/items/swatter.cpp | 1 + src/karts/abstract_kart_animation.cpp | 1 + src/karts/controller/kart_control.cpp | 47 +++++++++------------- src/karts/controller/kart_control.hpp | 23 ++--------- src/karts/controller/player_controller.cpp | 1 + src/karts/kart.cpp | 1 + src/karts/kart.hpp | 1 + src/karts/max_speed.cpp | 1 + src/karts/skidding.hpp | 1 + src/modes/soccer_world.cpp | 1 + src/network/protocols/game_protocol.cpp | 1 + 16 files changed, 37 insertions(+), 48 deletions(-) diff --git a/src/graphics/slip_stream.cpp b/src/graphics/slip_stream.cpp index a6bd14966..46c7e1d5e 100644 --- a/src/graphics/slip_stream.cpp +++ b/src/graphics/slip_stream.cpp @@ -32,6 +32,7 @@ #include "karts/kart_properties.hpp" #include "karts/max_speed.hpp" #include "modes/world.hpp" +#include "network/rewind_info.hpp" #include "network/rewind_manager.hpp" #include "tracks/quad.hpp" #include "utils/constants.hpp" diff --git a/src/items/attachment.cpp b/src/items/attachment.cpp index 2314a5eb7..e7567c08f 100644 --- a/src/items/attachment.cpp +++ b/src/items/attachment.cpp @@ -36,6 +36,7 @@ #include "karts/explosion_animation.hpp" #include "karts/kart_properties.hpp" #include "modes/world.hpp" +#include "network/network_string.hpp" #include "network/rewind_manager.hpp" #include "physics/triangle_mesh.hpp" #include "tracks/track.hpp" diff --git a/src/items/plunger.cpp b/src/items/plunger.cpp index 928ce0b03..f4638ae49 100644 --- a/src/items/plunger.cpp +++ b/src/items/plunger.cpp @@ -29,6 +29,7 @@ #include "karts/abstract_kart.hpp" #include "karts/controller/controller.hpp" #include "karts/kart_properties.hpp" +#include "network/network_string.hpp" #include "physics/physical_object.hpp" #include "physics/physics.hpp" #include "tracks/track.hpp" diff --git a/src/items/powerup.cpp b/src/items/powerup.cpp index 48d47e7c6..9064c1d38 100644 --- a/src/items/powerup.cpp +++ b/src/items/powerup.cpp @@ -33,6 +33,7 @@ #include "karts/kart_properties.hpp" #include "modes/world.hpp" #include "network/network_config.hpp" +#include "network/network_string.hpp" #include "network/rewind_manager.hpp" #include "physics/triangle_mesh.hpp" #include "tracks/track.hpp" diff --git a/src/items/rubber_ball.cpp b/src/items/rubber_ball.cpp index 3aaa7e184..006340b0d 100644 --- a/src/items/rubber_ball.cpp +++ b/src/items/rubber_ball.cpp @@ -27,6 +27,8 @@ #include "items/projectile_manager.hpp" #include "karts/abstract_kart.hpp" #include "modes/linear_world.hpp" +#include "network/network_string.hpp" +#include "network/rewind_info.hpp" #include "network/rewind_manager.hpp" #include "physics/btKart.hpp" #include "physics/triangle_mesh.hpp" diff --git a/src/items/swatter.cpp b/src/items/swatter.cpp index 79ff08178..6d5eab858 100644 --- a/src/items/swatter.cpp +++ b/src/items/swatter.cpp @@ -40,6 +40,7 @@ #include "karts/kart_properties.hpp" #include "modes/world.hpp" #include "network/network_config.hpp" +#include "network/rewind_info.hpp" #include "network/rewind_manager.hpp" #define SWAT_POS_OFFSET core::vector3df(0.0, 0.2f, -0.4f) diff --git a/src/karts/abstract_kart_animation.cpp b/src/karts/abstract_kart_animation.cpp index 13d5ab9a3..2f969f02c 100644 --- a/src/karts/abstract_kart_animation.cpp +++ b/src/karts/abstract_kart_animation.cpp @@ -25,6 +25,7 @@ #include "karts/skidding.hpp" #include "modes/world.hpp" #include "network/network_config.hpp" +#include "network/rewind_info.hpp" #include "network/rewind_manager.hpp" #include "physics/physics.hpp" diff --git a/src/karts/controller/kart_control.cpp b/src/karts/controller/kart_control.cpp index 97cf13c8c..91f8b7c01 100644 --- a/src/karts/controller/kart_control.cpp +++ b/src/karts/controller/kart_control.cpp @@ -17,35 +17,7 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "karts/controller/kart_control.hpp" - -#include "network/protocols/game_protocol.hpp" -#include "network/rewind_manager.hpp" - - -// ------------------------------------------------------------------------ -/** Called when going back in time during a rewind. Nothing to do here - * in this case. - */ -void KartControl::undo(BareNetworkString *buffer) -{ -} // undo - -// ------------------------------------------------------------------------ -/** Replay an event for a KartControl object from the buffer. - * \param buffer BareNetworkString with saved event into. - */ -void KartControl::rewind(BareNetworkString *buffer) -{ - if(buffer->getTotalSize()>1) - { - // Full state including accel and steering was saved - rewindTo(buffer); - } - else // only a button event was stored - { - setButtonsCompressed(buffer->getUInt8()); - } -} // rewind +#include "network/network_string.hpp" // ------------------------------------------------------------------------ /** Sets the current steering value. */ @@ -102,3 +74,20 @@ void KartControl::setLookBack(bool b) { m_look_back = b; } // setLookBack +// ---------------------------------------------------------------------------- +/** Copies the important data from this objects into a memory buffer. */ +void KartControl::saveState(BareNetworkString *buffer) const +{ + buffer->add(m_steer); + buffer->add(m_accel); + buffer->addChar(getButtonsCompressed()); +} // saveState + +// ---------------------------------------------------------------------------- +/** Restores this object from a previously saved memory buffer. */ +void KartControl::rewindTo(BareNetworkString *buffer) +{ + m_steer = buffer->getFloat(); + m_accel = buffer->getFloat(); + setButtonsCompressed(buffer->getUInt8()); +} // setFromMemory diff --git a/src/karts/controller/kart_control.hpp b/src/karts/controller/kart_control.hpp index 88d1cc171..cc060fcae 100644 --- a/src/karts/controller/kart_control.hpp +++ b/src/karts/controller/kart_control.hpp @@ -19,13 +19,12 @@ #ifndef HEADER_KART_CONTROL_HPP #define HEADER_KART_CONTROL_HPP -#include "network/network_string.hpp" -#include "network/rewind_info.hpp" +class BareNetworkString; /** * \ingroup controller */ -class KartControl : public EventRewinder +class KartControl { public: /** The skidding control state: SC_NONE: not pressed; @@ -51,8 +50,6 @@ private: /** True if the kart looks (and shoots) backwards. */ bool m_look_back; public: - virtual void undo(BareNetworkString *buffer); - virtual void rewind(BareNetworkString *buffer); void setSteer(float f); void setAccel(float f); void setBrake(bool b); @@ -100,22 +97,10 @@ public: static int getLength() { return 9; } // ------------------------------------------------------------------------ /** Copies the important data from this objects into a memory buffer. */ - void saveState(BareNetworkString *buffer) const - { - buffer->add(m_steer); - buffer->add(m_accel); - buffer->addChar(getButtonsCompressed()); - } // saveState - + void saveState(BareNetworkString *buffer) const; // ------------------------------------------------------------------------ /** Restores this object from a previously saved memory buffer. */ - void rewindTo(BareNetworkString *buffer) - { - m_steer = buffer->getFloat(); - m_accel = buffer->getFloat(); - setButtonsCompressed(buffer->getUInt8()); - } // setFromMemory - + void rewindTo(BareNetworkString *buffer); // ------------------------------------------------------------------------ /** Compresses all buttons into a single byte. */ char getButtonsCompressed() const diff --git a/src/karts/controller/player_controller.cpp b/src/karts/controller/player_controller.cpp index 8acf3c2c3..efca5a337 100644 --- a/src/karts/controller/player_controller.cpp +++ b/src/karts/controller/player_controller.cpp @@ -33,6 +33,7 @@ #include "network/rewind_manager.hpp" #include "network/network_config.hpp" #include "network/network_player_profile.hpp" +#include "network/network_string.hpp" #include "network/protocols/lobby_protocol.hpp" #include "race/history.hpp" #include "states_screens/race_gui_base.hpp" diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index def21671f..d32e0c44d 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -68,6 +68,7 @@ #include "modes/soccer_world.hpp" #include "network/network_config.hpp" #include "network/race_event_manager.hpp" +#include "network/rewind_info.hpp" #include "network/rewind_manager.hpp" #include "physics/btKart.hpp" #include "physics/btKartRaycast.hpp" diff --git a/src/karts/kart.hpp b/src/karts/kart.hpp index 361bce9cc..dca4721ef 100644 --- a/src/karts/kart.hpp +++ b/src/karts/kart.hpp @@ -30,6 +30,7 @@ #include "items/powerup_manager.hpp" // For PowerupType #include "karts/abstract_kart.hpp" +#include "utils/cpp2011.hpp" #include "utils/no_copy.hpp" #include diff --git a/src/karts/max_speed.cpp b/src/karts/max_speed.cpp index 89200d162..9c74f2823 100644 --- a/src/karts/max_speed.cpp +++ b/src/karts/max_speed.cpp @@ -21,6 +21,7 @@ #include "config/stk_config.hpp" #include "karts/abstract_kart.hpp" #include "karts/kart_properties.hpp" +#include "network/network_string.hpp" #include "physics/btKart.hpp" #include diff --git a/src/karts/skidding.hpp b/src/karts/skidding.hpp index b7aaced0d..a497522e8 100644 --- a/src/karts/skidding.hpp +++ b/src/karts/skidding.hpp @@ -22,6 +22,7 @@ #include "karts/controller/kart_control.hpp" #include "utils/leak_check.hpp" #include "utils/no_copy.hpp" +#include "utils/types.hpp" class BareNetworkString; class Kart; diff --git a/src/modes/soccer_world.cpp b/src/modes/soccer_world.cpp index 810b9214f..012f136fb 100644 --- a/src/modes/soccer_world.cpp +++ b/src/modes/soccer_world.cpp @@ -33,6 +33,7 @@ #include "network/network_config.hpp" #include "network/network_string.hpp" #include "network/protocols/game_events_protocol.hpp" +#include "network/rewind_info.hpp" #include "network/rewind_manager.hpp" #include "network/stk_host.hpp" #include "physics/physics.hpp" diff --git a/src/network/protocols/game_protocol.cpp b/src/network/protocols/game_protocol.cpp index dd379a06c..e943c17d1 100644 --- a/src/network/protocols/game_protocol.cpp +++ b/src/network/protocols/game_protocol.cpp @@ -28,6 +28,7 @@ #include "network/network_config.hpp" #include "network/network_string.hpp" #include "network/protocol_manager.hpp" +#include "network/rewind_info.hpp" #include "network/rewind_manager.hpp" #include "network/stk_host.hpp" #include "network/stk_peer.hpp" From 4c6d535f001c171b276143f04bea4db8e1f77aca Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 14:25:38 +0800 Subject: [PATCH 023/140] Compress kart control action --- src/karts/controller/ai_base_controller.cpp | 4 +- src/karts/controller/player_controller.cpp | 19 +++++--- src/karts/controller/player_controller.hpp | 2 +- src/network/protocols/game_protocol.cpp | 49 +++++++++++++-------- src/network/protocols/game_protocol.hpp | 25 ++++++++++- 5 files changed, 70 insertions(+), 29 deletions(-) diff --git a/src/karts/controller/ai_base_controller.cpp b/src/karts/controller/ai_base_controller.cpp index 9439bd161..d17e60e0f 100644 --- a/src/karts/controller/ai_base_controller.cpp +++ b/src/karts/controller/ai_base_controller.cpp @@ -335,7 +335,7 @@ void AIBaseController::saveState(BareNetworkString *buffer) const { // Endcontroller needs this for proper offset in kart rewinder // Must match the number of bytes in Playercontroller. - buffer->addUInt32(0).addUInt32(0).addUInt8(0); + buffer->addUInt32(0).addUInt16(0).addUInt8(0); } // copyToBuffer //----------------------------------------------------------------------------- @@ -343,5 +343,5 @@ void AIBaseController::rewindTo(BareNetworkString *buffer) { // Endcontroller needs this for proper offset in kart rewinder. // Skip the same number of bytes as PlayerController. - buffer->skip(4 * 2 + 1); + buffer->skip(4 + 2 + 1); } // rewindTo diff --git a/src/karts/controller/player_controller.cpp b/src/karts/controller/player_controller.cpp index efca5a337..d2c7ae2f8 100644 --- a/src/karts/controller/player_controller.cpp +++ b/src/karts/controller/player_controller.cpp @@ -171,10 +171,12 @@ bool PlayerController::action(PlayerAction action, int value, bool dry_run) break; case PA_ACCEL: - SET_OR_TEST(m_prev_accel, value); - if (value) + { + uint16_t v16 = (uint16_t)value; + SET_OR_TEST(m_prev_accel, v16); + if (v16) { - SET_OR_TEST_GETTER(Accel, value/32768.0f); + SET_OR_TEST_GETTER(Accel, v16 / 32768.0f); SET_OR_TEST_GETTER(Brake, false); SET_OR_TEST_GETTER(Nitro, m_prev_nitro); } @@ -185,6 +187,7 @@ bool PlayerController::action(PlayerAction action, int value, bool dry_run) SET_OR_TEST_GETTER(Nitro, false); } break; + } case PA_BRAKE: SET_OR_TEST(m_prev_brake, value!=0); // let's consider below that to be a deadzone @@ -374,8 +377,8 @@ void PlayerController::saveState(BareNetworkString *buffer) const { // NOTE: when the size changes, the AIBaseController::saveState and // restore state MUST be adjusted!! - buffer->addUInt32(m_steer_val).addUInt32(m_prev_accel) - .addUInt8(m_prev_brake); + buffer->addUInt32(m_steer_val).addUInt16(m_prev_accel) + .addUInt8((m_prev_brake ? 1 : 0) | (m_prev_nitro ? 2 : 0)); } // copyToBuffer //----------------------------------------------------------------------------- @@ -384,8 +387,10 @@ void PlayerController::rewindTo(BareNetworkString *buffer) // NOTE: when the size changes, the AIBaseController::saveState and // restore state MUST be adjusted!! m_steer_val = buffer->getUInt32(); - m_prev_accel = buffer->getUInt32(); - m_prev_brake = buffer->getUInt8(); + m_prev_accel = buffer->getUInt16(); + uint8_t c = buffer->getUInt8(); + m_prev_brake = (c & 1) != 0; + m_prev_nitro = (c & 2) != 0; } // rewindTo // ---------------------------------------------------------------------------- diff --git a/src/karts/controller/player_controller.hpp b/src/karts/controller/player_controller.hpp index ddd7f9a23..db7c0a914 100644 --- a/src/karts/controller/player_controller.hpp +++ b/src/karts/controller/player_controller.hpp @@ -29,7 +29,7 @@ class PlayerController : public Controller friend class KartRewinder; protected: int m_steer_val, m_steer_val_l, m_steer_val_r; - int m_prev_accel; + uint16_t m_prev_accel; bool m_prev_brake; bool m_prev_nitro; diff --git a/src/network/protocols/game_protocol.cpp b/src/network/protocols/game_protocol.cpp index e943c17d1..6adee3faa 100644 --- a/src/network/protocols/game_protocol.cpp +++ b/src/network/protocols/game_protocol.cpp @@ -77,11 +77,17 @@ void GameProtocol::sendActions() // Clear left-over data from previous frame. This way the network // string will increase till it reaches maximum size necessary m_data_to_send->clear(); + if (m_all_actions.size() > 255) + { + Log::warn("GameProtocol", + "Too many actions unsent %d.", (int)m_all_actions.size()); + m_all_actions.resize(255); + } m_data_to_send->addUInt8(GP_CONTROLLER_ACTION) .addUInt8(uint8_t(m_all_actions.size())); // Add all actions - for (auto a : m_all_actions) + for (auto& a : m_all_actions) { if (Network::m_connection_debug) { @@ -92,8 +98,9 @@ void GameProtocol::sendActions() } m_data_to_send->addUInt32(a.m_ticks); m_data_to_send->addUInt8(a.m_kart_id); - m_data_to_send->addUInt8((uint8_t)(a.m_action)).addUInt32(a.m_value) - .addUInt32(a.m_value_l).addUInt32(a.m_value_r); + const auto& c = compressAction(a); + m_data_to_send->addUInt8(std::get<0>(c)).addUInt16(std::get<1>(c)) + .addUInt16(std::get<2>(c)).addUInt16(std::get<3>(c)); } // for a in m_all_actions // FIXME: for now send reliable @@ -147,12 +154,12 @@ void GameProtocol::controllerAction(int kart_id, PlayerAction action, a.m_ticks = World::getWorld()->getTicksSinceStart(); m_all_actions.push_back(a); - + const auto& c = compressAction(a); // Store the event in the rewind manager, which is responsible // for freeing the allocated memory BareNetworkString *s = new BareNetworkString(4); - s->addUInt8(kart_id).addUInt8(action).addUInt32(value) - .addUInt32(val_l).addUInt32(val_r); + s->addUInt8(kart_id).addUInt8(std::get<0>(c)).addUInt16(std::get<1>(c)) + .addUInt16(std::get<2>(c)).addUInt16(std::get<3>(c)); RewindManager::get()->addEvent(this, s, /*confirmed*/true, World::getWorld()->getTicksSinceStart()); @@ -193,19 +200,21 @@ void GameProtocol::handleControllerAction(Event *event) return; } - PlayerAction action = (PlayerAction)(data.getUInt8()); - int value = data.getUInt32(); - int value_l = data.getUInt32(); - int value_r = data.getUInt32(); + uint8_t w = data.getUInt8(); + uint16_t x = data.getUInt16(); + uint16_t y = data.getUInt16(); + uint16_t z = data.getUInt16(); if (Network::m_connection_debug) { + const auto& a = decompressAction(w, x, y, z); Log::verbose("GameProtocol", "Controller action: %d %d %d %d %d %d", - cur_ticks, kart_id, action, value, value_l, value_r); + cur_ticks, kart_id, std::get<0>(a), std::get<1>(a), + std::get<2>(a), std::get<3>(a)); } BareNetworkString *s = new BareNetworkString(3); - s->addUInt8(kart_id).addUInt8(action).addUInt32(value) - .addUInt32(value_l).addUInt32(value_r); + s->addUInt8(kart_id).addUInt8(w).addUInt16(x).addUInt16(y) + .addUInt16(z); RewindManager::get()->addNetworkEvent(this, s, cur_ticks); } @@ -425,15 +434,19 @@ void GameProtocol::undo(BareNetworkString *buffer) void GameProtocol::rewind(BareNetworkString *buffer) { int kart_id = buffer->getUInt8(); - PlayerAction action = PlayerAction(buffer->getUInt8()); - int value = buffer->getUInt32(); - int value_l = buffer->getUInt32(); - int value_r = buffer->getUInt32(); + uint8_t w = buffer->getUInt8(); + uint16_t x = buffer->getUInt16(); + uint16_t y = buffer->getUInt16(); + uint16_t z = buffer->getUInt16(); + const auto& a = decompressAction(w, x, y, z); Controller *c = World::getWorld()->getKart(kart_id)->getController(); PlayerController *pc = dynamic_cast(c); // This can be endcontroller when finishing the race if (pc) - pc->actionFromNetwork(action, value, value_l, value_r); + { + pc->actionFromNetwork(std::get<0>(a), std::get<1>(a), std::get<2>(a), + std::get<3>(a)); + } } // rewind // ---------------------------------------------------------------------------- diff --git a/src/network/protocols/game_protocol.hpp b/src/network/protocols/game_protocol.hpp index 694cbdb7a..ccfd9776f 100644 --- a/src/network/protocols/game_protocol.hpp +++ b/src/network/protocols/game_protocol.hpp @@ -26,8 +26,10 @@ #include "utils/cpp2011.hpp" #include "utils/singleton.hpp" +#include #include #include +#include class BareNetworkString; class NetworkString; @@ -75,7 +77,28 @@ private: static std::weak_ptr m_game_protocol; std::map m_initial_ticks; std::map m_last_adjustments; - + // Maximum value of values are only 32768 + std::tuple + compressAction(const Action& a) + { + uint8_t w = (uint8_t)(a.m_action & 63) | + (a.m_value_l > 0 ? 64 : 0) | (a.m_value_r > 0 ? 128 : 0); + uint16_t x = (uint16_t)a.m_value; + uint16_t y = (uint16_t)std::abs(a.m_value_l); + uint16_t z = (uint16_t)std::abs(a.m_value_r); + return std::make_tuple(w, x, y, z); + } + std::tuple + decompressAction(uint8_t w, uint16_t x, uint16_t y , uint16_t z) + { + PlayerAction a = (PlayerAction)(w & 63); + int l_sign = ((w >> 6) & 1) != 0 ? 1 : -1; + int r_sign = ((w >> 7) & 1) != 0 ? 1 : -1; + int b = x; + int c = y * l_sign; + int d = z * r_sign; + return std::make_tuple(a, b, c, d); + } public: GameProtocol(); virtual ~GameProtocol(); From e5f5a1c04df6f04ea5da1256d514610b8b7b143e Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 15:10:03 +0800 Subject: [PATCH 024/140] Use a more server owner friendly value instead of threshold --- src/main.cpp | 7 +++---- src/network/game_setup.cpp | 5 ++--- src/network/protocols/client_lobby.cpp | 9 ++++----- src/network/protocols/server_lobby.cpp | 10 +++------- src/network/server_config.cpp | 4 ++++ src/network/server_config.hpp | 6 +++--- src/states_screens/networking_lobby.cpp | 17 +++++++++-------- src/states_screens/networking_lobby.hpp | 5 +++-- 8 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 161d846b8..9a7f73d8e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1228,10 +1228,9 @@ int handleCmdLine(bool has_server_config, bool has_parent_process) if (CommandLine::has("--min-players", &n)) { - float threshold = ((float)(n) - 0.5f) / - ServerConfig::m_server_max_players; - threshold = std::max(std::min(threshold, 1.0f), 0.0f); - ServerConfig::m_start_game_threshold = threshold; + if (n > ServerConfig::m_server_max_players) + n = 1; + ServerConfig::m_min_start_game_players = n; } if (CommandLine::has("--port", &n)) { diff --git a/src/network/game_setup.cpp b/src/network/game_setup.cpp index 8f49b5358..6af5ce125 100644 --- a/src/network/game_setup.cpp +++ b/src/network/game_setup.cpp @@ -216,12 +216,11 @@ void GameSetup::addServerInfo(NetworkString* ns) } if (ServerConfig::m_owner_less) { - ns->addFloat(ServerConfig::m_start_game_threshold) + ns->addUInt8(ServerConfig::m_min_start_game_players) .addFloat(ServerConfig::m_start_game_counter); } else - ns->addFloat(0.0f).addFloat(0.0f); - ns->addUInt8(ServerConfig::m_server_max_players); + ns->addUInt8(0).addFloat(0.0f); ns->encodeString16(m_message_of_today); } // addServerInfo diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp index 9d510bfe0..43f1c198d 100644 --- a/src/network/protocols/client_lobby.cpp +++ b/src/network/protocols/client_lobby.cpp @@ -574,9 +574,9 @@ void ClientLobby::handleServerInfo(Event* event) each_line = _("Difficulty: %s", difficulty_name); NetworkingLobby::getInstance()->addMoreServerInfo(each_line); - u_data = data.getUInt8(); + unsigned max_player = data.getUInt8(); //I18N: In the networking lobby - each_line = _("Max players: %d", (int)u_data); + each_line = _("Max players: %d", (int)max_player); NetworkingLobby::getInstance()->addMoreServerInfo(each_line); u_data = data.getUInt8(); @@ -627,11 +627,10 @@ void ClientLobby::handleServerInfo(Event* event) } } // Auto start info - float start_threshold = data.getFloat(); + unsigned min_players = data.getUInt8(); float start_timeout = data.getFloat(); - unsigned max_player = data.getUInt8(); NetworkingLobby::getInstance()->initAutoStartTimer(grand_prix_started, - start_threshold, start_timeout, max_player); + min_players, start_timeout, max_player); // MOTD core::stringw motd; diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index d8765e56f..0113ac9bb 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -437,10 +437,8 @@ void ServerLobby::asynchronousUpdate() { if (ServerConfig::m_owner_less) { - float player_size = (float)m_game_setup->getPlayerCount(); - if ((player_size >= - (float)ServerConfig::m_server_max_players * - ServerConfig::m_start_game_threshold || + int player_size = m_game_setup->getPlayerCount(); + if ((player_size >= ServerConfig::m_min_start_game_players || m_game_setup->isGrandPrixStarted()) && m_timeout.load() == std::numeric_limits::max()) { @@ -448,9 +446,7 @@ void ServerLobby::asynchronousUpdate() (int64_t) (ServerConfig::m_start_game_counter * 1000.0f)); } - else if (player_size < - (float)ServerConfig::m_server_max_players* - ServerConfig::m_start_game_threshold && + else if (player_size < ServerConfig::m_min_start_game_players && !m_game_setup->isGrandPrixStarted()) { m_timeout.store(std::numeric_limits::max()); diff --git a/src/network/server_config.cpp b/src/network/server_config.cpp index 2cfea03d0..80cbbea42 100644 --- a/src/network/server_config.cpp +++ b/src/network/server_config.cpp @@ -275,7 +275,11 @@ void loadServerLobbyFromConfig() m_owner_less = true; } if (m_owner_less) + { + if (m_min_start_game_players > m_server_max_players) + m_min_start_game_players = 1; m_team_choosing = false; + } const bool is_soccer = race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER; diff --git a/src/network/server_config.hpp b/src/network/server_config.hpp index 5b38c5c0e..b893005ba 100644 --- a/src/network/server_config.hpp +++ b/src/network/server_config.hpp @@ -176,10 +176,10 @@ namespace ServerConfig "if satisfied start-game-threshold below for owner less or ranked " "server.")); - SERVER_CFG_PREFIX FloatServerConfigParam m_start_game_threshold - SERVER_CFG_DEFAULT(FloatServerConfigParam(0.5f, "start-game-threshold", + SERVER_CFG_PREFIX IntServerConfigParam m_min_start_game_players + SERVER_CFG_DEFAULT(IntServerConfigParam(2, "min-start-game-players", "Only auto start kart selection when number of " - "connected player is larger than max player * this value, for " + "connected player is larger than or equals this value, for " "owner less or ranked server, after start-game-counter.")); SERVER_CFG_PREFIX BoolServerConfigParam m_auto_end diff --git a/src/states_screens/networking_lobby.cpp b/src/states_screens/networking_lobby.cpp index 8499b534b..448781a75 100644 --- a/src/states_screens/networking_lobby.cpp +++ b/src/states_screens/networking_lobby.cpp @@ -143,8 +143,9 @@ void NetworkingLobby::init() m_allow_change_team = false; m_has_auto_start_in_server = false; m_ping_update_timer = 0.0f; - m_cur_starting_timer = m_start_threshold = m_start_timeout = + m_cur_starting_timer = m_start_timeout = m_server_max_player = std::numeric_limits::max(); + m_min_start_game_players = 0; m_timeout_message->setVisible(false); //I18N: In the networking lobby @@ -252,13 +253,13 @@ void NetworkingLobby::onUpdate(float delta) if (m_has_auto_start_in_server && m_player_list) { m_timeout_message->setVisible(true); - float cur_player = (float)(m_player_list->getItemCount()); - if (cur_player >= m_server_max_player * m_start_threshold && + unsigned cur_player = m_player_list->getItemCount(); + if (cur_player >= m_min_start_game_players && m_cur_starting_timer == std::numeric_limits::max()) { m_cur_starting_timer = m_start_timeout; } - else if (cur_player < m_server_max_player * m_start_threshold) + else if (cur_player < m_min_start_game_players) { m_cur_starting_timer = std::numeric_limits::max(); //I18N: In the networking lobby, display the number of players @@ -266,7 +267,7 @@ void NetworkingLobby::onUpdate(float delta) core::stringw msg = _P("Game will start if there is more than %d player.", "Game will start if there are more than %d players.", - (int)ceil(m_server_max_player * m_start_threshold) - 1); + (int)(m_min_start_game_players - 1)); m_timeout_message->setText(msg, true); } @@ -534,15 +535,15 @@ void NetworkingLobby::cleanAddedPlayers() // ---------------------------------------------------------------------------- void NetworkingLobby::initAutoStartTimer(bool grand_prix_started, - float start_threshold, + unsigned min_players, float start_timeout, unsigned server_max_player) { - if (start_threshold == 0.0f || start_timeout == 0.0f) + if (min_players == 0 || start_timeout == 0.0f) return; m_has_auto_start_in_server = true; - m_start_threshold = grand_prix_started ? 0.0f : start_threshold; + m_min_start_game_players = grand_prix_started ? 0 : min_players; m_start_timeout = start_timeout; m_server_max_player = (float)server_max_player; } // initAutoStartTimer diff --git a/src/states_screens/networking_lobby.hpp b/src/states_screens/networking_lobby.hpp index e01c2b3ea..37a00aac6 100644 --- a/src/states_screens/networking_lobby.hpp +++ b/src/states_screens/networking_lobby.hpp @@ -71,8 +71,9 @@ private: std::vector m_server_info; int m_server_info_height; - float m_cur_starting_timer, m_start_threshold, m_start_timeout, + float m_cur_starting_timer, m_start_timeout, m_server_max_player; + unsigned m_min_start_game_players; bool m_allow_change_team, m_has_auto_start_in_server; @@ -137,7 +138,7 @@ public: KartTeam> >& p); void addSplitscreenPlayer(irr::core::stringw name); void cleanAddedPlayers(); - void initAutoStartTimer(bool grand_prix_started, float start_threshold, + void initAutoStartTimer(bool grand_prix_started, unsigned min_players, float start_timeout, unsigned server_max_player); void setStartingTimerTo(float t) { m_cur_starting_timer = t; } From 57d4017cc69d2bd6c2729e69a3b75ad0a512174d Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 15:23:06 +0800 Subject: [PATCH 025/140] Fix documentation --- src/network/server_config.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/server_config.hpp b/src/network/server_config.hpp index b893005ba..3baa49f71 100644 --- a/src/network/server_config.hpp +++ b/src/network/server_config.hpp @@ -173,14 +173,14 @@ namespace ServerConfig SERVER_CFG_PREFIX FloatServerConfigParam m_start_game_counter SERVER_CFG_DEFAULT(FloatServerConfigParam(30.0f, "start-game-counter", "Time to wait before entering kart selection screen " - "if satisfied start-game-threshold below for owner less or ranked " + "if satisfied min-start-game-players below for owner less or ranked " "server.")); SERVER_CFG_PREFIX IntServerConfigParam m_min_start_game_players SERVER_CFG_DEFAULT(IntServerConfigParam(2, "min-start-game-players", "Only auto start kart selection when number of " "connected player is larger than or equals this value, for " - "owner less or ranked server, after start-game-counter.")); + "owner less or ranked server, after start-game-counter reaches 0.")); SERVER_CFG_PREFIX BoolServerConfigParam m_auto_end SERVER_CFG_DEFAULT(BoolServerConfigParam(false, "auto-end", From 4cf9542be18b941e916cdf572a26564bbdc59aed Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 15:57:27 +0800 Subject: [PATCH 026/140] Add user version in string to connection request --- src/network/network_console.cpp | 3 ++- src/network/protocols/client_lobby.cpp | 3 ++- src/network/protocols/server_lobby.cpp | 8 ++++++-- src/network/stk_peer.hpp | 8 ++++++++ src/online/http_request.cpp | 15 +-------------- src/utils/string_utils.hpp | 20 +++++++++++++++++++- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/network/network_console.cpp b/src/network/network_console.cpp index 9d0ac876b..ffa2e8408 100644 --- a/src/network/network_console.cpp +++ b/src/network/network_console.cpp @@ -107,7 +107,8 @@ void mainLoop(STKHost* host) for (unsigned int i = 0; i < peers.size(); i++) { std::cout << peers[i]->getHostId() << ": " << - peers[i]->getAddress().toString() << std::endl; + peers[i]->getAddress().toString() << " " << + peers[i]->getUserVersion() << std::endl; } } else if (str == "listban") diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp index 43f1c198d..d521bbeaa 100644 --- a/src/network/protocols/client_lobby.cpp +++ b/src/network/protocols/client_lobby.cpp @@ -300,7 +300,8 @@ void ClientLobby::update(int ticks) { NetworkString* ns = getNetworkString(); ns->addUInt8(LE_CONNECTION_REQUESTED) - .addUInt32(ServerConfig::m_server_version); + .addUInt32(ServerConfig::m_server_version) + .encodeString(StringUtils::getUserAgentString()); auto all_k = kart_properties_manager->getAllAvailableKarts(); auto all_t = track_manager->getAllTrackIdentifiers(); diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 0113ac9bb..b4547a45d 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -1362,6 +1362,9 @@ void ServerLobby::connectionRequested(Event* event) Log::verbose("ServerLobby", "Player refused: wrong server version"); return; } + std::string user_version; + data.decodeString(&user_version); + event->getPeer()->setUserVersion(user_version); std::set client_karts, client_tracks; const unsigned kart_num = data.getUInt16(); @@ -1615,9 +1618,10 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, { m_game_setup->addPlayer(npp); Log::info("ServerLobby", - "New player %s with online id %u from %s.", + "New player %s with online id %u from %s with %s.", StringUtils::wideToUtf8(npp->getName()).c_str(), - npp->getOnlineId(), peer->getAddress().toString().c_str()); + npp->getOnlineId(), peer->getAddress().toString().c_str(), + peer->getUserVersion().c_str()); } updatePlayerList(); peer->sendPacket(message_ack); diff --git a/src/network/stk_peer.hpp b/src/network/stk_peer.hpp index a6b931ef3..0d6df2434 100644 --- a/src/network/stk_peer.hpp +++ b/src/network/stk_peer.hpp @@ -35,6 +35,7 @@ #include #include #include +#include #include class Crypto; @@ -91,6 +92,8 @@ protected: std::set m_available_kart_ids; + std::string m_user_version; + public: STKPeer(ENetPeer *enet_peer, STKHost* host, uint32_t host_id); // ------------------------------------------------------------------------ @@ -190,6 +193,11 @@ public: // ------------------------------------------------------------------------ bool availableKartID(unsigned id) { return m_available_kart_ids.find(id) != m_available_kart_ids.end(); } + // ------------------------------------------------------------------------ + void setUserVersion(const std::string& uv) { m_user_version = uv; } + // ------------------------------------------------------------------------ + const std::string& getUserVersion() const { return m_user_version; } + }; // STKPeer #endif // STK_PEER_HPP diff --git a/src/online/http_request.cpp b/src/online/http_request.cpp index efd95892f..cd6e8556c 100644 --- a/src/online/http_request.cpp +++ b/src/online/http_request.cpp @@ -276,20 +276,7 @@ namespace Online } // end log http request curl_easy_setopt(m_curl_session, CURLOPT_POSTFIELDS, m_parameters.c_str()); - std::string uagent( std::string("SuperTuxKart/") + STK_VERSION ); - #ifdef WIN32 - uagent += (std::string)" (Windows)"; - #elif defined(__APPLE__) - uagent += (std::string)" (Macintosh)"; - #elif defined(__FreeBSD__) - uagent += (std::string)" (FreeBSD)"; - #elif defined(ANDROID) - uagent += (std::string)" (Android)"; - #elif defined(linux) - uagent += (std::string)" (Linux)"; - #else - // Unknown system type - #endif + const std::string& uagent = StringUtils::getUserAgentString(); curl_easy_setopt(m_curl_session, CURLOPT_USERAGENT, uagent.c_str()); m_curl_code = curl_easy_perform(m_curl_session); diff --git a/src/utils/string_utils.hpp b/src/utils/string_utils.hpp index 2c01365e9..df22507b2 100644 --- a/src/utils/string_utils.hpp +++ b/src/utils/string_utils.hpp @@ -26,6 +26,7 @@ #include #include #include +#include "utils/constants.hpp" #include "utils/types.hpp" #include "utils/log.hpp" @@ -245,7 +246,24 @@ namespace StringUtils std::string wideToUtf8(const irr::core::stringw& input); std::string findAndReplace(const std::string& source, const std::string& find, const std::string& replace); std::string removeWhitespaces(const std::string& input); - + inline std::string getUserAgentString() + { + std::string uagent(std::string("SuperTuxKart/") + STK_VERSION); +#ifdef WIN32 + uagent += (std::string)" (Windows)"; +#elif defined(__APPLE__) + uagent += (std::string)" (Macintosh)"; +#elif defined(__FreeBSD__) + uagent += (std::string)" (FreeBSD)"; +#elif defined(ANDROID) + uagent += (std::string)" (Android)"; +#elif defined(linux) + uagent += (std::string)" (Linux)"; +#else + // Unknown system type +#endif + return uagent; + } } // namespace StringUtils #endif From bbb618fe6bf8bcec445adb5d1b082e48b45a111c Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 16:09:49 +0800 Subject: [PATCH 027/140] Write to a dummy blocks instead of out of bounds pointer for AES --- src/network/crypto_openssl.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/network/crypto_openssl.cpp b/src/network/crypto_openssl.cpp index 23adab48b..84c3dcf51 100644 --- a/src/network/crypto_openssl.cpp +++ b/src/network/crypto_openssl.cpp @@ -26,6 +26,12 @@ #include #include +// ============================================================================ +// AES GCM modes never writes anything when finalize, it only handles the tag +// authentication, so we write to this dummy block instead of out of bounds +// pointer, and AES GCM mode has the same ciphertext and plaintext size due to +// block cipher in stream cipher mode. +std::array unused_16_blocks; // ============================================================================ std::string Crypto::base64(const std::vector& input) { @@ -85,7 +91,7 @@ bool Crypto::encryptConnectionRequest(BareNetworkString& ns) if (EVP_EncryptUpdate(m_encrypt, cipher.data() + 4, &elen, ns.m_buffer.data(), (int)ns.m_buffer.size()) != 1) return false; - if (EVP_EncryptFinal_ex(m_encrypt, cipher.data() + 4 + elen, &elen) != 1) + if (EVP_EncryptFinal_ex(m_encrypt, unused_16_blocks.data(), &elen) != 1) return false; if (EVP_CIPHER_CTX_ctrl(m_encrypt, EVP_CTRL_GCM_GET_TAG, 4, cipher.data()) != 1) @@ -112,7 +118,7 @@ bool Crypto::decryptConnectionRequest(BareNetworkString& ns) (int)(ns.m_buffer.size() - 4)) != 1) return false; - if (EVP_DecryptFinal_ex(m_decrypt, pt.data() + dlen, &dlen) > 0) + if (EVP_DecryptFinal_ex(m_decrypt, unused_16_blocks.data(), &dlen) > 0) { assert(dlen == 0); std::swap(ns.m_buffer, pt); @@ -153,7 +159,7 @@ ENetPacket* Crypto::encryptSend(BareNetworkString& ns, bool reliable) enet_packet_destroy(p); return NULL; } - if (EVP_EncryptFinal_ex(m_encrypt, packet_start, &elen) != 1) + if (EVP_EncryptFinal_ex(m_encrypt, unused_16_blocks.data(), &elen) != 1) { enet_packet_destroy(p); return NULL; @@ -195,7 +201,7 @@ NetworkString* Crypto::decryptRecieve(ENetPacket* p) { throw std::runtime_error("Failed to decrypt."); } - if (EVP_DecryptFinal_ex(m_decrypt, ns->m_buffer.data() + dlen, &dlen) > 0) + if (EVP_DecryptFinal_ex(m_decrypt, unused_16_blocks.data(), &dlen) > 0) { assert(dlen == 0); NetworkString* result = ns.get(); From 211def77a6b9110a514cee4dbf6ad47c3a3eca9a Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 16:36:01 +0800 Subject: [PATCH 028/140] Make sure no IV is duplicated and allow using 32bit counter completely --- src/network/crypto_nettle.cpp | 22 +++++++++++++++------- src/network/crypto_nettle.hpp | 4 ++-- src/network/crypto_openssl.cpp | 22 +++++++++++++++------- src/network/crypto_openssl.hpp | 4 ++-- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/network/crypto_nettle.cpp b/src/network/crypto_nettle.cpp index d8327fd7a..ac283358f 100644 --- a/src/network/crypto_nettle.cpp +++ b/src/network/crypto_nettle.cpp @@ -108,11 +108,15 @@ ENetPacket* Crypto::encryptSend(BareNetworkString& ns, bool reliable) if (p == NULL) return NULL; - std::array iv = m_iv; + std::array iv = {}; std::unique_lock ul(m_crypto_mutex); - uint32_t val = NetworkConfig::get()->isClient() ? - m_packet_counter++ : m_packet_counter--; - memcpy(iv.data(), &val, 4); + + uint32_t val = ++m_packet_counter; + if (NetworkConfig::get()->isClient()) + memcpy(iv.data(), &val, 4); + else + memcpy(iv.data() + 4, &val, 4); + uint8_t* packet_start = p->data + 8; gcm_aes128_set_iv(&m_aes_context, 12, iv.data()); @@ -121,7 +125,7 @@ ENetPacket* Crypto::encryptSend(BareNetworkString& ns, bool reliable) gcm_aes128_digest(&m_aes_context, 4, p->data + 4); ul.unlock(); - memcpy(p->data, iv.data(), 4); + memcpy(p->data, &val, 4); return p; } // encryptSend @@ -131,8 +135,12 @@ NetworkString* Crypto::decryptRecieve(ENetPacket* p) int clen = (int)(p->dataLength - 8); auto ns = std::unique_ptr(new NetworkString(p->data, clen)); - std::array iv = m_iv; - memcpy(iv.data(), p->data, 4); + std::array iv = {}; + if (NetworkConfig::get()->isClient()) + memcpy(iv.data() + 4, p->data, 4); + else + memcpy(iv.data(), p->data, 4); + uint8_t* packet_start = p->data + 8; uint8_t* tag = p->data + 4; std::array tag_after = {}; diff --git a/src/network/crypto_nettle.hpp b/src/network/crypto_nettle.hpp index d867f0ff7..dca273f94 100644 --- a/src/network/crypto_nettle.hpp +++ b/src/network/crypto_nettle.hpp @@ -95,7 +95,7 @@ public: assert(!m_client_iv.empty()); auto c = std::unique_ptr(new Crypto(decode64(m_client_key), decode64(m_client_iv))); - c->m_packet_counter = 1; + c->m_packet_counter = 0; return c; } // ------------------------------------------------------------------------ @@ -131,7 +131,7 @@ public: assert(key.size() == 16); assert(iv.size() == 12); std::copy_n(iv.begin(), 12, m_iv.begin()); - m_packet_counter = (uint32_t)-1; + m_packet_counter = 0; gcm_aes128_set_key(&m_aes_context, key.data()); gcm_aes128_set_iv(&m_aes_context, 12, iv.data()); } diff --git a/src/network/crypto_openssl.cpp b/src/network/crypto_openssl.cpp index 84c3dcf51..0198958f7 100644 --- a/src/network/crypto_openssl.cpp +++ b/src/network/crypto_openssl.cpp @@ -139,11 +139,15 @@ ENetPacket* Crypto::encryptSend(BareNetworkString& ns, bool reliable) if (p == NULL) return NULL; - std::array iv = m_iv; + std::array iv = {}; std::unique_lock ul(m_crypto_mutex); - uint32_t val = NetworkConfig::get()->isClient() ? - m_packet_counter++ : m_packet_counter--; - memcpy(iv.data(), &val, 4); + + uint32_t val = ++m_packet_counter; + if (NetworkConfig::get()->isClient()) + memcpy(iv.data(), &val, 4); + else + memcpy(iv.data() + 4, &val, 4); + uint8_t* packet_start = p->data + 8; if (EVP_EncryptInit_ex(m_encrypt, NULL, NULL, NULL, iv.data()) != 1) @@ -172,7 +176,7 @@ ENetPacket* Crypto::encryptSend(BareNetworkString& ns, bool reliable) } ul.unlock(); - memcpy(p->data, iv.data(), 4); + memcpy(p->data, &val, 4); return p; } // encryptSend @@ -182,8 +186,12 @@ NetworkString* Crypto::decryptRecieve(ENetPacket* p) int clen = (int)(p->dataLength - 8); auto ns = std::unique_ptr(new NetworkString(p->data, clen)); - std::array iv = m_iv; - memcpy(iv.data(), p->data, 4); + std::array iv = {}; + if (NetworkConfig::get()->isClient()) + memcpy(iv.data() + 4, p->data, 4); + else + memcpy(iv.data(), p->data, 4); + uint8_t* packet_start = p->data + 8; uint8_t* tag = p->data + 4; if (EVP_DecryptInit_ex(m_decrypt, NULL, NULL, NULL, iv.data()) != 1) diff --git a/src/network/crypto_openssl.hpp b/src/network/crypto_openssl.hpp index 3a9d560ad..e665c5895 100644 --- a/src/network/crypto_openssl.hpp +++ b/src/network/crypto_openssl.hpp @@ -87,7 +87,7 @@ public: assert(!m_client_iv.empty()); auto c = std::unique_ptr(new Crypto(decode64(m_client_key), decode64(m_client_iv))); - c->m_packet_counter = 1; + c->m_packet_counter = 0; return c; } // ------------------------------------------------------------------------ @@ -128,7 +128,7 @@ public: assert(key.size() == 16); assert(iv.size() == 12); std::copy_n(iv.begin(), 12, m_iv.begin()); - m_packet_counter = (uint32_t)-1; + m_packet_counter = 0; m_encrypt = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX_init(m_encrypt); EVP_EncryptInit_ex(m_encrypt, EVP_aes_128_gcm(), NULL, key.data(), From 28511c597ee5185ecb0651b651a61850a3c78880 Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 22:43:35 +0800 Subject: [PATCH 029/140] Remove compiler warning --- src/karts/kart.cpp | 3 ++- src/states_screens/tracks_screen.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index d32e0c44d..17b3c2dee 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -1830,7 +1830,8 @@ void Kart::setSquash(float time, float slowdown) */ bool Kart::isSquashed() const { - return m_max_speed->isSpeedDecreaseActive(MaxSpeed::MS_DECREASE_SQUASH); + return + m_max_speed->isSpeedDecreaseActive(MaxSpeed::MS_DECREASE_SQUASH) == 1; } // setSquash //----------------------------------------------------------------------------- diff --git a/src/states_screens/tracks_screen.cpp b/src/states_screens/tracks_screen.cpp index 6c3c266af..7054a71b9 100644 --- a/src/states_screens/tracks_screen.cpp +++ b/src/states_screens/tracks_screen.cpp @@ -484,7 +484,8 @@ void TracksScreen::onUpdate(float dt) } m_votes->setVisible(true); - int remaining_time = (m_vote_timeout - StkTime::getRealTimeMs()) / 1000; + int remaining_time = (int) + ((int64_t)m_vote_timeout - (int64_t)StkTime::getRealTimeMs()) / 1000; if (remaining_time < 0) remaining_time = 0; //I18N: In tracks screen, about voting of tracks in network From 0c7475c6cf6a93d72a79e8bf8c42772bfca3928b Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 15 Sep 2018 23:06:28 +0800 Subject: [PATCH 030/140] Handle linebreaking from motd if needed --- src/network/protocols/client_lobby.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp index d521bbeaa..864fa91c4 100644 --- a/src/network/protocols/client_lobby.cpp +++ b/src/network/protocols/client_lobby.cpp @@ -636,9 +636,13 @@ void ClientLobby::handleServerInfo(Event* event) // MOTD core::stringw motd; data.decodeString16(&motd); - if (!motd.empty()) - NetworkingLobby::getInstance()->addMoreServerInfo(motd); - + const std::vector& motd_line = StringUtils::split(motd, + '\n'); + if (!motd_line.empty()) + { + for (const core::stringw& motd : motd_line) + NetworkingLobby::getInstance()->addMoreServerInfo(motd); + } } // handleServerInfo //----------------------------------------------------------------------------- From 78e592bfbf9a75b831409707997f6abe5ceafe4b Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Sat, 15 Sep 2018 18:27:49 +0200 Subject: [PATCH 031/140] Add disable button --- data/gui/options_device.stkgui | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/data/gui/options_device.stkgui b/data/gui/options_device.stkgui index 652dfd621..9b6d1f2d1 100644 --- a/data/gui/options_device.stkgui +++ b/data/gui/options_device.stkgui @@ -32,22 +32,24 @@ - + -
- +
- + -
-
- - -
+
+ + +
- + -
-
- - -
- - - -
- - -
+
+ + +
- + -
-
- - -
+
+ + +
- + + +
+ + +
+ + -
- - -
+
+ + +
- + -
-
- - -
- - - -
- - -
+
+ + +
- + + +
+ + +
+ +
From c22403f080c012a1d66647e38061c6f9a295be5a Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Sun, 16 Sep 2018 01:36:43 +0200 Subject: [PATCH 045/140] Fix #3448 --- data/kart_characteristics.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/kart_characteristics.xml b/data/kart_characteristics.xml index f8ff73651..e31227f7c 100644 --- a/data/kart_characteristics.xml +++ b/data/kart_characteristics.xml @@ -404,12 +404,12 @@ - + - + Date: Sun, 16 Sep 2018 01:50:39 +0200 Subject: [PATCH 046/140] Fix #3445 --- src/states_screens/addons_screen.cpp | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/src/states_screens/addons_screen.cpp b/src/states_screens/addons_screen.cpp index cc4f063b1..0a2158422 100644 --- a/src/states_screens/addons_screen.cpp +++ b/src/states_screens/addons_screen.cpp @@ -133,26 +133,6 @@ void AddonsScreen::beforeAddingWidget() { w_filter_rating->addLabel(StringUtils::toWString(n / 2.0)); } - - - GUIEngine::LabelWidget *w_tips = - getWidget("tips_label"); - bool ip = UserConfigParams::m_internet_status == RequestManager::IPERM_ALLOWED; - if(!ip) - { - w_tips->setVisible(true); - - w_tips->setText( _("Access to the Internet is disabled. " - "(To enable it, go to options and " - "select tab 'User Interface')"), - false); - - w_tips->m_properties[GUIEngine::PROP_HEIGHT] = "fit"; - calculateLayout(); - - m_show_tips = true; - } - } // ---------------------------------------------------------------------------- @@ -178,7 +158,9 @@ void AddonsScreen::init() m_type = "kart"; bool ip = UserConfigParams::m_internet_status == RequestManager::IPERM_ALLOWED; - if(ip) + //TODO : determine if the tips scrolling could be used + // to display other useful messages or if it should be removed + if(true) { // Nothing to show in the tips label, disable it. From 1fc58ef445bc25533e4dab828cccd91a56245663 Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Sun, 16 Sep 2018 03:37:26 +0200 Subject: [PATCH 047/140] Fix #3434 --- src/states_screens/dialogs/registration_dialog.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/states_screens/dialogs/registration_dialog.cpp b/src/states_screens/dialogs/registration_dialog.cpp index 1ec7b325f..878131dfd 100644 --- a/src/states_screens/dialogs/registration_dialog.cpp +++ b/src/states_screens/dialogs/registration_dialog.cpp @@ -42,8 +42,7 @@ RegistrationDialog::RegistrationDialog() : core::stringw terms = _(L"Please read the terms and conditions " L"for SuperTuxKart at '%s'. You must agree " L"to these terms in order to register an account for STK. " - L"By checking the box below, you are confirming that you understand " - L"these terms. If you have any questions or comments regarding these " + L"If you have any questions or comments regarding these " L"terms, one of the members of the development team would gladly " L"assist you.", L"http://terms.supertuxkart.net"); From 21857327d4fee3face5b35819f0724d35000f62f Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Sun, 16 Sep 2018 04:53:39 +0200 Subject: [PATCH 048/140] Improvement for #3441 --- data/gui/tracks.stkgui | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/data/gui/tracks.stkgui b/data/gui/tracks.stkgui index 40013ce52..7ad758a66 100644 --- a/data/gui/tracks.stkgui +++ b/data/gui/tracks.stkgui @@ -19,22 +19,18 @@
-
-
From 07e681e927a3ca8e4a19c4ea2d6c2950e0ee212e Mon Sep 17 00:00:00 2001 From: Alayan-stk-2 Date: Sun, 16 Sep 2018 05:42:39 +0200 Subject: [PATCH 049/140] Minor improvement to the help text --- data/gui/help1.stkgui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/gui/help1.stkgui b/data/gui/help1.stkgui index ba35d5b3b..119c5b735 100644 --- a/data/gui/help1.stkgui +++ b/data/gui/help1.stkgui @@ -54,7 +54,7 @@ + text="Collecting nitro allows you to get speed boosts whenever you wish by pressing the appropriate key or button. You can see your current level of nitro in the gauge at the bottom-right of the race screen."/>
@@ -70,7 +70,7 @@ + text="You can skid by pressing a special key or button. Short skids help to take sharp turns. If you skid long enough, you will get a boost. You can't stop turning while skidding, so orient your kart carefully before!"/>
From 2c35b0f03c6562947acdd632e58ece4257bc8485 Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Sep 2018 12:26:34 +0800 Subject: [PATCH 050/140] Allow using --connect-now with wan server with server-id --- src/guiengine/widgets/model_view_widget.cpp | 3 +- src/main.cpp | 53 ++++++++++++++------- src/network/protocols/connect_to_server.hpp | 2 +- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/guiengine/widgets/model_view_widget.cpp b/src/guiengine/widgets/model_view_widget.cpp index df93cccf7..1570c3f68 100644 --- a/src/guiengine/widgets/model_view_widget.cpp +++ b/src/guiengine/widgets/model_view_widget.cpp @@ -22,6 +22,7 @@ #include "guiengine/widgets/model_view_widget.hpp" #include "graphics/irr_driver.hpp" #include "graphics/render_target.hpp" +#include "modes/profile_world.hpp" #include #include @@ -55,7 +56,7 @@ m_rtt_size(rtt_size) // so that the base class doesn't complain there is no icon defined m_properties[PROP_ICON]="gui/main_help.png"; - m_rtt_unsupported = false; + m_rtt_unsupported = ProfileWorld::isNoGraphics(); } // ModelViewWidget // ----------------------------------------------------------------------------- diff --git a/src/main.cpp b/src/main.cpp index 9a7f73d8e..1f29c20fb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -224,6 +224,7 @@ #include "network/server_config.hpp" #include "network/servers_manager.hpp" #include "network/stk_host.hpp" +#include "network/stk_peer.hpp" #include "online/profile_manager.hpp" #include "online/request_manager.hpp" #include "race/grand_prix_manager.hpp" @@ -608,6 +609,7 @@ void cmdLineHelp() " --connect-now=ip Connect to a server with IP known now\n" " (in format x.x.x.x:xxx(port)), the port should be its\n" " public port.\n" + " --server-id=n Server id in stk addons for --connect-now.\n" " --login=s Automatically log in (set the login).\n" " --password=s Automatically log in (set the password).\n" " --init-user Save the above login and password (if set) in config.\n" @@ -1243,6 +1245,31 @@ int handleCmdLine(bool has_server_config, bool has_parent_process) { NetworkConfig::get()->setIsPublicServer(); } + + unsigned server_id = 0; + if ((NetworkConfig::get()->isServer() && ServerConfig::m_wan_server) || + CommandLine::has("--server-id", &server_id)) + { + PlayerProfile* player = PlayerManager::getCurrentPlayer(); + // Try to use saved user token if exists + if (!can_wan && player && player->wasOnlineLastTime() && + player->wasOnlineLastTime() && player->hasSavedSession()) + { + while (PlayerManager::getCurrentOnlineState() != + PlayerProfile::OS_SIGNED_IN) + { + Online::RequestManager::get()->update(0.0f); + StkTime::sleep(1); + } + can_wan = true; + } + else if (!can_wan) + { + Log::warn("main","No saved online player session to create " + "or connect to a wan server."); + } + } + if (CommandLine::has("--connect-now", &s)) { TransportAddress server_addr(s); @@ -1257,6 +1284,12 @@ int handleCmdLine(bool has_server_config, bool has_parent_process) STKHost::create(); auto cts = std::make_shared(server); cts->setup(); + if (server_id != 0) + { + server->setServerId(server_id); + server->setSupportsEncryption(true); + cts->registerWithSTKServer(); + } Log::info("main", "Trying to connect to server '%s'.", server_addr.toString().c_str()); if (!cts->tryConnect(2000, 15)) @@ -1268,6 +1301,8 @@ int handleCmdLine(bool has_server_config, bool has_parent_process) } else { + server_addr = + STKHost::get()->getServerPeerForClient()->getAddress(); auto cl = LobbyProtocol::create(server_addr, server); cl->requestStart(); } @@ -1278,24 +1313,6 @@ int handleCmdLine(bool has_server_config, bool has_parent_process) const std::string& server_name = ServerConfig::m_server_name; if (ServerConfig::m_wan_server) { - PlayerProfile* player = PlayerManager::getCurrentPlayer(); - // Try to use saved user token if exists - if (!can_wan && player && player->wasOnlineLastTime() && - player->wasOnlineLastTime() && player->hasSavedSession()) - { - while (PlayerManager::getCurrentOnlineState() != - PlayerProfile::OS_SIGNED_IN) - { - Online::RequestManager::get()->update(0.0f); - StkTime::sleep(1); - } - can_wan = true; - } - else if (!can_wan) - { - Log::warn("main", - "No saved online player session to create a wan server"); - } if (can_wan) { // Server owner online account will keep online as long as diff --git a/src/network/protocols/connect_to_server.hpp b/src/network/protocols/connect_to_server.hpp index f99eacce9..4ffe1f239 100644 --- a/src/network/protocols/connect_to_server.hpp +++ b/src/network/protocols/connect_to_server.hpp @@ -44,7 +44,6 @@ private: std::atomic m_state; void getClientServerInfo(); - void registerWithSTKServer(); static TransportAddress m_server_address; static int interceptCallback(ENetHost* host, ENetEvent* event); static int m_retry_count; @@ -56,6 +55,7 @@ public: virtual void setup() OVERRIDE; virtual void asynchronousUpdate() OVERRIDE; virtual void update(int ticks) OVERRIDE; + void registerWithSTKServer(); bool tryConnect(int timeout, int retry, bool another_port = false); }; // class ConnectToServer From b3bffacb40fac9eb16c4d50f824e0f945bb3f7d8 Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Sep 2018 17:58:00 +0800 Subject: [PATCH 051/140] Add network ai tester for linear race --- sources.cmake | 2 +- src/karts/controller/ai_base_controller.cpp | 1 + src/karts/controller/ai_base_controller.hpp | 2 + src/karts/controller/controller.hpp | 2 + .../controller/network_ai_controller.cpp | 122 ++++++++++++++++++ .../controller/network_ai_controller.hpp | 42 ++++++ src/karts/controller/skidding_ai.cpp | 19 ++- src/main.cpp | 24 +++- src/modes/world.cpp | 22 +++- src/network/network_config.cpp | 1 + src/network/network_config.hpp | 13 +- 11 files changed, 233 insertions(+), 17 deletions(-) create mode 100644 src/karts/controller/network_ai_controller.cpp create mode 100644 src/karts/controller/network_ai_controller.hpp diff --git a/sources.cmake b/sources.cmake index d4f28ae4d..ba4868d71 100644 --- a/sources.cmake +++ b/sources.cmake @@ -1,5 +1,5 @@ # Modify this file to change the last-modified date when you add/remove a file. -# This will then trigger a new cmake run automatically. +# This will then trigger a new cmake run automatically. file(GLOB_RECURSE STK_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.hpp") file(GLOB_RECURSE STK_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp") file(GLOB_RECURSE STK_SHADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "data/shaders/*") diff --git a/src/karts/controller/ai_base_controller.cpp b/src/karts/controller/ai_base_controller.cpp index d17e60e0f..259461797 100644 --- a/src/karts/controller/ai_base_controller.cpp +++ b/src/karts/controller/ai_base_controller.cpp @@ -48,6 +48,7 @@ AIBaseController::AIBaseController(AbstractKart *kart) void AIBaseController::reset() { + m_enabled_network_ai = false; m_stuck = false; m_collision_ticks.clear(); } // reset diff --git a/src/karts/controller/ai_base_controller.hpp b/src/karts/controller/ai_base_controller.hpp index 0c0f2e8a2..a244c347f 100644 --- a/src/karts/controller/ai_base_controller.hpp +++ b/src/karts/controller/ai_base_controller.hpp @@ -43,6 +43,7 @@ private: bool m_stuck; protected: + bool m_enabled_network_ai; /** Length of the kart, storing it here saves many function calls. */ float m_kart_length; @@ -106,6 +107,7 @@ public: // ------------------------------------------------------------------------ virtual void saveState(BareNetworkString *buffer) const OVERRIDE; virtual void rewindTo(BareNetworkString *buffer) OVERRIDE; + void setNetworkAI(bool val) { m_enabled_network_ai = val; } }; // AIBaseController diff --git a/src/karts/controller/controller.hpp b/src/karts/controller/controller.hpp index f2358a373..6a74de144 100644 --- a/src/karts/controller/controller.hpp +++ b/src/karts/controller/controller.hpp @@ -103,6 +103,8 @@ public: /** Get a pointer on the kart controls. */ virtual KartControl* getControls() { return m_controls; } // ------------------------------------------------------------------------ + void setControls(KartControl* kc) { m_controls = kc; } + // ------------------------------------------------------------------------ /** Only local players can get achievements. */ virtual bool canGetAchievements () const { return false; } // ------------------------------------------------------------------------ diff --git a/src/karts/controller/network_ai_controller.cpp b/src/karts/controller/network_ai_controller.cpp new file mode 100644 index 000000000..60ed43285 --- /dev/null +++ b/src/karts/controller/network_ai_controller.cpp @@ -0,0 +1,122 @@ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2018 SuperTuxKart-Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "karts/controller/network_ai_controller.hpp" +#include "graphics/camera.hpp" +#include "karts/abstract_kart.hpp" +#include "karts/controller/kart_control.hpp" +#include "karts/controller/skidding_ai.hpp" +#include "modes/world.hpp" +#include "network/protocols/game_protocol.hpp" +#include "network/network_config.hpp" +#include "network/rewind_manager.hpp" + +// ============================================================================ +const int UPDATE_FREQUENCY = 30; +// ---------------------------------------------------------------------------- +NetworkAIController::NetworkAIController(AbstractKart *kart, + int local_player_id, + SkiddingAI* ai) + : PlayerController(kart) +{ + m_ai_controller = ai; + m_ai_controls = new KartControl; + Camera::createCamera(kart, local_player_id); + ai->setControls(m_ai_controls); +} // NetworkAIController + +// ---------------------------------------------------------------------------- +NetworkAIController::~NetworkAIController() +{ + delete m_ai_controls; +} // ~NetworkAIController + +// ---------------------------------------------------------------------------- +void NetworkAIController::update(int ticks) +{ + if (!RewindManager::get()->isRewinding()) + { + if (World::getWorld()->isStartPhase() || + World::getWorld()->getTicksSinceStart() > m_prev_update_ticks) + { + m_prev_update_ticks = World::getWorld()->getTicksSinceStart() + + UPDATE_FREQUENCY; + m_ai_controller->update(UPDATE_FREQUENCY); + convertAIToPlayerActions(); + } + } + PlayerController::update(ticks); +} // update + +// ---------------------------------------------------------------------------- +void NetworkAIController::reset() +{ + m_prev_update_ticks = 0; + m_ai_controller->reset(); + m_ai_controller->setNetworkAI(true); + m_ai_controls->reset(); + PlayerController::reset(); +} // reset + +// ---------------------------------------------------------------------------- +void NetworkAIController::convertAIToPlayerActions() +{ + std::vector > all_actions; + if (m_ai_controls->getSteer() < 0.0f) + { + all_actions.emplace_back(PA_STEER_LEFT, + fabsf(m_ai_controls->getSteer()) * 32768); + } + else + { + all_actions.emplace_back(PA_STEER_RIGHT, + fabsf(m_ai_controls->getSteer()) * 32768); + } + all_actions.emplace_back(PA_ACCEL, + m_ai_controls->getAccel() * 32768); + all_actions.emplace_back(PA_BRAKE, + m_ai_controls->getBrake() ? 32768 : 0); + all_actions.emplace_back(PA_FIRE, + m_ai_controls->getFire() ? 32768 : 0); + all_actions.emplace_back(PA_NITRO, + m_ai_controls->getNitro() ? 32768 : 0); + all_actions.emplace_back(PA_DRIFT, + m_ai_controls->getSkidControl() == KartControl::SC_NONE ? + 0 : 32768); + all_actions.emplace_back(PA_RESCUE, + m_ai_controls->getRescue() ? 32768 : 0); + + for (const auto& a : all_actions) + { + if (!PlayerController::action(a.first, a.second, /*dry_run*/true)) + continue; + + if (NetworkConfig::get()->isNetworking() && + NetworkConfig::get()->isClient() && + !RewindManager::get()->isRewinding()) + { + if (auto gp = GameProtocol::lock()) + { + gp->controllerAction(m_kart->getWorldKartId(), + a.first, a.second, + m_steer_val_l, m_steer_val_r); + } + } + PlayerController::action(a.first, a.second, false); + } +} // convertAIToPlayerActions diff --git a/src/karts/controller/network_ai_controller.hpp b/src/karts/controller/network_ai_controller.hpp new file mode 100644 index 000000000..179dd523c --- /dev/null +++ b/src/karts/controller/network_ai_controller.hpp @@ -0,0 +1,42 @@ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2018 SuperTuxKart-Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef HEADER_NETWORK_AI_CONTROLLER_HPP +#define HEADER_NETWORK_AI_CONTROLLER_HPP + +#include "karts/controller/player_controller.hpp" + +class AbstractKart; +class SkiddingAI; + +class NetworkAIController : public PlayerController +{ +private: + int m_prev_update_ticks; + SkiddingAI* m_ai_controller; + KartControl* m_ai_controls; + void convertAIToPlayerActions(); +public: + NetworkAIController(AbstractKart *kart, int local_player_id, + SkiddingAI* ai); + virtual ~NetworkAIController(); + virtual void update(int ticks) OVERRIDE; + virtual void reset() OVERRIDE; +}; // class NetworkAIController + +#endif // HEADER_PLAYER_CONTROLLER_HPP diff --git a/src/karts/controller/skidding_ai.cpp b/src/karts/controller/skidding_ai.cpp index cc518e761..fb1b1cf08 100644 --- a/src/karts/controller/skidding_ai.cpp +++ b/src/karts/controller/skidding_ai.cpp @@ -221,6 +221,8 @@ unsigned int SkiddingAI::getNextSector(unsigned int index) void SkiddingAI::update(int ticks) { float dt = stk_config->ticks2Time(ticks); + m_controls->setRescue(false); + // This is used to enable firing an item backwards. m_controls->setLookBack(false); m_controls->setNitro(false); @@ -293,7 +295,11 @@ void SkiddingAI::update(int ticks) // If the kart needs to be rescued, do it now (and nothing else) if(isStuck() && !m_kart->getKartAnimation()) { - new RescueAnimation(m_kart); + // For network AI controller + if (m_enabled_network_ai) + m_controls->setRescue(true); + else + new RescueAnimation(m_kart); AIBaseLapController::update(ticks); return; } @@ -2085,6 +2091,11 @@ void SkiddingAI::handleRaceStart() { if( m_start_delay < 0 ) { + if (m_enabled_network_ai) + { + m_start_delay = 0; + return; + } // Each kart starts at a different, random time, and the time is // smaller depending on the difficulty. m_start_delay = stk_config->time2Ticks( @@ -2122,7 +2133,11 @@ void SkiddingAI::handleRescue(const float dt) m_time_since_stuck += dt; if(m_time_since_stuck > 2.0f) { - new RescueAnimation(m_kart); + // For network AI controller + if (m_enabled_network_ai) + m_controls->setRescue(true); + else + new RescueAnimation(m_kart); m_time_since_stuck=0.0f; } // m_time_since_stuck > 2.0f } diff --git a/src/main.cpp b/src/main.cpp index 1f29c20fb..dfef34733 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -610,6 +610,8 @@ void cmdLineHelp() " (in format x.x.x.x:xxx(port)), the port should be its\n" " public port.\n" " --server-id=n Server id in stk addons for --connect-now.\n" + " --network-ai=n Numbers of AI for connecting to linear race server, used\n" + " together with --connect-now.\n" " --login=s Automatically log in (set the login).\n" " --password=s Automatically log in (set the password).\n" " --init-user Save the above login and password (if set) in config.\n" @@ -1272,14 +1274,28 @@ int handleCmdLine(bool has_server_config, bool has_parent_process) if (CommandLine::has("--connect-now", &s)) { - TransportAddress server_addr(s); NetworkConfig::get()->setIsWAN(); NetworkConfig::get()->setIsServer(false); + if (CommandLine::has("--network-ai", &n)) + { + NetworkConfig::get()->setNetworkAITester(true); + PlayerManager::get()->createGuestPlayers(n); + for (int i = 0; i < n; i++) + { + NetworkConfig::get()->addNetworkPlayer( + NULL, PlayerManager::get()->getPlayer(i), + PLAYER_DIFFICULTY_NORMAL); + } + } + else + { + NetworkConfig::get()->addNetworkPlayer( + input_manager->getDeviceManager()->getLatestUsedDevice(), + PlayerManager::getCurrentPlayer(), PLAYER_DIFFICULTY_NORMAL); + } + TransportAddress server_addr(s); auto server = std::make_shared(0, L"", 0, 0, 0, 0, server_addr, !server_password.empty(), false); - NetworkConfig::get()->addNetworkPlayer( - input_manager->getDeviceManager()->getLatestUsedDevice(), - PlayerManager::getCurrentPlayer(), PLAYER_DIFFICULTY_NORMAL); NetworkConfig::get()->doneAddingNetworkPlayers(); STKHost::create(); auto cts = std::make_shared(server); diff --git a/src/modes/world.cpp b/src/modes/world.cpp index 07de4475f..d12c7c56b 100644 --- a/src/modes/world.cpp +++ b/src/modes/world.cpp @@ -44,6 +44,7 @@ #include "karts/controller/soccer_ai.hpp" #include "karts/controller/spare_tire_ai.hpp" #include "karts/controller/test_ai.hpp" +#include "karts/controller/network_ai_controller.hpp" #include "karts/controller/network_player_controller.hpp" #include "karts/kart.hpp" #include "karts/kart_model.hpp" @@ -387,15 +388,22 @@ std::shared_ptr World::createKart { case RaceManager::KT_PLAYER: { - controller = new LocalPlayerController(new_kart.get(), local_player_id, - difficulty); - const PlayerProfile* p = StateManager::get() - ->getActivePlayer(local_player_id)->getConstProfile(); - if (p && p->getDefaultKartColor() > 0.0f) + if (NetworkConfig::get()->isNetworkAITester()) { - ri->setHue(p->getDefaultKartColor()); + controller = new NetworkAIController(new_kart.get(), + local_player_id, new SkiddingAI(new_kart.get())); + } + else + { + controller = new LocalPlayerController(new_kart.get(), + local_player_id, difficulty); + const PlayerProfile* p = StateManager::get() + ->getActivePlayer(local_player_id)->getConstProfile(); + if (p && p->getDefaultKartColor() > 0.0f) + { + ri->setHue(p->getDefaultKartColor()); + } } - m_num_players ++; break; } diff --git a/src/network/network_config.cpp b/src/network/network_config.cpp index f14723802..8dd5e2389 100644 --- a/src/network/network_config.cpp +++ b/src/network/network_config.cpp @@ -54,6 +54,7 @@ NetworkConfig::NetworkConfig() m_client_port = UserConfigParams::m_random_client_port ? 0 : stk_config->m_client_port; m_joined_server_version = 0; + m_network_ai_tester = false; } // NetworkConfig // ---------------------------------------------------------------------------- diff --git a/src/network/network_config.hpp b/src/network/network_config.hpp index 01523c251..3951e0f3b 100644 --- a/src/network/network_config.hpp +++ b/src/network/network_config.hpp @@ -65,14 +65,17 @@ private: /** True if this host is a server, false otherwise. */ bool m_is_server; - /** The LAN port on which a client is waiting for a server connection. */ - uint16_t m_client_port; /** True if a client should connect to the first server it finds and * immediately start a race. */ bool m_auto_connect; bool m_done_adding_network_players; + bool m_network_ai_tester; + + /** The LAN port on which a client is waiting for a server connection. */ + uint16_t m_client_port; + /** Used by wan server. */ uint32_t m_cur_user_id; std::string m_cur_user_token; @@ -154,7 +157,7 @@ public: { for (auto& p : m_network_players) { - if (std::get<0>(p) == device) + if (std::get<0>(p) == device && !m_network_ai_tester) return false; if (std::get<1>(p) == profile) return false; @@ -192,6 +195,10 @@ public: * requested. */ bool isAutoConnect() const { return m_auto_connect; } // ------------------------------------------------------------------------ + void setNetworkAITester(bool b) { m_network_ai_tester = b; } + // ------------------------------------------------------------------------ + bool isNetworkAITester() const { return m_network_ai_tester; } + // ------------------------------------------------------------------------ void setCurrentUserId(uint32_t id) { m_cur_user_id = id ; } // ------------------------------------------------------------------------ void setCurrentUserToken(const std::string& t) { m_cur_user_token = t; } From 8cb5e43bad8938eb256bb6b2b60e584c07a5c22e Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Sep 2018 19:19:42 +0800 Subject: [PATCH 052/140] Allow using --auto-connect with network ai tester --- src/karts/controller/network_ai_controller.cpp | 1 + src/network/protocols/client_lobby.cpp | 17 ++++++++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/karts/controller/network_ai_controller.cpp b/src/karts/controller/network_ai_controller.cpp index 60ed43285..0aba0979b 100644 --- a/src/karts/controller/network_ai_controller.cpp +++ b/src/karts/controller/network_ai_controller.cpp @@ -43,6 +43,7 @@ NetworkAIController::NetworkAIController(AbstractKart *kart, // ---------------------------------------------------------------------------- NetworkAIController::~NetworkAIController() { + delete m_ai_controller; delete m_ai_controls; } // ~NetworkAIController diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp index 864fa91c4..7d1fca44d 100644 --- a/src/network/protocols/client_lobby.cpp +++ b/src/network/protocols/client_lobby.cpp @@ -376,6 +376,14 @@ void ClientLobby::update(int ticks) break; case REQUESTING_CONNECTION: case CONNECTED: + if (STKHost::get()->isAuthorisedToControl() && + NetworkConfig::get()->isAutoConnect()) + { + // Send a message to the server to start + NetworkString start(PROTOCOL_LOBBY_ROOM); + start.addUInt8(LobbyProtocol::LE_REQUEST_BEGIN); + STKHost::get()->sendToServer(&start, true); + } case SELECTING_ASSETS: case RACING: case EXITING: @@ -709,15 +717,6 @@ void ClientLobby::handleBadConnection() void ClientLobby::becomingServerOwner() { STKHost::get()->setAuthorisedToControl(true); - if (m_state.load() == CONNECTED && NetworkConfig::get()->isAutoConnect()) - { - // Send a message to the server to start - NetworkString start(PROTOCOL_LOBBY_ROOM); - start.setSynchronous(true); - start.addUInt8(LobbyProtocol::LE_REQUEST_BEGIN); - STKHost::get()->sendToServer(&start, true); - } - if (STKHost::get()->isClientServer()) return; From f1057726add4130cc41d7fc92687b326f9c64cd0 Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Sep 2018 19:48:27 +0800 Subject: [PATCH 053/140] Log peer address who formed bad message --- src/network/protocol_manager.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/network/protocol_manager.cpp b/src/network/protocol_manager.cpp index c69054fd4..16b3be986 100644 --- a/src/network/protocol_manager.cpp +++ b/src/network/protocol_manager.cpp @@ -20,6 +20,7 @@ #include "network/event.hpp" #include "network/protocol.hpp" +#include "network/stk_peer.hpp" #include "utils/log.hpp" #include "utils/profiler.hpp" #include "utils/time.hpp" @@ -440,8 +441,9 @@ void ProtocolManager::update(int ticks) } catch (std::exception& e) { - Log::error("ProtocolManager", "Synchronous event error: %s", - e.what()); + const std::string& name = (*i)->getPeer()->getAddress().toString(); + Log::error("ProtocolManager", + "Synchronous event error from %s: %s", name.c_str(), e.what()); Log::error("ProtocolManager", (*i)->data().getLogMessage().c_str()); } m_sync_events_to_process.lock(); @@ -496,8 +498,9 @@ void ProtocolManager::asynchronousUpdate() } catch (std::exception& e) { - Log::error("ProtocolManager", "Asynchronous event error: %s", - e.what()); + const std::string& name = (*i)->getPeer()->getAddress().toString(); + Log::error("ProtocolManager", "Asynchronous event " + "error from %s: %s", name.c_str(), e.what()); Log::error("ProtocolManager", (*i)->data().getLogMessage().c_str()); } From 68d63263489c25c4c589f0b9807d9c73d4b306e3 Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Sep 2018 20:48:51 +0800 Subject: [PATCH 054/140] Update NETWORKING.md for network AI tester --- NETWORKING.md | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/NETWORKING.md b/NETWORKING.md index 3672ff036..41bdfaeac 100644 --- a/NETWORKING.md +++ b/NETWORKING.md @@ -1,6 +1,8 @@ # Online networking games for STK ## Hosting server +First of all, you can compile STK with `-DSERVER_ONLY=ON` which will produce a GUI-less STK binary optimized for size and memory usage, useful for situation like in VPS. + ### Hosting WAN (public internet) server You are required to have an stk online account first, go [here](https://addons.supertuxkart.net/register.php) for registration. @@ -36,7 +38,7 @@ The current server configuration xml looks like this: - + @@ -69,11 +71,11 @@ The current server configuration xml looks like this: - + - - + + @@ -123,16 +125,17 @@ The current server configuration xml looks like this: + ``` -At the moment STK has a list of STUN servers for NAT penetration which allows players or servers behind a firewall or router to make connectable to each other, but in case it doesn't work, you have to manually disable firewall / do a port-forward for the server port STK using. -By default STK uses `2759` for server port, for example in Ubuntu alike Linux distribution do the following to disable firewall on such port: +At the moment STK has a list of STUN servers for NAT penetration which allows players or servers behind a firewall or router to be able to connect to each other, but in case it doesn't work, you have to manually disable the firewall or port forward the port(s) used by the STK. +By default STK servers use port `2759`. For example, in Ubuntu based distributions, run the following command to disable the firewall on that port: `sudo ufw allow 2759` You may also need to handle the server discovery port `2757` for connecting your WAN server in LAN / localhost. -Notice: You don't need to make any firewall or router configuration if you connect to our official servers. +Notice: You don't need to make any firewall or router configuration changes if you connect to our official servers. ### Hosting LAN (local internet) server Everything is basically the same as WAN one, except you don't need an stk online account, just do: @@ -148,3 +151,21 @@ After the first time configuration, you can just start the server with the comma You can find out that directory location [here (See Where is the configuration stored?)](https://supertuxkart.net/FAQ) +## Testing server +There is a network AI tester in STK which can use AI on player controller for server hosting linear races game mode, which helps automating the testing for servers, to enable it use: + +`supertuxkart --connect-now=x.x.x.x:y --server-id=id --network-ai=n --auto-connect --no-graphics` + +x.x.x.x:y is your server ip address with its port, id is the id field of server-info in STK server xml list, omit it if you are testing LAN server, n is the number of AI you want to create. + +You can see STK server xml list [here](https://addons.supertuxkart.net/api/v2/server/get-all). + +The server you want to test must be able to be connected without NAT penetration. You can remove `--auto-connect` if you have another client which can control the starting of games in server, or you can consider enable owner-less mode on server so the games on server can keep going. Remove `--no-graphics` if you want to see the AI racing. You can also run network AI tester in server-only build of STK. + +With the network AI tester, it's easier to for example simulate high-loaded servers or bad (high ping with packet loss) network. + +Tested on a Raspberry Pi 3 Model B+, if you have 8 players connected to a server hosted on it, the CPU usage of STK is ~60% and there are ~60MB of memory usage for game with heavy tracks like Cocoa Temple or Candela City on the server, you can use the above figures to consider number of STK servers hosting on a same computer. + +For bad network simulation, we recommend `network traffic control` by linux kernel, see [here](https://wiki.linuxfoundation.org/networking/netem) for details. + +You have the best gaming experience when choosing server less than 100ms ping with no packet loss. From d663bb2caf77b32f1a3bffbcae4aedb4f23bc1f9 Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Sep 2018 22:01:08 +0800 Subject: [PATCH 055/140] Update german translation by Wuzzy --- data/po/de.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/data/po/de.po b/data/po/de.po index a03c3f490..850594157 100644 --- a/data/po/de.po +++ b/data/po/de.po @@ -1102,7 +1102,7 @@ msgstr "Nachdem die Eingabegeräte konfiguriert worden sind, wähle im Hauptmen #. I18N: ./data/gui/kart_color_slider.stkgui #. I18N: In the kart color slider dialog msgid "0 to use the original color, otherwise pick one from slider." -msgstr "0, um Ursprungsfarbe zu wählen, wähle ansonsten eine vom Schieberegler." +msgstr "0, um Originalfarbe zu wählen, wähle ansonsten eine vom Schieberegler." #. I18N: ./data/gui/karts.stkgui #. I18N: In the kart selection (player setup) screen @@ -1256,7 +1256,7 @@ msgstr "Passwort für privaten Server (optional)" #: src/states_screens/ghost_replay_selection.cpp:130 #: src/states_screens/server_selection.cpp:121 msgid "Difficulty" -msgstr "Schwierigkeitsgrad" +msgstr "Schwierigk." #. I18N: ./data/gui/online/create_server.stkgui #. I18N: Difficulty @@ -1398,7 +1398,7 @@ msgstr "Server finden" #. I18N: In the online multiplayer screen #: src/states_screens/create_server_screen.cpp:91 msgid "Create Server" -msgstr "Server Erstellen" +msgstr "Server erstellen" #. I18N: ./data/gui/online/lobby_settings.stkgui #. I18N: In the lobby settings screen @@ -1775,7 +1775,7 @@ msgstr "Ton" #. I18N: ./data/gui/user_screen_tab.stkgui #. I18N: Section in the settings menu msgid "User Interface" -msgstr "Benutzeroberfläche" +msgstr "Benutzer- oberfläche" #. I18N: ./data/gui/options_audio.stkgui #. I18N: Section in the settings menu @@ -1912,7 +1912,7 @@ msgstr "Bildrate anzeigen" #. I18N: ./data/gui/options_ui.stkgui #. I18N: In the ui settings msgid "Multiplayer splits screen horizontally" -msgstr "Mehrspieler teilt Bildschirm horizontal" +msgstr "Mehrspieler teilt Bildschirm horiz." #. I18N: ./data/gui/options_ui.stkgui #. I18N: In the ui settings @@ -1927,7 +1927,7 @@ msgstr "Mit dem Internet verbinden" #. I18N: ./data/gui/options_ui.stkgui #. I18N: In the ui settings msgid "Send anonymous hardware statistics" -msgstr "Anonyme Hardwarestatistiken senden" +msgstr "Anonyme HW-Statistiken senden" #. I18N: ./data/gui/options_ui.stkgui #. I18N: In the ui settings @@ -2136,7 +2136,7 @@ msgstr "Passwort speichern" #. I18N: ./data/gui/user_screen_tab.stkgui #. I18N: In the user screen msgid "Add user" -msgstr "Nutzer hinzufügen" +msgstr "Neuer Nutzer" #. I18N: ./data/gui/user_screen.stkgui #. I18N: In the user screen @@ -4782,7 +4782,7 @@ msgstr "Inhaber" #. I18N: In server selection screen, distance to server #: src/states_screens/server_selection.cpp:129 msgid "Distance (km)" -msgstr "Entfernung (km)" +msgstr "Entf. (km)" #. I18N: In server selection screen, unknown distance to server #: src/states_screens/server_selection.cpp:214 From 03839b7cfe4a7811efa4ddb984210483ad26bd89 Mon Sep 17 00:00:00 2001 From: Alayan Date: Sun, 16 Sep 2018 16:37:42 +0200 Subject: [PATCH 056/140] Move GUI files to categorized folders and update all references --- data/gui/{ => dialogs}/addons_loading.stkgui | 8 ++-- .../{ => dialogs}/android/init_android.stkgui | 4 +- .../android/multitouch_settings.stkgui | 0 data/gui/{ => dialogs}/confirm_dialog.stkgui | 4 +- .../confirm_resolution_dialog.stkgui | 0 .../custom_video_settings.stkgui | 0 data/gui/{ => dialogs}/debug_slider.stkgui | 0 .../general_text_field_dialog.stkgui | 0 .../ghost_replay_info_dialog.stkgui | 8 ++-- .../{ => dialogs}/kart_color_slider.stkgui | 0 .../online/change_password.stkgui | 4 +- .../online/notification_dialog.stkgui | 4 +- .../online/player_rankings_dialog.stkgui | 4 +- .../{ => dialogs}/online/recovery_info.stkgui | 2 +- .../online/recovery_input.stkgui | 4 +- .../online/registration_terms.stkgui | 4 +- .../online/server_info_dialog.stkgui | 4 +- .../online/splitscreen_player_dialog.stkgui | 8 ++-- .../online/user_info_dialog.stkgui | 12 +++--- .../{ => dialogs}/online/vote_dialog.stkgui | 2 +- .../gui/{ => dialogs}/overworld_dialog.stkgui | 10 ++--- .../{ => dialogs}/press_a_key_dialog.stkgui | 0 .../{ => dialogs}/race_paused_dialog.stkgui | 14 +++---- .../gui/{ => dialogs}/select_challenge.stkgui | 8 ++-- .../select_challenge_nobest.stkgui | 6 +-- .../tutorial_message_dialog.stkgui | 0 data/gui/{ => icons}/License.txt | 0 data/gui/{ => icons}/addons.png | Bin .../{ => icons}/android/blur_bg_button.png | Bin .../android/blur_bg_button_focus.png | Bin data/gui/{ => icons}/android/drift.png | Bin data/gui/{ => icons}/android/license.txt | 0 data/gui/{ => icons}/android/nitro.png | Bin data/gui/{ => icons}/android/nitro_empty.png | Bin data/gui/{ => icons}/android/pause.png | Bin .../{ => icons}/android/steering_wheel.png | Bin .../{ => icons}/android/thunderbird_reset.png | Bin data/gui/{ => icons}/android/up_down.png | Bin data/gui/{ => icons}/android/wing_mirror.png | Bin data/gui/{ => icons}/back.png | Bin data/gui/{ => icons}/banana.png | Bin data/gui/{ => icons}/blue_arrow.png | Bin data/gui/{ => icons}/blue_flag.png | Bin data/gui/{ => icons}/blue_plus.png | Bin data/gui/{ => icons}/bomb_icon.png | Bin data/gui/{ => icons}/challenge.png | Bin data/gui/{ => icons}/crown.png | Bin data/gui/{ => icons}/cup_bronze.png | Bin data/gui/{ => icons}/cup_gold.png | Bin data/gui/{ => icons}/cup_platinum.png | Bin data/gui/{ => icons}/cup_silver.png | Bin data/gui/{ => icons}/difficulty_best.png | Bin data/gui/{ => icons}/difficulty_easy.png | Bin data/gui/{ => icons}/difficulty_hard.png | Bin data/gui/{ => icons}/difficulty_medium.png | Bin data/gui/{ => icons}/down.png | Bin data/gui/{ => icons}/dropdown.png | Bin data/gui/{ => icons}/edit.png | Bin data/gui/{ => icons}/gamepad.png | Bin data/gui/{ => icons}/gamepad_off.png | Bin data/gui/{ => icons}/gauge_empty.png | Bin data/gui/{ => icons}/gauge_full.png | Bin data/gui/{ => icons}/gauge_full_bright.png | Bin data/gui/{ => icons}/gauge_goal.png | Bin data/gui/{ => icons}/ghost_plus.png | Bin data/gui/{ => icons}/gift.png | Bin data/gui/{ => icons}/gp_copy.png | Bin data/gui/{ => icons}/gp_edit.png | Bin data/gui/{ => icons}/gp_new.png | Bin data/gui/{ => icons}/gp_remove.png | Bin data/gui/{ => icons}/gpeditor.png | Bin data/gui/{ => icons}/green_check.png | Bin data/gui/{ => icons}/gui_lock.png | Bin data/gui/{ => icons}/heart.png | Bin data/gui/{ => icons}/hourglass.png | Bin data/gui/{ => icons}/icons-frame.png | Bin data/gui/{ => icons}/karts.png | Bin data/gui/{ => icons}/keyboard.png | Bin data/gui/{ => icons}/loading.png | Bin data/gui/{ => icons}/logo.png | Bin data/gui/{ => icons}/logo_slim.png | Bin data/gui/{ => icons}/main_about.png | Bin data/gui/{ => icons}/main_help.png | Bin data/gui/{ => icons}/main_network.png | Bin data/gui/{ => icons}/main_options.png | Bin data/gui/{ => icons}/main_quit.png | Bin data/gui/{ => icons}/main_race.png | Bin data/gui/{ => icons}/main_race_multi.png | Bin data/gui/{ => icons}/mass.png | Bin data/gui/{ => icons}/materials.xml | 0 data/gui/{ => icons}/menu_addons.png | Bin data/gui/{ => icons}/menu_addons_focus.png | Bin data/gui/{ => icons}/menu_multi.png | Bin data/gui/{ => icons}/menu_multi_focus.png | Bin data/gui/{ => icons}/menu_online.png | Bin data/gui/{ => icons}/menu_online_focus.png | Bin data/gui/{ => icons}/menu_race.png | Bin data/gui/{ => icons}/menu_race_focus.png | Bin data/gui/{ => icons}/menu_story.png | Bin data/gui/{ => icons}/menu_story_focus.png | Bin data/gui/{ => icons}/mode_3strikes.png | Bin data/gui/{ => icons}/mode_easter.png | Bin data/gui/{ => icons}/mode_ftl.png | Bin data/gui/{ => icons}/mode_ghost.png | Bin data/gui/{ => icons}/mode_normal.png | Bin data/gui/{ => icons}/mode_soccer.png | Bin data/gui/{ => icons}/mode_tt.png | Bin data/gui/{ => icons}/mystery_unlock.png | Bin data/gui/{ => icons}/networking_icon.png | Bin data/gui/{ => icons}/nitro.png | Bin data/gui/{ => icons}/no-package-featured.png | Bin data/gui/{ => icons}/no-package.png | Bin data/gui/{ => icons}/notes.png | Bin .../{ => icons}/online/menu_create_server.png | Bin .../online/menu_create_server_hover.png | Bin .../{ => icons}/online/menu_find_server.png | Bin .../online/menu_find_server_hover.png | Bin .../{ => icons}/online/menu_quick_play.png | Bin .../online/menu_quick_play_hover.png | Bin data/gui/{ => icons}/options_audio.png | Bin data/gui/{ => icons}/options_input.png | Bin data/gui/{ => icons}/options_language.png | Bin data/gui/{ => icons}/options_players.png | Bin data/gui/{ => icons}/options_ui.png | Bin data/gui/{ => icons}/options_video.png | Bin data/gui/{ => icons}/package-featured.png | Bin data/gui/{ => icons}/package-uninstall.png | Bin data/gui/{ => icons}/package-update.png | Bin data/gui/{ => icons}/package.png | Bin data/gui/{ => icons}/power.png | Bin data/gui/{ => icons}/race_giveup.png | Bin data/gui/{ => icons}/random_kart.png | Bin data/gui/{ => icons}/red_arrow.png | Bin data/gui/{ => icons}/red_flag.png | Bin data/gui/{ => icons}/red_mark.png | Bin data/gui/{ => icons}/remove.png | Bin data/gui/{ => icons}/rename.png | Bin data/gui/{ => icons}/restart.png | Bin data/gui/{ => icons}/save.png | Bin data/gui/{ => icons}/screen1610.png | Bin data/gui/{ => icons}/screen169.png | Bin data/gui/{ => icons}/screen32.png | Bin data/gui/{ => icons}/screen43.png | Bin data/gui/{ => icons}/screen53.png | Bin data/gui/{ => icons}/screen54.png | Bin data/gui/{ => icons}/screen_other.png | Bin data/gui/{ => icons}/scroll_down.png | Bin data/gui/{ => icons}/scroll_up.png | Bin data/gui/{ => icons}/search.png | Bin data/gui/{ => icons}/slipstream_icon.png | Bin data/gui/{ => icons}/soccer_ball_blue.png | Bin data/gui/{ => icons}/soccer_ball_normal.png | Bin data/gui/{ => icons}/soccer_ball_red.png | Bin data/gui/{ => icons}/speed.png | Bin data/gui/{ => icons}/speedback.png | Bin data/gui/{ => icons}/speedfore.png | Bin data/gui/{ => icons}/story_mode_book.png | Bin data/gui/{ => icons}/top_bar.png | Bin data/gui/{ => icons}/track_random.png | Bin data/gui/{ => icons}/tutorial.png | Bin data/gui/{ => icons}/up.png | Bin data/gui/{ => icons}/weapons.png | Bin data/gui/{ => screens}/addons_screen.stkgui | 12 +++--- data/gui/{ => screens}/arenas.stkgui | 2 +- data/gui/{ => screens}/credits.stkgui | 4 +- data/gui/{ => screens}/easter_egg.stkgui | 2 +- data/gui/{ => screens}/edit_gp.stkgui | 14 +++---- data/gui/{ => screens}/edit_track.stkgui | 0 .../gui/{ => screens}/feature_unlocked.stkgui | 0 .../ghost_replay_selection.stkgui | 8 ++-- data/gui/{ => screens}/gp_info.stkgui | 6 +-- .../{ => screens}/grand_prix_editor.stkgui | 12 +++--- data/gui/{ => screens}/grand_prix_lose.stkgui | 0 data/gui/{ => screens}/grand_prix_win.stkgui | 0 data/gui/{ => screens}/help1.stkgui | 28 ++++++------- data/gui/{ => screens}/help2.stkgui | 30 +++++++------- data/gui/{ => screens}/help3.stkgui | 16 ++++---- data/gui/{ => screens}/help4.stkgui | 18 ++++----- data/gui/{ => screens}/help5.stkgui | 22 +++++----- data/gui/{ => screens}/help6.stkgui | 26 ++++++------ data/gui/{ => screens}/help7.stkgui | 24 +++++------ data/gui/{ => screens}/karts.stkgui | 2 +- data/gui/{ => screens}/main_menu.stkgui | 38 +++++++++--------- .../{ => screens}/online/create_server.stkgui | 20 ++++----- .../{ => screens}/online/guest_login.stkgui | 12 +++--- data/gui/{ => screens}/online/lan.stkgui | 10 ++--- .../online/lobby_settings.stkgui | 2 +- .../online/networking_lobby.stkgui | 6 +-- data/gui/{ => screens}/online/online.stkgui | 12 +++--- .../online/profile_achievements.stkgui | 2 +- .../online/profile_achievements_tab.stkgui | 8 ++-- .../online/profile_friends.stkgui | 8 ++-- .../online/profile_overview.stkgui | 10 ++--- .../online/profile_servers.stkgui | 10 ++--- .../online/profile_settings.stkgui | 8 ++-- data/gui/{ => screens}/online/register.stkgui | 12 +++--- .../online/server_selection.stkgui | 4 +- .../{ => screens}/online/user_search.stkgui | 2 +- data/gui/{ => screens}/options_audio.stkgui | 14 +++---- data/gui/{ => screens}/options_device.stkgui | 14 +++---- data/gui/{ => screens}/options_input.stkgui | 14 +++---- .../gui/{ => screens}/options_language.stkgui | 14 +++---- data/gui/{ => screens}/options_players.stkgui | 12 +++--- data/gui/{ => screens}/options_ui.stkgui | 14 +++---- data/gui/{ => screens}/options_video.stkgui | 14 +++---- data/gui/{ => screens}/race_result.stkgui | 0 data/gui/{ => screens}/race_setup.stkgui | 10 ++--- data/gui/{ => screens}/soccer_setup.stkgui | 6 +-- data/gui/{ => screens}/track_info.stkgui | 10 ++--- data/gui/{ => screens}/tracks.stkgui | 2 +- data/gui/{ => screens}/tracks_and_gp.stkgui | 2 +- data/gui/{ => screens}/user_screen.stkgui | 14 +++---- data/gui/{ => screens}/user_screen_tab.stkgui | 26 ++++++------ src/config/player_profile.cpp | 2 +- src/graphics/irr_driver.cpp | 6 +-- src/graphics/particle_emitter.cpp | 2 +- src/guiengine/engine.cpp | 2 +- src/guiengine/layout_manager.cpp | 2 +- src/guiengine/modaldialog.cpp | 2 +- src/guiengine/screen.cpp | 2 +- src/guiengine/skin.cpp | 20 ++++----- src/guiengine/widgets/icon_button_widget.cpp | 8 ++-- src/guiengine/widgets/kart_stats_widget.cpp | 8 ++-- src/guiengine/widgets/model_view_widget.cpp | 4 +- src/guiengine/widgets/player_name_spinner.cpp | 2 +- src/guiengine/widgets/ribbon_widget.cpp | 4 +- src/io/file_manager.cpp | 6 ++- src/io/file_manager.hpp | 3 +- src/main.cpp | 12 +++--- src/modes/capture_the_flag.cpp | 4 +- src/modes/three_strikes_battle.cpp | 2 +- src/modes/world.cpp | 4 +- src/race/race_manager.hpp | 12 +++--- src/states_screens/addons_screen.cpp | 12 +++--- src/states_screens/arenas_screen.cpp | 2 +- .../dialogs/ghost_replay_info_dialog.cpp | 2 +- .../dialogs/network_user_dialog.cpp | 2 +- .../dialogs/select_challenge.cpp | 2 +- src/states_screens/easter_egg_screen.cpp | 2 +- src/states_screens/edit_gp_screen.cpp | 2 +- src/states_screens/feature_unlocked.cpp | 8 ++-- src/states_screens/ghost_replay_selection.cpp | 2 +- src/states_screens/gp_info_screen.cpp | 4 +- .../grand_prix_editor_screen.cpp | 2 +- src/states_screens/grand_prix_win.cpp | 4 +- src/states_screens/kart_selection.cpp | 2 +- src/states_screens/main_menu_screen.cpp | 2 +- src/states_screens/network_kart_selection.cpp | 2 +- src/states_screens/networking_lobby.cpp | 8 ++-- src/states_screens/options_screen_input.cpp | 6 +-- src/states_screens/options_screen_video.cpp | 14 +++---- src/states_screens/race_gui.cpp | 12 +++--- src/states_screens/race_gui_base.cpp | 12 +++--- src/states_screens/race_gui_multitouch.cpp | 22 +++++----- src/states_screens/race_gui_overworld.cpp | 14 +++---- src/states_screens/race_result_gui.cpp | 14 +++---- src/states_screens/race_setup_screen.cpp | 2 +- src/states_screens/server_selection.cpp | 4 +- src/states_screens/track_info_screen.cpp | 4 +- src/states_screens/tracks_and_gp_screen.cpp | 4 +- src/states_screens/tracks_screen.cpp | 6 +-- 261 files changed, 474 insertions(+), 471 deletions(-) rename data/gui/{ => dialogs}/addons_loading.stkgui (89%) rename data/gui/{ => dialogs}/android/init_android.stkgui (92%) rename data/gui/{ => dialogs}/android/multitouch_settings.stkgui (100%) rename data/gui/{ => dialogs}/confirm_dialog.stkgui (76%) rename data/gui/{ => dialogs}/confirm_resolution_dialog.stkgui (100%) rename data/gui/{ => dialogs}/custom_video_settings.stkgui (100%) rename data/gui/{ => dialogs}/debug_slider.stkgui (100%) rename data/gui/{ => dialogs}/general_text_field_dialog.stkgui (100%) rename data/gui/{ => dialogs}/ghost_replay_info_dialog.stkgui (92%) rename data/gui/{ => dialogs}/kart_color_slider.stkgui (100%) rename data/gui/{ => dialogs}/online/change_password.stkgui (97%) rename data/gui/{ => dialogs}/online/notification_dialog.stkgui (92%) rename data/gui/{ => dialogs}/online/player_rankings_dialog.stkgui (89%) rename data/gui/{ => dialogs}/online/recovery_info.stkgui (96%) rename data/gui/{ => dialogs}/online/recovery_input.stkgui (97%) rename data/gui/{ => dialogs}/online/registration_terms.stkgui (96%) rename data/gui/{ => dialogs}/online/server_info_dialog.stkgui (95%) rename data/gui/{ => dialogs}/online/splitscreen_player_dialog.stkgui (95%) rename data/gui/{ => dialogs}/online/user_info_dialog.stkgui (91%) rename data/gui/{ => dialogs}/online/vote_dialog.stkgui (97%) rename data/gui/{ => dialogs}/overworld_dialog.stkgui (85%) rename data/gui/{ => dialogs}/press_a_key_dialog.stkgui (100%) rename data/gui/{ => dialogs}/race_paused_dialog.stkgui (85%) rename data/gui/{ => dialogs}/select_challenge.stkgui (85%) rename data/gui/{ => dialogs}/select_challenge_nobest.stkgui (86%) rename data/gui/{ => dialogs}/tutorial_message_dialog.stkgui (100%) rename data/gui/{ => icons}/License.txt (100%) rename data/gui/{ => icons}/addons.png (100%) rename data/gui/{ => icons}/android/blur_bg_button.png (100%) rename data/gui/{ => icons}/android/blur_bg_button_focus.png (100%) rename data/gui/{ => icons}/android/drift.png (100%) rename data/gui/{ => icons}/android/license.txt (100%) rename data/gui/{ => icons}/android/nitro.png (100%) rename data/gui/{ => icons}/android/nitro_empty.png (100%) rename data/gui/{ => icons}/android/pause.png (100%) rename data/gui/{ => icons}/android/steering_wheel.png (100%) rename data/gui/{ => icons}/android/thunderbird_reset.png (100%) rename data/gui/{ => icons}/android/up_down.png (100%) rename data/gui/{ => icons}/android/wing_mirror.png (100%) rename data/gui/{ => icons}/back.png (100%) rename data/gui/{ => icons}/banana.png (100%) rename data/gui/{ => icons}/blue_arrow.png (100%) rename data/gui/{ => icons}/blue_flag.png (100%) rename data/gui/{ => icons}/blue_plus.png (100%) rename data/gui/{ => icons}/bomb_icon.png (100%) rename data/gui/{ => icons}/challenge.png (100%) rename data/gui/{ => icons}/crown.png (100%) rename data/gui/{ => icons}/cup_bronze.png (100%) rename data/gui/{ => icons}/cup_gold.png (100%) rename data/gui/{ => icons}/cup_platinum.png (100%) rename data/gui/{ => icons}/cup_silver.png (100%) rename data/gui/{ => icons}/difficulty_best.png (100%) rename data/gui/{ => icons}/difficulty_easy.png (100%) rename data/gui/{ => icons}/difficulty_hard.png (100%) rename data/gui/{ => icons}/difficulty_medium.png (100%) rename data/gui/{ => icons}/down.png (100%) rename data/gui/{ => icons}/dropdown.png (100%) rename data/gui/{ => icons}/edit.png (100%) rename data/gui/{ => icons}/gamepad.png (100%) rename data/gui/{ => icons}/gamepad_off.png (100%) rename data/gui/{ => icons}/gauge_empty.png (100%) rename data/gui/{ => icons}/gauge_full.png (100%) rename data/gui/{ => icons}/gauge_full_bright.png (100%) rename data/gui/{ => icons}/gauge_goal.png (100%) rename data/gui/{ => icons}/ghost_plus.png (100%) rename data/gui/{ => icons}/gift.png (100%) rename data/gui/{ => icons}/gp_copy.png (100%) rename data/gui/{ => icons}/gp_edit.png (100%) rename data/gui/{ => icons}/gp_new.png (100%) rename data/gui/{ => icons}/gp_remove.png (100%) rename data/gui/{ => icons}/gpeditor.png (100%) rename data/gui/{ => icons}/green_check.png (100%) rename data/gui/{ => icons}/gui_lock.png (100%) rename data/gui/{ => icons}/heart.png (100%) rename data/gui/{ => icons}/hourglass.png (100%) rename data/gui/{ => icons}/icons-frame.png (100%) rename data/gui/{ => icons}/karts.png (100%) rename data/gui/{ => icons}/keyboard.png (100%) rename data/gui/{ => icons}/loading.png (100%) rename data/gui/{ => icons}/logo.png (100%) rename data/gui/{ => icons}/logo_slim.png (100%) rename data/gui/{ => icons}/main_about.png (100%) rename data/gui/{ => icons}/main_help.png (100%) rename data/gui/{ => icons}/main_network.png (100%) rename data/gui/{ => icons}/main_options.png (100%) rename data/gui/{ => icons}/main_quit.png (100%) rename data/gui/{ => icons}/main_race.png (100%) rename data/gui/{ => icons}/main_race_multi.png (100%) rename data/gui/{ => icons}/mass.png (100%) rename data/gui/{ => icons}/materials.xml (100%) rename data/gui/{ => icons}/menu_addons.png (100%) rename data/gui/{ => icons}/menu_addons_focus.png (100%) rename data/gui/{ => icons}/menu_multi.png (100%) rename data/gui/{ => icons}/menu_multi_focus.png (100%) rename data/gui/{ => icons}/menu_online.png (100%) rename data/gui/{ => icons}/menu_online_focus.png (100%) rename data/gui/{ => icons}/menu_race.png (100%) rename data/gui/{ => icons}/menu_race_focus.png (100%) rename data/gui/{ => icons}/menu_story.png (100%) rename data/gui/{ => icons}/menu_story_focus.png (100%) rename data/gui/{ => icons}/mode_3strikes.png (100%) rename data/gui/{ => icons}/mode_easter.png (100%) rename data/gui/{ => icons}/mode_ftl.png (100%) rename data/gui/{ => icons}/mode_ghost.png (100%) rename data/gui/{ => icons}/mode_normal.png (100%) rename data/gui/{ => icons}/mode_soccer.png (100%) rename data/gui/{ => icons}/mode_tt.png (100%) rename data/gui/{ => icons}/mystery_unlock.png (100%) rename data/gui/{ => icons}/networking_icon.png (100%) rename data/gui/{ => icons}/nitro.png (100%) rename data/gui/{ => icons}/no-package-featured.png (100%) rename data/gui/{ => icons}/no-package.png (100%) rename data/gui/{ => icons}/notes.png (100%) rename data/gui/{ => icons}/online/menu_create_server.png (100%) rename data/gui/{ => icons}/online/menu_create_server_hover.png (100%) rename data/gui/{ => icons}/online/menu_find_server.png (100%) rename data/gui/{ => icons}/online/menu_find_server_hover.png (100%) rename data/gui/{ => icons}/online/menu_quick_play.png (100%) rename data/gui/{ => icons}/online/menu_quick_play_hover.png (100%) rename data/gui/{ => icons}/options_audio.png (100%) rename data/gui/{ => icons}/options_input.png (100%) rename data/gui/{ => icons}/options_language.png (100%) rename data/gui/{ => icons}/options_players.png (100%) rename data/gui/{ => icons}/options_ui.png (100%) rename data/gui/{ => icons}/options_video.png (100%) rename data/gui/{ => icons}/package-featured.png (100%) rename data/gui/{ => icons}/package-uninstall.png (100%) rename data/gui/{ => icons}/package-update.png (100%) rename data/gui/{ => icons}/package.png (100%) rename data/gui/{ => icons}/power.png (100%) rename data/gui/{ => icons}/race_giveup.png (100%) rename data/gui/{ => icons}/random_kart.png (100%) rename data/gui/{ => icons}/red_arrow.png (100%) rename data/gui/{ => icons}/red_flag.png (100%) rename data/gui/{ => icons}/red_mark.png (100%) rename data/gui/{ => icons}/remove.png (100%) rename data/gui/{ => icons}/rename.png (100%) rename data/gui/{ => icons}/restart.png (100%) rename data/gui/{ => icons}/save.png (100%) rename data/gui/{ => icons}/screen1610.png (100%) rename data/gui/{ => icons}/screen169.png (100%) rename data/gui/{ => icons}/screen32.png (100%) rename data/gui/{ => icons}/screen43.png (100%) rename data/gui/{ => icons}/screen53.png (100%) rename data/gui/{ => icons}/screen54.png (100%) rename data/gui/{ => icons}/screen_other.png (100%) rename data/gui/{ => icons}/scroll_down.png (100%) rename data/gui/{ => icons}/scroll_up.png (100%) rename data/gui/{ => icons}/search.png (100%) rename data/gui/{ => icons}/slipstream_icon.png (100%) rename data/gui/{ => icons}/soccer_ball_blue.png (100%) rename data/gui/{ => icons}/soccer_ball_normal.png (100%) rename data/gui/{ => icons}/soccer_ball_red.png (100%) rename data/gui/{ => icons}/speed.png (100%) rename data/gui/{ => icons}/speedback.png (100%) rename data/gui/{ => icons}/speedfore.png (100%) rename data/gui/{ => icons}/story_mode_book.png (100%) rename data/gui/{ => icons}/top_bar.png (100%) rename data/gui/{ => icons}/track_random.png (100%) rename data/gui/{ => icons}/tutorial.png (100%) rename data/gui/{ => icons}/up.png (100%) rename data/gui/{ => icons}/weapons.png (100%) rename data/gui/{ => screens}/addons_screen.stkgui (88%) rename data/gui/{ => screens}/arenas.stkgui (92%) rename data/gui/{ => screens}/credits.stkgui (84%) rename data/gui/{ => screens}/easter_egg.stkgui (92%) rename data/gui/{ => screens}/edit_gp.stkgui (86%) rename data/gui/{ => screens}/edit_track.stkgui (100%) rename data/gui/{ => screens}/feature_unlocked.stkgui (100%) rename data/gui/{ => screens}/ghost_replay_selection.stkgui (93%) rename data/gui/{ => screens}/gp_info.stkgui (95%) rename data/gui/{ => screens}/grand_prix_editor.stkgui (90%) rename data/gui/{ => screens}/grand_prix_lose.stkgui (100%) rename data/gui/{ => screens}/grand_prix_win.stkgui (100%) rename data/gui/{ => screens}/help1.stkgui (89%) rename data/gui/{ => screens}/help2.stkgui (91%) rename data/gui/{ => screens}/help3.stkgui (94%) rename data/gui/{ => screens}/help4.stkgui (90%) rename data/gui/{ => screens}/help5.stkgui (89%) rename data/gui/{ => screens}/help6.stkgui (90%) rename data/gui/{ => screens}/help7.stkgui (91%) rename data/gui/{ => screens}/karts.stkgui (92%) rename data/gui/{ => screens}/main_menu.stkgui (78%) rename data/gui/{ => screens}/online/create_server.stkgui (91%) rename data/gui/{ => screens}/online/guest_login.stkgui (89%) rename data/gui/{ => screens}/online/lan.stkgui (71%) rename data/gui/{ => screens}/online/lobby_settings.stkgui (94%) rename data/gui/{ => screens}/online/networking_lobby.stkgui (90%) rename data/gui/{ => screens}/online/online.stkgui (75%) rename data/gui/{ => screens}/online/profile_achievements.stkgui (84%) rename data/gui/{ => screens}/online/profile_achievements_tab.stkgui (82%) rename data/gui/{ => screens}/online/profile_friends.stkgui (88%) rename data/gui/{ => screens}/online/profile_overview.stkgui (79%) rename data/gui/{ => screens}/online/profile_servers.stkgui (67%) rename data/gui/{ => screens}/online/profile_settings.stkgui (85%) rename data/gui/{ => screens}/online/register.stkgui (94%) rename data/gui/{ => screens}/online/server_selection.stkgui (89%) rename data/gui/{ => screens}/online/user_search.stkgui (90%) rename data/gui/{ => screens}/options_audio.stkgui (92%) rename data/gui/{ => screens}/options_device.stkgui (89%) rename data/gui/{ => screens}/options_input.stkgui (87%) rename data/gui/{ => screens}/options_language.stkgui (84%) rename data/gui/{ => screens}/options_players.stkgui (88%) rename data/gui/{ => screens}/options_ui.stkgui (93%) rename data/gui/{ => screens}/options_video.stkgui (93%) rename data/gui/{ => screens}/race_result.stkgui (100%) rename data/gui/{ => screens}/race_setup.stkgui (87%) rename data/gui/{ => screens}/soccer_setup.stkgui (90%) rename data/gui/{ => screens}/track_info.stkgui (91%) rename data/gui/{ => screens}/tracks.stkgui (96%) rename data/gui/{ => screens}/tracks_and_gp.stkgui (93%) rename data/gui/{ => screens}/user_screen.stkgui (93%) rename data/gui/{ => screens}/user_screen_tab.stkgui (90%) diff --git a/data/gui/addons_loading.stkgui b/data/gui/dialogs/addons_loading.stkgui similarity index 89% rename from data/gui/addons_loading.stkgui rename to data/gui/dialogs/addons_loading.stkgui index d51e3f12c..0c86b451f 100644 --- a/data/gui/addons_loading.stkgui +++ b/data/gui/dialogs/addons_loading.stkgui @@ -3,7 +3,7 @@
- +
@@ -27,13 +27,13 @@
diff --git a/data/gui/android/init_android.stkgui b/data/gui/dialogs/android/init_android.stkgui similarity index 92% rename from data/gui/android/init_android.stkgui rename to data/gui/dialogs/android/init_android.stkgui index 81d9c13c9..60f71ec8b 100644 --- a/data/gui/android/init_android.stkgui +++ b/data/gui/dialogs/android/init_android.stkgui @@ -8,9 +8,9 @@ - - diff --git a/data/gui/android/multitouch_settings.stkgui b/data/gui/dialogs/android/multitouch_settings.stkgui similarity index 100% rename from data/gui/android/multitouch_settings.stkgui rename to data/gui/dialogs/android/multitouch_settings.stkgui diff --git a/data/gui/confirm_dialog.stkgui b/data/gui/dialogs/confirm_dialog.stkgui similarity index 76% rename from data/gui/confirm_dialog.stkgui rename to data/gui/dialogs/confirm_dialog.stkgui index 70334d1d1..cd7c5add3 100644 --- a/data/gui/confirm_dialog.stkgui +++ b/data/gui/dialogs/confirm_dialog.stkgui @@ -7,10 +7,10 @@ - - diff --git a/data/gui/confirm_resolution_dialog.stkgui b/data/gui/dialogs/confirm_resolution_dialog.stkgui similarity index 100% rename from data/gui/confirm_resolution_dialog.stkgui rename to data/gui/dialogs/confirm_resolution_dialog.stkgui diff --git a/data/gui/custom_video_settings.stkgui b/data/gui/dialogs/custom_video_settings.stkgui similarity index 100% rename from data/gui/custom_video_settings.stkgui rename to data/gui/dialogs/custom_video_settings.stkgui diff --git a/data/gui/debug_slider.stkgui b/data/gui/dialogs/debug_slider.stkgui similarity index 100% rename from data/gui/debug_slider.stkgui rename to data/gui/dialogs/debug_slider.stkgui diff --git a/data/gui/general_text_field_dialog.stkgui b/data/gui/dialogs/general_text_field_dialog.stkgui similarity index 100% rename from data/gui/general_text_field_dialog.stkgui rename to data/gui/dialogs/general_text_field_dialog.stkgui diff --git a/data/gui/ghost_replay_info_dialog.stkgui b/data/gui/dialogs/ghost_replay_info_dialog.stkgui similarity index 92% rename from data/gui/ghost_replay_info_dialog.stkgui rename to data/gui/dialogs/ghost_replay_info_dialog.stkgui index 3f64cb386..2182d7116 100644 --- a/data/gui/ghost_replay_info_dialog.stkgui +++ b/data/gui/dialogs/ghost_replay_info_dialog.stkgui @@ -39,16 +39,16 @@
diff --git a/data/gui/kart_color_slider.stkgui b/data/gui/dialogs/kart_color_slider.stkgui similarity index 100% rename from data/gui/kart_color_slider.stkgui rename to data/gui/dialogs/kart_color_slider.stkgui diff --git a/data/gui/online/change_password.stkgui b/data/gui/dialogs/online/change_password.stkgui similarity index 97% rename from data/gui/online/change_password.stkgui rename to data/gui/dialogs/online/change_password.stkgui index 02b20c367..8809bb35c 100644 --- a/data/gui/online/change_password.stkgui +++ b/data/gui/dialogs/online/change_password.stkgui @@ -35,9 +35,9 @@ - -
diff --git a/data/gui/online/notification_dialog.stkgui b/data/gui/dialogs/online/notification_dialog.stkgui similarity index 92% rename from data/gui/online/notification_dialog.stkgui rename to data/gui/dialogs/online/notification_dialog.stkgui index 034ea31c1..0495ce56c 100644 --- a/data/gui/online/notification_dialog.stkgui +++ b/data/gui/dialogs/online/notification_dialog.stkgui @@ -7,9 +7,9 @@ - -
diff --git a/data/gui/online/player_rankings_dialog.stkgui b/data/gui/dialogs/online/player_rankings_dialog.stkgui similarity index 89% rename from data/gui/online/player_rankings_dialog.stkgui rename to data/gui/dialogs/online/player_rankings_dialog.stkgui index e9fa097dd..b930b6c2e 100644 --- a/data/gui/online/player_rankings_dialog.stkgui +++ b/data/gui/dialogs/online/player_rankings_dialog.stkgui @@ -15,10 +15,10 @@ diff --git a/data/gui/online/recovery_info.stkgui b/data/gui/dialogs/online/recovery_info.stkgui similarity index 96% rename from data/gui/online/recovery_info.stkgui rename to data/gui/dialogs/online/recovery_info.stkgui index 50ac5c186..e93b4b765 100644 --- a/data/gui/online/recovery_info.stkgui +++ b/data/gui/dialogs/online/recovery_info.stkgui @@ -12,7 +12,7 @@ -
diff --git a/data/gui/online/recovery_input.stkgui b/data/gui/dialogs/online/recovery_input.stkgui similarity index 97% rename from data/gui/online/recovery_input.stkgui rename to data/gui/dialogs/online/recovery_input.stkgui index 9dc2819c9..269af29a6 100644 --- a/data/gui/online/recovery_input.stkgui +++ b/data/gui/dialogs/online/recovery_input.stkgui @@ -34,9 +34,9 @@ - -
diff --git a/data/gui/online/registration_terms.stkgui b/data/gui/dialogs/online/registration_terms.stkgui similarity index 96% rename from data/gui/online/registration_terms.stkgui rename to data/gui/dialogs/online/registration_terms.stkgui index 1447495be..239e24d04 100644 --- a/data/gui/online/registration_terms.stkgui +++ b/data/gui/dialogs/online/registration_terms.stkgui @@ -23,9 +23,9 @@ - -
diff --git a/data/gui/online/server_info_dialog.stkgui b/data/gui/dialogs/online/server_info_dialog.stkgui similarity index 95% rename from data/gui/online/server_info_dialog.stkgui rename to data/gui/dialogs/online/server_info_dialog.stkgui index 6a602f387..7dc722936 100644 --- a/data/gui/online/server_info_dialog.stkgui +++ b/data/gui/dialogs/online/server_info_dialog.stkgui @@ -12,9 +12,9 @@
- - diff --git a/data/gui/online/splitscreen_player_dialog.stkgui b/data/gui/dialogs/online/splitscreen_player_dialog.stkgui similarity index 95% rename from data/gui/online/splitscreen_player_dialog.stkgui rename to data/gui/dialogs/online/splitscreen_player_dialog.stkgui index 4fbcf1973..046b2c8a2 100644 --- a/data/gui/online/splitscreen_player_dialog.stkgui +++ b/data/gui/dialogs/online/splitscreen_player_dialog.stkgui @@ -33,13 +33,13 @@ - - - - diff --git a/data/gui/online/user_info_dialog.stkgui b/data/gui/dialogs/online/user_info_dialog.stkgui similarity index 91% rename from data/gui/online/user_info_dialog.stkgui rename to data/gui/dialogs/online/user_info_dialog.stkgui index 5de3d49c2..d7b9c3756 100644 --- a/data/gui/online/user_info_dialog.stkgui +++ b/data/gui/dialogs/online/user_info_dialog.stkgui @@ -20,17 +20,17 @@ - - - - - - diff --git a/data/gui/online/vote_dialog.stkgui b/data/gui/dialogs/online/vote_dialog.stkgui similarity index 97% rename from data/gui/online/vote_dialog.stkgui rename to data/gui/dialogs/online/vote_dialog.stkgui index 904deba58..3bd19ebbf 100644 --- a/data/gui/online/vote_dialog.stkgui +++ b/data/gui/dialogs/online/vote_dialog.stkgui @@ -17,7 +17,7 @@ - diff --git a/data/gui/overworld_dialog.stkgui b/data/gui/dialogs/overworld_dialog.stkgui similarity index 85% rename from data/gui/overworld_dialog.stkgui rename to data/gui/dialogs/overworld_dialog.stkgui index 62c8453c5..f023697c6 100644 --- a/data/gui/overworld_dialog.stkgui +++ b/data/gui/dialogs/overworld_dialog.stkgui @@ -5,23 +5,23 @@ - - - - - diff --git a/data/gui/press_a_key_dialog.stkgui b/data/gui/dialogs/press_a_key_dialog.stkgui similarity index 100% rename from data/gui/press_a_key_dialog.stkgui rename to data/gui/dialogs/press_a_key_dialog.stkgui diff --git a/data/gui/race_paused_dialog.stkgui b/data/gui/dialogs/race_paused_dialog.stkgui similarity index 85% rename from data/gui/race_paused_dialog.stkgui rename to data/gui/dialogs/race_paused_dialog.stkgui index cf19918b5..2f844c380 100644 --- a/data/gui/race_paused_dialog.stkgui +++ b/data/gui/dialogs/race_paused_dialog.stkgui @@ -5,29 +5,29 @@ - - - - - - - diff --git a/data/gui/select_challenge.stkgui b/data/gui/dialogs/select_challenge.stkgui similarity index 85% rename from data/gui/select_challenge.stkgui rename to data/gui/dialogs/select_challenge.stkgui index 02ab05b65..c11716c1f 100644 --- a/data/gui/select_challenge.stkgui +++ b/data/gui/dialogs/select_challenge.stkgui @@ -15,7 +15,7 @@
-