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#include <np_toolkit.h>
10#endif
11#include <queue>
12
13#include <unordered_map>
14#if defined __PSVITA__
15#include "..\..\Minecraft.Client\PSVita\4JLibs\inc\4J_Profile.h"
16#endif
17
18class SQRNetworkPlayer;
19class ISQRNetworkManagerListener;
20class SonyVoiceChat;
21class C4JThread;
22
23// 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.
24// The game shouldn't directly use this class, it is here to provide functionality required by PlatformNetworkManagerSony.
25
26class SQRNetworkManager
27{
28public:
29 static const int MAX_LOCAL_PLAYER_COUNT = XUSER_MAX_COUNT;
30 static const int MAX_ONLINE_PLAYER_COUNT = MINECRAFT_NET_MAX_PLAYERS;
31
32 static const int NP_POOL_SIZE = 128 * 1024;
33protected:
34 friend class SQRNetworkPlayer;
35 friend class SonyVoiceChat;
36#ifdef __PSVITA__
37 friend class HelloSyncInfo;
38#endif
39
40 static const int MAX_FRIENDS = 100;
41#ifdef __PS3__
42 static const int RUDP_THREAD_PRIORITY = 999;
43#else // __ORBIS_
44 static const int RUDP_THREAD_PRIORITY = 500;
45#endif
46 static const int RUDP_THREAD_STACK_SIZE = 32878;
47 static const int MAX_SIMULTANEOUS_INVITES = 10;
48
49
50 // This class stores everything about a player that must be synchronised between machines. This syncing is carried out
51 // by the Matching2 lib by using internal room binary data (ie data that is only visible to current members of a room)
52 class PlayerSyncData
53 {
54 public:
55 PlayerUID m_UID; // Assigned by the associated player->GetUID()
56 SceNpMatching2RoomMemberId m_roomMemberId; // Assigned by Matching2 lib, we can use to indicate which machine this player belongs to (note - 16 bits)
57 unsigned char m_smallId; // Assigned by SQRNetworkManager, to attach a permanent id to this player (until we have to wrap round), to match a similar concept in qnet
58 unsigned char m_localIdx : 4; // Which local player (by controller index) this represents
59 unsigned char m_playerCount : 4;
60 };
61
62 class RoomSyncData
63 {
64 public:
65 PlayerSyncData players[MAX_ONLINE_PLAYER_COUNT];
66 void setPlayerCount(int c) { players[0].m_playerCount = c;}
67 int getPlayerCount() { return players[0].m_playerCount;}
68 };
69
70public:
71 class PresenceSyncInfo
72 {
73 public:
74 GameSessionUID hostPlayerUID;
75 SceNpMatching2RoomId m_RoomId;
76 SceNpMatching2ServerId m_ServerId;
77 unsigned int texturePackParentId;
78 unsigned short netVersion;
79 unsigned char subTexturePackId;
80 bool inviteOnly;
81 };
82
83
84 // Externally exposed state. All internal states are mapped to one of these broader states.
85 typedef enum
86 {
87 SNM_STATE_INITIALISING,
88 SNM_STATE_INITIALISE_FAILED,
89 SNM_STATE_IDLE,
90
91 SNM_STATE_HOSTING,
92 SNM_STATE_JOINING,
93
94 SNM_STATE_STARTING,
95 SNM_STATE_PLAYING,
96
97 SNM_STATE_LEAVING,
98 SNM_STATE_ENDING,
99 } eSQRNetworkManagerState;
100
101 struct SessionID
102 {
103 SceNpMatching2RoomId m_RoomId;
104 SceNpMatching2ServerId m_ServerId;
105 };
106
107 struct SessionSearchResult
108 {
109 SceNpId m_NpId;
110 SessionID m_sessionId;
111 void *m_extData;
112#ifdef __PSVITA__
113 SceNetInAddr m_netAddr;
114#endif
115 };
116
117protected:
118
119 // On initialisation, state should transition from SNM_INT_STATE_UNINITIALISED -> SNM_INT_STATE_SIGNING_IN -> SNM_INT_STATE_SIGNED_IN -> SNM_INT_STATE_STARTING_CONTEXT -> SNM_INT_STATE_IDLE.
120 // Error indicated if we transition at any point to SNM_INT_STATE_INITIALISE_FAILED.
121
122 // NOTE: If anything changes in here, then the mapping from internal -> external state needs to be updated (m_INTtoEXTStateMappings, defined in the cpp file)
123 typedef enum
124 {
125 SNM_INT_STATE_UNINITIALISED,
126 SNM_INT_STATE_SIGNING_IN,
127 SNM_INT_STATE_STARTING_CONTEXT,
128 SNM_INT_STATE_INITIALISE_FAILED,
129
130 SNM_INT_STATE_IDLE,
131 SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT,
132
133 SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT,
134 SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER,
135 SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR,
136 SNM_INT_STATE_HOSTING_SERVER_FOUND,
137 SNM_INT_STATE_HOSTING_SERVER_SEARCH_CREATING_CONTEXT,
138 SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED,
139
140 SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD,
141 SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND,
142 SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM,
143 SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS,
144 SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED,
145 SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT,
146 SNM_INT_STATE_HOSTING_WAITING_TO_PLAY,
147
148 SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT,
149 SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER,
150 SNM_INT_STATE_JOINING_SERVER_SEARCH_SERVER_ERROR,
151 SNM_INT_STATE_JOINING_SERVER_FOUND,
152 SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT,
153 SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED,
154
155 SNM_INT_STATE_JOINING_JOIN_ROOM,
156 SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED,
157
158 SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS,
159
160 SNM_INT_STATE_SERVER_DELETING_CONTEXT,
161
162 SNM_INT_STATE_STARTING,
163 SNM_INT_STATE_PLAYING,
164
165 SNM_INT_STATE_LEAVING,
166 SNM_INT_STATE_LEAVING_FAILED,
167
168 SNM_INT_STATE_ENDING,
169
170 SNM_INT_STATE_COUNT
171
172 } eSQRNetworkManagerInternalState;
173
174 typedef enum
175 {
176 SNM_FORCE_ERROR_NP2_INIT,
177 SNM_FORCE_ERROR_NET_INITIALIZE_NETWORK,
178 SNM_FORCE_ERROR_NET_CTL_INIT,
179 SNM_FORCE_ERROR_RUDP_INIT,
180 SNM_FORCE_ERROR_NET_START_DIALOG,
181 SNM_FORCE_ERROR_MATCHING2_INIT,
182 SNM_FORCE_ERROR_REGISTER_NP_CALLBACK,
183 SNM_FORCE_ERROR_GET_NPID,
184 SNM_FORCE_ERROR_CREATE_MATCHING_CONTEXT,
185 SNM_FORCE_ERROR_REGISTER_CALLBACKS,
186 SNM_FORCE_ERROR_CONTEXT_START_ASYNC,
187 SNM_FORCE_ERROR_SET_EXTERNAL_ROOM_DATA,
188 SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY_COUNT,
189 SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY,
190 SNM_FORCE_ERROR_GET_USER_INFO_LIST,
191 SNM_FORCE_ERROR_LEAVE_ROOM,
192 SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL,
193 SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL2,
194 SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT,
195 SNM_FORCE_ERROR_CREATE_JOIN_ROOM,
196 SNM_FORCE_ERROR_GET_SERVER_INFO,
197 SNM_FORCE_ERROR_DELETE_SERVER_CONTEXT,
198 SNM_FORCE_ERROR_SETSOCKOPT_0,
199 SNM_FORCE_ERROR_SETSOCKOPT_1,
200 SNM_FORCE_ERROR_SETSOCKOPT_2,
201 SNM_FORCE_ERROR_SOCK_BIND,
202 SNM_FORCE_ERROR_CREATE_RUDP_CONTEXT,
203 SNM_FORCE_ERROR_RUDP_BIND,
204 SNM_FORCE_ERROR_RUDP_INIT2,
205 SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA,
206 SNM_FORCE_ERROR_GET_SERVER_INFO_DATA,
207 SNM_FORCE_ERROR_GET_WORLD_INFO_DATA,
208 SNM_FORCE_ERROR_GET_CREATE_JOIN_ROOM_DATA,
209 SNM_FORCE_ERROR_GET_USER_INFO_LIST_DATA,
210 SNM_FORCE_ERROR_GET_JOIN_ROOM_DATA,
211 SNM_FORCE_ERROR_GET_ROOM_MEMBER_DATA_INTERNAL,
212 SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA2,
213 SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT_CALLBACK,
214 SNM_FORCE_ERROR_SET_ROOM_DATA_CALLBACK,
215 SNM_FORCE_ERROR_UPDATED_ROOM_DATA,
216 SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL1,
217 SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL2,
218 SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL3,
219 SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL4,
220 SNM_FORCE_ERROR_GET_WORLD_INFO_LIST,
221 SNM_FORCE_ERROR_JOIN_ROOM,
222
223 SNM_FORCE_ERROR_COUNT,
224 } eSQRForceError;
225
226
227 class StateChangeInfo
228 {
229 public:
230 eSQRNetworkManagerState m_oldState;
231 eSQRNetworkManagerState m_newState;
232 bool m_idleReasonIsSessionFull;
233 StateChangeInfo(eSQRNetworkManagerState oldState, eSQRNetworkManagerState newState,bool idleReasonIsSessionFull) : m_oldState(oldState), m_newState(newState), m_idleReasonIsSessionFull(idleReasonIsSessionFull) {}
234 };
235
236 std::queue<StateChangeInfo> m_stateChangeQueue;
237 CRITICAL_SECTION m_csStateChangeQueue;
238 CRITICAL_SECTION m_csMatching;
239 CRITICAL_SECTION m_csAckQueue;
240 std::queue<int> m_queuedAckRequests;
241
242 typedef enum
243 {
244 SNM_FRIEND_SEARCH_STATE_IDLE, // Idle - search result will be valid (although it may not have any entries)
245 SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_COUNT, // Getting count of friends in friend list
246 SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_INFO, // Getting presence/NpId info for each friend
247 } eSQRNetworkManagerFriendSearchState;
248
249 typedef void (*ServerContextValidCallback)(SQRNetworkManager *manager);
250
251 static bool s_safeToRespondToGameBootInvite;
252
253public:
254
255 // General
256 virtual void Tick() = 0;
257 virtual void Initialise() = 0;
258#ifdef __PSVITA__
259 virtual void UnInitialise() = 0; // to switch from PSN to Adhoc
260 virtual bool IsInitialised() = 0;
261#endif
262 virtual void Terminate() = 0;
263 virtual eSQRNetworkManagerState GetState() = 0;
264 virtual bool IsHost() = 0;
265 virtual bool IsReadyToPlayOrIdle() = 0;
266 virtual bool IsInSession() = 0;
267
268 // Session management
269 virtual void CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline) = 0;
270 virtual void UpdateExternalRoomData() = 0;
271 virtual bool FriendRoomManagerIsBusy() = 0;
272 virtual bool FriendRoomManagerSearch() = 0;
273 virtual bool FriendRoomManagerSearch2() = 0;
274 virtual int FriendRoomManagerGetCount() = 0;
275 virtual void FriendRoomManagerGetRoomInfo(int idx, SessionSearchResult *searchResult) = 0;
276 virtual bool JoinRoom(SessionSearchResult *searchResult, int localPlayerMask) = 0;
277 virtual bool JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const SQRNetworkManager::PresenceSyncInfo *presence) = 0;
278 virtual void StartGame() = 0;
279 virtual void LeaveRoom(bool bActuallyLeaveRoom) = 0;
280 virtual void EndGame() = 0;
281 virtual bool SessionHasSpace(int spaceRequired) = 0;
282 virtual bool AddLocalPlayerByUserIndex(int idx) = 0;
283 virtual bool RemoveLocalPlayerByUserIndex(int idx) = 0;
284 virtual void SendInviteGUI() = 0;
285
286 virtual void GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) = 0;
287
288 // Player retrieval
289 virtual int GetPlayerCount() = 0;
290 virtual int GetOnlinePlayerCount() = 0;
291 virtual SQRNetworkPlayer *GetPlayerByIndex(int idx) = 0;
292 virtual SQRNetworkPlayer *GetPlayerBySmallId(int idx) = 0;
293 virtual SQRNetworkPlayer *GetPlayerByXuid(PlayerUID xuid) = 0;
294 virtual SQRNetworkPlayer *GetLocalPlayerByUserIndex(int idx) = 0;
295 virtual SQRNetworkPlayer *GetHostPlayer() = 0;
296
297 virtual void SetPresenceDataStartHostingGame() = 0;
298 virtual int GetJoiningReadyPercentage() = 0;
299
300 virtual void LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize) = 0;
301 virtual int GetSessionIndex(SQRNetworkPlayer *player) = 0;
302
303 static void SafeToRespondToGameBootInvite();
304
305 int GetOutstandingAckCount(SQRNetworkPlayer *pSonyPlayer);
306 int GetSendQueueSizeBytes();
307 int GetSendQueueSizeMessages();
308 void RequestWriteAck(int smallId);
309 void TickWriteAcks();
310
311
312};
313
314
315// Class defining interface to be implemented for class that handles callbacks
316class ISQRNetworkManagerListener
317{
318public:
319 virtual void HandleDataReceived(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, unsigned char *data, unsigned int dataSize) = 0;
320 virtual void HandlePlayerJoined(SQRNetworkPlayer *player) = 0;
321 virtual void HandlePlayerLeaving(SQRNetworkPlayer *player) = 0;
322 virtual void HandleStateChange(SQRNetworkManager::eSQRNetworkManagerState oldState, SQRNetworkManager::eSQRNetworkManagerState newState, bool idleReasonIsSessionFull) = 0;
323 virtual void HandleResyncPlayerRequest(SQRNetworkPlayer **aPlayers) = 0;
324 virtual void HandleAddLocalPlayerFailed(int idx) = 0;
325 virtual void HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut=false) = 0;
326 virtual void HandleInviteReceived( int userIndex, const SQRNetworkManager::PresenceSyncInfo *pInviteInfo) = 0;
327};