summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorRachel Bryk <RachelBryk@gmail.com>2013-09-02 21:54:28 -0400
committerRachel Bryk <RachelBryk@gmail.com>2013-09-02 21:54:28 -0400
commitcea7737aefa2afc6083a14f404c807dc2add894f (patch)
tree0cbb9bd90e55cbecaadd59b06be693bbe9402591 /Source/Core
parent6b1c8f9d17ca7a3e368f9fafeaa8d5d3c729e5b8 (diff)
Fix crash on stop in netplay, and stop netplay when anyone with a pad mapped in game stops emulation.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/NetPlayClient.cpp17
-rw-r--r--Source/Core/Core/Src/NetPlayClient.h1
-rw-r--r--Source/Core/Core/Src/NetPlayServer.cpp14
-rw-r--r--Source/Core/DolphinWX/Src/NetWindow.cpp6
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<std::recursive_mutex> lkp(m_crit.players);
+ std::lock_guard<std::recursive_mutex> 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();
}