the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#pragma once
2#include <np.h>
3#ifdef __PS3__
4#include <netex\libnetctl.h>
5#include <netex\net.h>
6#else
7#include <libnetctl.h>
8#include <net.h>
9#endif
10#include <queue>
11
12#include "..\..\Common\Network\Sony\SQRNetworkManager.h"
13
14class SQRNetworkPlayer;
15class ISQRNetworkManagerListener;
16class SonyVoiceChat;
17class C4JThread;
18
19// This is the lowest level manager for providing network functionality on Sony platforms. This manages various network activities including the players within a gaming session.
20// The game shouldn't directly use this class, it is here to provide functionality required by PlatformNetworkManagerSony.
21
22class SQRNetworkManager_PS3 : public SQRNetworkManager
23{
24
25 friend class SonyVoiceChat;
26 friend class SQRNetworkPlayer;
27 static const eSQRNetworkManagerState m_INTtoEXTStateMappings[SNM_INT_STATE_COUNT];
28
29
30
31public:
32 SQRNetworkManager_PS3(ISQRNetworkManagerListener *listener);
33
34 // General
35 void Tick();
36 void Initialise();
37 void Terminate();
38 eSQRNetworkManagerState GetState();
39 bool IsHost();
40 bool IsReadyToPlayOrIdle();
41 bool IsInSession();
42
43 // Session management
44 void CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline);
45 void UpdateExternalRoomData();
46 bool FriendRoomManagerIsBusy();
47 bool FriendRoomManagerSearch();
48 bool FriendRoomManagerSearch2();
49 int FriendRoomManagerGetCount();
50 void FriendRoomManagerGetRoomInfo(int idx, SessionSearchResult *searchResult);
51 bool JoinRoom(SessionSearchResult *searchResult, int localPlayerMask);
52 bool JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const SQRNetworkManager_PS3::PresenceSyncInfo *presence);
53 void StartGame();
54 void LeaveRoom(bool bActuallyLeaveRoom);
55 void EndGame();
56 bool SessionHasSpace(int spaceRequired);
57 bool AddLocalPlayerByUserIndex(int idx);
58 bool RemoveLocalPlayerByUserIndex(int idx);
59 void SendInviteGUI();
60 void GetInviteDataAndProcess(SceNpBasicAttachmentDataId id);
61 static bool UpdateInviteData(SQRNetworkManager_PS3::PresenceSyncInfo *invite);
62 void GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam );
63
64 // Player retrieval
65 int GetPlayerCount();
66 int GetOnlinePlayerCount();
67 SQRNetworkPlayer *GetPlayerByIndex(int idx);
68 SQRNetworkPlayer *GetPlayerBySmallId(int idx);
69 SQRNetworkPlayer *GetPlayerByXuid(PlayerUID xuid);
70 SQRNetworkPlayer *GetLocalPlayerByUserIndex(int idx);
71 SQRNetworkPlayer *GetHostPlayer();
72
73 // Communication parameter storage
74 static const SceNpCommunicationId* GetSceNpCommsId();
75 static const SceNpCommunicationSignature* GetSceNpCommsSig();
76
77private:
78 void InitialiseAfterOnline();
79 void ErrorHandlingTick();
80 void UpdateOnlineStatus(int status) { m_onlineStatus = status; }
81 int GetOnlineStatus() { return m_onlineStatus; }
82
83 ISQRNetworkManagerListener *m_listener;
84 SQRNetworkPlayer *GetPlayerIfReady(SQRNetworkPlayer *player);
85
86 // Internal state
87 void SetState(eSQRNetworkManagerInternalState state);
88 void ResetToIdle();
89 eSQRNetworkManagerInternalState m_state;
90 eSQRNetworkManagerState m_stateExternal;
91 bool m_nextIdleReasonIsFull;
92 bool m_isHosting;
93 SceNpMatching2RoomMemberId m_localMemberId;
94 int m_localPlayerCount;
95 int m_localPlayerJoined; // Client only, keep a count of how many local players we have confirmed as joined to the application
96 SceNpMatching2RoomId m_room;
97 unsigned char m_currentSmallId;
98 int m_soc;
99 bool m_offlineGame;
100 bool m_offlineSQR;
101 int m_resendExternalRoomDataCountdown;
102 bool m_matching2initialised;
103 PresenceSyncInfo m_inviteReceived[MAX_SIMULTANEOUS_INVITES];
104 int m_inviteIndex;
105 PresenceSyncInfo *m_gameBootInvite;
106 bool m_doBootInviteCheck;
107 bool m_isInSession;
108 static SceNpBasicAttachmentDataId s_lastInviteIdToRetry;
109 int m_onlineStatus;
110 bool m_bLinkDisconnected;
111private:
112
113 CRITICAL_SECTION m_csRoomSyncData;
114 RoomSyncData m_roomSyncData;
115 void *m_joinExtData;
116 int m_joinExtDataSize;
117
118 std::vector<SQRNetworkPlayer *> m_vecTempPlayers;
119 SQRNetworkPlayer *m_aRoomSlotPlayers[MAX_ONLINE_PLAYER_COUNT]; // Maps from the players in m_roomSyncData, to SQRNetworkPlayers
120 void FindOrCreateNonNetworkPlayer(int slot, int playerType, SceNpMatching2RoomMemberId memberId, int localPlayerIdx, int smallId);
121
122 void MapRoomSlotPlayers(int roomSlotPlayerCount =-1);
123 void UpdateRoomSyncUIDsFromPlayers();
124 void UpdatePlayersFromRoomSyncUIDs();
125 void LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize);
126 int GetSessionIndex(SQRNetworkPlayer *player);
127
128 bool AddRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int playerMask, bool *isFull = NULL );
129 void RemoveRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int mask );
130 void RemoveNetworkPlayers( int mask );
131 void SetLocalPlayersAndSync();
132 void SyncRoomData();
133 SceNpMatching2RequestId m_setRoomDataRequestId;
134 SceNpMatching2RequestId m_setRoomIntDataRequestId;
135 SceNpMatching2RequestId m_roomExtDataRequestId;
136
137 // Server context management
138 bool GetMatchingContext(eSQRNetworkManagerInternalState asyncState);
139 bool GetServerContext();
140 bool GetServerContext2();
141 bool GetServerContext(SceNpMatching2ServerId serverId);
142 void DeleteServerContext();
143 bool SelectRandomServer();
144 void ServerContextTick();
145 int m_totalServerCount;
146 int m_serverCount;
147 SceNpMatching2ServerId *m_aServerId;
148 SceNpMatching2ServerId m_serverId;
149 bool m_serverContextValid;
150 SceNpMatching2RequestId m_serverSearchRequestId;
151 SceNpMatching2RequestId m_serverContextRequestId;
152
153 // Room creation management
154 SceNpMatching2RequestId m_getWorldRequestId;
155 SceNpMatching2RequestId m_createRoomRequestId;
156 SceNpMatching2WorldId m_worldId;
157 void RoomCreateTick();
158
159 // Room joining management
160 SceNpMatching2RoomId m_roomToJoin;
161 int m_localPlayerJoinMask;
162 SceNpMatching2RequestId m_joinRoomRequestId;
163 SceNpMatching2RequestId m_kickRequestId;
164
165 // Room leaving management
166 SceNpMatching2RequestId m_leaveRoomRequestId;
167
168 // Adding extra network players management
169 SceNpMatching2RequestId m_setRoomMemberInternalDataRequestId;
170
171 // Player state management
172 void NetworkPlayerConnectionComplete(SQRNetworkPlayer *player);
173 void NetworkPlayerSmallIdAllocated(SQRNetworkPlayer *player, unsigned char smallId);
174 void NetworkPlayerInitialDataReceived(SQRNetworkPlayer *player,void *data);
175 void NonNetworkPlayerComplete(SQRNetworkPlayer *player, unsigned char smallId);
176 void HandlePlayerJoined(SQRNetworkPlayer *player);
177 CRITICAL_SECTION m_csPlayerState;
178
179 // State and thread for managing basic event type messages
180 C4JThread *m_basicEventThread;
181 sys_event_port_t m_basicEventPort;
182 sys_event_queue_t m_basicEventQueue;
183 static int BasicEventThreadProc( void *lpParameter);
184
185 // State and storage for managing search for friends' games
186 eSQRNetworkManagerFriendSearchState m_friendSearchState;
187 SceNpMatching2ContextId m_matchingContext;
188 bool m_matchingContextValid;
189 SceNpMatching2RequestId m_friendSearchRequestId;
190 unsigned int m_friendCount;
191 C4JThread *m_getFriendCountThread;
192 static int GetFriendsThreadProc( void* lpParameter );
193 void FriendSearchTick();
194 SceNpMatching2RequestId m_roomDataExternalListRequestId;
195 void (* m_FriendSessionUpdatedFn)(bool success, void *pParam);
196 void *m_pParamFriendSessionUpdated;
197 void *m_pExtDataToUpdate;
198
199 // Results from searching for rooms that friends are playing in - 5 matched arrays to store their NpIds, rooms, servers, whether a room was found, and whether the external data had been received for the room. Also a count of how many elements are used in this array.
200 SceNpId m_aSearchResultNpId[MAX_FRIENDS];
201 SceNpMatching2RoomId m_aSearchResultRoomId[MAX_FRIENDS];
202 SceNpMatching2ServerId m_aSearchResultServerId[MAX_FRIENDS];
203 bool m_aSearchResultRoomFound[MAX_FRIENDS];
204 void *m_aSearchResultRoomExtDataReceived[MAX_FRIENDS];
205 unsigned int m_searchResultCount;
206
207 // Rudp management and local players
208 unordered_map<int,SQRNetworkPlayer *> m_RudpCtxToPlayerMap;
209 bool CreateRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask, SceNpMatching2RoomMemberId playersPeerMemberId);
210 SQRNetworkPlayer *GetPlayerFromRudpCtx(int rudpCtx);
211 SQRNetworkPlayer *GetPlayerFromRoomMemberAndLocalIdx(int roomMember, int localIdx);
212 SceNpMatching2RequestId m_roomMemberDataRequestId;
213
214 // Callbacks (for matching)
215 bool RegisterCallbacks();
216 static void ContextCallback(SceNpMatching2ContextId id, SceNpMatching2Event event, SceNpMatching2EventCause eventCause, int errorCode, void *arg);
217#ifdef __PS3__
218 static void DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, SceNpMatching2EventKey eventKey, int errorCode, size_t dataSize, void *arg);
219 static void RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, SceNpMatching2EventKey eventKey, int errorCode, size_t dataSize, void *arg);
220#else
221 static void DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, int errorCode, const void *data, void *arg);
222 static void RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, int errorCode, const void *data, void *arg);
223#endif
224 static void SignallingCallback(SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, SceNpMatching2Event event, int errorCode, void *arg);
225
226 // Callback for NpBasic
227 static int BasicEventCallback(int event, int retCode, uint32_t reqId, void *arg);
228
229 // Callback for NpManager
230 static void ManagerCallback(int event, int result, void *arg);
231
232 // Callback for sys util
233 static void SysUtilCallback(uint64_t status, uint64_t param, void *userdata);
234
235 // Callbacks for rudp
236 static void RudpContextCallback(int ctx_id, int event_id, int error_code, void *arg);
237#ifdef __PS3__
238 static int RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct sockaddr const *addr, socklen_t addrlen, void *arg);
239#else
240 static int RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct SceNetSockaddr const *addr, SceNetSocklen_t addrlen, void *arg);
241#endif
242
243 // Callback for netctl
244 static void NetCtlCallback(int prev_state, int new_state, int event, int error_code, void *arg);
245
246 // Methods to be called when the server context has been created
247 void ServerContextValid_CreateRoom();
248 void ServerContextValid_JoinRoom();
249
250 // Mask utilities
251 int GetOldMask(SceNpMatching2RoomMemberId memberId);
252 int GetAddedMask(int newMask, int oldMask);
253 int GetRemovedMask(int newMask, int oldMask);
254
255#ifdef __PS3__
256 // Response storage
257 char cUserInfoListStorage[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetUserInfoList] __attribute__((__aligned__(4)));
258 char cServerInfoStorage[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetServerInfo] __attribute__((__aligned__(4)));
259 char cWorldListStorage[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetWorldInfoList] __attribute__((__aligned__(4)));
260 char cCreateJoinRoomStorage[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_CreateJoinRoom] __attribute__((__aligned__(4)));
261 char cJoinRoomStorage[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_JoinRoom] __attribute__((__aligned__(4)));
262 char cRoomMemberDataInternal[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomMemberDataInternal] __attribute__((__aligned__(4)));
263 char cRoomDataInternal[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomDataInternalUpdateInfo] __attribute__((__aligned__(4)));
264 char cRoomDataExternalList[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetRoomDataExternalList] __attribute__((__aligned__(4)));
265 char cRoomMemberDataInternalUpdate[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberDataInternalUpdateInfo] __attribute__((__aligned__(4)));
266 char cRoomDataUpdateInfo[SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomUpdateInfo] __attribute__((__aligned__(4)));
267#endif
268
269#ifndef _CONTENT_PACKAGE
270 static bool aForceError[SNM_FORCE_ERROR_COUNT];
271#endif
272 bool ForceErrorPoint(eSQRForceError err);
273
274public:
275 static void AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed = false);
276 static int (*s_SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad);
277 static bool s_signInCompleteCallbackIfFailed;
278 static void *s_SignInCompleteParam;
279
280 static int SetRichPresence(const void *data, unsigned int options);
281 void SetPresenceDataStartHostingGame();
282 int GetJoiningReadyPercentage();
283private:
284 static void UpdateRichPresenceCustomData(void *data, unsigned int dataBytes);
285 static void TickRichPresence();
286 static void SendLastPresenceInfo();
287
288 static SceNpBasicPresenceDetails2 s_lastPresenceInfo;
289 static int s_resendPresenceCountdown;
290 static bool s_presenceStatusDirty;
291 static bool s_presenceDataDirty;
292 static PresenceSyncInfo s_lastPresenceSyncInfo;
293 static PresenceSyncInfo c_presenceSyncInfoNULL;
294
295 // 4J-PB - so we can stop the crash on PS3 when Iggy's LoadMovie is called from the ContextCallback
296 static bool m_bCallPSNSignInCallback;
297
298 // Debug
299 static long long s_roomStartTime;
300};