mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-24 09:34:24 +00:00
201 lines
7 KiB
C++
201 lines
7 KiB
C++
#pragma once
|
|
#include <stdint.h>
|
|
// using namespace std;
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "platform/PlatformTypes.h"
|
|
#include "platform/NetTypes.h"
|
|
#include "minecraft/client/model/SkinBox.h"
|
|
#include "platform/XboxStubs.h"
|
|
#include "NetworkPlayerInterface.h"
|
|
#include "platform/IPlatformNetwork.h"
|
|
#include "SessionInfo.h"
|
|
#include "platform/C4JThread.h"
|
|
|
|
class C4JThread;
|
|
class CGameNetworkManager;
|
|
class INetworkPlayer;
|
|
|
|
class IPlatformNetworkStub : public IPlatformNetwork {
|
|
friend class CGameNetworkManager;
|
|
|
|
public:
|
|
virtual bool Initialise(CGameNetworkManager* pGameNetworkManager,
|
|
int flagIndexSize);
|
|
virtual void Terminate();
|
|
virtual int GetJoiningReadyPercentage();
|
|
virtual int CorrectErrorIDS(int IDS);
|
|
|
|
virtual void DoWork();
|
|
virtual int GetPlayerCount();
|
|
virtual int GetOnlinePlayerCount();
|
|
virtual int GetLocalPlayerMask(int playerIndex);
|
|
virtual bool AddLocalPlayerByUserIndex(int userIndex);
|
|
virtual bool RemoveLocalPlayerByUserIndex(int userIndex);
|
|
virtual INetworkPlayer* GetLocalPlayerByUserIndex(int userIndex);
|
|
virtual INetworkPlayer* GetPlayerByIndex(int playerIndex);
|
|
virtual INetworkPlayer* GetPlayerByXuid(PlayerUID xuid);
|
|
virtual INetworkPlayer* GetPlayerBySmallId(unsigned char smallId);
|
|
virtual bool ShouldMessageForFullSession();
|
|
|
|
virtual INetworkPlayer* GetHostPlayer();
|
|
virtual bool IsHost();
|
|
virtual bool JoinGameFromInviteInfo(int userIndex, int userMask,
|
|
const INVITE_INFO* pInviteInfo);
|
|
virtual bool LeaveGame(bool bMigrateHost);
|
|
|
|
virtual bool IsInSession();
|
|
virtual bool IsInGameplay();
|
|
virtual bool IsReadyToPlayOrIdle();
|
|
virtual bool IsInStatsEnabledSession();
|
|
virtual bool SessionHasSpace(unsigned int spaceRequired = 1);
|
|
virtual void SendInviteGUI(int quadrant);
|
|
virtual bool IsAddingPlayer();
|
|
|
|
virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate,
|
|
unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS,
|
|
unsigned char privateSlots = 0);
|
|
virtual int JoinGame(FriendSessionInfo* searchResult, int localUsersMask,
|
|
int primaryUserIndex);
|
|
virtual bool SetLocalGame(bool isLocal);
|
|
virtual bool IsLocalGame() { return m_bIsOfflineGame; }
|
|
virtual void SetPrivateGame(bool isPrivate);
|
|
virtual bool IsPrivateGame() { return m_bIsPrivateGame; }
|
|
virtual bool IsLeavingGame() { return m_bLeavingGame; }
|
|
virtual void ResetLeavingGame() { m_bLeavingGame = false; }
|
|
|
|
virtual void RegisterPlayerChangedCallback(
|
|
int iPad,
|
|
std::function<void(INetworkPlayer* pPlayer, bool leaving)>
|
|
callback);
|
|
virtual void UnRegisterPlayerChangedCallback(int iPad);
|
|
|
|
virtual void HandleSignInChange();
|
|
|
|
virtual bool _RunNetworkGame();
|
|
|
|
private:
|
|
bool isSystemPrimaryPlayer(IQNetPlayer* pQNetPlayer);
|
|
virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom);
|
|
virtual void _HostGame(
|
|
int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS,
|
|
unsigned char privateSlots = 0);
|
|
virtual bool _StartGame();
|
|
|
|
IQNet* m_pIQNet; // pointer to QNet interface
|
|
|
|
void* m_notificationListener;
|
|
|
|
std::vector<IQNetPlayer*>
|
|
m_machineQNetPrimaryPlayers; // collection of players that we deem to
|
|
// be the main one for that system
|
|
|
|
bool m_bLeavingGame;
|
|
bool m_bLeaveGameOnTick;
|
|
bool m_migrateHostOnLeave;
|
|
bool m_bHostChanged;
|
|
|
|
bool m_bIsOfflineGame;
|
|
bool m_bIsPrivateGame;
|
|
int m_flagIndexSize;
|
|
|
|
// This is only maintained by the host, and is not valid on client machines
|
|
GameSessionData m_hostGameSessionData;
|
|
CGameNetworkManager* m_pGameNetworkManager;
|
|
|
|
public:
|
|
virtual void UpdateAndSetGameSessionData(
|
|
INetworkPlayer* pNetworkPlayerLeaving = nullptr);
|
|
|
|
private:
|
|
std::function<void(INetworkPlayer* pPlayer, bool leaving)>
|
|
playerChangedCallback[XUSER_MAX_COUNT];
|
|
|
|
static int RemovePlayerOnSocketClosedThreadProc(void* lpParam);
|
|
virtual bool RemoveLocalPlayer(INetworkPlayer* pNetworkPlayer);
|
|
|
|
// Things for handling per-system flags
|
|
class PlayerFlags {
|
|
public:
|
|
INetworkPlayer* m_pNetworkPlayer;
|
|
unsigned char* flags;
|
|
unsigned int count;
|
|
PlayerFlags(INetworkPlayer* pNetworkPlayer, unsigned int count);
|
|
~PlayerFlags();
|
|
};
|
|
std::vector<PlayerFlags*> m_playerFlags;
|
|
void SystemFlagAddPlayer(INetworkPlayer* pNetworkPlayer);
|
|
void SystemFlagRemovePlayer(INetworkPlayer* pNetworkPlayer);
|
|
void SystemFlagReset();
|
|
|
|
public:
|
|
virtual void SystemFlagSet(INetworkPlayer* pNetworkPlayer, int index);
|
|
virtual bool SystemFlagGet(INetworkPlayer* pNetworkPlayer, int index);
|
|
|
|
// For telemetry
|
|
private:
|
|
float m_lastPlayerEventTimeStart;
|
|
|
|
public:
|
|
std::string GatherStats();
|
|
std::string GatherRTTStats();
|
|
|
|
private:
|
|
std::vector<FriendSessionInfo*> friendsSessions[XUSER_MAX_COUNT];
|
|
int m_searchResultsCount[XUSER_MAX_COUNT];
|
|
int m_lastSearchStartTime[XUSER_MAX_COUNT];
|
|
|
|
// The results that will be filled in with the current search
|
|
XSESSION_SEARCHRESULT_HEADER* m_pSearchResults[XUSER_MAX_COUNT];
|
|
XNQOS* m_pQoSResult[XUSER_MAX_COUNT];
|
|
|
|
// The results from the previous search, which are currently displayed in
|
|
// the game
|
|
XSESSION_SEARCHRESULT_HEADER* m_pCurrentSearchResults[XUSER_MAX_COUNT];
|
|
XNQOS* m_pCurrentQoSResult[XUSER_MAX_COUNT];
|
|
int m_currentSearchResultsCount[XUSER_MAX_COUNT];
|
|
|
|
int m_lastSearchPad;
|
|
bool m_bSearchResultsReady;
|
|
bool m_bSearchPending;
|
|
std::function<void()> m_SessionsUpdatedCallback;
|
|
|
|
C4JThread* m_SearchingThread;
|
|
|
|
void TickSearch();
|
|
void SearchForGames();
|
|
static int SearchForGamesThreadProc(void* lpParameter);
|
|
|
|
void SetSearchResultsReady(int resultCount = 0);
|
|
|
|
std::vector<INetworkPlayer*> currentNetworkPlayers;
|
|
INetworkPlayer* addNetworkPlayer(IQNetPlayer* pQNetPlayer);
|
|
void removeNetworkPlayer(IQNetPlayer* pQNetPlayer);
|
|
static INetworkPlayer* getNetworkPlayer(IQNetPlayer* pQNetPlayer);
|
|
|
|
virtual void SetSessionTexturePackParentId(int id);
|
|
virtual void SetSessionSubTexturePackId(int id);
|
|
virtual void Notify(int ID, uintptr_t Param);
|
|
|
|
public:
|
|
virtual std::vector<FriendSessionInfo*>* GetSessionList(int iPad,
|
|
int localPlayers,
|
|
bool partyOnly);
|
|
virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,
|
|
FriendSessionInfo* foundSession);
|
|
virtual void SetSessionsUpdatedCallback(
|
|
std::function<void()> callback);
|
|
virtual void GetFullFriendSessionInfo(
|
|
FriendSessionInfo* foundSession,
|
|
std::function<void(bool success)> callback);
|
|
virtual void ForceFriendsSessionRefresh();
|
|
|
|
private:
|
|
void NotifyPlayerJoined(IQNetPlayer* pQNetPlayer);
|
|
|
|
void FakeLocalPlayerJoined() {
|
|
NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(0));
|
|
}
|
|
};
|