From b8a59865047a4c0c2f13c467499a1cc29e32df5b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 23 May 2025 03:22:02 +0200 Subject: [PATCH 1/2] Update hidapi to 0.15.0 --- 3rdparty/hidapi/hidapi | 2 +- rpcs3/Input/ds4_pad_handler.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/3rdparty/hidapi/hidapi b/3rdparty/hidapi/hidapi index 6bfdcf7368..f42423643e 160000 --- a/3rdparty/hidapi/hidapi +++ b/3rdparty/hidapi/hidapi @@ -1 +1 @@ -Subproject commit 6bfdcf7368169efe1b745cd4468d45cda05ef8de +Subproject commit f42423643ec9011c98cccc0bb790722bbbd3f30b diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index 5ad4f8f3af..3ab7edc648 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -646,7 +646,7 @@ int ds4_pad_handler::send_output_report(DS4Device* device) const auto config = device->config; if (config == nullptr) - return -2; // hid_write and hid_write_control return -1 on error + return -2; // hid_write returns -1 on error // write rumble state ds4_output_report_common common{}; From 57207bbe96d093229580fd52e4853c92dfcd1dc8 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 22 May 2025 12:45:50 +0200 Subject: [PATCH 2/2] Sort bin attributes based on ID --- rpcs3/Emu/NP/rpcn_client.cpp | 111 +++++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 25 deletions(-) diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 7d80c361a8..8fa33a306a 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -1629,17 +1629,6 @@ namespace rpcn { flatbuffers::FlatBufferBuilder builder(1024); - flatbuffers::Offset>> final_binattrinternal_vec; - if (req->roomBinAttrInternalNum && req->roomBinAttrInternal) - { - std::vector> davec; - for (u32 i = 0; i < req->roomBinAttrInternalNum; i++) - { - auto bin = CreateBinAttr(builder, req->roomBinAttrInternal[i].id, builder.CreateVector(req->roomBinAttrInternal[i].ptr.get_ptr(), req->roomBinAttrInternal[i].size)); - davec.push_back(bin); - } - final_binattrinternal_vec = builder.CreateVector(davec); - } flatbuffers::Offset>> final_searchintattrexternal_vec; if (req->roomSearchableIntAttrExternalNum && req->roomSearchableIntAttrExternal) { @@ -1651,28 +1640,74 @@ namespace rpcn } final_searchintattrexternal_vec = builder.CreateVector(davec); } + + // WWE SmackDown vs. RAW 2009 passes roomBinAttrExternal in roomSearchableBinAttrExternal so we parse based on attribute ids + + flatbuffers::Offset>> final_binattrinternal_vec; flatbuffers::Offset>> final_searchbinattrexternal_vec; + flatbuffers::Offset>> final_binattrexternal_vec; + + std::vector> davec_binattrinternal; + std::vector> davec_searchable_binattrexternal; + std::vector> davec_binattrexternal; + + auto put_binattr = [&](SceNpMatching2AttributeId id, flatbuffers::Offset bin) + { + switch (id) + { + case SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_1_ID: + case SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_2_ID: + davec_binattrinternal.push_back(bin); + break; + case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_1_ID: + case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_2_ID: + davec_binattrexternal.push_back(bin); + break; + case SCE_NP_MATCHING2_ROOM_SEARCHABLE_BIN_ATTR_EXTERNAL_1_ID: + davec_searchable_binattrexternal.push_back(bin); + break; + default: + rpcn_log.error("Unexpected bin attribute id in createjoin_room request: 0x%x", id); + break; + } + }; + + if (req->roomBinAttrInternalNum && req->roomBinAttrInternal) + { + for (u32 i = 0; i < req->roomBinAttrInternalNum; i++) + { + auto bin = CreateBinAttr(builder, req->roomBinAttrInternal[i].id, builder.CreateVector(req->roomBinAttrInternal[i].ptr.get_ptr(), req->roomBinAttrInternal[i].size)); + put_binattr(req->roomBinAttrInternal[i].id, bin); + } + } + if (req->roomSearchableBinAttrExternalNum && req->roomSearchableBinAttrExternal) { - std::vector> davec; for (u32 i = 0; i < req->roomSearchableBinAttrExternalNum; i++) { auto bin = CreateBinAttr(builder, req->roomSearchableBinAttrExternal[i].id, builder.CreateVector(req->roomSearchableBinAttrExternal[i].ptr.get_ptr(), req->roomSearchableBinAttrExternal[i].size)); - davec.push_back(bin); + put_binattr(req->roomSearchableBinAttrExternal[i].id, bin); } - final_searchbinattrexternal_vec = builder.CreateVector(davec); } - flatbuffers::Offset>> final_binattrexternal_vec; + if (req->roomBinAttrExternalNum && req->roomBinAttrExternal) { - std::vector> davec; for (u32 i = 0; i < req->roomBinAttrExternalNum; i++) { auto bin = CreateBinAttr(builder, req->roomBinAttrExternal[i].id, builder.CreateVector(req->roomBinAttrExternal[i].ptr.get_ptr(), req->roomBinAttrExternal[i].size)); - davec.push_back(bin); + put_binattr(req->roomBinAttrExternal[i].id, bin); } - final_binattrexternal_vec = builder.CreateVector(davec); } + + if (!davec_binattrinternal.empty()) + final_binattrinternal_vec = builder.CreateVector(davec_binattrinternal); + + if (!davec_searchable_binattrexternal.empty()) + final_searchbinattrexternal_vec = builder.CreateVector(davec_searchable_binattrexternal); + + if (!davec_binattrexternal.empty()) + final_binattrexternal_vec = builder.CreateVector(davec_binattrexternal); + flatbuffers::Offset> final_roompassword; if (req->roomPassword) final_roompassword = builder.CreateVector(req->roomPassword->data, 8); @@ -1884,28 +1919,54 @@ namespace rpcn } final_searchintattrexternal_vec = builder.CreateVector(davec); } + flatbuffers::Offset>> final_searchbinattrexternal_vec; + flatbuffers::Offset>> final_binattrexternal_vec; + + std::vector> davec_searchable_binattrexternal; + std::vector> davec_binattrexternal; + + auto put_binattr = [&](SceNpMatching2AttributeId id, flatbuffers::Offset bin) + { + switch (id) + { + case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_1_ID: + case SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_2_ID: + davec_binattrexternal.push_back(bin); + break; + case SCE_NP_MATCHING2_ROOM_SEARCHABLE_BIN_ATTR_EXTERNAL_1_ID: + davec_searchable_binattrexternal.push_back(bin); + break; + default: + rpcn_log.error("Unexpected bin attribute id in set_roomdata_external request: 0x%x", id); + break; + } + }; + if (req->roomSearchableBinAttrExternalNum && req->roomSearchableBinAttrExternal) { - std::vector> davec; for (u32 i = 0; i < req->roomSearchableBinAttrExternalNum; i++) { auto bin = CreateBinAttr(builder, req->roomSearchableBinAttrExternal[i].id, builder.CreateVector(req->roomSearchableBinAttrExternal[i].ptr.get_ptr(), req->roomSearchableBinAttrExternal[i].size)); - davec.push_back(bin); + put_binattr(req->roomSearchableBinAttrExternal[i].id, bin); } - final_searchbinattrexternal_vec = builder.CreateVector(davec); } - flatbuffers::Offset>> final_binattrexternal_vec; + if (req->roomBinAttrExternalNum && req->roomBinAttrExternal) { - std::vector> davec; for (u32 i = 0; i < req->roomBinAttrExternalNum; i++) { auto bin = CreateBinAttr(builder, req->roomBinAttrExternal[i].id, builder.CreateVector(req->roomBinAttrExternal[i].ptr.get_ptr(), req->roomBinAttrExternal[i].size)); - davec.push_back(bin); + put_binattr(req->roomBinAttrExternal[i].id, bin); } - final_binattrexternal_vec = builder.CreateVector(davec); } + + if (!davec_searchable_binattrexternal.empty()) + final_searchbinattrexternal_vec = builder.CreateVector(davec_searchable_binattrexternal); + + if (!davec_binattrexternal.empty()) + final_binattrexternal_vec = builder.CreateVector(davec_binattrexternal); + auto req_finished = CreateSetRoomDataExternalRequest(builder, req->roomId, final_searchintattrexternal_vec, final_searchbinattrexternal_vec, final_binattrexternal_vec); builder.Finish(req_finished);