From 3e7ff4059e6bff50cf9045592e3cdafe4232444a Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Thu, 16 May 2024 04:52:15 +0200 Subject: [PATCH] Add matching2 option handling --- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 4 ++-- rpcs3/Emu/NP/fb_helpers.cpp | 40 +++++++++++++++---------------- rpcs3/Emu/NP/np_cache.cpp | 14 +++++------ rpcs3/Emu/NP/np_cache.h | 2 +- rpcs3/Emu/NP/np_contexts.cpp | 9 ++++--- rpcs3/Emu/NP/np_contexts.h | 5 ++-- rpcs3/Emu/NP/np_handler.cpp | 18 ++++++++++++-- rpcs3/Emu/NP/np_handler.h | 21 ++++++++-------- rpcs3/Emu/NP/np_notifications.cpp | 15 ++++++++---- rpcs3/Emu/NP/np_requests.cpp | 16 +++++++++---- rpcs3/Emu/NP/np_structs_extra.cpp | 4 ++-- 11 files changed, 89 insertions(+), 59 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index b44b9df6cc..d0b957f2e8 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -1044,7 +1044,7 @@ error_code sceNpMatching2GetRoomMemberDataInternalLocal(SceNpMatching2ContextId return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_FOUND; } - return nph.local_get_room_member_data(roomId, memberId, binattrs_list, member ? member.get_ptr() : nullptr, buf.addr(), bufLen); + return nph.local_get_room_member_data(roomId, memberId, binattrs_list, member ? member.get_ptr() : nullptr, buf.addr(), bufLen, ctxId); } error_code sceNpMatching2GetCbQueueInfo(SceNpMatching2ContextId ctxId, vm::ptr queueInfo) @@ -1309,7 +1309,7 @@ error_code sceNpMatching2CreateContext( return SCE_NP_MATCHING2_ERROR_NOT_NP_SIGN_IN; } - *ctxId = create_match2_context(commId, passPhrase); + *ctxId = create_match2_context(commId, passPhrase, option); return CELL_OK; } diff --git a/rpcs3/Emu/NP/fb_helpers.cpp b/rpcs3/Emu/NP/fb_helpers.cpp index 1b1d705947..35f4a86382 100644 --- a/rpcs3/Emu/NP/fb_helpers.cpp +++ b/rpcs3/Emu/NP/fb_helpers.cpp @@ -67,24 +67,24 @@ namespace np } } - void np_handler::UserInfo2_to_SceNpUserInfo2(event_data& edata, const UserInfo2* user, SceNpUserInfo2* user_info) + void np_handler::UserInfo2_to_SceNpUserInfo2(event_data& edata, const UserInfo2* user, SceNpUserInfo2* user_info, bool include_onlinename, bool include_avatarurl) { if (user->npId()) std::memcpy(user_info->npId.handle.data, user->npId()->c_str(), std::min(16, user->npId()->size())); - if (user->onlineName()) + if (include_onlinename && user->onlineName()) { auto* ptr = edata.allocate(sizeof(SceNpOnlineName), user_info->onlineName); std::memcpy(ptr->data, user->onlineName()->c_str(), std::min(48, user->onlineName()->size())); } - if (user->avatarUrl()) + if (include_avatarurl && user->avatarUrl()) { auto* ptr = edata.allocate(sizeof(SceNpAvatarUrl), user_info->avatarUrl); std::memcpy(ptr->data, user->avatarUrl()->c_str(), std::min(127, user->avatarUrl()->size())); } } - void np_handler::RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const RoomDataExternal* room, SceNpMatching2RoomDataExternal* room_info) + void np_handler::RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const RoomDataExternal* room, SceNpMatching2RoomDataExternal* room_info, bool include_onlinename, bool include_avatarurl) { room_info->serverId = room->serverId(); room_info->worldId = room->worldId(); @@ -116,7 +116,7 @@ namespace np if (auto owner = room->owner()) { auto* ptr_owner = edata.allocate(sizeof(SceNpUserInfo2), room_info->owner); - UserInfo2_to_SceNpUserInfo2(edata, owner, ptr_owner); + UserInfo2_to_SceNpUserInfo2(edata, owner, ptr_owner, include_onlinename, include_avatarurl); } if (room->roomGroup() && room->roomGroup()->size() != 0) @@ -172,13 +172,13 @@ namespace np cur_room = (i > 0) ? edata.allocate(sizeof(SceNpMatching2RoomDataExternal), prev_room->next) : edata.allocate(sizeof(SceNpMatching2RoomDataExternal), search_resp->roomDataExternal); - RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, fb_room, cur_room); + RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, fb_room, cur_room, true, true); prev_room = cur_room; } } } - void np_handler::GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const GetRoomDataExternalListResponse* resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp) + void np_handler::GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const GetRoomDataExternalListResponse* resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl) { get_resp->roomDataExternalNum = resp->rooms() ? resp->rooms()->size() : 0; @@ -191,12 +191,12 @@ namespace np cur_room = (i > 0) ? edata.allocate(sizeof(SceNpMatching2RoomDataExternal), prev_room->next) : edata.allocate(sizeof(SceNpMatching2RoomDataExternal), get_resp->roomDataExternal); - RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, fb_room, cur_room); + RoomDataExternal_to_SceNpMatching2RoomDataExternal(edata, fb_room, cur_room, include_onlinename, include_avatarurl); prev_room = cur_room; } } - u16 np_handler::RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const RoomDataInternal* resp, SceNpMatching2RoomDataInternal* room_info, const SceNpId& npid) + u16 np_handler::RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const RoomDataInternal* resp, SceNpMatching2RoomDataInternal* room_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl) { u16 member_id = 0; room_info->serverId = resp->serverId(); @@ -227,7 +227,7 @@ namespace np edata.add_relocation(sce_member->next); } - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, fb_member, room_info, sce_member); + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, fb_member, room_info, sce_member, include_onlinename, include_avatarurl); } for (u32 i = 0; i < room_info->memberList.membersNum; i++) @@ -279,9 +279,9 @@ namespace np return member_id; } - void np_handler::RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const RoomMemberDataInternal* member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data) + void np_handler::RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const RoomMemberDataInternal* member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data, bool include_onlinename, bool include_avatarurl) { - UserInfo2_to_SceNpUserInfo2(edata, member_data->userInfo(), &sce_member_data->userInfo); + UserInfo2_to_SceNpUserInfo2(edata, member_data->userInfo(), &sce_member_data->userInfo, include_onlinename, include_avatarurl); sce_member_data->joinDate.tick = member_data->joinDate(); sce_member_data->memberId = member_data->memberId(); sce_member_data->teamId = member_data->teamId(); @@ -325,7 +325,7 @@ namespace np } } - void np_handler::RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const RoomMemberUpdateInfo* update_info, SceNpMatching2RoomMemberUpdateInfo* sce_update_info) + void np_handler::RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const RoomMemberUpdateInfo* update_info, SceNpMatching2RoomMemberUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl) { sce_update_info->eventCause = 0; if (update_info->optData()) @@ -343,7 +343,7 @@ namespace np auto* ptr_roomemberinternal = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), sce_update_info->roomMemberDataInternal); // TODO: Pass room_info - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, fb_member, nullptr, ptr_roomemberinternal); + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, fb_member, nullptr, ptr_roomemberinternal, include_onlinename, include_avatarurl); } } @@ -361,10 +361,10 @@ namespace np } } - void np_handler::RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const RoomDataInternalUpdateInfo* update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid) + void np_handler::RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const RoomDataInternalUpdateInfo* update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl) { auto* sce_room_data = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), sce_update_info->newRoomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, update_info->newRoomDataInternal(), sce_room_data, npid); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, update_info->newRoomDataInternal(), sce_room_data, npid, include_onlinename, include_avatarurl); if (sce_room_data->flagAttr != update_info->prevFlagAttr()) { @@ -417,10 +417,10 @@ namespace np } } - void np_handler::RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const RoomMemberDataInternalUpdateInfo* update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info) + void np_handler::RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const RoomMemberDataInternalUpdateInfo* update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl) { auto* sce_room_member_data = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), sce_update_info->newRoomMemberDataInternal); - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, update_info->newRoomMemberDataInternal(), nullptr, sce_room_member_data); + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, update_info->newRoomMemberDataInternal(), nullptr, sce_room_member_data, include_onlinename, include_avatarurl); if (sce_update_info->newRoomMemberDataInternal->flagAttr != update_info->prevFlagAttr()) { @@ -469,7 +469,7 @@ namespace np sce_resp->rtt = resp->rtt(); } - void np_handler::RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const RoomMessageInfo* mi, SceNpMatching2RoomMessageInfo* sce_mi) + void np_handler::RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const RoomMessageInfo* mi, SceNpMatching2RoomMessageInfo* sce_mi, bool include_onlinename, bool include_avatarurl) { sce_mi->filtered = mi->filtered(); sce_mi->castType = mi->castType(); @@ -500,7 +500,7 @@ namespace np if (auto src_member = mi->srcMember()) { auto* ptr_sce_userinfo = edata.allocate(sizeof(SceNpUserInfo2), sce_mi->srcMember); - UserInfo2_to_SceNpUserInfo2(edata, src_member, ptr_sce_userinfo); + UserInfo2_to_SceNpUserInfo2(edata, src_member, ptr_sce_userinfo, include_onlinename, include_avatarurl); } if (auto msg = mi->msg()) diff --git a/rpcs3/Emu/NP/np_cache.cpp b/rpcs3/Emu/NP/np_cache.cpp index 8d1b028e40..986a112455 100644 --- a/rpcs3/Emu/NP/np_cache.cpp +++ b/rpcs3/Emu/NP/np_cache.cpp @@ -220,7 +220,7 @@ namespace np return {CELL_OK, rooms[room_id].password}; } - error_code cache_manager::get_member_and_attrs(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data) + error_code cache_manager::get_member_and_attrs(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, bool include_onlinename, bool include_avatarurl) { std::lock_guard lock(mutex); @@ -249,11 +249,11 @@ namespace np } u32 needed_data_size = 0; - - if (member.userInfo.onlineName) + + if (include_onlinename && member.userInfo.onlineName) needed_data_size += sizeof(SceNpOnlineName); - - if (member.userInfo.avatarUrl) + + if (include_avatarurl && member.userInfo.avatarUrl) needed_data_size += sizeof(SceNpAvatarUrl); if (member.group_id) @@ -280,13 +280,13 @@ namespace np memory_allocator mem; mem.setup(vm::ptr(vm::cast(addr_data)), size_data); - if (member.userInfo.onlineName) + if (include_onlinename && member.userInfo.onlineName) { ptr_member->userInfo.onlineName.set(mem.allocate(sizeof(SceNpOnlineName))); memcpy(ptr_member->userInfo.onlineName.get_ptr(), &member.userInfo.onlineName.value(), sizeof(SceNpOnlineName)); } - if (member.userInfo.avatarUrl) + if (include_avatarurl && member.userInfo.avatarUrl) { ptr_member->userInfo.avatarUrl.set(mem.allocate(sizeof(SceNpAvatarUrl))); memcpy(ptr_member->userInfo.avatarUrl.get_ptr(), &member.userInfo.avatarUrl.value(), sizeof(SceNpAvatarUrl)); diff --git a/rpcs3/Emu/NP/np_cache.h b/rpcs3/Emu/NP/np_cache.h index 9883375e0e..9e1b496ea5 100644 --- a/rpcs3/Emu/NP/np_cache.h +++ b/rpcs3/Emu/NP/np_cache.h @@ -74,7 +74,7 @@ namespace np std::pair> get_slots(SceNpMatching2RoomId room_id); std::pair> get_memberids(u64 room_id, s32 sort_method); std::pair> get_password(SceNpMatching2RoomId room_id); - error_code get_member_and_attrs(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data); + error_code get_member_and_attrs(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, bool include_onlinename, bool include_avatarurl); std::pair> get_npid(u64 room_id, u16 member_id); std::optional get_memberid(u64 room_id, const SceNpId& npid); diff --git a/rpcs3/Emu/NP/np_contexts.cpp b/rpcs3/Emu/NP/np_contexts.cpp index 112d926e90..d9acbc4396 100644 --- a/rpcs3/Emu/NP/np_contexts.cpp +++ b/rpcs3/Emu/NP/np_contexts.cpp @@ -136,16 +136,19 @@ bool destroy_score_transaction_context(s32 ctx_id) return idm::remove(static_cast(ctx_id)); } -match2_ctx::match2_ctx(vm::cptr communicationId, vm::cptr passphrase) +match2_ctx::match2_ctx(vm::cptr communicationId, vm::cptr passphrase, s32 option) { ensure(!communicationId->data[9] && strlen(communicationId->data) == 9); memcpy(&this->communicationId, communicationId.get_ptr(), sizeof(SceNpCommunicationId)); memcpy(&this->passphrase, passphrase.get_ptr(), sizeof(SceNpCommunicationPassphrase)); + + include_onlinename = option & SCE_NP_MATCHING2_CONTEXT_OPTION_USE_ONLINENAME; + include_avatarurl = option & SCE_NP_MATCHING2_CONTEXT_OPTION_USE_AVATARURL; } -u16 create_match2_context(vm::cptr communicationId, vm::cptr passphrase) +u16 create_match2_context(vm::cptr communicationId, vm::cptr passphrase, s32 option) { sceNp2.notice("Creating match2 context with communicationId: <%s>", static_cast(communicationId->data)); - return static_cast(idm::make(communicationId, passphrase)); + return static_cast(idm::make(communicationId, passphrase, option)); } bool destroy_match2_context(u16 ctx_id) { diff --git a/rpcs3/Emu/NP/np_contexts.h b/rpcs3/Emu/NP/np_contexts.h index 236974d36a..edb4c1dc79 100644 --- a/rpcs3/Emu/NP/np_contexts.h +++ b/rpcs3/Emu/NP/np_contexts.h @@ -184,7 +184,7 @@ bool destroy_score_transaction_context(s32 ctx_id); // Match2 related struct match2_ctx { - match2_ctx(vm::cptr communicationId, vm::cptr passphrase); + match2_ctx(vm::cptr communicationId, vm::cptr passphrase, s32 option); static const u32 id_base = 1; static const u32 id_step = 1; @@ -195,6 +195,7 @@ struct match2_ctx SceNpCommunicationId communicationId{}; SceNpCommunicationPassphrase passphrase{}; + bool include_onlinename = false, include_avatarurl = false; vm::ptr context_callback{}; vm::ptr context_callback_param{}; @@ -204,7 +205,7 @@ struct match2_ctx vm::ptr signaling_cb{}; vm::ptr signaling_cb_arg{}; }; -u16 create_match2_context(vm::cptr communicationId, vm::cptr passphrase); +u16 create_match2_context(vm::cptr communicationId, vm::cptr passphrase, s32 option); bool check_match2_context(u16 ctx_id); std::shared_ptr get_match2_context(u16 ctx_id); bool destroy_match2_context(u16 ctx_id); diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index d3780baf87..8cb9be53c6 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1594,9 +1594,10 @@ namespace np return np_cache.get_memberids(room_id, sort_method); } - error_code np_handler::local_get_room_member_data(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data) + error_code np_handler::local_get_room_member_data(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, u32 ctx_id) { - return np_cache.get_member_and_attrs(room_id, member_id, binattrs_list, ptr_member, addr_data, size_data); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(ctx_id); + return np_cache.get_member_and_attrs(room_id, member_id, binattrs_list, ptr_member, addr_data, size_data, include_onlinename, include_avatarurl); } void np_handler::upnp_add_port_mapping(u16 internal_port, std::string_view protocol) @@ -1608,4 +1609,17 @@ namespace np { upnp.remove_port_redir(internal_port, protocol); } + + std::pair np_handler::get_match2_context_options(u32 ctx_id) + { + bool include_onlinename = false, include_avatarurl = false; + + if (auto ctx = get_match2_context(ctx_id)) + { + include_onlinename = ctx->include_onlinename; + include_avatarurl = ctx->include_avatarurl; + } + + return {include_onlinename, include_avatarurl}; + } } // namespace np diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index 91821f478f..5aee2547f9 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -205,7 +205,7 @@ namespace np std::pair> local_get_room_slots(SceNpMatching2RoomId room_id); std::pair> local_get_room_password(SceNpMatching2RoomId room_id); std::pair> local_get_room_memberids(SceNpMatching2RoomId room_id, s32 sort_method); - error_code local_get_room_member_data(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data); + error_code local_get_room_member_data(SceNpMatching2RoomId room_id, SceNpMatching2RoomMemberId member_id, const std::vector& binattrs_list, SceNpMatching2RoomMemberDataInternal* ptr_member, u32 addr_data, u32 size_data, u32 ctx_id); // Friend stuff u32 get_num_friends(); @@ -310,24 +310,25 @@ namespace np bool reply_tus_delete_multislot_data(u32 req_id, std::vector& reply_data); // Helper functions(fb=>np2) + std::pair get_match2_context_options(u32 ctx_id); void BinAttr_to_SceNpMatching2BinAttr(event_data& edata, const BinAttr* bin_attr, SceNpMatching2BinAttr* binattr_info); void BinAttrs_to_SceNpMatching2BinAttrs(event_data& edata, const flatbuffers::Vector>* fb_attr, SceNpMatching2BinAttr* binattr_info); void RoomMemberBinAttrInternal_to_SceNpMatching2RoomMemberBinAttrInternal(event_data& edata, const RoomMemberBinAttrInternal* fb_attr, SceNpMatching2RoomMemberBinAttrInternal* binattr_info); void RoomBinAttrInternal_to_SceNpMatching2RoomBinAttrInternal(event_data& edata, const BinAttrInternal* fb_attr, SceNpMatching2RoomBinAttrInternal* binattr_info); void RoomGroup_to_SceNpMatching2RoomGroup(const RoomGroup* fb_group, SceNpMatching2RoomGroup* sce_group); void RoomGroups_to_SceNpMatching2RoomGroups(const flatbuffers::Vector>* fb_groups, SceNpMatching2RoomGroup* sce_groups); - void UserInfo2_to_SceNpUserInfo2(event_data& edata, const UserInfo2* user, SceNpUserInfo2* user_info); - void RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const RoomDataExternal* room, SceNpMatching2RoomDataExternal* room_info); + void UserInfo2_to_SceNpUserInfo2(event_data& edata, const UserInfo2* user, SceNpUserInfo2* user_info, bool include_onlinename, bool include_avatarurl); + void RoomDataExternal_to_SceNpMatching2RoomDataExternal(event_data& edata, const RoomDataExternal* room, SceNpMatching2RoomDataExternal* room_info, bool include_onlinename, bool include_avatarurl); void SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(event_data& edata, const SearchRoomResponse* resp, SceNpMatching2SearchRoomResponse* search_resp); - void GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const GetRoomDataExternalListResponse* resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp); - u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const RoomDataInternal* resp, SceNpMatching2RoomDataInternal* room_resp, const SceNpId& npid); - void RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const RoomMemberDataInternal* member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data); - void RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const RoomMemberUpdateInfo* resp, SceNpMatching2RoomMemberUpdateInfo* room_info); + void GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(event_data& edata, const GetRoomDataExternalListResponse* resp, SceNpMatching2GetRoomDataExternalListResponse* get_resp, bool include_onlinename, bool include_avatarurl); + u16 RoomDataInternal_to_SceNpMatching2RoomDataInternal(event_data& edata, const RoomDataInternal* resp, SceNpMatching2RoomDataInternal* room_resp, const SceNpId& npid, bool include_onlinename, bool include_avatarurl); + void RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(event_data& edata, const RoomMemberDataInternal* member_data, const SceNpMatching2RoomDataInternal* room_info, SceNpMatching2RoomMemberDataInternal* sce_member_data, bool include_onlinename, bool include_avatarurl); + void RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(event_data& edata, const RoomMemberUpdateInfo* resp, SceNpMatching2RoomMemberUpdateInfo* room_info, bool include_onlinename, bool include_avatarurl); void RoomUpdateInfo_to_SceNpMatching2RoomUpdateInfo(const RoomUpdateInfo* update_info, SceNpMatching2RoomUpdateInfo* sce_update_info); void GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(const GetPingInfoResponse* resp, SceNpMatching2SignalingGetPingInfoResponse* sce_resp); - void RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const RoomMessageInfo* mi, SceNpMatching2RoomMessageInfo* sce_mi); - void RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const RoomDataInternalUpdateInfo* update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid); - void RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const RoomMemberDataInternalUpdateInfo* update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info); + void RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(event_data& edata, const RoomMessageInfo* mi, SceNpMatching2RoomMessageInfo* sce_mi, bool include_onlinename, bool include_avatarurl); + void RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(event_data& edata, const RoomDataInternalUpdateInfo* update_info, SceNpMatching2RoomDataInternalUpdateInfo* sce_update_info, const SceNpId& npid, bool include_onlinename, bool include_avatarurl); + void RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(event_data& edata, const RoomMemberDataInternalUpdateInfo* update_info, SceNpMatching2RoomMemberDataInternalUpdateInfo* sce_update_info, bool include_onlinename, bool include_avatarurl); bool handle_GetScoreResponse(u32 req_id, std::vector& reply_data, bool simple_result = false); bool handle_tus_no_data(u32 req_id, std::vector& reply_data); bool handle_TusVarResponse(u32 req_id, std::vector& reply_data); diff --git a/rpcs3/Emu/NP/np_notifications.cpp b/rpcs3/Emu/NP/np_notifications.cpp index f064cf1c5d..e1e3753628 100644 --- a/rpcs3/Emu/NP/np_notifications.cpp +++ b/rpcs3/Emu/NP/np_notifications.cpp @@ -23,10 +23,11 @@ namespace np } u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberUpdateInfo, sizeof(SceNpMatching2RoomMemberUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, update_info, notif_data); + RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, update_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); if (!np_cache.add_member(room_id, notif_data->roomMemberDataInternal.get_ptr())) @@ -58,10 +59,11 @@ namespace np } u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberUpdateInfo, sizeof(SceNpMatching2RoomMemberUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, update_info, notif_data); + RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, update_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); if (!np_cache.del_member(room_id, notif_data->roomMemberDataInternal->memberId)) @@ -127,10 +129,11 @@ namespace np } u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomDataInternalUpdateInfo, sizeof(SceNpMatching2RoomDataInternalUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(edata, update_info, notif_data, npid); + RoomDataInternalUpdateInfo_to_SceNpMatching2RoomDataInternalUpdateInfo(edata, update_info, notif_data, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(notif_data->newRoomDataInternal.get_ptr()); @@ -162,10 +165,11 @@ namespace np } u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberDataInternalUpdateInfo, sizeof(SceNpMatching2RoomMemberDataInternalUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(edata, update_info, notif_data); + RoomMemberDataInternalUpdateInfo_to_SceNpMatching2RoomMemberDataInternalUpdateInfo(edata, update_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); if (!np_cache.add_member(room_id, notif_data->newRoomMemberDataInternal.get_ptr())) @@ -198,10 +202,11 @@ namespace np } u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMessageInfo, sizeof(SceNpMatching2RoomMessageInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(edata, message_info, notif_data); + RoomMessageInfo_to_SceNpMatching2RoomMessageInfo(edata, message_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); rpcn_log.notice("Received notification of a room message from member(%d) in room(%d)", member_id, room_id); diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index 2f8198508b..418fe79145 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -187,11 +187,12 @@ namespace np return error_and_disconnect("Malformed reply to CreateRoom command"); u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_CreateJoinRoom, sizeof(SceNpMatching2CreateJoinRoomResponse)); auto* room_resp = reinterpret_cast(edata.data()); auto* room_info = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), room_resp->roomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(room_info); @@ -253,11 +254,12 @@ namespace np return error_and_disconnect("Malformed reply to JoinRoom command"); u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_JoinRoom, sizeof(SceNpMatching2JoinRoomResponse)); auto* room_resp = reinterpret_cast(edata.data()); auto* room_info = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), room_resp->roomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(room_info); @@ -334,6 +336,7 @@ namespace np auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_SearchRoom, sizeof(SceNpMatching2SearchRoomResponse)); auto* search_resp = reinterpret_cast(edata.data()); + // The online_name and avatar_url are naturally filtered by the reply from the server SearchRoomResponse_to_SceNpMatching2SearchRoomResponse(edata, resp, search_resp); np_memory.shrink_allocation(edata.addr(), edata.size()); @@ -372,10 +375,11 @@ namespace np return error_and_disconnect("Malformed reply to GetRoomDataExternalList command"); u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomDataExternalList, sizeof(SceNpMatching2GetRoomDataExternalListResponse)); auto* sce_get_room_ext_resp = reinterpret_cast(edata.data()); - GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(edata, resp, sce_get_room_ext_resp); + GetRoomDataExternalListResponse_to_SceNpMatching2GetRoomDataExternalListResponse(edata, resp, sce_get_room_ext_resp, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); extra_nps::print_get_roomdata_external_list_resp(sce_get_room_ext_resp); @@ -440,11 +444,12 @@ namespace np return error_and_disconnect("Malformed reply to GetRoomDataInternal command"); u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomDataInternal, sizeof(SceNpMatching2GetRoomDataInternalResponse)); auto* room_resp = reinterpret_cast(edata.data()); auto* room_info = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), room_resp->roomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(room_info); @@ -527,11 +532,12 @@ namespace np return error_and_disconnect("Malformed reply to GetRoomMemberDataInternal command"); u32 event_key = get_event_key(); + auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomMemberDataInternal, sizeof(SceNpMatching2GetRoomMemberDataInternalResponse)); auto* mdata_resp = reinterpret_cast(edata.data()); auto* mdata_info = edata.allocate(sizeof(SceNpMatching2RoomMemberDataInternal), mdata_resp->roomMemberDataInternal); - RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, resp, nullptr, mdata_info); + RoomMemberDataInternal_to_SceNpMatching2RoomMemberDataInternal(edata, resp, nullptr, mdata_info, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); diff --git a/rpcs3/Emu/NP/np_structs_extra.cpp b/rpcs3/Emu/NP/np_structs_extra.cpp index 939840d6a3..abc08d9725 100644 --- a/rpcs3/Emu/NP/np_structs_extra.cpp +++ b/rpcs3/Emu/NP/np_structs_extra.cpp @@ -195,8 +195,8 @@ namespace extra_nps sceNp2.warning("SceNpMatching2RoomMemberDataInternal:"); sceNp2.warning("next: *0x%x", member->next); sceNp2.warning("npId: %s", member->userInfo.npId.handle.data); - sceNp2.warning("onlineName: %s", member->userInfo.onlineName->data); - sceNp2.warning("avatarUrl: %s", member->userInfo.avatarUrl->data); + sceNp2.warning("onlineName: %s", member->userInfo.onlineName ? member->userInfo.onlineName->data : ""); + sceNp2.warning("avatarUrl: %s", member->userInfo.avatarUrl ? member->userInfo.avatarUrl->data : ""); sceNp2.warning("joinDate: %lld", member->joinDate.tick); sceNp2.warning("memberId: %d", member->memberId); sceNp2.warning("teamId: %d", member->teamId);