From c38278fbc1f060bd5ed731835e0e0d055443b9e7 Mon Sep 17 00:00:00 2001 From: Benau Date: Thu, 9 May 2019 11:22:19 +0800 Subject: [PATCH] Add report_player network capabilities --- data/stk_config.xml | 5 +++++ src/config/stk_config.cpp | 12 ++++++++++++ src/config/stk_config.hpp | 9 +++++++-- src/network/network_config.hpp | 7 ++++--- src/network/protocols/client_lobby.cpp | 9 +++++---- src/network/protocols/server_lobby.cpp | 10 ++++++---- src/network/stk_peer.hpp | 6 +++--- 7 files changed, 42 insertions(+), 16 deletions(-) diff --git a/data/stk_config.xml b/data/stk_config.xml index 14c143bdb..76660b52a 100644 --- a/data/stk_config.xml +++ b/data/stk_config.xml @@ -581,4 +581,9 @@ max-adjust-time="2.0" adjust-length-threshold="4.0"/> + + + + diff --git a/src/config/stk_config.cpp b/src/config/stk_config.cpp index 200f45e75..6c9ad6c88 100644 --- a/src/config/stk_config.cpp +++ b/src/config/stk_config.cpp @@ -539,6 +539,18 @@ void STKConfig::getAllData(const XMLNode * root) ns->get("adjust-length-threshold", &m_snb_adjust_length_threshold); } + if (const XMLNode* nc = root->getNode("network-capabilities")) + { + for (unsigned int i = 0; i < nc->getNumNodes(); i++) + { + const XMLNode* name = nc->getNode(i); + std::string cap; + name->get("name", &cap); + if (!cap.empty()) + m_network_capabilities.insert(cap); + } + } + // Get the default KartProperties // ------------------------------ const XMLNode *node = root -> getNode("general-kart-defaults"); diff --git a/src/config/stk_config.hpp b/src/config/stk_config.hpp index d636fb7f6..8092ca204 100644 --- a/src/config/stk_config.hpp +++ b/src/config/stk_config.hpp @@ -31,9 +31,10 @@ #include "utils/no_copy.hpp" #include "utils/constants.hpp" -#include -#include #include +#include +#include +#include class KartProperties; class MusicInformation; @@ -229,6 +230,10 @@ public: /** If true we allow all the server urls to be redirected by the news.xml. */ bool m_allow_news_redirects = true; + /** List of network capabilities to handle different servers with same + * version. */ + std::set m_network_capabilities; + private: /** True if stk_config has been loaded. This is necessary if the * --stk-config command line parameter has been specified to avoid diff --git a/src/network/network_config.hpp b/src/network/network_config.hpp index 7583fd6b2..fda62c8c5 100644 --- a/src/network/network_config.hpp +++ b/src/network/network_config.hpp @@ -27,6 +27,7 @@ #include "utils/no_copy.hpp" #include "irrString.h" +#include #include #include @@ -95,7 +96,7 @@ private: /** List of server capabilities set when joining it, to determine features * available in same version. */ - std::vector m_server_capabilities; + std::set m_server_capabilities; public: /** Singleton get, which creates this object if necessary. */ @@ -236,12 +237,12 @@ public: // ------------------------------------------------------------------------ bool roundValuesNow() const; // ------------------------------------------------------------------------ - void setServerCapabilities(std::vector& caps) + void setServerCapabilities(std::set& caps) { m_server_capabilities = std::move(caps); } // ------------------------------------------------------------------------ void clearServerCapabilities() { m_server_capabilities.clear(); } // ------------------------------------------------------------------------ - const std::vector& getServerCapabilities() const + const std::set& getServerCapabilities() const { return m_server_capabilities; } }; // class NetworkConfig diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp index f447f8494..6f7cd2b37 100644 --- a/src/network/protocols/client_lobby.cpp +++ b/src/network/protocols/client_lobby.cpp @@ -360,8 +360,9 @@ void ClientLobby::update(int ticks) ns->addUInt8(LE_CONNECTION_REQUESTED) .addUInt32(ServerConfig::m_server_version) .encodeString(StringUtils::getUserAgentString()) - // Reserved for future to supply list of network capabilities - .addUInt16(0); + .addUInt16((uint16_t)stk_config->m_network_capabilities.size()); + for (const std::string& cap : stk_config->m_network_capabilities) + ns->encodeString(cap); auto all_k = kart_properties_manager->getAllAvailableKarts(); auto all_t = track_manager->getAllTrackIdentifiers(); @@ -606,12 +607,12 @@ void ClientLobby::connectionAccepted(Event* event) m_state.store(CONNECTED); unsigned list_caps = data.getUInt16(); - std::vector caps; + std::set caps; for (unsigned i = 0; i < list_caps; i++) { std::string cap; data.decodeString(&cap); - caps.push_back(cap); + caps.insert(cap); } NetworkConfig::get()->setServerCapabilities(caps); diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index bff456b19..4482bbe98 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -2590,12 +2590,12 @@ void ServerLobby::connectionRequested(Event* event) event->getPeer()->setUserVersion(user_version); unsigned list_caps = data.getUInt16(); - std::vector caps; + std::set caps; for (unsigned i = 0; i < list_caps; i++) { std::string cap; data.decodeString(&cap); - caps.push_back(cap); + caps.insert(cap); } event->getPeer()->setClientCapabilities(caps); @@ -2843,8 +2843,10 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr peer, message_ack->addUInt8(LE_CONNECTION_ACCEPTED).addUInt32(peer->getHostId()) .addUInt32(ServerConfig::m_server_version); - // Reserved for future to supply list of network capabilities - message_ack->addUInt16(0); + message_ack->addUInt16( + (uint16_t)stk_config->m_network_capabilities.size()); + for (const std::string& cap : stk_config->m_network_capabilities) + message_ack->encodeString(cap); message_ack->addFloat(auto_start_timer) .addUInt32(ServerConfig::m_state_frequency) diff --git a/src/network/stk_peer.hpp b/src/network/stk_peer.hpp index eb9cb37c6..9041540f6 100644 --- a/src/network/stk_peer.hpp +++ b/src/network/stk_peer.hpp @@ -102,7 +102,7 @@ protected: /** List of client capabilities set when connecting it, to determine * features available in same version. */ - std::vector m_client_capabilities; + std::set m_client_capabilities; public: STKPeer(ENetPeer *enet_peer, STKHost* host, uint32_t host_id); @@ -236,10 +236,10 @@ public: return (int)(diff / 1000); } // ------------------------------------------------------------------------ - void setClientCapabilities(std::vector& caps) + void setClientCapabilities(std::set& caps) { m_client_capabilities = std::move(caps); } // ------------------------------------------------------------------------ - const std::vector& getClientCapabilities() const + const std::set& getClientCapabilities() const { return m_client_capabilities; } }; // STKPeer