the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 184 lines 8.0 kB view raw
1#pragma once 2using namespace std; 3#include <vector> 4#include <qnet.h> 5#include "..\..\..\Minecraft.World\C4JThread.h" 6#include "..\..\Common\Network\NetworkPlayerInterface.h" 7#include "..\..\Common\Network\PlatformNetworkManagerInterface.h" 8#include "..\..\Common\Network\SessionInfo.h" 9 10// This is how often we allow a search for new games 11#define MINECRAFT_XSESSION_SEARCH_DELAY_MILLISECONDS 30000 12 13// This is the xbox 360 specific implementation of CPlatformNetworkManager. It is implemented using QNET. There shouldn't be any general game code in here, this class is 14// for providing a bridge between the common game-side network implementation, and the lowest level platform specific libraries (QNET in this case). 15 16class CPlatformNetworkManagerXbox : public CPlatformNetworkManager, public IQNetCallbacks 17{ 18 friend class CGameNetworkManager; 19public: 20 virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize); 21 virtual void Terminate(); 22 virtual int GetJoiningReadyPercentage(); 23 virtual int CorrectErrorIDS(int IDS); 24 25 virtual void DoWork(); 26 virtual int GetPlayerCount(); 27 virtual int GetOnlinePlayerCount(); 28 virtual int GetLocalPlayerMask(int playerIndex); 29 virtual bool AddLocalPlayerByUserIndex( int userIndex ); 30 virtual bool RemoveLocalPlayerByUserIndex( int userIndex ); 31 virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ); 32 virtual INetworkPlayer *GetPlayerByIndex(int playerIndex); 33 virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid); 34 virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId); 35 virtual bool ShouldMessageForFullSession(); 36 37 virtual INetworkPlayer *GetHostPlayer(); 38 virtual bool IsHost(); 39 virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); 40 virtual bool LeaveGame(bool bMigrateHost); 41 42 virtual bool IsInSession(); 43 virtual bool IsInGameplay(); 44 virtual bool IsInStatsEnabledSession(); 45 virtual bool IsReadyToPlayOrIdle(); 46 virtual bool SessionHasSpace(unsigned int spaceRequired = 1); 47 virtual void SendInviteGUI(int quadrant); 48 virtual bool IsAddingPlayer(); 49 50 virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); 51 virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex ); 52 virtual bool SetLocalGame(bool isLocal); 53 virtual bool IsLocalGame() { return m_bIsOfflineGame; } 54 virtual void SetPrivateGame(bool isPrivate); 55 virtual bool IsPrivateGame() { return m_bIsPrivateGame; } 56 virtual bool IsLeavingGame() { return m_bLeavingGame; } 57 virtual void ResetLeavingGame() { m_bLeavingGame = true; } 58 59 virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); 60 virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); 61 62 virtual void HandleSignInChange(); 63 64 virtual bool _RunNetworkGame(); 65 66private: 67 bool isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer); 68 virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom); 69 virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); 70 virtual bool _StartGame(); 71 72 IQNet * m_pIQNet; // pointer to QNet interface 73 74 HANDLE m_notificationListener; 75 76 vector<IQNetPlayer *> m_machineQNetPrimaryPlayers; // collection of players that we deem to be the main one for that system 77 78 bool m_bLeavingGame; 79 bool m_bLeaveGameOnTick; 80 bool m_migrateHostOnLeave; 81 bool m_bHostChanged; 82 83 bool m_bIsOfflineGame; 84 bool m_bIsPrivateGame; 85 int m_flagIndexSize; 86 87 // This is only maintained by the host, and is not valid on client machines 88 GameSessionData m_hostGameSessionData; 89 CGameNetworkManager *m_pGameNetworkManager; 90public: 91 virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); 92 93private: 94 // TODO 4J Stu - Do we need to be able to have more than one of these? 95 void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); 96 void *playerChangedCallbackParam[XUSER_MAX_COUNT]; 97 98 static int RemovePlayerOnSocketClosedThreadProc( void* lpParam ); 99 virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ); 100 101 // Things for handling per-system flags 102 class PlayerFlags 103 { 104 public: 105 INetworkPlayer *m_pNetworkPlayer; 106 unsigned char *flags; 107 unsigned int count; 108 PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count); 109 ~PlayerFlags(); 110 }; 111 vector<PlayerFlags *> m_playerFlags; 112 void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer); 113 void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer); 114 void SystemFlagReset(); 115public: 116 virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); 117 virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); 118 119 // For telemetry 120private: 121 float m_lastPlayerEventTimeStart; 122 123public: 124 wstring GatherStats(); 125 wstring GatherRTTStats(); 126 127private: 128 vector<FriendSessionInfo *> friendsSessions[XUSER_MAX_COUNT]; 129 int m_searchResultsCount[XUSER_MAX_COUNT]; 130 int m_lastSearchStartTime[XUSER_MAX_COUNT]; 131 132 // The results that will be filled in with the current search 133 XSESSION_SEARCHRESULT_HEADER *m_pSearchResults[XUSER_MAX_COUNT]; 134 XNQOS *m_pQoSResult[XUSER_MAX_COUNT]; 135 136 // The results from the previous search, which are currently displayed in the game 137 XSESSION_SEARCHRESULT_HEADER *m_pCurrentSearchResults[XUSER_MAX_COUNT]; 138 XNQOS *m_pCurrentQoSResult[XUSER_MAX_COUNT]; 139 int m_currentSearchResultsCount[XUSER_MAX_COUNT]; 140 141 int m_lastSearchPad; 142 bool m_bSearchResultsReady; 143 bool m_bSearchPending; 144 LPVOID m_pSearchParam; 145 void (*m_SessionsUpdatedCallback)(LPVOID pParam); 146 147 C4JThread* m_SearchingThread; 148 149 void TickSearch(); 150 void SearchForGames(); 151 static int SearchForGamesThreadProc( void* lpParameter ); 152 153 void SetSearchResultsReady(int resultCount = 0); 154 155 vector<INetworkPlayer *>currentNetworkPlayers; 156 INetworkPlayer *addNetworkPlayer(IQNetPlayer *pQNetPlayer); 157 void removeNetworkPlayer(IQNetPlayer *pQNetPlayer); 158 static INetworkPlayer *getNetworkPlayer(IQNetPlayer *pQNetPlayer); 159 160 virtual void SetSessionTexturePackParentId( int id ); 161 virtual void SetSessionSubTexturePackId( int id ); 162 virtual void Notify(int ID, ULONG_PTR Param); 163 164public: 165 virtual vector<FriendSessionInfo *> *GetSessionList(int iPad, int localPlayers, bool partyOnly); 166 virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); 167 virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); 168 virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); 169 virtual void ForceFriendsSessionRefresh(); 170 171 // IQNetcallback interface functions 172 VOID NotifyStateChanged( __in QNET_STATE OldState, __in QNET_STATE NewState, __in HRESULT hrInfo ); 173 VOID NotifyPlayerJoined( __in IQNetPlayer *pQNetPlayer ); 174 VOID NotifyPlayerLeaving(__in IQNetPlayer *pQNetPlayer ); 175 VOID NotifyNewHost( __in IQNetPlayer * pQNetPlayer); 176 VOID NotifyDataReceived( __in IQNetPlayer * pQNetPlayerFrom, __in DWORD dwNumPlayersTo, __in_ecount(dwNumPlayersTo) IQNetPlayer ** apQNetPlayersTo, __in_bcount(dwDataSize) const BYTE * pbData, __in DWORD dwDataSize); 177 VOID NotifyWriteStats( __in IQNetPlayer * pQNetPlayer ); 178 VOID NotifyReadinessChanged(__in IQNetPlayer * pQNetPlayer, __in BOOL bReady); 179 VOID NotifyCommSettingsChanged(__in IQNetPlayer * pQNetPlayer); 180 VOID NotifyGameSearchComplete(__in IQNetGameSearch * pGameSearch, __in HRESULT hrComplete, __in DWORD dwNumResults); 181 VOID NotifyGameInvite( __in DWORD dwUserIndex, __in const INVITE_INFO * pInviteInfo ); 182 VOID NotifyContextChanged( __in const XUSER_CONTEXT * pContext); 183 VOID NotifyPropertyChanged( __in const XUSER_PROPERTY * pProperty); 184};