diff --git a/rpcs3/Emu/Cell/Modules/sceNpCommerce2.cpp b/rpcs3/Emu/Cell/Modules/sceNpCommerce2.cpp index ab791ca704..fc74bd59ef 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpCommerce2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpCommerce2.cpp @@ -214,7 +214,9 @@ error_code sceNpCommerce2InitGetCategoryContentsResult(vm::ptr result, vm::ptr categoryInfo) { sceNpCommerce2.todo("sceNpCommerce2GetCategoryInfo(result=*0x%x, categoryInfo=*0x%x)", result, categoryInfo); - return CELL_OK; + + // Hack to stop crashes in some games + return SCE_NP_COMMERCE2_ERROR_SERVER_MAINTENANCE; } error_code sceNpCommerce2GetContentInfo(vm::cptr result, u32 index, vm::ptr contentInfo) diff --git a/rpcs3/Emu/NP/fb_helpers.cpp b/rpcs3/Emu/NP/fb_helpers.cpp index 823fadef2d..1b1d705947 100644 --- a/rpcs3/Emu/NP/fb_helpers.cpp +++ b/rpcs3/Emu/NP/fb_helpers.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "np_handler.h" +#include "Emu/Cell/lv2/sys_process.h" LOG_CHANNEL(rpcn_log, "rpcn"); @@ -87,16 +88,31 @@ namespace np { room_info->serverId = room->serverId(); room_info->worldId = room->worldId(); - room_info->publicSlotNum = room->publicSlotNum(); - room_info->privateSlotNum = room->privateSlotNum(); room_info->lobbyId = room->lobbyId(); room_info->roomId = room->roomId(); - room_info->openPublicSlotNum = room->openPublicSlotNum(); room_info->maxSlot = room->maxSlot(); - room_info->openPrivateSlotNum = room->openPrivateSlotNum(); room_info->curMemberNum = room->curMemberNum(); room_info->passwordSlotMask = room->passwordSlotMask(); + s32 sdk_ver; + process_get_sdk_version(process_getpid(), sdk_ver); + + // Structure changed in sdk 3.3.0 + if (sdk_ver >= 0x330000) + { + room_info->publicSlotNum = room->publicSlotNum(); + room_info->privateSlotNum = room->privateSlotNum(); + room_info->openPublicSlotNum = room->openPublicSlotNum(); + room_info->openPrivateSlotNum = room->openPrivateSlotNum(); + } + else + { + room_info->publicSlotNum = 0; + room_info->privateSlotNum = 0; + room_info->openPublicSlotNum = 0; + room_info->openPrivateSlotNum = 0; + } + if (auto owner = room->owner()) { auto* ptr_owner = edata.allocate(sizeof(SceNpUserInfo2), room_info->owner); diff --git a/rpcs3/Emu/NP/np_cache.cpp b/rpcs3/Emu/NP/np_cache.cpp index efe36621bf..6b53cbd502 100644 --- a/rpcs3/Emu/NP/np_cache.cpp +++ b/rpcs3/Emu/NP/np_cache.cpp @@ -11,7 +11,7 @@ namespace np { memberbin_cache::memberbin_cache(const SceNpMatching2RoomMemberBinAttrInternal* sce_memberbin) { - ensure(sce_memberbin && (sce_memberbin->data.ptr.get_ptr() || !sce_memberbin->data.size)); + ensure(sce_memberbin && (sce_memberbin->data.ptr || !sce_memberbin->data.size)); id = sce_memberbin->data.id; updateDate.tick = sce_memberbin->updateDate.tick; diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index e4476d013e..8b22215ff0 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -852,6 +852,8 @@ namespace np queue_basic_event(to_add); send_basic_event(to_add.event, 0, 0); } + + send_basic_event(SCE_NP_BASIC_EVENT_END_OF_INITIAL_PRESENCE, 0, 0); } SceNpCommunicationId np_handler::get_basic_handler_context() diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 5d56b47e15..f2efccd2fa 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -79,6 +79,11 @@ namespace rpcn return get_localized_string(rpcn_state_to_localized_string_id(state)); } + void friend_online_data::dump() const + { + rpcn_log.notice("online: %s, pr_com_id: %s, pr_title: %s, pr_status: %s, pr_comment: %s, pr_data: %s", online ? "true" : "false", pr_com_id.data, pr_title, pr_status, pr_comment, fmt::buf_to_hexstring(pr_data.data(), pr_data.size())); + } + constexpr u32 RPCN_PROTOCOL_VERSION = 21; constexpr usz RPCN_HEADER_SIZE = 15; diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index f2fc89f9bc..c75e827f8a 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -309,6 +309,8 @@ namespace rpcn friend_online_data(bool online, u64 timestamp) : online(online), timestamp(timestamp) {} + void dump() const; + bool online = false; u64 timestamp = 0; SceNpCommunicationId pr_com_id{};