From b564846b3c06341786797e69e6b42ea1e4042387 Mon Sep 17 00:00:00 2001 From: metr1k-91 Date: Fri, 26 Jun 2026 00:39:09 -0500 Subject: [PATCH] Matching2 Part1: general additions, corrections, and sorting. (#4625) --- CMakeLists.txt | 5 +- src/core/libraries/libs.cpp | 2 +- src/core/libraries/np/np_matching2.h | 48 --- .../np/{ => np_matching2}/np_matching2.cpp | 234 +------------- .../libraries/np/np_matching2/np_matching2.h | 82 +++++ .../np/np_matching2/np_matching2_types.h | 305 ++++++++++++++++++ 6 files changed, 393 insertions(+), 283 deletions(-) delete mode 100644 src/core/libraries/np/np_matching2.h rename src/core/libraries/np/{ => np_matching2}/np_matching2.cpp (77%) create mode 100644 src/core/libraries/np/np_matching2/np_matching2.h create mode 100644 src/core/libraries/np/np_matching2/np_matching2_types.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b97627bdc..e9f6eafa8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -630,8 +630,9 @@ set(NP_LIBS src/core/libraries/np/np_error.h src/core/libraries/np/np_common.h src/core/libraries/np/np_manager.cpp src/core/libraries/np/np_manager.h - src/core/libraries/np/np_matching2.cpp - src/core/libraries/np/np_matching2.h + src/core/libraries/np/np_matching2/np_matching2.cpp + src/core/libraries/np/np_matching2/np_matching2.h + src/core/libraries/np/np_matching2/np_matching2_types.h src/core/libraries/np/np_trophy.cpp src/core/libraries/np/np_trophy.h src/core/libraries/np/np_tus.cpp diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index b2719b554..1bc57efd7 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -38,7 +38,7 @@ #include "core/libraries/np/np_commerce/np_commerce.h" #include "core/libraries/np/np_common.h" #include "core/libraries/np/np_manager.h" -#include "core/libraries/np/np_matching2.h" +#include "core/libraries/np/np_matching2/np_matching2.h" #include "core/libraries/np/np_partner.h" #include "core/libraries/np/np_party.h" #include "core/libraries/np/np_profile_dialog/np_profile_dialog.h" diff --git a/src/core/libraries/np/np_matching2.h b/src/core/libraries/np/np_matching2.h deleted file mode 100644 index 6f7fca900..000000000 --- a/src/core/libraries/np/np_matching2.h +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/types.h" - -namespace Core::Loader { -class SymbolsResolver; -} - -namespace Libraries::Np::NpMatching2 { - -using OrbisNpMatching2AttributeId = u16; -using OrbisNpMatching2ContextId = u16; -using OrbisNpMatching2Event = u16; -using OrbisNpMatching2EventCause = u8; -using OrbisNpMatching2Flags = u32; -using OrbisNpMatching2LobbyId = u64; -using OrbisNpMatching2NatType = u8; -using OrbisNpMatching2RequestId = u16; -using OrbisNpMatching2RoomId = u64; -using OrbisNpMatching2RoomMemberId = u16; -using OrbisNpMatching2ServerId = u16; -using OrbisNpMatching2TeamId = u8; -using OrbisNpMatching2WorldId = u32; - -constexpr int ORBIS_NP_MATCHING2_ERROR_NOT_INITIALIZED = 0x80550c01; -constexpr int ORBIS_NP_MATCHING2_ERROR_ALREADY_INITIALIZED = 0x80550c02; -constexpr int ORBIS_NP_MATCHING2_ERROR_INVALID_ARGUMENT = 0x80550c15; - -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_CREATE_JOIN_ROOM = 0x0101; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_CREATE_JOIN_ROOM_A = 0x7101; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_GET_WORLD_INFO_LIST = 0x0002; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SEARCH_ROOM_A = 0x7106; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_LEAVE_ROOM = 0x0103; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SEND_ROOM_MESSAGE = 0x0108; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SET_ROOM_DATA_EXTERNAL = 0x0004; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SET_ROOM_DATA_INTERNAL = 0x1106; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SET_USER_INFO = 0x0007; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_CONTEXT_EVENT_START_OVER = 0x6F01; -constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_CONTEXT_EVENT_STARTED = 0x6F02; - -constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_CONTEXT_ERROR = 10; -constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_CONTEXT_ACTION = 11; - -void RegisterLib(Core::Loader::SymbolsResolver* sym); -} // namespace Libraries::Np::NpMatching2 \ No newline at end of file diff --git a/src/core/libraries/np/np_matching2.cpp b/src/core/libraries/np/np_matching2/np_matching2.cpp similarity index 77% rename from src/core/libraries/np/np_matching2.cpp rename to src/core/libraries/np/np_matching2/np_matching2.cpp index 199f1acfc..916a432bd 100644 --- a/src/core/libraries/np/np_matching2.cpp +++ b/src/core/libraries/np/np_matching2/np_matching2.cpp @@ -9,7 +9,8 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/np/np_manager.h" -#include "core/libraries/np/np_matching2.h" +#include "core/libraries/np/np_matching2/np_matching2.h" +#include "core/libraries/np/np_matching2/np_matching2_types.h" #include "core/libraries/np/np_types.h" #include "core/libraries/system/userservice.h" @@ -18,27 +19,6 @@ namespace Libraries::Np::NpMatching2 { static bool g_initialized = false; static OrbisNpMatching2ContextId contextId = 1; -struct NpMatching2ContextEvent { - OrbisNpMatching2ContextId contextId; - OrbisNpMatching2Event event; - OrbisNpMatching2EventCause cause; - int errorCode; -}; - -struct NpMatching2LobbyEvent { - OrbisNpMatching2ContextId contextId; - OrbisNpMatching2LobbyId lobbyId; - OrbisNpMatching2Event event; - void* data; -}; - -struct NpMatching2RoomEvent { - OrbisNpMatching2ContextId contextId; - OrbisNpMatching2RoomId roomId; - OrbisNpMatching2Event event; - void* data; -}; - static std::mutex g_events_mutex; static std::deque g_ctx_events; static std::deque g_lobby_events; @@ -46,16 +26,6 @@ static std::deque g_room_events; static std::mutex g_responses_mutex; static std::deque> g_responses; -struct OrbisNpMatching2CreateContextParameter { - Libraries::Np::OrbisNpId* npId; - void* npCommunicationId; - void* npPassphrase; - Libraries::Np::OrbisNpServiceLabel serviceLabel; - u64 size; -}; - -static_assert(sizeof(OrbisNpMatching2CreateContextParameter) == 0x28); - int PS4_SYSV_ABI sceNpMatching2CreateContext(const OrbisNpMatching2CreateContextParameter* param, OrbisNpMatching2ContextId* ctxId) { LOG_DEBUG(Lib_NpMatching2, "called, npId = {}, serviceLabel = {}, size = {}", @@ -73,14 +43,6 @@ int PS4_SYSV_ABI sceNpMatching2CreateContext(const OrbisNpMatching2CreateContext return ORBIS_OK; } -struct OrbisNpMatching2CreateContextParameterA { - Libraries::UserService::OrbisUserServiceUserId userId; - Libraries::Np::OrbisNpServiceLabel serviceLabel; - u64 size; -}; - -static_assert(sizeof(OrbisNpMatching2CreateContextParameterA) == 16); - int PS4_SYSV_ABI sceNpMatching2CreateContextA(const OrbisNpMatching2CreateContextParameterA* param, OrbisNpMatching2ContextId* ctxId) { LOG_DEBUG(Lib_NpMatching2, "called, userId = {}, serviceLabel = {}, size = {}", param->userId, @@ -98,19 +60,6 @@ int PS4_SYSV_ABI sceNpMatching2CreateContextA(const OrbisNpMatching2CreateContex return ORBIS_OK; } -using OrbisNpMatching2RequestCallback = PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId, - OrbisNpMatching2RequestId, - OrbisNpMatching2Event, int, void*, - void*); - -struct OrbisNpMatching2RequestOptParam { - OrbisNpMatching2RequestCallback callback; - void* arg; - u32 timeout; - u16 appId; - u8 dummy[2]; -}; - static std::optional defaultRequestOptParam = std::nullopt; auto GetOptParam(OrbisNpMatching2RequestOptParam* requestOpt) { @@ -119,84 +68,6 @@ auto GetOptParam(OrbisNpMatching2RequestOptParam* requestOpt) { : std::optional{}); } -struct OrbisNpMatching2CreateJoinRoomRequestA { - u16 maxSlot; - OrbisNpMatching2TeamId teamId; - u8 pad[5]; - OrbisNpMatching2Flags flags; - OrbisNpMatching2WorldId worldId; - OrbisNpMatching2LobbyId lobbyId; - void* roomPasswd; - void* passwdSlotMask; - void* groupConfig; - u64 groupConfigs; - void* joinGroupLabel; - Libraries::Np::OrbisNpAccountId* allowedUser; - u64 allowedUsers; - Libraries::Np::OrbisNpAccountId* blockedUser; - u64 blockedUsers; - void* internalBinAttr; - u64 internalBinAttrs; - void* externalSearchIntAttr; - u64 externalSearchIntAttrs; - void* externalSearchBinAttr; - u64 externalSearchBinAttrs; - void* externalBinAttr; - u64 externalBinAttrs; - void* memberInternalBinAttr; - u64 memberInternalBinAttrs; - void* signalingParam; -}; - -static_assert(sizeof(OrbisNpMatching2CreateJoinRoomRequestA) == 184); - -struct OrbisNpMatching2RoomDataInternal { - u16 publicSlots; - u16 privateSlots; - u16 openPublicSlots; - u16 openPrivateSlots; - u16 maxSlot; - OrbisNpMatching2ServerId serverId; - OrbisNpMatching2WorldId worldId; - OrbisNpMatching2LobbyId lobbyId; - OrbisNpMatching2RoomId roomId; - u64 passwdSlotMask; - u64 joinedSlotMask; - void* roomGroup; - u64 roomGroups; - OrbisNpMatching2Flags flags; - u8 pad[4]; - void* internalBinAttr; - u64 internalBinAttrs; -}; - -struct OrbisNpMatching2RoomMemberDataInternalA { - OrbisNpMatching2RoomMemberDataInternalA* next; - u64 joinDateTicks; - Libraries::Np::OrbisNpPeerAddressA user; - Libraries::Np::OrbisNpOnlineId onlineId; - u8 pad[4]; - OrbisNpMatching2RoomMemberId memberId; - OrbisNpMatching2TeamId teamId; - OrbisNpMatching2NatType natType; - OrbisNpMatching2Flags flags; - void* roomGroup; - void* roomMemberInternalBinAttr; - u64 roomMemberInternalBinAttrs; -}; - -struct OrbisNpMatching2RoomMemberDataInternalListA { - OrbisNpMatching2RoomMemberDataInternalA* members; - u64 membersNum; - OrbisNpMatching2RoomMemberDataInternalA* me; - OrbisNpMatching2RoomMemberDataInternalA* owner; -}; - -struct OrbisNpMatching2CreateJoinRoomResponseA { - OrbisNpMatching2RoomDataInternal* roomData; - OrbisNpMatching2RoomMemberDataInternalListA members; -}; - int PS4_SYSV_ABI sceNpMatching2CreateJoinRoomA(OrbisNpMatching2ContextId ctxId, OrbisNpMatching2CreateJoinRoomRequestA* request, OrbisNpMatching2RequestOptParam* requestOpt, @@ -270,11 +141,6 @@ int PS4_SYSV_ABI sceNpMatching2CreateJoinRoomA(OrbisNpMatching2ContextId ctxId, return ORBIS_OK; } -using OrbisNpMatching2ContextCallback = PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, - OrbisNpMatching2Event event, - OrbisNpMatching2EventCause cause, - int errorCode, void* userdata); - std::function npMatching2ContextCallback = nullptr; int PS4_SYSV_ABI sceNpMatching2RegisterContextCallback(OrbisNpMatching2ContextCallback callback, @@ -292,10 +158,6 @@ int PS4_SYSV_ABI sceNpMatching2RegisterContextCallback(OrbisNpMatching2ContextCa return ORBIS_OK; } -using OrbisNpMatching2LobbyEventCallback = - PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, OrbisNpMatching2LobbyId lobbyId, - OrbisNpMatching2Event event, void* data, void* userdata); - std::function npMatching2LobbyCallback = nullptr; int PS4_SYSV_ABI sceNpMatching2RegisterLobbyEventCallback( @@ -313,11 +175,6 @@ int PS4_SYSV_ABI sceNpMatching2RegisterLobbyEventCallback( return ORBIS_OK; } -using OrbisNpMatching2RoomEventCallback = PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, - OrbisNpMatching2RoomId roomId, - OrbisNpMatching2Event event, - void* data, void* userdata); - std::function npMatching2RoomCallback = nullptr; int PS4_SYSV_ABI sceNpMatching2RegisterRoomEventCallback(OrbisNpMatching2ContextId ctxId, @@ -336,19 +193,6 @@ int PS4_SYSV_ABI sceNpMatching2RegisterRoomEventCallback(OrbisNpMatching2Context return ORBIS_OK; } -struct OrbisNpMatching2SignalingEvent { - OrbisNpMatching2ContextId contextId; - OrbisNpMatching2RoomId roomId; - OrbisNpMatching2RoomMemberId roomMemberId; - OrbisNpMatching2Event event; - int errorCode; -}; - -using OrbisNpMatching2SignalingCallback = - PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, OrbisNpMatching2RoomId roomId, - OrbisNpMatching2RoomMemberId roomMemberId, OrbisNpMatching2Event event, - int errorCode, void* userdata); - std::function npMatching2SignalingCallback = nullptr; int PS4_SYSV_ABI sceNpMatching2RegisterSignalingCallback(OrbisNpMatching2ContextId ctxId, @@ -421,11 +265,6 @@ void ProcessEvents() { } } -struct OrbisNpMatching2InitializeParameter { - u64 poolSize; - // -}; - int PS4_SYSV_ABI sceNpMatching2Initialize(OrbisNpMatching2InitializeParameter* param) { LOG_DEBUG(Lib_NpMatching2, "called"); @@ -484,26 +323,6 @@ int PS4_SYSV_ABI sceNpMatching2GetServerId(OrbisNpMatching2ContextId ctxId, return ORBIS_OK; } -struct OrbisNpMatching2GetWorldInfoListRequest { - OrbisNpMatching2ServerId serverId; -}; - -struct OrbisNpMatching2World { - OrbisNpMatching2World* next; - OrbisNpMatching2WorldId worldId; - u32 lobbiesNum; - u32 maxLobbyMembersNum; - u32 lobbyMembersNum; - u32 roomsNum; - u32 roomMembersNum; - u8 pad[3]; -}; - -struct OrbisNpMatching2GetWorldInfoListResponse { - OrbisNpMatching2World* world; - u64 worldNum; -}; - int PS4_SYSV_ABI sceNpMatching2GetWorldInfoList(OrbisNpMatching2ContextId ctxId, OrbisNpMatching2GetWorldInfoListRequest* request, OrbisNpMatching2RequestOptParam* requestOpt, @@ -538,16 +357,6 @@ int PS4_SYSV_ABI sceNpMatching2GetWorldInfoList(OrbisNpMatching2ContextId ctxId, return ORBIS_OK; } -struct OrbisNpMatching2PresenceOptionData { - u8 data[16]; - u64 len; -}; - -struct OrbisNpMatching2LeaveRoomRequest { - OrbisNpMatching2RoomId roomId; - OrbisNpMatching2PresenceOptionData optData; -}; - int PS4_SYSV_ABI sceNpMatching2LeaveRoom(OrbisNpMatching2ContextId ctxId, OrbisNpMatching2LeaveRoomRequest* request, OrbisNpMatching2RequestOptParam* requestOpt, @@ -578,38 +387,6 @@ int PS4_SYSV_ABI sceNpMatching2LeaveRoom(OrbisNpMatching2ContextId ctxId, return ORBIS_OK; } -struct OrbisNpMatching2RangeFilter { - u32 start; - u32 max; -}; - -struct OrbisNpMatching2SearchRoomRequest { - int option; - OrbisNpMatching2WorldId worldId; - OrbisNpMatching2LobbyId lobbyId; - OrbisNpMatching2RangeFilter rangeFilter; - OrbisNpMatching2Flags flags1; - OrbisNpMatching2Flags flags2; - void* intFilter; - u64 intFilters; - void* binFilter; - u64 binFilters; - OrbisNpMatching2AttributeId* attr; - u64 attrs; -}; - -struct OrbisNpMatching2Range { - u32 start; - u32 total; - u32 results; - u8 pad[4]; -}; - -struct OrbisNpMatching2SearchRoomResponseA { - OrbisNpMatching2Range range; - void* roomDataExt; -}; - int PS4_SYSV_ABI sceNpMatching2SearchRoom(OrbisNpMatching2ContextId ctxId, OrbisNpMatching2SearchRoomRequest* request, OrbisNpMatching2RequestOptParam* requestOpt, @@ -642,13 +419,6 @@ int PS4_SYSV_ABI sceNpMatching2SearchRoom(OrbisNpMatching2ContextId ctxId, return ORBIS_OK; } -struct OrbisNpMatching2SetUserInfoRequest { - OrbisNpMatching2ServerId serverId; - u8 padding[6]; - void* userBinAttr; - u64 userBinAttrs; -}; - int PS4_SYSV_ABI sceNpMatching2SetUserInfo(OrbisNpMatching2ContextId ctxId, OrbisNpMatching2SetUserInfoRequest* request, OrbisNpMatching2RequestOptParam* requestOpt, diff --git a/src/core/libraries/np/np_matching2/np_matching2.h b/src/core/libraries/np/np_matching2/np_matching2.h new file mode 100644 index 000000000..903e1227d --- /dev/null +++ b/src/core/libraries/np/np_matching2/np_matching2.h @@ -0,0 +1,82 @@ +// SPDX-FileCopyrightText: Copyright 2026 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Np::NpMatching2 { + +using OrbisNpMatching2AttributeId = u16; +using OrbisNpMatching2ContextId = u16; +using OrbisNpMatching2Event = u16; +using OrbisNpMatching2EventCause = u8; +using OrbisNpMatching2Flags = u32; +using OrbisNpMatching2LobbyId = u64; +using OrbisNpMatching2NatType = u8; +using OrbisNpMatching2RequestId = u32; +using OrbisNpMatching2RoomId = u64; +using OrbisNpMatching2RoomMemberId = u16; +using OrbisNpMatching2RoomPasswordSlotMask = u64; +using OrbisNpMatching2ServerId = u16; +using OrbisNpMatching2SignalingFlag = u8; +using OrbisNpMatching2SignalingRequestId = u32; +using OrbisNpMatching2SignalingType = u8; +using OrbisNpMatching2TeamId = u8; +using OrbisNpMatching2WorldId = u32; + +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_GET_WORLD_INFO_LIST = 0x0002; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SET_ROOM_DATA_EXTERNAL = 0x0004; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SET_USER_INFO = 0x0007; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_CREATE_JOIN_ROOM = 0x0101; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_JOIN_ROOM = 0x0102; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_LEAVE_ROOM = 0x0103; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_KICKOUT_ROOM_MEMBER = 0x0104; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_GRANT_ROOM_OWNER = 0x0105; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SEARCH_ROOM = 0x0106; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SEND_ROOM_MESSAGE = 0x0108; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SET_ROOM_DATA_INTERNAL = 0x0109; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_GET_ROOM_DATA_INTERNAL = 0x010A; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_JOIN_LOBBY = 0x0201; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SIGNALING_GET_PING_INFO = 0x0E01; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_MEMBER_JOINED = 0x1101; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_MEMBER_LEFT = 0x1102; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_KICKEDOUT = 0x1103; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_ROOM_DESTROYED = 0x1104; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_ROOM_OWNER_CHANGED = 0x1105; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_UPDATED_ROOM_DATA_INTERNAL = 0x1106; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_UPDATED_ROOM_MEMBER_DATA_INTERNAL = + 0x1107; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_UPDATED_SIGNALING_OPT_PARAM = 0x1108; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_SIGNALING_EVENT_DEAD = 0x5101; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_SIGNALING_EVENT_ESTABLISHED = 0x5102; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_SIGNALING_EVENT_NETINFO_ERROR = 0x5103; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_CONTEXT_EVENT_START_OVER = 0x6F01; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_CONTEXT_EVENT_STARTED = 0x6F02; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_CONTEXT_EVENT_STOPPED = 0x6F03; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_CREATE_JOIN_ROOM_A = 0x7101; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_REQUEST_EVENT_SEARCH_ROOM_A = 0x7106; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_MEMBER_JOINED_A = 0x8101; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_MEMBER_LEFT_A = 0x8102; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_EVENT_UPDATED_ROOM_MEMBER_DATA_INTERNAL_A = + 0x8107; +constexpr OrbisNpMatching2Event ORBIS_NP_MATCHING2_ROOM_MSG_EVENT_MESSAGE_A = 0x9102; + +constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_LEAVE_ACTION = 1; +constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_KICKOUT_ACTION = 2; +constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_GRANT_OWNER_ACTION = 3; +constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_MEMBER_DISAPPEARED = 5; +constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_NP_SIGNED_OUT = 8; +constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_CONTEXT_ERROR = 10; +constexpr OrbisNpMatching2EventCause ORBIS_NP_MATCHING2_EVENT_CAUSE_CONTEXT_ACTION = 11; + +constexpr OrbisNpMatching2SignalingType ORBIS_NP_MATCHING2_SIGNALING_TYPE_NONE = 0; +constexpr OrbisNpMatching2SignalingType ORBIS_NP_MATCHING2_SIGNALING_TYPE_MESH = 1; +constexpr OrbisNpMatching2SignalingType ORBIS_NP_MATCHING2_SIGNALING_TYPE_STAR = 2; + +void RegisterLib(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Np::NpMatching2 \ No newline at end of file diff --git a/src/core/libraries/np/np_matching2/np_matching2_types.h b/src/core/libraries/np/np_matching2/np_matching2_types.h new file mode 100644 index 000000000..5cb32cee6 --- /dev/null +++ b/src/core/libraries/np/np_matching2/np_matching2_types.h @@ -0,0 +1,305 @@ +// SPDX-FileCopyrightText: Copyright 2026 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" +#include "core/libraries/np/np_matching2/np_matching2.h" +#include "core/libraries/np/np_types.h" +#include "core/libraries/rtc/rtc.h" +#include "core/libraries/system/userservice.h" + +namespace Libraries::Np::NpMatching2 { + +using OrbisNpMatching2ContextCallback = PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, + OrbisNpMatching2Event event, + OrbisNpMatching2EventCause cause, + int errorCode, void* userdata); + +using OrbisNpMatching2LobbyEventCallback = + PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, OrbisNpMatching2LobbyId lobbyId, + OrbisNpMatching2Event event, void* data, void* userdata); + +using OrbisNpMatching2RequestCallback = PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId, + OrbisNpMatching2RequestId, + OrbisNpMatching2Event, int, + const void*, void*); + +using OrbisNpMatching2RoomEventCallback = PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, + OrbisNpMatching2RoomId roomId, + OrbisNpMatching2Event event, + const void* data, void* userdata); + +using OrbisNpMatching2RoomMessageCallback = + PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, OrbisNpMatching2RoomId roomId, + OrbisNpMatching2RoomMemberId srcMemberId, OrbisNpMatching2Event event, + const void* data, void* userdata); + +using OrbisNpMatching2SignalingCallback = + PS4_SYSV_ABI void (*)(OrbisNpMatching2ContextId contextId, OrbisNpMatching2RoomId roomId, + OrbisNpMatching2RoomMemberId roomMemberId, OrbisNpMatching2Event event, + int errorCode, void* userdata); + +// internal - to be removed. +struct NpMatching2ContextEvent { + OrbisNpMatching2ContextId contextId; + OrbisNpMatching2Event event; + OrbisNpMatching2EventCause cause; + int errorCode; +}; + +// internal - to be removed. +struct NpMatching2LobbyEvent { + OrbisNpMatching2ContextId contextId; + OrbisNpMatching2LobbyId lobbyId; + OrbisNpMatching2Event event; + void* data; +}; + +// internal - to be removed. +struct NpMatching2RoomEvent { + OrbisNpMatching2ContextId contextId; + OrbisNpMatching2RoomId roomId; + OrbisNpMatching2Event event; + void* data; +}; + +struct OrbisNpMatching2BinAttr { + OrbisNpMatching2AttributeId id; + u8 pad[6]; + u8* data; + u64 dataSize; +}; + +struct OrbisNpMatching2CreateContextParameter { + Libraries::Np::OrbisNpId* npId; + void* npCommunicationId; + void* npPassphrase; + Libraries::Np::OrbisNpServiceLabel serviceLabel; + u64 size; +}; +static_assert(sizeof(OrbisNpMatching2CreateContextParameter) == 0x28); + +struct OrbisNpMatching2CreateContextParameterA { + Libraries::UserService::OrbisUserServiceUserId userId; + Libraries::Np::OrbisNpServiceLabel serviceLabel; + u64 size; +}; +static_assert(sizeof(OrbisNpMatching2CreateContextParameterA) == 16); + +struct OrbisNpMatching2IntAttr { + OrbisNpMatching2AttributeId id; + u8 padding[2]; + u32 num; +}; + +struct OrbisNpMatching2SignalingOptParam { + OrbisNpMatching2SignalingType type; + OrbisNpMatching2SignalingFlag flag; + OrbisNpMatching2RoomMemberId memberId; + u8 padding[4]; +}; + +struct OrbisNpMatching2CreateJoinRoomRequestA { + u16 maxSlot; + OrbisNpMatching2TeamId teamId; + u8 pad[5]; + OrbisNpMatching2Flags flags; + OrbisNpMatching2WorldId worldId; + OrbisNpMatching2LobbyId lobbyId; + void* roomPasswd; + OrbisNpMatching2RoomPasswordSlotMask* passwdSlotMask; + void* groupConfig; + u64 groupConfigs; + void* joinGroupLabel; + Libraries::Np::OrbisNpAccountId* allowedUser; + u64 allowedUsers; + Libraries::Np::OrbisNpAccountId* blockedUser; + u64 blockedUsers; + OrbisNpMatching2BinAttr* internalBinAttr; + u64 internalBinAttrs; + OrbisNpMatching2IntAttr* externalSearchIntAttr; + u64 externalSearchIntAttrs; + OrbisNpMatching2BinAttr* externalSearchBinAttr; + u64 externalSearchBinAttrs; + OrbisNpMatching2BinAttr* externalBinAttr; + u64 externalBinAttrs; + OrbisNpMatching2BinAttr* memberInternalBinAttr; + u64 memberInternalBinAttrs; + OrbisNpMatching2SignalingOptParam* signalingParam; +}; +static_assert(sizeof(OrbisNpMatching2CreateJoinRoomRequestA) == 184); + +struct OrbisNpMatching2RoomDataInternal { + u16 publicSlots; + u16 privateSlots; + u16 openPublicSlots; + u16 openPrivateSlots; + u16 maxSlot; + OrbisNpMatching2ServerId serverId; + OrbisNpMatching2WorldId worldId; + OrbisNpMatching2LobbyId lobbyId; + OrbisNpMatching2RoomId roomId; + OrbisNpMatching2RoomPasswordSlotMask passwdSlotMask; + u64 joinedSlotMask; + void* roomGroup; + u64 roomGroups; + OrbisNpMatching2Flags flags; + u8 pad[4]; + void* internalBinAttr; + u64 internalBinAttrs; +}; + +struct OrbisNpMatching2RoomMemberDataInternalA { + OrbisNpMatching2RoomMemberDataInternalA* next; + Libraries::Rtc::OrbisRtcTick joinDateTicks; + Libraries::Np::OrbisNpPeerAddressA user; + Libraries::Np::OrbisNpOnlineId onlineId; + u8 pad[4]; + OrbisNpMatching2RoomMemberId memberId; + OrbisNpMatching2TeamId teamId; + OrbisNpMatching2NatType natType; + OrbisNpMatching2Flags flags; + void* roomGroup; + void* roomMemberInternalBinAttr; + u64 roomMemberInternalBinAttrs; +}; + +struct OrbisNpMatching2RoomMemberDataInternalListA { + OrbisNpMatching2RoomMemberDataInternalA* members; + u64 membersNum; + OrbisNpMatching2RoomMemberDataInternalA* me; + OrbisNpMatching2RoomMemberDataInternalA* owner; +}; + +struct OrbisNpMatching2CreateJoinRoomResponseA { + OrbisNpMatching2RoomDataInternal* roomData; + OrbisNpMatching2RoomMemberDataInternalListA members; +}; + +struct OrbisNpMatching2GetWorldInfoListRequest { + OrbisNpMatching2ServerId serverId; +}; + +struct OrbisNpMatching2World { + OrbisNpMatching2World* next; + OrbisNpMatching2WorldId worldId; + u32 lobbiesNum; + u32 maxLobbyMembersNum; + u32 lobbyMembersNum; + u32 roomsNum; + u32 roomMembersNum; + u8 pad[3]; +}; + +struct OrbisNpMatching2GetWorldInfoListResponse { + OrbisNpMatching2World* world; + u64 worldNum; +}; + +struct OrbisNpMatching2InitializeParameter { + u64 poolSize; + u64 unknown; + s32 priority; + u8 padding[4]; + u64 stackSize; + u64 size; + u64 sslPoolSize; +}; +static_assert(sizeof(OrbisNpMatching2InitializeParameter) == 0x30); + +struct OrbisNpMatching2PresenceOptionData { + u8 data[16]; + u64 len; +}; + +struct OrbisNpMatching2LeaveRoomRequest { + OrbisNpMatching2RoomId roomId; + OrbisNpMatching2PresenceOptionData optData; +}; + +struct OrbisNpMatching2Range { + u32 start; + u32 total; + u32 results; + u8 pad[4]; +}; + +struct OrbisNpMatching2RangeFilter { + u32 start; + u32 max; +}; + +struct OrbisNpMatching2RequestOptParam { + OrbisNpMatching2RequestCallback callback; + void* arg; + u32 timeout; + u16 appId; + u8 padding[2]; +}; + +struct OrbisNpMatching2RoomDataExternalA { + OrbisNpMatching2RoomDataExternalA* next; + u16 maxSlot; + u16 curMembers; + OrbisNpMatching2Flags flags; + OrbisNpMatching2ServerId serverId; + u8 pad[2]; + OrbisNpMatching2WorldId worldId; + OrbisNpMatching2LobbyId lobbyId; + OrbisNpMatching2RoomId roomId; + OrbisNpMatching2RoomPasswordSlotMask passwdSlotMask; + u64 joinedSlotMask; + u16 publicSlots; + u16 privateSlots; + u16 openPublicSlots; + u16 openPrivateSlots; + Libraries::Np::OrbisNpPeerAddressA owner; + Libraries::Np::OrbisNpOnlineId ownerOnlineId; + void* roomGroup; + u64 roomGroups; + OrbisNpMatching2IntAttr* externalSearchIntAttr; + u64 externalSearchIntAttrs; + OrbisNpMatching2BinAttr* externalSearchBinAttr; + u64 externalSearchBinAttrs; + OrbisNpMatching2BinAttr* externalBinAttr; + u64 externalBinAttrs; +}; + +struct OrbisNpMatching2SearchRoomRequest { + int option; + OrbisNpMatching2WorldId worldId; + OrbisNpMatching2LobbyId lobbyId; + OrbisNpMatching2RangeFilter rangeFilter; + OrbisNpMatching2Flags flags1; + OrbisNpMatching2Flags flags2; + void* intFilter; + u64 intFilters; + void* binFilter; + u64 binFilters; + OrbisNpMatching2AttributeId* attr; + u64 attrs; +}; + +struct OrbisNpMatching2SearchRoomResponseA { + OrbisNpMatching2Range range; + OrbisNpMatching2RoomDataExternalA* roomDataExt; +}; + +struct OrbisNpMatching2SetUserInfoRequest { + OrbisNpMatching2ServerId serverId; + u8 padding[6]; + OrbisNpMatching2BinAttr* userBinAttr; + u64 userBinAttrs; +}; + +// internal - to be removed. +struct OrbisNpMatching2SignalingEvent { + OrbisNpMatching2ContextId contextId; + OrbisNpMatching2RoomId roomId; + OrbisNpMatching2RoomMemberId roomMemberId; + OrbisNpMatching2Event event; + int errorCode; +}; + +} // namespace Libraries::Np::NpMatching2