diff --git a/Common/Data/Format/JSONReader.cpp b/Common/Data/Format/JSONReader.cpp
index 6e7af3634f..3a4e947bb0 100644
--- a/Common/Data/Format/JSONReader.cpp
+++ b/Common/Data/Format/JSONReader.cpp
@@ -131,7 +131,7 @@ bool JsonGet::getBool(const char *child_name) const {
return get(child_name)->value.getTag() == JSON_TRUE;
}
-bool JsonGet::getBool(const char *child_name, bool default_value) const {
+bool JsonGet::getBoolOr(const char *child_name, bool default_value) const {
const JsonNode *val = get(child_name);
if (val) {
JsonTag tag = val->value.getTag();
diff --git a/Common/Data/Format/JSONReader.h b/Common/Data/Format/JSONReader.h
index 4cd849c52b..08bb555095 100644
--- a/Common/Data/Format/JSONReader.h
+++ b/Common/Data/Format/JSONReader.h
@@ -30,7 +30,7 @@ struct JsonGet {
int getInt(const char *child_name) const;
int getInt(const char *child_name, int default_value) const;
bool getBool(const char *child_name) const;
- bool getBool(const char *child_name, bool default_value) const;
+ bool getBoolOr(const char *child_name, bool default_value) const;
bool hasChild(const char *child_name, JsonTag child_type) const {
return get(child_name, child_type) != nullptr;
diff --git a/Common/GhidraClient.cpp b/Common/GhidraClient.cpp
index 815eaf63b7..26a95ff796 100644
--- a/Common/GhidraClient.cpp
+++ b/Common/GhidraClient.cpp
@@ -123,7 +123,7 @@ bool GhidraClient::FetchTypes() {
type.pathName = entry.getStringOr("pathName", "");
type.length = entry.getInt("length", 0);
type.alignedLength = entry.getInt("alignedLength", 0);
- type.zeroLength = entry.getBool("zeroLength", false);
+ type.zeroLength = entry.getBoolOr("zeroLength", false);
type.description = entry.getStringOr("description", "");
type.kind = ResolveTypeKind(entry.getStringOr("kind", ""));
diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp
index 7e1b66d614..592f31db6b 100644
--- a/Core/HLE/sceNet.cpp
+++ b/Core/HLE/sceNet.cpp
@@ -228,7 +228,7 @@ bool LoadDNSForGameID(std::string_view gameID, std::string_view jsonStr, InfraDN
dns->revivalTeamURL = revived.getStringOr("url", "");
}
}
- dns->connectAdHocForGrouping = def.getBool("connect_adhoc_for_grouping", false);
+ dns->connectAdHocForGrouping = def.getBoolOr("connect_adhoc_for_grouping", false);
}
const JsonNode *games = root.getArray("games");
@@ -290,7 +290,7 @@ bool LoadDNSForGameID(std::string_view gameID, std::string_view jsonStr, InfraDN
dns->gameName = game.getStringOr("name", "");
dns->dns = game.getStringOr("dns", dns->dns.c_str());
dns->dyn_dns = game.getStringOr("dyn_dns", "");
- dns->connectAdHocForGrouping = game.getBool("connect_adhoc_for_grouping", dns->connectAdHocForGrouping);
+ dns->connectAdHocForGrouping = game.getBoolOr("connect_adhoc_for_grouping", dns->connectAdHocForGrouping);
if (game.hasChild("domains", JSON_OBJECT)) {
const JsonGet domains = game.getDict("domains");
for (const auto &iter : domains.value_) {
diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp
index 30542c2b0e..e22d328a34 100644
--- a/Core/HLE/sceNetAdhoc.cpp
+++ b/Core/HLE/sceNetAdhoc.cpp
@@ -142,6 +142,7 @@ static bool ParseServerListEntriesJSON(std::string_view json) {
for (const JsonNode *iter : servers->value) {
JsonGet server = iter->value;
AdhocServerListEntry entry;
+ entry.hidden = server.getBoolOr("hidden", false);
entry.name = server.getStringOr("name", "");
entry.discord = server.getStringOr("discord", "");
entry.host = server.getStringOr("host", "");
diff --git a/Core/HLE/sceNetAdhoc.h b/Core/HLE/sceNetAdhoc.h
index ade0870b4c..ed627206a7 100644
--- a/Core/HLE/sceNetAdhoc.h
+++ b/Core/HLE/sceNetAdhoc.h
@@ -114,6 +114,7 @@ struct AdhocServerListEntry {
std::string dataJsonUrl;
std::string statusXmlUrl;
std::string statusWebUrl;
+ bool hidden = false;
AdhocDataMode mode = AdhocDataMode::P2P;
};
diff --git a/UI/AdhocServerScreen.cpp b/UI/AdhocServerScreen.cpp
index 7beb8ad91d..040d77d9d0 100644
--- a/UI/AdhocServerScreen.cpp
+++ b/UI/AdhocServerScreen.cpp
@@ -726,6 +726,8 @@ void AdhocServerScreen::CreatePopupContents(UI::ViewGroup *parent) {
CollapsibleSection *publicSection = innerView->Add(new CollapsibleSection(n->T("Public server list"), new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)));
for (const auto &entry : entries) {
+ if (entry.hidden)
+ continue;
AddButtonFromEntry(publicSection, entry, false);
}
diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj
index 8135b96df9..55cd42e4e1 100644
--- a/Windows/PPSSPP.vcxproj
+++ b/Windows/PPSSPP.vcxproj
@@ -1177,10 +1177,34 @@
+
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+ true
+ true
+ true
+ true
+
@@ -1411,6 +1435,14 @@
+
+ true
+ true
+ true
+ true
+ true
+ true
+
@@ -1426,4 +1458,4 @@
-
+
\ No newline at end of file
diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters
index 687e8ba4b0..07285507bc 100644
--- a/Windows/PPSSPP.vcxproj.filters
+++ b/Windows/PPSSPP.vcxproj.filters
@@ -68,6 +68,9 @@
{55d277d0-1afa-464d-9bde-672334ad73fe}
+
+ {a5b85611-e50f-4179-814d-426816c1e04d}
+
@@ -830,6 +833,15 @@
Other Platforms
+
+ assets
+
+
+ assets
+
+
+ assets
+
@@ -864,5 +876,8 @@
Other Platforms\SDL
+
+ assets
+
-
+
\ No newline at end of file