mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-12-11 16:18:41 +00:00
110 lines
3.2 KiB
C++
110 lines
3.2 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
|
|
#include "cbase.h"
|
|
#include "tf_match_description.h"
|
|
#include "tf_match_description_shared.h"
|
|
#include "tf_ladder_data.h"
|
|
#include "tf_rating_data.h"
|
|
|
|
|
|
#if defined CLIENT_DLL || defined GAME_DLL
|
|
#include "tf_gamerules.h"
|
|
#endif
|
|
|
|
|
|
static const IMatchGroupDescription* s_arMatchDesc[ ETFMatchGroup_ARRAYSIZE ] = { NULL };
|
|
void RegisterMatchDesc( const ETFMatchGroup& eGroup, const IMatchGroupDescription* pDesc )
|
|
{
|
|
Assert( s_arMatchDesc[ eGroup ] == NULL );
|
|
s_arMatchDesc[ eGroup ] = pDesc;
|
|
}
|
|
|
|
const IMatchGroupDescription* GetMatchGroupDescription( const ETFMatchGroup& eGroup )
|
|
{
|
|
if ( eGroup == k_eTFMatchGroup_Invalid )
|
|
return NULL;
|
|
if ( eGroup < 0 || (unsigned int)eGroup >= V_ARRAYSIZE( s_arMatchDesc ) )
|
|
{
|
|
AssertMsg( false, "Bogus matchgroup passed to GetMatchGroupDescription" );
|
|
return NULL;
|
|
}
|
|
|
|
const IMatchGroupDescription* pMatchDesc = s_arMatchDesc[ eGroup ];
|
|
if ( pMatchDesc )
|
|
return pMatchDesc;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
IMatchGroupDescription::IMatchGroupDescription( ETFMatchGroup eMatchGroup )
|
|
: m_eMatchGroup( eMatchGroup )
|
|
, m_pProgressionDesc( NULL )
|
|
{}
|
|
|
|
|
|
#ifdef CLIENT_DLL
|
|
bool IMatchGroupDescription::BPlayerIsInPlacement( CSteamID steamID ) const
|
|
{
|
|
return GetNumPlacementMatchesToGo( steamID ) != 0;
|
|
}
|
|
|
|
bool IMatchGroupDescription::BLocalPlayerIsInPlacement() const
|
|
{
|
|
return BPlayerIsInPlacement( ClientSteamContext().GetLocalPlayerSteamID() );
|
|
}
|
|
|
|
int IMatchGroupDescription::GetNumPlacementMatchesToGo( CSteamID steamID ) const
|
|
{
|
|
if ( BUsesPlacementMatches() )
|
|
{
|
|
const CTFRatingData* pRatingData = CTFRatingData::YieldingGetPlayerRatingDataBySteamID( steamID, GetCurrentDisplayRank() );
|
|
|
|
// No data? You're definitely in placement
|
|
if ( !pRatingData )
|
|
{
|
|
return GetNumWinsToExitPlacement();
|
|
}
|
|
|
|
// Real ranks start at 1. If your rank (which is stored in primary rating) is 0, then that's our code to know
|
|
// that you're still in placement. If that's true, then secondary contains your number of wins.
|
|
if ( pRatingData->GetRatingData().unRatingPrimary == k_nPrimaryFieldPlacementValue )
|
|
{
|
|
return GetNumWinsToExitPlacement() - pRatingData->GetRatingData().unRatingSecondary;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void IMatchGroupDescription::SetupBadgePanel( CBaseModelPanel *pModelPanel, const LevelInfo_t& level, const CSteamID& steamID, bool bInPlacement ) const
|
|
{
|
|
if ( m_pProgressionDesc )
|
|
{
|
|
m_pProgressionDesc->SetupBadgePanel( pModelPanel, level, steamID, BUsesPlacementMatches() && bInPlacement );
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef GAME_DLL
|
|
bool IMatchGroupDescription::InitServerSettingsForMatch( const CTFGSLobby* pLobby ) const
|
|
{
|
|
extern bool IsCustomGameMode( const char *pszMapName );
|
|
if ( IsCustomGameMode( pLobby->GetMapName() ) )
|
|
{
|
|
// HACK(misyl): Force a custom cfg for custom game modes.
|
|
servercfgfile.SetValue( "server_custom.cfg" );
|
|
lservercfgfile.SetValue( "server_custom.cfg" );
|
|
}
|
|
else
|
|
{
|
|
// Setting servercfgfile to our mode-specific config causes the server to exec it once it finishes
|
|
// loading the map from the changelevel below
|
|
servercfgfile.SetValue( m_pszExecFileName );
|
|
lservercfgfile.SetValue( m_pszExecFileName );
|
|
}
|
|
|
|
return TFGameRules()->StartManagedMatch();
|
|
}
|
|
#endif
|