diff options
Diffstat (limited to 'Source/Core/DolphinWX/NetPlay/NetWindow.cpp')
| -rw-r--r-- | Source/Core/DolphinWX/NetPlay/NetWindow.cpp | 162 |
1 files changed, 127 insertions, 35 deletions
diff --git a/Source/Core/DolphinWX/NetPlay/NetWindow.cpp b/Source/Core/DolphinWX/NetPlay/NetWindow.cpp index bbd5308e03..200597b9ca 100644 --- a/Source/Core/DolphinWX/NetPlay/NetWindow.cpp +++ b/Source/Core/DolphinWX/NetPlay/NetWindow.cpp @@ -12,6 +12,7 @@ #include <wx/checkbox.h> #include <wx/choice.h> #include <wx/clipbrd.h> +#include <wx/colour.h> #include <wx/dialog.h> #include <wx/frame.h> #include <wx/listbox.h> @@ -48,29 +49,13 @@ #include "DolphinWX/WxUtils.h" #include "MD5Dialog.h" +#include "VideoCommon/OnScreenDisplay.h" +#include "VideoCommon/VideoConfig.h" + NetPlayServer* NetPlayDialog::netplay_server = nullptr; NetPlayClient* NetPlayDialog::netplay_client = nullptr; NetPlayDialog* NetPlayDialog::npd = nullptr; -static wxString FailureReasonStringForHostLabel(int reason) -{ - switch (reason) - { - case TraversalClient::BadHost: - return _("(Error: Bad host)"); - case TraversalClient::VersionTooOld: - return _("(Error: Dolphin too old)"); - case TraversalClient::ServerForgotAboutUs: - return _("(Error: Disconnected)"); - case TraversalClient::SocketSendError: - return _("(Error: Socket)"); - case TraversalClient::ResendTimeout: - return _("(Error: Timeout)"); - default: - return _("(Error: Unknown)"); - } -} - static std::string BuildGameName(const GameListItem& game) { // Lang needs to be consistent @@ -280,13 +265,13 @@ NetPlayDialog::~NetPlayDialog() void NetPlayDialog::OnChat(wxCommandEvent&) { - wxString text = m_chat_msg_text->GetValue(); + std::string text = WxStrToStr(m_chat_msg_text->GetValue()); if (!text.empty()) { - netplay_client->SendChatMessage(WxStrToStr(text)); - m_chat_text->AppendText(text.Prepend(" >> ").Append('\n')); + netplay_client->SendChatMessage(text); m_chat_msg_text->Clear(); + AddChatMessage(ChatMessageType::UserOut, text); } } @@ -406,11 +391,46 @@ void NetPlayDialog::OnAdjustBuffer(wxCommandEvent& event) { const int val = ((wxSpinCtrl*)event.GetEventObject())->GetValue(); netplay_server->AdjustPadBufferSize(val); +} - std::ostringstream ss; - ss << "< Pad Buffer: " << val << " >"; - netplay_client->SendChatMessage(ss.str()); - m_chat_text->AppendText(StrToWxStr(ss.str()).Append('\n')); +void NetPlayDialog::OnPadBufferChanged(u32 buffer) +{ + m_pad_buffer = buffer; + wxThreadEvent evt(wxEVT_THREAD, NP_GUI_EVT_PAD_BUFFER_CHANGE); + GetEventHandler()->AddPendingEvent(evt); +} + +void NetPlayDialog::OnDesync(u32 frame, const std::string& player) +{ + m_desync_frame = frame; + m_desync_player = player; + wxThreadEvent evt(wxEVT_THREAD, NP_GUI_EVT_DESYNC); + GetEventHandler()->AddPendingEvent(evt); +} + +void NetPlayDialog::OnConnectionLost() +{ + wxThreadEvent evt(wxEVT_THREAD, NP_GUI_EVT_CONNECTION_LOST); + GetEventHandler()->AddPendingEvent(evt); +} + +void NetPlayDialog::OnTraversalError(int error) +{ + switch (error) + { + case TraversalClient::BadHost: + PanicAlertT("Couldn't look up central server"); + break; + case TraversalClient::VersionTooOld: + PanicAlertT("Dolphin is too old for traversal server"); + break; + case TraversalClient::ServerForgotAboutUs: + case TraversalClient::SocketSendError: + case TraversalClient::ResendTimeout: + wxThreadEvent evt(wxEVT_THREAD, NP_GUI_EVT_TRAVERSAL_CONNECTION_ERROR); + GetEventHandler()->AddPendingEvent(evt); + break; + } } void NetPlayDialog::OnQuit(wxCommandEvent&) @@ -477,17 +497,16 @@ void NetPlayDialog::OnThread(wxThreadEvent& event) case NP_GUI_EVT_START_GAME: // client start game :/ { - std::string game = FindCurrentGame(); - if (game.empty()) - WxUtils::ShowErrorDialog(_("Game not found!")); - else - netplay_client->StartGame(game); + netplay_client->StartGame(FindCurrentGame()); + std::string msg = "Starting game"; + AddChatMessage(ChatMessageType::Info, msg); } break; case NP_GUI_EVT_STOP_GAME: // client stop game { - netplay_client->StopGame(); + std::string msg = "Stopping game"; + AddChatMessage(ChatMessageType::Info, msg); } break; case NP_GUI_EVT_DISPLAY_MD5_DIALOG: @@ -515,6 +534,42 @@ void NetPlayDialog::OnThread(wxThreadEvent& event) m_MD5_dialog->SetResult(payload.first, payload.second); } break; + case NP_GUI_EVT_PAD_BUFFER_CHANGE: + { + std::string msg = StringFromFormat("Pad buffer: %d", m_pad_buffer); + + if (g_ActiveConfig.bShowNetPlayMessages) + { + OSD::AddTypedMessage(OSD::MessageType::NetPlayBuffer, msg, OSD::Duration::NORMAL); + } + + AddChatMessage(ChatMessageType::Info, msg); + } + break; + case NP_GUI_EVT_DESYNC: + { + std::string msg = "Possible desync detected from player " + m_desync_player + " on frame " + + std::to_string(m_desync_frame); + + AddChatMessage(ChatMessageType::Error, msg); + + if (g_ActiveConfig.bShowNetPlayMessages) + { + OSD::AddMessage(msg, OSD::Duration::VERY_LONG, OSD::Color::RED); + } + } + break; + case NP_GUI_EVT_CONNECTION_LOST: + { + std::string msg = "Lost connection to server"; + AddChatMessage(ChatMessageType::Error, msg); + } + break; + case NP_GUI_EVT_TRAVERSAL_CONNECTION_ERROR: + { + std::string msg = "Traversal server connection error"; + AddChatMessage(ChatMessageType::Error, msg); + } } // chat messages @@ -522,8 +577,12 @@ void NetPlayDialog::OnThread(wxThreadEvent& event) { std::string s; chat_msgs.Pop(s); - // PanicAlert("message: %s", s.c_str()); - m_chat_text->AppendText(StrToWxStr(s).Append('\n')); + AddChatMessage(ChatMessageType::UserIn, s); + + if (g_ActiveConfig.bShowNetPlayMessages) + { + OSD::AddMessage(s, OSD::Duration::NORMAL, OSD::Color::GREEN); + } } } @@ -690,7 +749,7 @@ void NetPlayDialog::UpdateHostLabel() break; case TraversalClient::Failure: m_host_label->SetForegroundColour(*wxBLACK); - m_host_label->SetLabel(FailureReasonStringForHostLabel(g_TraversalClient->m_FailureReason)); + m_host_label->SetLabel("..."); m_host_copy_btn->SetLabel(_("Retry")); m_host_copy_btn->Enable(); m_host_copy_btn_is_retry = true; @@ -724,3 +783,36 @@ void NetPlayDialog::UpdateHostLabel() } } } + +void NetPlayDialog::AddChatMessage(ChatMessageType type, const std::string& msg) +{ + wxColour colour = *wxBLACK; + std::string printed_msg = msg; + + switch (type) + { + case ChatMessageType::Info: + colour = wxColour(0, 150, 150); // cyan + break; + + case ChatMessageType::Error: + colour = *wxRED; + break; + + case ChatMessageType::UserIn: + colour = wxColour(0, 150, 0); // green + printed_msg = "▶ " + msg; + break; + + case ChatMessageType::UserOut: + colour = wxColour(100, 100, 100); // grey + printed_msg = "◀ " + msg; + break; + } + + if (type == ChatMessageType::Info || type == ChatMessageType::Error) + printed_msg = "― " + msg + " ―"; + + m_chat_text->SetDefaultStyle(wxTextAttr(colour)); + m_chat_text->AppendText(StrToWxStr(printed_msg + "\n")); +} |
