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