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#include <libnetctl.h>
4#include <net.h>
5#include <np_toolkit.h>
6#include <queue>
7
8#include <unordered_map>
9// #include "SonyVoiceChat_Orbis.h"
10
11#include "..\..\Common\Network\Sony\SQRNetworkManager.h"
12
13class SQRNetworkPlayer;
14class ISQRNetworkManagerListener;
15class SonyVoiceChat_Orbis;
16class SQRVoiceConnection;
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_Orbis : public SQRNetworkManager
23{
24 friend class SonyVoiceChat_Orbis;
25 friend class SQRNetworkPlayer;
26
27 static const eSQRNetworkManagerState m_INTtoEXTStateMappings[SNM_INT_STATE_COUNT];
28
29public:
30 SQRNetworkManager_Orbis(ISQRNetworkManagerListener *listener);
31
32 // General
33 void Tick();
34 void Initialise();
35 void Terminate();
36 eSQRNetworkManagerState GetState();
37 bool IsHost();
38 bool IsReadyToPlayOrIdle();
39 bool IsInSession();
40
41 // Session management
42 void CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline);
43 void UpdateExternalRoomData();
44 bool FriendRoomManagerIsBusy();
45 bool FriendRoomManagerSearch();
46 bool FriendRoomManagerSearch2();
47 int FriendRoomManagerGetCount();
48 void FriendRoomManagerGetRoomInfo(int idx, SessionSearchResult *searchResult);
49 bool JoinRoom(SessionSearchResult *searchResult, int localPlayerMask);
50 bool JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const SQRNetworkManager_Orbis::PresenceSyncInfo *presence);
51 void StartGame();
52 void LeaveRoom(bool bActuallyLeaveRoom);
53 void EndGame();
54 bool SessionHasSpace(int spaceRequired);
55 bool AddLocalPlayerByUserIndex(int idx);
56 bool RemoveLocalPlayerByUserIndex(int idx);
57 void SendInviteGUI();
58 static void RecvInviteGUI();
59 void TickInviteGUI();
60
61 // Remote play
62 void UpdateRemotePlay();
63
64
65
66// void GetInviteDataAndProcess(SceNpBasicAttachmentDataId id);
67// static bool UpdateInviteData(SQRNetworkManager_Orbis::PresenceSyncInfo *invite);
68 void GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam );
69
70 // Player retrieval
71 int GetPlayerCount();
72 int GetOnlinePlayerCount();
73 SQRNetworkPlayer *GetPlayerByIndex(int idx);
74 SQRNetworkPlayer *GetPlayerBySmallId(int idx);
75 SQRNetworkPlayer *GetPlayerByXuid(PlayerUID xuid);
76 SQRNetworkPlayer *GetLocalPlayerByUserIndex(int idx);
77 SQRNetworkPlayer *GetHostPlayer();
78
79 void removePlayerFromVoiceChat(SQRNetworkPlayer* pPlayer);
80 // Communication parameter storage
81 static const SceNpCommunicationId* GetSceNpCommsId();
82 static const SceNpCommunicationSignature* GetSceNpCommsSig();
83 static const SceNpTitleId* GetSceNpTitleId();
84 static const SceNpTitleSecret* GetSceNpTitleSecret();
85
86 static void GetInviteDataAndProcess(sce::Toolkit::NP::MessageAttachment* pInvite);
87private:
88 void InitialiseAfterOnline();
89 void ErrorHandlingTick();
90 void UpdateOnlineStatus(int status) { m_onlineStatus = status; }
91 int GetOnlineStatus() { return m_onlineStatus; }
92
93 ISQRNetworkManagerListener *m_listener;
94 SQRNetworkPlayer *GetPlayerIfReady(SQRNetworkPlayer *player);
95
96 // Internal state
97 void SetState(eSQRNetworkManagerInternalState state);
98 void ResetToIdle();
99 eSQRNetworkManagerInternalState m_state;
100 eSQRNetworkManagerState m_stateExternal;
101 bool m_nextIdleReasonIsFull;
102 bool m_isHosting;
103 SceNpMatching2RoomMemberId m_localMemberId;
104 SceNpMatching2RoomMemberId m_hostMemberId; // if we're not the host
105 int m_localPlayerCount;
106 int m_localPlayerJoined; // Client only, keep a count of how many local players we have confirmed as joined to the application
107 SceNpMatching2RoomId m_room;
108 unsigned char m_currentSmallId;
109 int m_soc;
110 bool m_offlineGame;
111 bool m_offlineSQR;
112 int m_resendExternalRoomDataCountdown;
113 bool m_matching2initialised;
114 PresenceSyncInfo m_inviteReceived[MAX_SIMULTANEOUS_INVITES];
115 int m_inviteIndex;
116 static PresenceSyncInfo *m_gameBootInvite;
117 static PresenceSyncInfo m_gameBootInvite_data;
118 bool m_doBootInviteCheck;
119 bool m_isInSession;
120// static SceNpBasicAttachmentDataId s_lastInviteIdToRetry;
121 int m_onlineStatus;
122 bool m_bLinkDisconnected;
123
124
125private:
126
127 CRITICAL_SECTION m_csRoomSyncData;
128 RoomSyncData m_roomSyncData;
129 void *m_joinExtData;
130 int m_joinExtDataSize;
131
132 std::vector<SQRNetworkPlayer *> m_vecTempPlayers;
133 SQRNetworkPlayer *m_aRoomSlotPlayers[MAX_ONLINE_PLAYER_COUNT]; // Maps from the players in m_roomSyncData, to SQRNetworkPlayers
134 void FindOrCreateNonNetworkPlayer(int slot, int playerType, SceNpMatching2RoomMemberId memberId, int localPlayerIdx, int smallId);
135
136 void MapRoomSlotPlayers(int roomSlotPlayerCount =-1);
137 void UpdateRoomSyncUIDsFromPlayers();
138 void UpdatePlayersFromRoomSyncUIDs();
139 void LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize);
140 int GetSessionIndex(SQRNetworkPlayer *player);
141
142 bool AddRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int playerMask, bool *isFull = NULL );
143 void RemoveRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int mask );
144 void RemoveNetworkPlayers( int mask );
145 void SetLocalPlayersAndSync();
146 void SyncRoomData();
147 SceNpMatching2RequestId m_setRoomDataRequestId;
148 SceNpMatching2RequestId m_setRoomIntDataRequestId;
149 SceNpMatching2RequestId m_roomExtDataRequestId;
150
151 // Server context management
152 bool GetMatchingContext(eSQRNetworkManagerInternalState asyncState);
153 bool GetServerContext();
154 bool GetServerContext2();
155 bool GetServerContext(SceNpMatching2ServerId serverId);
156 void DeleteServerContext();
157 bool SelectRandomServer();
158 void ServerContextTick();
159 int m_totalServerCount;
160 int m_serverCount;
161 SceNpMatching2ServerId *m_aServerId;
162 SceNpMatching2ServerId m_serverId;
163 bool m_serverContextValid;
164 SceNpMatching2RequestId m_serverSearchRequestId;
165 SceNpMatching2RequestId m_serverContextRequestId;
166
167 // Room creation management
168 SceNpMatching2RequestId m_getWorldRequestId;
169 SceNpMatching2RequestId m_createRoomRequestId;
170 SceNpMatching2WorldId m_worldId;
171 void RoomCreateTick();
172
173 // Room joining management
174 SceNpMatching2RoomId m_roomToJoin;
175 int m_localPlayerJoinMask;
176 SceNpMatching2RequestId m_joinRoomRequestId;
177 SceNpMatching2RequestId m_kickRequestId;
178
179 // Room leaving management
180 SceNpMatching2RequestId m_leaveRoomRequestId;
181
182 // Adding extra network players management
183 SceNpMatching2RequestId m_setRoomMemberInternalDataRequestId;
184
185 // Player state management
186 void NetworkPlayerConnectionComplete(SQRNetworkPlayer *player);
187 void NetworkPlayerSmallIdAllocated(SQRNetworkPlayer *player, unsigned char smallId);
188 void NetworkPlayerInitialDataReceived(SQRNetworkPlayer *player,void *data);
189 void NonNetworkPlayerComplete(SQRNetworkPlayer *player, unsigned char smallId);
190 void HandlePlayerJoined(SQRNetworkPlayer *player);
191 CRITICAL_SECTION m_csPlayerState;
192
193 // State and thread for managing basic event type messages
194 C4JThread *m_basicEventThread;
195 SceKernelEqueue m_basicEventQueue;
196 static int BasicEventThreadProc( void *lpParameter);
197
198 // State and storage for managing search for friends' games
199 eSQRNetworkManagerFriendSearchState m_friendSearchState;
200 SceNpMatching2ContextId m_matchingContext;
201 bool m_matchingContextValid;
202 SceNpMatching2RequestId m_friendSearchRequestId;
203 unsigned int m_friendCount;
204 C4JThread *m_getFriendCountThread;
205 static int GetFriendsThreadProc( void* lpParameter );
206 void FriendSearchTick();
207 SceNpMatching2RequestId m_roomDataExternalListRequestId;
208 void (* m_FriendSessionUpdatedFn)(bool success, void *pParam);
209 void *m_pParamFriendSessionUpdated;
210 void *m_pExtDataToUpdate;
211
212 // 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.
213 class FriendSearchResult
214 {
215 public:
216 SceNpId m_NpId;
217 SceNpMatching2RoomId m_RoomId;
218 SceNpMatching2ServerId m_ServerId;
219 bool m_RoomFound;
220 void *m_RoomExtDataReceived;
221 };
222 std::vector<FriendSearchResult> m_aFriendSearchResults;
223
224 // Rudp management and local players
225 std::unordered_map<int,SQRNetworkPlayer *> m_RudpCtxToPlayerMap;
226
227 std::unordered_map<SceNetInAddr_t, SQRVoiceConnection*> m_NetAddrToVoiceConnectionMap;
228
229 bool CreateRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask, SceNpMatching2RoomMemberId playersPeerMemberId);
230 bool CreateVoiceRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask);
231 bool CreateSocket();
232 SQRNetworkPlayer *GetPlayerFromRudpCtx(int rudpCtx);
233 SQRVoiceConnection* GetVoiceConnectionFromRudpCtx(int rudpCtx);
234
235 SQRNetworkPlayer *GetPlayerFromRoomMemberAndLocalIdx(int roomMember, int localIdx);
236 SceNpMatching2RequestId m_roomMemberDataRequestId;
237
238 // Callbacks (for matching)
239 bool RegisterCallbacks();
240 static void ContextCallback(SceNpMatching2ContextId id, SceNpMatching2Event event, SceNpMatching2EventCause eventCause, int errorCode, void *arg);
241
242 static void DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, int errorCode, const void *data, void *arg);
243 static void RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, const void *data, void *arg);
244
245
246 // MGH - changed this to queue up the signalling events from the callback and process them later on the server thread
247 class SignallingEvent
248 {
249 public:
250 SceNpMatching2ContextId ctxId;
251 SceNpMatching2RoomId roomId;
252 SceNpMatching2RoomMemberId peerMemberId;
253 SceNpMatching2Event event;
254 int error_code;
255 };
256 std::vector<SignallingEvent> m_signallingEventList;
257 CRITICAL_SECTION m_signallingEventListCS;
258
259 static void SignallingCallback(SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, SceNpMatching2Event event, int error_code, void *arg);
260 void ProcessSignallingEvent(SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, SceNpMatching2Event event, int error_code);
261 void SignallingEventsTick();
262
263 // Callback for NpBasic
264 static int BasicEventCallback(int event, int retCode, uint32_t reqId, void *arg);
265
266 // Callback for NpManager
267 static void ManagerCallback(int event, int result, void *arg);
268
269 // Callback for sys util
270 static void SysUtilCallback(uint64_t status, uint64_t param, void *userdata);
271
272 // Callbacks for rudp
273 static void RudpContextCallback(int ctx_id, int event_id, int error_code, void *arg);
274 static int RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct SceNetSockaddr const *addr, SceNetSocklen_t addrlen, void *arg);
275
276 // Callback for netctl
277 static void NetCtlCallback(int eventType, void *arg);
278
279 // Methods to be called when the server context has been created
280 void ServerContextValid_CreateRoom();
281 void ServerContextValid_JoinRoom();
282
283 // Mask utilities
284 int GetOldMask(SceNpMatching2RoomMemberId memberId);
285 int GetAddedMask(int newMask, int oldMask);
286 int GetRemovedMask(int newMask, int oldMask);
287
288#ifndef _CONTENT_PACKAGE
289 static bool aForceError[SNM_FORCE_ERROR_COUNT];
290#endif
291 bool ForceErrorPoint(eSQRForceError err);
292
293public:
294 static void AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed = false, int iPad = -1);
295 //static void CallSignInCompleteCallback();
296 static int (*s_SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad);
297 static bool s_signInCompleteCallbackIfFailed;
298 static bool s_signInCompleteCallbackFAIL;
299
300 static void *s_SignInCompleteParam;
301 static bool s_SignInCompleteCallbackPending;
302 static long long s_errorDialogClosed;
303 static long long s_systemDialogClosed;
304 static int s_SignInCompleteCallbackPad;
305
306 // Time to wait for system UI before we check result
307 #define SYSTEM_UI_WAIT_TIME 1000
308
309 static int SetRichPresence(const void *data);
310 void SetPresenceDataStartHostingGame();
311 int GetJoiningReadyPercentage();
312 static void SetPresenceFailedCallback();
313
314 // 4J-PB - so we can stop the crash when Iggy's LoadMovie is called from the ContextCallback
315 static bool m_bCallPSNSignInCallback;
316
317private:
318 static void UpdateRichPresenceCustomData(void *data, unsigned int dataBytes);
319 static void TickRichPresence();
320 static void SendLastPresenceInfo();
321
322 void OnlineCheck();
323 void tickErrorDialog();
324
325 static sce::Toolkit::NP::PresenceDetails s_lastPresenceInfo;
326
327 static const int MIN_PRESENCE_RESEND_TIME = 30 * 1000; // Minimum presence send rate - doesn't seem possible to find out what this actually should be
328 static __int64 s_lastPresenceTime;
329 static __int64 s_resendPresenceTime;
330
331 static bool s_presenceStatusDirty;
332 static bool s_presenceDataDirty;
333
334 static PresenceSyncInfo s_lastPresenceSyncInfo;
335 static PresenceSyncInfo c_presenceSyncInfoNULL;
336 static bool b_inviteRecvGUIRunning;
337
338 // Debug
339 static long long s_roomStartTime;
340
341 // Error dialog
342 static bool s_errorDialogRunning;
343
344 // NP Notify
345 void TickNotify();
346 void NotifyRealtimePlusFeature(int iQuadrant);
347 long long m_lastNotifyTime;
348
349 static void RefreshChatAndContentRestrictionsReturned_HandleInvite(void *pParam);
350 bool m_bRefreshingRestrictionsForInvite;
351
352public:
353 static bool s_bInviteDialogRunning;
354};
355