From fdfa14d9cc412d6ed8db841136ef62b6b3facb3e Mon Sep 17 00:00:00 2001 From: Brandon Rothweiler Date: Tue, 30 Jul 2019 20:14:51 -0700 Subject: [PATCH 1/2] Show a message in netplay chat when a player joins or leaves --- Source/Core/Core/NetPlayClient.cpp | 4 ++++ Source/Core/Core/NetPlayClient.h | 2 ++ Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp | 10 ++++++++++ Source/Core/DolphinQt/NetPlay/NetPlayDialog.h | 2 ++ 4 files changed, 18 insertions(+) diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index d157d892a3..0d97ec26ab 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -305,6 +305,8 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet) m_players[player.pid] = player; } + m_dialog->OnPlayerConnect(player.name); + m_dialog->Update(); } break; @@ -316,6 +318,8 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet) INFO_LOG(NETPLAY, "Player %s (%d) left", m_players.find(pid)->second.name.c_str(), pid); + m_dialog->OnPlayerDisconnect(m_players.find(pid)->second.name); + { std::lock_guard lkp(m_crit.players); m_players.erase(m_players.find(pid)); diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index 7ece1a5a68..2e6acf4518 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -46,6 +46,8 @@ public: virtual void OnMsgStartGame() = 0; virtual void OnMsgStopGame() = 0; virtual void OnMsgPowerButton() = 0; + virtual void OnPlayerConnect(const std::string& player) = 0; + virtual void OnPlayerDisconnect(const std::string& player) = 0; virtual void OnPadBufferChanged(u32 buffer) = 0; virtual void OnHostInputAuthorityChanged(bool enabled) = 0; virtual void OnDesync(u32 frame, const std::string& player) = 0; diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp index d8e2a5f4d2..69d01a94a4 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp @@ -887,6 +887,16 @@ void NetPlayDialog::OnMsgPowerButton() QueueOnObject(this, [] { UICommon::TriggerSTMPowerEvent(); }); } +void NetPlayDialog::OnPlayerConnect(const std::string& player) +{ + DisplayMessage(tr("%1 has joined").arg(QString::fromStdString(player)), "darkcyan"); +} + +void NetPlayDialog::OnPlayerDisconnect(const std::string& player) +{ + DisplayMessage(tr("%1 has left").arg(QString::fromStdString(player)), "darkcyan"); +} + void NetPlayDialog::OnPadBufferChanged(u32 buffer) { QueueOnObject(this, [this, buffer] { diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h index 64824d2847..84fc24e5e1 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.h @@ -49,6 +49,8 @@ public: void OnMsgStartGame() override; void OnMsgStopGame() override; void OnMsgPowerButton() override; + void OnPlayerConnect(const std::string& player) override; + void OnPlayerDisconnect(const std::string& player) override; void OnPadBufferChanged(u32 buffer) override; void OnHostInputAuthorityChanged(bool enabled) override; void OnDesync(u32 frame, const std::string& player) override; From 8857db98339bbf902cbc95c24822dbe1ce5ffa05 Mon Sep 17 00:00:00 2001 From: Brandon Rothweiler Date: Tue, 13 Aug 2019 18:00:12 -0700 Subject: [PATCH 2/2] Check validity of iterator before dereferencing --- Source/Core/Core/NetPlayClient.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 0d97ec26ab..40b4f1703a 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -316,12 +316,15 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet) PlayerId pid; packet >> pid; - INFO_LOG(NETPLAY, "Player %s (%d) left", m_players.find(pid)->second.name.c_str(), pid); - - m_dialog->OnPlayerDisconnect(m_players.find(pid)->second.name); - { std::lock_guard lkp(m_crit.players); + const auto it = m_players.find(pid); + if (it == m_players.end()) + break; + + const auto& player = it->second; + INFO_LOG(NETPLAY, "Player %s (%d) left", player.name.c_str(), pid); + m_dialog->OnPlayerDisconnect(player.name); m_players.erase(m_players.find(pid)); }