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.
139 lines
4.3 KiB
139 lines
4.3 KiB
//===== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose: common routines to operate on matchmaking sessions and members
|
|
// Assumptions: caller should include all required headers before including mm_helpers.h
|
|
//
|
|
//===========================================================================//
|
|
|
|
#ifndef __COMMON__MM_HELPERS_H_
|
|
#define __COMMON__MM_HELPERS_H_
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "tier1/keyvalues.h"
|
|
#include "tier1/fmtstr.h"
|
|
|
|
|
|
//
|
|
// Contains inline functions to deal with common tasks involving matchmaking and sessions
|
|
//
|
|
|
|
inline KeyValues * SessionMembersFindPlayer( KeyValues *pSessionSettings, XUID xuidPlayer, KeyValues **ppMachine = NULL )
|
|
{
|
|
if ( ppMachine )
|
|
*ppMachine = NULL;
|
|
|
|
if ( !pSessionSettings )
|
|
return NULL;
|
|
|
|
KeyValues *pMembers = pSessionSettings->FindKey( "Members" );
|
|
if ( !pMembers )
|
|
return NULL;
|
|
|
|
int numMachines = pMembers->GetInt( "numMachines" );
|
|
for ( int k = 0; k < numMachines; ++ k )
|
|
{
|
|
KeyValues *pMachine = pMembers->FindKey( CFmtStr( "machine%d", k ) );
|
|
if ( !pMachine )
|
|
continue;
|
|
|
|
int numPlayers = pMachine->GetInt( "numPlayers" );
|
|
for ( int j = 0; j < numPlayers; ++ j )
|
|
{
|
|
KeyValues *pPlayer = pMachine->FindKey( CFmtStr( "player%d", j ) );
|
|
if ( !pPlayer )
|
|
continue;
|
|
|
|
if ( pPlayer->GetUint64( "xuid" ) == xuidPlayer )
|
|
{
|
|
if ( ppMachine )
|
|
*ppMachine = pMachine;
|
|
|
|
return pPlayer;
|
|
}
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
inline XUID SessionMembersFindNonGuestXuid( XUID xuid )
|
|
{
|
|
#ifdef _X360
|
|
if ( !g_pMatchFramework )
|
|
return xuid;
|
|
|
|
if ( !g_pMatchFramework->GetMatchSession() )
|
|
return xuid;
|
|
|
|
KeyValues *pMachine = NULL;
|
|
KeyValues *pPlayer = SessionMembersFindPlayer( g_pMatchFramework->GetMatchSession()->GetSessionSettings(), xuid, &pMachine );
|
|
if ( !pPlayer || !pMachine )
|
|
return xuid;
|
|
|
|
if ( !strchr( pPlayer->GetString( "name" ), '(' ) )
|
|
return xuid;
|
|
|
|
int numPlayers = pMachine->GetInt( "numPlayers" );
|
|
for ( int k = 0; k < numPlayers; ++ k )
|
|
{
|
|
XUID xuidOtherPlayer = pMachine->GetUint64( CFmtStr( "player%d/xuid", k ) );
|
|
if ( xuidOtherPlayer && !strchr( pMachine->GetString( CFmtStr( "player%d/xuid", k ) ), '(' ) )
|
|
return xuidOtherPlayer; // found a replacement that is not guest
|
|
}
|
|
#endif
|
|
|
|
return xuid;
|
|
}
|
|
|
|
inline TitleDataFieldsDescription_t const * TitleDataFieldsDescriptionFindByString( TitleDataFieldsDescription_t const *fields, char const *szString )
|
|
{
|
|
if ( !szString )
|
|
return NULL;
|
|
for ( ; fields && fields->m_szFieldName; ++ fields )
|
|
{
|
|
if ( !Q_stricmp( fields->m_szFieldName, szString ) )
|
|
return fields;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
inline bool TitleDataFieldsDescriptionGetBit( TitleDataFieldsDescription_t const *fdKey, IPlayerLocal *pPlayer )
|
|
{
|
|
Assert( pPlayer );
|
|
Assert( fdKey );
|
|
Assert( fdKey->m_eDataType == TitleDataFieldsDescription_t::DT_BITFIELD );
|
|
return !!( ( *( const uint8 * )( ( ( const char * )pPlayer->GetPlayerTitleData( fdKey->m_iTitleDataBlock ) ) + (fdKey->m_numBytesOffset/8) ) ) & ( 1 << ( fdKey->m_numBytesOffset%8 ) ) );
|
|
}
|
|
|
|
inline void TitleDataFieldsDescriptionSetBit( TitleDataFieldsDescription_t const *fdKey, IPlayerLocal *pPlayer, bool bBitValue )
|
|
{
|
|
Assert( pPlayer );
|
|
Assert( fdKey );
|
|
Assert( fdKey->m_eDataType == TitleDataFieldsDescription_t::DT_BITFIELD );
|
|
uint8 uiValue = static_cast< uint8 >( bBitValue ? (~0u) : 0u );
|
|
pPlayer->UpdatePlayerTitleData( fdKey, &uiValue, sizeof( uiValue ) );
|
|
}
|
|
|
|
template < typename T >
|
|
inline T TitleDataFieldsDescriptionGetValue( TitleDataFieldsDescription_t const *fdKey, IPlayerLocal *pPlayer )
|
|
{
|
|
Assert( pPlayer );
|
|
Assert( fdKey );
|
|
Assert( ( fdKey->m_eDataType != TitleDataFieldsDescription_t::DT_BITFIELD ) && ( fdKey->m_eDataType != TitleDataFieldsDescription_t::DT_0 ) );
|
|
return *( T const * )(&( (char const*) pPlayer->GetPlayerTitleData( fdKey->m_iTitleDataBlock ) )[(fdKey->m_numBytesOffset)]);
|
|
}
|
|
|
|
template < typename T > // T is primitive type, passing by value instead of constref to avoid compiler troubles when passing temporaries
|
|
inline void TitleDataFieldsDescriptionSetValue( TitleDataFieldsDescription_t const *fdKey, IPlayerLocal *pPlayer, T val )
|
|
{
|
|
Assert( pPlayer );
|
|
Assert( fdKey );
|
|
Assert( ( fdKey->m_eDataType != TitleDataFieldsDescription_t::DT_BITFIELD ) && ( fdKey->m_eDataType != TitleDataFieldsDescription_t::DT_0 ) );
|
|
pPlayer->UpdatePlayerTitleData( fdKey, &val, sizeof( T ) );
|
|
}
|
|
|
|
|
|
#endif // __COMMON__MM_HELPERS_H_
|
|
|