From 5600d01b2c2ada1517c3d5a8e1413d2fb29b0d88 Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 9 Mar 2018 23:54:13 +0800 Subject: [PATCH] Use shared_ptr of STKPeer if needed --- src/network/network_console.cpp | 2 +- src/network/protocol.cpp | 6 +-- src/network/protocols/connect_to_server.cpp | 2 +- .../protocols/game_events_protocol.cpp | 39 ++++++++----------- src/network/protocols/latency_protocol.cpp | 4 +- src/network/protocols/server_lobby.cpp | 4 -- src/network/stk_host.cpp | 18 ++++++++- src/network/stk_host.hpp | 14 ++++--- 8 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/network/network_console.cpp b/src/network/network_console.cpp index 455d78c81..fad043994 100644 --- a/src/network/network_console.cpp +++ b/src/network/network_console.cpp @@ -34,7 +34,7 @@ namespace NetworkConsole // ---------------------------------------------------------------------------- void kickAllPlayers(STKHost* host) { - const std::vector &peers = host->getPeers(); + auto peers = host->getPeers(); for (unsigned int i = 0; i < peers.size(); i++) { peers[i]->disconnect(); diff --git a/src/network/protocol.cpp b/src/network/protocol.cpp index 607e9df68..17c597725 100644 --- a/src/network/protocol.cpp +++ b/src/network/protocol.cpp @@ -119,11 +119,7 @@ void Protocol::requestTerminate() void Protocol::sendMessageToPeersChangingToken(NetworkString *message, bool reliable) { - const std::vector &peers = STKHost::get()->getPeers(); - for (unsigned int i = 0; i < peers.size(); i++) - { - peers[i]->sendPacket(message, reliable); - } + STKHost::get()->sendPacketToAllPeers(message, reliable); } // sendMessageToPeersChangingToken // ---------------------------------------------------------------------------- diff --git a/src/network/protocols/connect_to_server.cpp b/src/network/protocols/connect_to_server.cpp index c7fa0a71f..987d48191 100644 --- a/src/network/protocols/connect_to_server.cpp +++ b/src/network/protocols/connect_to_server.cpp @@ -239,7 +239,7 @@ void ConnectToServer::update(float dt) { // lobby room protocol if we're connected only if (STKHost::get()->getPeerCount() > 0 && - STKHost::get()->getPeers()[0]->isConnected() && + STKHost::get()->getServerPeerForClient()->isConnected() && !m_server_address.isUnset()) { // Let main thread create ClientLobby for better diff --git a/src/network/protocols/game_events_protocol.cpp b/src/network/protocols/game_events_protocol.cpp index 038fc470c..862766cfb 100644 --- a/src/network/protocols/game_events_protocol.cpp +++ b/src/network/protocols/game_events_protocol.cpp @@ -82,30 +82,23 @@ bool GameEventsProtocol::notifyEvent(Event* event) */ void GameEventsProtocol::collectedItem(Item* item, AbstractKart* kart) { - GameSetup* setup = STKHost::get()->getGameSetup(); - assert(setup); + NetworkString *ns = getNetworkString(7); + ns->setSynchronous(true); + // Item picked : send item id, powerup type and kart race id + uint8_t powerup = 0; + if (item->getType() == Item::ITEM_BANANA) + powerup = (int)(kart->getAttachment()->getType()); + else if (item->getType() == Item::ITEM_BONUS_BOX) + powerup = (((int)(kart->getPowerup()->getType()) << 4) & 0xf0) + + (kart->getPowerup()->getNum() & 0x0f); - const std::vector &peers = STKHost::get()->getPeers(); - for (unsigned int i = 0; i < peers.size(); i++) - { - NetworkString *ns = getNetworkString(7); - ns->setSynchronous(true); - // Item picked : send item id, powerup type and kart race id - uint8_t powerup = 0; - if (item->getType() == Item::ITEM_BANANA) - powerup = (int)(kart->getAttachment()->getType()); - else if (item->getType() == Item::ITEM_BONUS_BOX) - powerup = (((int)(kart->getPowerup()->getType()) << 4) & 0xf0) - + (kart->getPowerup()->getNum() & 0x0f); - - ns->addUInt8(GE_ITEM_COLLECTED).addUInt32(item->getItemId()) - .addUInt8(powerup).addUInt8(kart->getWorldKartId()); - peers[i]->sendPacket(ns, /*reliable*/true); - delete ns; - Log::info("GameEventsProtocol", - "Notified a peer that a kart collected item %d.", - (int)(kart->getPowerup()->getType())); - } + ns->addUInt8(GE_ITEM_COLLECTED).addUInt32(item->getItemId()) + .addUInt8(powerup).addUInt8(kart->getWorldKartId()); + Log::info("GameEventsProtocol", + "Notified a peer that a kart collected item %d.", + (int)(kart->getPowerup()->getType())); + STKHost::get()->sendPacketToAllPeers(ns, /*reliable*/true); + delete ns; } // collectedItem // ---------------------------------------------------------------------------- diff --git a/src/network/protocols/latency_protocol.cpp b/src/network/protocols/latency_protocol.cpp index 6e9e36967..d01e0ab31 100644 --- a/src/network/protocols/latency_protocol.cpp +++ b/src/network/protocols/latency_protocol.cpp @@ -56,7 +56,7 @@ bool LatencyProtocol::notifyEventAsynchronous(Event* event) uint32_t request = data.getUInt8(); uint32_t sequence = data.getUInt32(); - const std::vector &peers = STKHost::get()->getPeers(); + auto peers = STKHost::get()->getPeers(); assert(peers.size() > 0); // Find the right peer id. The host id (i.e. each host sendings its @@ -124,7 +124,7 @@ void LatencyProtocol::asynchronousUpdate() float current_time = float(StkTime::getRealTime()); if (NetworkConfig::get()->isServer() && current_time > m_last_time+1) { - const std::vector &peers = STKHost::get()->getPeers(); + auto peers = STKHost::get()->getPeers(); for (unsigned int i = 0; i < peers.size(); i++) { NetworkString *ping_request = diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 26156475e..bc2b2313e 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -449,7 +449,6 @@ void ServerLobby::signalRaceStartToClients() { Log::verbose("Server", "Signaling race start to clients at %lf", StkTime::getRealTime()); - const std::vector &peers = STKHost::get()->getPeers(); NetworkString *ns = getNetworkString(1); ns->addUInt8(LE_START_RACE); sendMessageToPeersChangingToken(ns, /*reliable*/true); @@ -485,7 +484,6 @@ void ServerLobby::startSelection(const Event *event) event->getPeer()); return; } - const std::vector &peers = STKHost::get()->getPeers(); NetworkString *ns = getNetworkString(1); // Start selection - must be synchronous since the receiver pushes // a new screen, which must be donefrom the main thread. @@ -606,8 +604,6 @@ void ServerLobby::checkIncomingConnectionRequests() } } - const std::vector &peers = STKHost::get()->getPeers(); - NetworkString *total = getNetworkString(1 + karts_results.size()); total->setSynchronous(true); total->addUInt8(LE_RACE_FINISHED); diff --git a/src/network/stk_host.cpp b/src/network/stk_host.cpp index 5cb7a1b97..e33255b3c 100644 --- a/src/network/stk_host.cpp +++ b/src/network/stk_host.cpp @@ -920,11 +920,11 @@ std::vector STKHost::getMyPlayerProfiles() /** \brief Return the only server peer for client. * \return STKPeer the STKPeer of server. */ -STKPeer* STKHost::getServerPeerForClient() const +std::shared_ptr STKHost::getServerPeerForClient() const { assert(m_peers.size() == 1); assert(NetworkConfig::get()->isClient()); - return m_peers.begin()->second.get(); + return m_peers.begin()->second; } // getServerPeerForClient // ---------------------------------------------------------------------------- @@ -945,6 +945,20 @@ bool STKHost::isConnectedTo(const TransportAddress& peer) return false; } // isConnectedTo +//----------------------------------------------------------------------------- +/** Sends data to all peers + * \param data Data to sent. + * \param reliable If the data should be sent reliable or now. + */ +void STKHost::sendPacketToAllPeers(NetworkString *data, bool reliable) +{ + std::lock_guard lock(m_peers_mutex); + for (auto p : m_peers) + { + p.second->sendPacket(data, reliable); + } +} // sendPacketExcept + //----------------------------------------------------------------------------- /** Sends data to all peers except the specified one. * \param peer Peer which will not receive the message. diff --git a/src/network/stk_host.hpp b/src/network/stk_host.hpp index 705606a60..981dd8bae 100644 --- a/src/network/stk_host.hpp +++ b/src/network/stk_host.hpp @@ -180,7 +180,9 @@ public: } // requestExit //------------------------------------------------------------------------- void shutdown(); - + //------------------------------------------------------------------------- + void sendPacketToAllPeers(NetworkString *data, bool reliable = true); + //------------------------------------------------------------------------- void sendPacketExcept(STKPeer* peer, NetworkString *data, bool reliable = true); @@ -191,7 +193,7 @@ public: void stopListening(); bool peerExists(const TransportAddress& peer_address); bool isConnectedTo(const TransportAddress& peer_address); - STKPeer *getServerPeerForClient() const; + std::shared_ptr getServerPeerForClient() const; std::vector getMyPlayerProfiles(); void setErrorMessage(const irr::core::stringw &message); bool isAuthorisedToControl() const; @@ -221,14 +223,14 @@ public: m_network->sendRawPacket(buffer, dst); } // sendRawPacket // ------------------------------------------------------------------------ - /** Returns a const reference to the list of peers. */ - std::vector getPeers() + /** Returns a copied list of peers. */ + std::vector > getPeers() { std::lock_guard lock(m_peers_mutex); - std::vector peers; + std::vector > peers; for (auto p : m_peers) { - peers.push_back(p.second.get()); + peers.push_back(p.second); } return peers; }