the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 327 lines 12 kB view raw
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};