From cea7737aefa2afc6083a14f404c807dc2add894f Mon Sep 17 00:00:00 2001 From: Rachel Bryk Date: Mon, 2 Sep 2013 21:54:28 -0400 Subject: [PATCH] Fix crash on stop in netplay, and stop netplay when anyone with a pad mapped in game stops emulation. --- Source/Core/Core/Src/NetPlayClient.cpp | 17 +++++++++++++++++ Source/Core/Core/Src/NetPlayClient.h | 1 + Source/Core/Core/Src/NetPlayServer.cpp | 14 ++++++++++++++ Source/Core/DolphinWX/Src/NetWindow.cpp | 6 ++---- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/Src/NetPlayClient.cpp b/Source/Core/Core/Src/NetPlayClient.cpp index 46acca6b94..3153ad2e2a 100644 --- a/Source/Core/Core/Src/NetPlayClient.cpp +++ b/Source/Core/Core/Src/NetPlayClient.cpp @@ -564,6 +564,23 @@ bool NetPlayClient::StopGame() return true; } +void NetPlayClient::Stop() +{ + bool isPadMapped = false; + for (unsigned int i = 0; i < 4; ++i) + { + if (m_pad_map[i] == m_local_player->pid) + isPadMapped = true; + } + // tell the server to stop if we have a pad mapped in game. + if (isPadMapped) + { + sf::Packet spac; + spac << (MessageId)NP_MSG_STOP_GAME; + m_socket.Send(spac); + } +} + // called from ---CPU--- thread u8 NetPlayClient::GetPadNum(u8 numPAD) { diff --git a/Source/Core/Core/Src/NetPlayClient.h b/Source/Core/Core/Src/NetPlayClient.h index 59d5742b18..a5aea6e472 100644 --- a/Source/Core/Core/Src/NetPlayClient.h +++ b/Source/Core/Core/Src/NetPlayClient.h @@ -74,6 +74,7 @@ public: bool StartGame(const std::string &path); bool StopGame(); + void Stop(); bool ChangeGame(const std::string& game); void SendChatMessage(const std::string& msg); diff --git a/Source/Core/Core/Src/NetPlayServer.cpp b/Source/Core/Core/Src/NetPlayServer.cpp index d8f2a7dd09..bcbfce9e29 100644 --- a/Source/Core/Core/Src/NetPlayServer.cpp +++ b/Source/Core/Core/Src/NetPlayServer.cpp @@ -376,6 +376,20 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket) } break; + case NP_MSG_STOP_GAME: + { + // tell clients to stop game + sf::Packet spac; + spac << (MessageId)NP_MSG_STOP_GAME; + + std::lock_guard lkp(m_crit.players); + std::lock_guard lks(m_crit.send); + SendToClients(spac); + + m_is_running = false; + } + break; + default : PanicAlertT("Unknown message with id:%d received from player:%d Kicking player!", mid, player.pid); // unknown message, kick the client diff --git a/Source/Core/DolphinWX/Src/NetWindow.cpp b/Source/Core/DolphinWX/Src/NetWindow.cpp index f962b58590..a31f9c1cb1 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.cpp +++ b/Source/Core/DolphinWX/Src/NetWindow.cpp @@ -650,8 +650,6 @@ void PadMapDiag::OnAdjust(wxCommandEvent& event) void NetPlay::StopGame() { - if (netplay_server != NULL) - netplay_server->StopGame(); - - // TODO: allow non-hosting clients to close the window + if (netplay_client != NULL) + netplay_client->Stop(); }