You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
7.7 KiB
306 lines
7.7 KiB
//========= Copyright © 1996-2009, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=====================================================================================//
|
|
|
|
|
|
#ifndef _PLAYER_H_
|
|
#define _PLAYER_H_
|
|
|
|
class PlayerFriend;
|
|
class PlayerLocal;
|
|
|
|
#include "mm_framework.h"
|
|
#include "matchmaking/iplayer.h"
|
|
#include "matchmaking/cstrike15/imatchext_cstrike15.h"
|
|
#include "playerrankingdata.h"
|
|
#include "mathlib/expressioncalculator.h"
|
|
|
|
|
|
//Players can be created several ways
|
|
// -They are the local player and this is a reference to themselves
|
|
// -They are created by the friends enumerator
|
|
// -They are part of a party that a player joins
|
|
// -They are part of a game that a player joins.
|
|
|
|
template < typename TBaseInterface >
|
|
class Player : public TBaseInterface
|
|
{
|
|
protected:
|
|
Player() : m_xuid( 0 ), m_iController( XUSER_INDEX_NONE ), m_eOnlineState( IPlayer::STATE_OFFLINE )
|
|
{
|
|
memset( m_szName, 0, sizeof( m_szName ) );
|
|
strcpy(m_szName, "EMPTY");
|
|
}
|
|
virtual ~Player() {}
|
|
|
|
public:
|
|
// Updates connection info if needed.
|
|
virtual void Update() = 0;
|
|
|
|
// Deletes the player class instance
|
|
virtual void Destroy() = 0;
|
|
|
|
//
|
|
// IPlayer implementation
|
|
//
|
|
public:
|
|
virtual XUID GetXUID() { return m_xuid; }
|
|
virtual int GetPlayerIndex() { return m_iController; }
|
|
|
|
virtual const char * GetName() { return m_szName; }
|
|
|
|
virtual IPlayer::OnlineState_t GetOnlineState() { return m_eOnlineState; }
|
|
|
|
protected:
|
|
XUID m_xuid;
|
|
int m_iController;
|
|
IPlayer::OnlineState_t m_eOnlineState;
|
|
char m_szName[MAX_PLAYER_NAME_LENGTH];
|
|
};
|
|
|
|
class PlayerFriend : public Player< IPlayerFriend >
|
|
{
|
|
public:
|
|
struct FriendInfo_t
|
|
{
|
|
char const *m_szName;
|
|
wchar_t const *m_wszRichPresence;
|
|
XNKID m_xSessionID;
|
|
uint64 m_uiTitleID;
|
|
uint32 m_uiGameServerIP;
|
|
KeyValues *m_pGameDetails;
|
|
};
|
|
public:
|
|
explicit PlayerFriend( XUID xuid, FriendInfo_t const *pFriendInfo = NULL );
|
|
|
|
//
|
|
// IPlayerFriend implementation
|
|
//
|
|
public:
|
|
virtual wchar_t const * GetRichPresence();
|
|
|
|
virtual KeyValues *GetGameDetails();
|
|
virtual KeyValues *GetPublishedPresence();
|
|
|
|
virtual bool IsJoinable();
|
|
virtual void Join();
|
|
virtual uint64 GetTitleID();
|
|
virtual uint32 GetGameServerIP();
|
|
|
|
//
|
|
// Player<IPlayerFriend> implementation
|
|
//
|
|
public:
|
|
virtual void Update();
|
|
virtual void Destroy();
|
|
|
|
public:
|
|
void SetFriendMark( unsigned maskSetting );
|
|
unsigned GetFriendMark( );
|
|
|
|
void SetIsStale( bool bStale );
|
|
bool GetIsStale();
|
|
|
|
void UpdateFriendInfo( FriendInfo_t const *pFriendInfo );
|
|
bool IsUpdatingInfo();
|
|
|
|
public:
|
|
void StartSearchForSessionInfo();
|
|
void StartSearchForSessionInfoImpl();
|
|
void AbortSearch();
|
|
|
|
protected:
|
|
unsigned m_uFriendMark;
|
|
bool m_bIsStale;
|
|
wchar_t m_wszRichPresence[MAX_RICHPRESENCE_SIZE];
|
|
|
|
uint64 m_uiTitleID;
|
|
uint32 m_uiGameServerIP;
|
|
XNKID m_xSessionID;
|
|
XSESSION_INFO m_GameSessionInfo;
|
|
KeyValues *m_pDetails;
|
|
KeyValues *m_pPublishedPresence;
|
|
|
|
enum SearchState_t
|
|
{
|
|
SEARCH_NONE,
|
|
SEARCH_QUEUED,
|
|
#ifdef _X360
|
|
SEARCH_XNKID,
|
|
SEARCH_QOS,
|
|
#elif !defined( NO_STEAM )
|
|
SEARCH_WAIT_LOBBY_DATA,
|
|
#endif
|
|
SEARCH_COMPLETED
|
|
};
|
|
SearchState_t m_eSearchState;
|
|
#ifdef _X360
|
|
XSESSION_INFO m_xsiSearchState;
|
|
XNADDR const *m_pQOS_xnaddr;
|
|
XNKID const *m_pQOS_xnkid;
|
|
XNKEY const *m_pQOS_xnkey;
|
|
XNQOS *m_XNQOS;
|
|
XOVERLAPPED m_SessionSearchOverlapped;
|
|
|
|
CUtlBuffer m_bufSessionSearchResults;
|
|
XSESSION_SEARCHRESULT_HEADER * GetXSearchResults() { return ( XSESSION_SEARCHRESULT_HEADER * ) m_bufSessionSearchResults.Base(); }
|
|
|
|
void Live_Update_SearchXNKID();
|
|
void Live_Update_Search_QOS();
|
|
#elif !defined( NO_STEAM )
|
|
STEAM_CALLBACK_MANUAL( PlayerFriend, Steam_OnLobbyDataUpdate, LobbyDataUpdate_t, m_CallbackOnLobbyDataUpdate );
|
|
#endif
|
|
};
|
|
|
|
class PlayerLocal : public Player< IPlayerLocal >
|
|
{
|
|
public:
|
|
explicit PlayerLocal( int iController );
|
|
~PlayerLocal();
|
|
|
|
public:
|
|
void RecomputeXUID( char const *szNetwork );
|
|
void DetectOnlineState();
|
|
|
|
//
|
|
// IPlayerLocal implementation
|
|
//
|
|
public:
|
|
virtual const UserProfileData& GetPlayerProfileData();
|
|
|
|
virtual MatchmakingData * GetPlayerMatchmakingData( void );
|
|
virtual void UpdatePlayerMatchmakingData( int mmDataType );
|
|
virtual void ResetPlayerMatchmakingData( int mmDataScope );
|
|
|
|
virtual const void * GetPlayerTitleData( int iTitleDataIndex );
|
|
virtual void UpdatePlayerTitleData( TitleDataFieldsDescription_t const *fdKey, const void *pvNewTitleData, int numNewBytes );
|
|
|
|
virtual void GetLeaderboardData( KeyValues *pLeaderboardInfo );
|
|
virtual void UpdateLeaderboardData( KeyValues *pLeaderboardInfo );
|
|
|
|
virtual void GetAwardsData( KeyValues *pAwardsData );
|
|
virtual void UpdateAwardsData( KeyValues *pAwardsData );
|
|
|
|
virtual void SetNeedsSave( void );
|
|
|
|
#if defined ( _X360 )
|
|
virtual bool IsTitleDataValid() { return m_bIsTitleDataValid; };
|
|
virtual bool IsTitleDataBlockValid( int blockId );
|
|
virtual void SetIsTitleDataValid( bool isValid ) { m_bIsTitleDataValid = isValid; }
|
|
virtual bool IsFreshPlayerProfile( void ) { return m_bIsFreshPlayerProfile; }
|
|
virtual void ClearBufTitleData( void );
|
|
#endif
|
|
|
|
//
|
|
// Player<IPlayerLocal> implementation
|
|
//
|
|
public:
|
|
virtual void Update();
|
|
virtual void Destroy();
|
|
|
|
public:
|
|
XUSER_SIGNIN_STATE GetAssumedSigninState();
|
|
void LoadPlayerProfileData();
|
|
void LoadTitleData();
|
|
void SetTitleDataWriteTime( float flTime );
|
|
void WriteTitleData();
|
|
bool IsTitleDataStorageConnected( void );
|
|
void OnLeaderboardRequestFinished( KeyValues *pLeaderboardData );
|
|
|
|
void SetFlag_AwaitingTitleData() { m_uiPlayerFlags |= PLAYER_INVITE_AWAITING_TITLEDATA; }
|
|
#if defined ( _X360 )
|
|
bool m_bIsTitleDataValid;
|
|
bool m_bIsFreshPlayerProfile;
|
|
#endif
|
|
|
|
protected:
|
|
//stats
|
|
XUSER_SIGNIN_STATE m_eLoadedTitleData;
|
|
float m_flLastSave;
|
|
|
|
enum Flags_t
|
|
{
|
|
PLAYER_INVITE_AWAITING_TITLEDATA = ( 1 << 0 )
|
|
};
|
|
uint32 m_uiPlayerFlags;
|
|
|
|
enum Consts_t
|
|
{
|
|
TITLE_DATA_COUNT_X360 = 3, // number of Xbox LIVE - backed title data buffers
|
|
TITLE_DATA_COUNT = 3, // number of valid title data buffers
|
|
};
|
|
|
|
UserProfileData m_ProfileData;
|
|
MatchmakingData m_MatchmakingData;
|
|
CUtlVector<int> m_arrAchievementsEarned, m_arrAvatarAwardsEarned;
|
|
char m_bufTitleData[TITLE_DATA_COUNT][XPROFILE_SETTING_MAX_SIZE];
|
|
bool m_bSaveTitleData[TITLE_DATA_COUNT];
|
|
#if defined ( _X360 )
|
|
bool m_bIsTitleDataBlockValid[TITLE_DATA_COUNT];
|
|
#endif
|
|
|
|
KeyValues *m_pLeaderboardData;
|
|
KeyValues::AutoDelete m_autodelete_pLeaderboardData;
|
|
|
|
#ifdef _X360
|
|
struct XPendingAsyncAward_t
|
|
{
|
|
float m_flStartTimestamp;
|
|
XOVERLAPPED m_xOverlapped;
|
|
PlayerLocal *m_pLocalPlayer;
|
|
enum Type_t
|
|
{
|
|
TYPE_ACHIEVEMENT,
|
|
TYPE_AVATAR_AWARD
|
|
};
|
|
Type_t m_eType;
|
|
union
|
|
{
|
|
TitleAchievementsDescription_t const *m_pAchievementDesc;
|
|
TitleAvatarAwardsDescription_t const *m_pAvatarAwardDesc;
|
|
};
|
|
union
|
|
{
|
|
XUSER_ACHIEVEMENT m_xAchievement;
|
|
XUSER_AVATARASSET m_xAvatarAsset;
|
|
};
|
|
};
|
|
static CUtlVector< XPendingAsyncAward_t * > s_arrPendingAsyncAwards;
|
|
void UpdatePendingAwardsState();
|
|
#elif !defined( NO_STEAM )
|
|
void UpdatePlayersSteamLogon();
|
|
|
|
STEAM_CALLBACK_MANUAL( PlayerLocal, Steam_OnUserStatsReceived, UserStatsReceived_t, m_CallbackOnUserStatsReceived );
|
|
STEAM_CALLBACK_MANUAL( PlayerLocal, Steam_OnPersonaStateChange, PersonaStateChange_t, m_CallbackOnPersonaStateChange );
|
|
STEAM_CALLBACK_MANUAL( PlayerLocal, Steam_OnServersConnected, SteamServersConnected_t, m_CallbackOnServersConnected );
|
|
STEAM_CALLBACK_MANUAL( PlayerLocal, Steam_OnServersDisconnected, SteamServersDisconnected_t, m_CallbackOnServersDisconnected );
|
|
#endif
|
|
|
|
void EvaluateAwardsStateBasedOnStats();
|
|
void LoadGuestsTitleData();
|
|
void OnProfileTitleDataLoaded( int iErrorCode );
|
|
|
|
protected:
|
|
|
|
};
|
|
|
|
//
|
|
// Players XWrite opportunities
|
|
//
|
|
|
|
// XWrite opportunities
|
|
enum MM_XWriteOpportunity
|
|
{
|
|
MMXWO_NONE = 0,
|
|
MMXWO_SETTINGS,
|
|
MMXWO_SESSION_STARTED,
|
|
MMXWO_CHECKPOINT,
|
|
MMXWO_SESSION_FINISHED
|
|
};
|
|
|
|
void SignalXWriteOpportunity( MM_XWriteOpportunity eXWO );
|
|
|
|
|
|
#endif
|