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