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
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
|