From 1852cae7c1985ec828dad8b474357e11a84df4a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Feb 2026 18:08:02 +0100 Subject: [PATCH] AdHoc relay server: Replace checkbox with "Auto" / "On" / "Off" --- Core/Config.cpp | 4 ++-- Core/Config.h | 4 +++- Core/ConfigValues.h | 6 ++++++ Core/HLE/sceNetAdhoc.cpp | 20 +++++++++++++++++++- UI/GameSettingsScreen.cpp | 5 ++++- 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 23e273e392..6ebf3241dc 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -71,7 +71,7 @@ static const std::string_view logSectionName = "LogDebug"; static const std::string_view logSectionName = "Log"; #endif -static const std::vector defaultProAdhocServerList = { +const std::vector defaultProAdhocServerList = { "socom.cc", "psp.gameplayer.club", // TODO: Add some saved recent history too? }; @@ -1033,7 +1033,7 @@ static const ConfigSetting networkSettings[] = { ConfigSetting("EnableWlan", SETTING(g_Config, bEnableWlan), false, CfgFlag::PER_GAME), ConfigSetting("EnableAdhocServer", SETTING(g_Config, bEnableAdhocServer), false, CfgFlag::PER_GAME), ConfigSetting("proAdhocServer", SETTING(g_Config, sProAdhocServer), "socom.cc", CfgFlag::PER_GAME), - ConfigSetting("UseServerRelay", SETTING(g_Config, bUseServerRelay), false, CfgFlag::PER_GAME), + ConfigSetting("AdhocServerRelayMode", SETTING(g_Config, iAdhocServerRelayMode), (int)AdhocServerRelayMode::Auto, CfgFlag::PER_GAME), ConfigSetting("proAdhocServerList", SETTING(g_Config, proAdhocServerList), &defaultProAdhocServerList, CfgFlag::DEFAULT), ConfigSetting("PortOffset", SETTING(g_Config, iPortOffset), 10000, CfgFlag::PER_GAME), ConfigSetting("PrimaryDNSServer", SETTING(g_Config, sInfrastructureDNSServer), "67.222.156.250", CfgFlag::PER_GAME), diff --git a/Core/Config.h b/Core/Config.h index ce1dfc1c5d..7f2db72fcb 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -552,7 +552,7 @@ public: // Networking bool bEnableAdhocServer; std::string sProAdhocServer; - bool bUseServerRelay; + int iAdhocServerRelayMode; std::vector proAdhocServerList; std::string sInfrastructureDNSServer; std::string sInfrastructureUsername; // Username used for Infrastructure play. Different restrictions. @@ -765,3 +765,5 @@ std::string CreateRandMAC(); extern http::RequestManager g_DownloadManager; extern Config g_Config; +extern const std::vector defaultProAdhocServerList; + diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index f58564f30d..34d6fadc9d 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -81,6 +81,12 @@ enum class CPUCore { JIT_IR = 3, }; +enum class AdhocServerRelayMode { + Auto = 0, + AlwaysOn = 1, + AlwaysOff = 2, +}; + enum { ROTATION_AUTO = 0, ROTATION_LOCKED_HORIZONTAL = 1, diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 0e6dfdbe8d..aeadc30a8a 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1648,7 +1648,25 @@ u32 sceNetAdhocInit() { // Since we are deleting GameMode Master here, we should probably need to make sure GameMode resources all cleared too. deleteAllGMB(); - serverHasRelay = g_Config.bUseServerRelay; + // If a server is in our default list, we know it supports relay. + switch ((AdhocServerRelayMode)g_Config.iAdhocServerRelayMode) { + case AdhocServerRelayMode::Auto: + serverHasRelay = false; + // If it's in our default server list, we know it supports relay. + for (auto serverName : defaultProAdhocServerList) { + if (serverName == g_Config.sProAdhocServer) { + serverHasRelay = true; + break; + } + } + break; + case AdhocServerRelayMode::AlwaysOn: + serverHasRelay = true; + break; + default: + serverHasRelay = false; + break; + } if (serverHasRelay) { aemu_post_office_init(); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index c1dfee3260..4ec65b08bf 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1049,7 +1049,10 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti } networkingSettings->Add(new ItemHeader(n->T("Ad Hoc multiplayer"))); - networkingSettings->Add(new CheckBox(&g_Config.bUseServerRelay, n->T("Try to use server-provided packet relay")))->SetEnabled(!PSP_IsInited()); + + static const char *relayModes[] = {"Auto", "On", "Off"}; + PopupMultiChoice *relayModePopup = networkingSettings->Add(new PopupMultiChoice(&g_Config.iAdhocServerRelayMode, n->T("Try to use server-provided packet relay"), relayModes, 0, ARRAY_SIZE(relayModes), I18NCat::NETWORKING, screenManager())); + relayModePopup->SetEnabled(!PSP_IsInited()); networkingSettings->Add(new SettingHint(n->T("PacketRelayHint", "Available on servers that provide 'aemu_postoffice' packet relay, like socom.cc. Disable this for LAN or VPN play. Can be more reliable, but sometimes slower."))); networkingSettings->Add(new ItemHeader(n->T("Ad Hoc server")));