160 lines
4.6 KiB
C++
160 lines
4.6 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
#ifndef SESSION_H
|
|
#define SESSION_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "engine/imatchmaking.h"
|
|
#include "ixboxsystem.h"
|
|
#include "const.h"
|
|
#include "net.h"
|
|
|
|
// valid session states
|
|
enum SESSION_STATE
|
|
{
|
|
SESSION_STATE_NONE,
|
|
SESSION_STATE_CREATING,
|
|
SESSION_STATE_MIGRATING,
|
|
SESSION_STATE_IDLE,
|
|
SESSION_STATE_WAITING_FOR_REGISTRATION,
|
|
SESSION_STATE_REGISTERING,
|
|
SESSION_STATE_REGISTERED,
|
|
SESSION_STATE_STARTING,
|
|
SESSION_STATE_IN_GAME,
|
|
SESSION_STATE_ENDING,
|
|
SESSION_STATE_FINISHED,
|
|
SESSION_STATE_DELETING
|
|
};
|
|
|
|
// slot types for the session
|
|
enum SLOTS
|
|
{
|
|
SLOTS_TOTALPUBLIC,
|
|
SLOTS_TOTALPRIVATE,
|
|
SLOTS_FILLEDPUBLIC,
|
|
SLOTS_FILLEDPRIVATE,
|
|
SLOTS_LAST
|
|
};
|
|
|
|
class CClientInfo
|
|
{
|
|
public:
|
|
uint64 m_id; // machine id
|
|
netadr_t m_adr; // IP and Port
|
|
XNADDR m_xnaddr; // XNADDR
|
|
XUID m_xuids[MAX_PLAYERS_PER_CLIENT]; // XUIDs
|
|
bool m_bInvited; // use private slots
|
|
bool m_bRegistered; // registered for arbitration
|
|
bool m_bMigrated; // successfully completed migration
|
|
bool m_bModified; // completed session modification
|
|
bool m_bReportedStats; // reported session stats to Live
|
|
bool m_bLoaded; // map load is complete
|
|
byte m_cVoiceState[MAX_PLAYERS_PER_CLIENT]; // has voice permission
|
|
char m_cPlayers; // number of players on this client
|
|
char m_iControllers[MAX_PLAYERS_PER_CLIENT]; // the controller (user index) for each player
|
|
char m_iTeam[MAX_PLAYERS_PER_CLIENT]; // each player's team
|
|
char m_szGamertags[MAX_PLAYERS_PER_CLIENT][MAX_PLAYER_NAME_LENGTH];
|
|
char mutable m_numPrivateSlotsUsed; // number of private slots used by this client if invited
|
|
|
|
CClientInfo()
|
|
{
|
|
Clear();
|
|
}
|
|
void Clear()
|
|
{
|
|
Q_memset( this, 0, sizeof( CClientInfo ) );
|
|
Q_memset( &m_iTeam, -1, sizeof( m_iTeam ) );
|
|
}
|
|
};
|
|
|
|
class CMatchmaking;
|
|
class CSession
|
|
{
|
|
public:
|
|
CSession();
|
|
~CSession();
|
|
|
|
void ResetSession();
|
|
void SetParent( CMatchmaking *pParent );
|
|
void RunFrame();
|
|
bool CreateSession();
|
|
void CancelCreateSession();
|
|
void DestroySession();
|
|
void RegisterForArbitration();
|
|
bool MigrateHost();
|
|
|
|
void JoinLocal( const CClientInfo *pClient );
|
|
void JoinRemote( const CClientInfo *pClient );
|
|
void RemoveLocal( const CClientInfo *pClient );
|
|
void RemoveRemote( const CClientInfo *pClient );
|
|
|
|
// Accessors
|
|
HANDLE GetSessionHandle();
|
|
void SetSessionInfo( XSESSION_INFO *pInfo );
|
|
void SetNewSessionInfo( XSESSION_INFO *pInfo );
|
|
void GetSessionInfo( XSESSION_INFO *pInfo );
|
|
void GetNewSessionInfo( XSESSION_INFO *pInfo );
|
|
void SetSessionNonce( int64 nonce );
|
|
uint64 GetSessionNonce();
|
|
XNKID GetSessionId();
|
|
void SetSessionSlots( unsigned int nSlot, unsigned int nPlayers );
|
|
uint GetSessionSlots( unsigned int nSlot );
|
|
void SetSessionFlags( uint flags );
|
|
uint GetSessionFlags();
|
|
int GetPlayerCount();
|
|
void SetFlag( uint dwFlag );
|
|
void SetIsHost( bool bHost );
|
|
void SetIsSystemLink( bool bSystemLink );
|
|
void SetOwnerId( uint id );
|
|
bool IsHost();
|
|
bool IsFull();
|
|
bool IsArbitrated();
|
|
bool IsSystemLink();
|
|
|
|
void SwitchToState( SESSION_STATE newState );
|
|
|
|
void SetContext( const uint nContextId, const uint nContextValue, const bool bAsync = true );
|
|
void SetProperty( const uint nPropertyId, const uint cbValue, const void *pvValue, const bool bAsync = true );
|
|
|
|
XSESSION_REGISTRATION_RESULTS *GetRegistrationResults() { return m_pRegistrationResults; }
|
|
|
|
private:
|
|
// Update functions
|
|
void UpdateCreating();
|
|
void UpdateMigrating();
|
|
void UpdateRegistering();
|
|
void SendNotification( SESSION_NOTIFY notification );
|
|
void UpdateSlots( const CClientInfo *pClient, bool bAddPlayers );
|
|
double GetTime();
|
|
|
|
HANDLE m_hSession; // Session handle
|
|
bool m_bIsHost; // Is hosting
|
|
bool m_bIsArbitrated; // Is Arbitrated
|
|
bool m_bUsingQoS; // Is the QoS listener enabled
|
|
bool m_bIsSystemLink; // Is this a system link session
|
|
XSESSION_INFO m_SessionInfo; // Session ID, key, and host address
|
|
XSESSION_INFO m_NewSessionInfo; // Session ID, key, and host address
|
|
uint64 m_SessionNonce; // Nonce of the session
|
|
uint m_nSessionFlags; // Session creation flags
|
|
uint m_nOwnerId; // Which player created the session
|
|
uint m_SessionState;
|
|
double m_fOperationStartTime;
|
|
CMatchmaking *m_pParent;
|
|
AsyncHandle_t m_hCreateHandle;
|
|
AsyncHandle_t m_hMigrateHandle;
|
|
AsyncHandle_t m_hRegisterHandle;
|
|
|
|
XSESSION_REGISTRATION_RESULTS *m_pRegistrationResults;
|
|
|
|
// public/private slots for the session
|
|
uint m_nPlayerSlots[SLOTS_LAST];
|
|
|
|
};
|
|
|
|
#endif // SESSION_H
|