the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at master 300 lines 15 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#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};