summaryrefslogtreecommitdiff
path: root/engine/Session.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/Session.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'engine/Session.h')
-rw-r--r--engine/Session.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/engine/Session.h b/engine/Session.h
new file mode 100644
index 0000000..a2ef45b
--- /dev/null
+++ b/engine/Session.h
@@ -0,0 +1,159 @@
+//========= 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