Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

129 lines
3.4 KiB

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef _DLC_HELPER_H
#define _DLC_HELPER_H
#pragma once
#include "platform.h"
#include "keyvalues.h"
#include "filesystem.h"
class KeyValues;
// Helper methods for DLC
class DLCHelper
{
public:
static inline uint64 GetInstalledDLCMask( void );
// Loads the key values from all installed DLC files matching the file name plus _dlc[id].
// For example, if fileName is "gamemodes.txt" we will look for "gamemodes_dlc1.txt", "gamemodes_dlc2.txt", etc...
// The key values from the dlc files will then be merged in (with update) to the passed
// in key values.
static inline void AppendDLCKeyValues( KeyValues* pKeyValues, const char* fileName, const char* startDir = NULL );
};
uint64 DLCHelper::GetInstalledDLCMask( void )
{
// Assert( g_pMatchFramework );
// return g_pMatchFramework->GetMatchSystem()->GetDlcManager()->GetDataInfo()->GetUint64( "@info/installed" );
//static ConVarRef mm_dlcs_mask_fake( "mm_dlcs_mask_fake" );
//char const *szFakeDlcsString = mm_dlcs_mask_fake.GetString();
//if ( *szFakeDlcsString )
// return atoi( szFakeDlcsString );
//static ConVarRef mm_dlcs_mask_extras( "mm_dlcs_mask_extras" );
//uint64 uiDLCmask = ( unsigned ) mm_dlcs_mask_extras.GetInt();
uint64 uiDLCmask = 0;
bool bSearchPath = false;
int numDLCs = g_pFullFileSystem->IsAnyDLCPresent( &bSearchPath );
// If we need to, trigger the mounting of DLC
if ( !bSearchPath )
{
g_pFullFileSystem->AddDLCSearchPaths();
}
for ( int j = 0; j < numDLCs; ++ j )
{
unsigned int uiDlcHeader = 0;
if ( !g_pFullFileSystem->GetAnyDLCInfo( j, &uiDlcHeader, NULL, 0 ) )
continue;
int idDLC = DLC_LICENSE_ID( uiDlcHeader );
if ( idDLC < 1 || idDLC >= 31 )
continue; // unsupported DLC id
uiDLCmask |= ( 1ull << idDLC );
}
return uiDLCmask;
}
void DLCHelper::AppendDLCKeyValues( KeyValues* pKeyValues, const char* fileName, const char* startDir )
{
uint64 installedDlc = GetInstalledDLCMask();
if ( installedDlc )
{
KeyValues* pDlcKeyValues = new KeyValues( "" );
char dlcFileName[128] = "";
// We need to insert _dlc[id] into the file name right before the extension
// so filename.txt should become filename_dlc1.txt
// scan backward for '.'
int dotIndex = V_strlen( fileName ) - 1;
while ( dotIndex > 0 && fileName[dotIndex] != '.' )
{
--dotIndex;
}
if ( dotIndex == 0 )
{
Warning( "Invalid file name passed to DLCHelper::AppendDLCKeyValues (%s)\n", fileName );
return;
}
const char* extension = fileName + dotIndex + 1;
V_strncpy( dlcFileName, fileName, 128 );
// For each installed dlc check for an updated file and merge it in
for ( uint64 i = 1; i < 64; i++ )
{
// Don't bother if this dlc isn't installed
if ( installedDlc & ( 1ull << i ) )
{
// Get the filename for this dlc
V_snprintf( dlcFileName + dotIndex, 128 - dotIndex, "_dlc%d.%s", ( int )i, extension );
// Load and merge the keys from this dlc
pDlcKeyValues->Clear();
if ( pDlcKeyValues->LoadFromFile( g_pFullFileSystem, dlcFileName, startDir ) )
{
pKeyValues->MergeFrom( pDlcKeyValues, KeyValues::MERGE_KV_UPDATE );
}
else
{
Warning( "Failed to load %s\n", dlcFileName );
}
}
}
if ( pDlcKeyValues )
{
pDlcKeyValues->deleteThis();
pDlcKeyValues = NULL;
}
}
}
#endif // _DLC_HELPER_H