diff --git a/src/public/zip_utils.cpp b/src/public/zip_utils.cpp index 6efacb10c11..3b08723beb8 100644 --- a/src/public/zip_utils.cpp +++ b/src/public/zip_utils.cpp @@ -984,6 +984,22 @@ static void CopyTextData( char *pDst, const char *pSrc, int dstSize, int srcSize Assert( pDstScan == pDstEnd ); } +#ifdef MAPBASE +// https://github.com/ValveSoftware/source-sdk-2013/issues/1322 +// mp3s, shaders and specific wav files have de-compression issues +static bool ShouldCompressFile( const char *name ) +{ + const char *ext = V_GetFileExtensionSafe( name ); + + if ( !V_stricmp( ext, "mp3" ) + || !V_stricmp( ext, "vcs" ) + || !V_stricmp( ext, "wav" ) + ) + return false; + return true; +} +#endif + //----------------------------------------------------------------------------- // Purpose: Adds a new lump, or overwrites existing one // Input : *relativename - @@ -1021,6 +1037,11 @@ void CZipFile::AddBufferToZip( const char *relativename, void *data, int length, CRC32_Final( &zipCRC ); #ifdef ZIP_SUPPORT_LZMA_ENCODE +#ifdef MAPBASE + if ( compressionType == IZip::eCompressionType_LZMA && !ShouldCompressFile( name ) ) + compressionType = IZip::eCompressionType_None; +#endif + if ( compressionType == IZip::eCompressionType_LZMA ) { unsigned int compressedSize = 0; diff --git a/src/utils/bsppack/bsppack.cpp b/src/utils/bsppack/bsppack.cpp new file mode 100644 index 00000000000..8e392ba5d04 --- /dev/null +++ b/src/utils/bsppack/bsppack.cpp @@ -0,0 +1,74 @@ +// Created by ficool2 and posted in the Valve Modding Community Discord on 4/5/2025 +#include "../common/cmdlib.h" +#include "../common/bsplib.h" +#include "ibsppack.h" + +static void SetFileSystem( IFileSystem* pFileSystem ) +{ + g_pFullFileSystem = pFileSystem; + g_pFileSystem = pFileSystem; +} + +class CBSPPack : public IBSPPack +{ +public: + void LoadBSPFile( IFileSystem *pFileSystem, char *filename ) override + { + SetFileSystem( pFileSystem ); + ::LoadBSPFile( filename ); + } + void WriteBSPFile( char *filename ) override + { + ::WriteBSPFile( filename ); + } + void ClearPackFile( void ) override + { + ::ClearPakFile( GetPakFile() ); + } + void AddFileToPack( const char *relativename, const char *fullpath ) override + { + ::AddFileToPak( GetPakFile(), relativename, fullpath, IZip::eCompressionType_None ); + } + void AddBufferToPack( const char *relativename, void *data, int length, bool bTextMode ) override + { + ::AddBufferToPak( GetPakFile(), relativename, data, length, bTextMode, IZip::eCompressionType_None ); + } + void SetHDRMode( bool bHDR ) override + { + ::SetHDRMode( bHDR ); + } + bool SwapBSPFile( IFileSystem *pFileSystem, const char *filename, const char *swapFilename, bool bSwapOnLoad, VTFConvertFunc_t pVTFConvertFunc, VHVFixupFunc_t pVHVFixupFunc, CompressFunc_t pCompressFunc ) override + { + SetFileSystem( pFileSystem ); + return ::SwapBSPFile( filename, swapFilename, bSwapOnLoad, pVTFConvertFunc, pVHVFixupFunc, pCompressFunc ); + } + bool RepackBSP( CUtlBuffer &inputBuffer, CUtlBuffer &outputBuffer, eRepackBSPFlags repackFlags ) override + { + CompressFunc_t funcCompress = NULL; + if ( repackFlags & eRepackBSP_CompressLumps ) + funcCompress = RepackBSPCallback_LZMA; + + IZip::eCompressionType eCompressType = IZip::eCompressionType_None; + if ( repackFlags & eRepackBSP_CompressPackfile ) + eCompressType = IZip::eCompressionType_LZMA; + + return ::RepackBSP( inputBuffer, outputBuffer, funcCompress, eCompressType ); + } + bool GetPakFileLump( IFileSystem *pFileSystem, const char *pBSPFilename, void **pPakData, int *pPakSize ) override + { + SetFileSystem( pFileSystem ); + return ::GetPakFileLump( pBSPFilename, pPakData, pPakSize ); + } + bool SetPakFileLump( IFileSystem *pFileSystem, const char *pBSPFilename, const char *pNewFilename, void *pPakData, int pakSize ) override + { + SetFileSystem( pFileSystem ); + return ::SetPakFileLump( pBSPFilename, pNewFilename, pPakData, pakSize ); + } + bool GetBSPDependants( IFileSystem *pFileSystem, const char *pBSPFilename, CUtlVector< CUtlString > *pList ) override + { + SetFileSystem( pFileSystem ); + return ::GetBSPDependants( pBSPFilename, pList ); + } +}; + +EXPOSE_SINGLE_INTERFACE( CBSPPack, IBSPPack, IBSPPACK_VERSION_STRING ); \ No newline at end of file diff --git a/src/utils/bsppack/bsppack.vpc b/src/utils/bsppack/bsppack.vpc new file mode 100644 index 00000000000..a3df0d97931 --- /dev/null +++ b/src/utils/bsppack/bsppack.vpc @@ -0,0 +1,51 @@ +//----------------------------------------------------------------------------- +// BSPPACK_DLL.VPC +// +// Project Script +//----------------------------------------------------------------------------- + +$Macro SRCDIR "..\.." +$Macro OUTBINDIR "$SRCDIR\..\game\bin" +$Macro OUTBINNAME "bsppack" + +$Include "$SRCDIR\vpc_scripts\source_dll_base.vpc" + +$Configuration +{ + $Compiler + { + $AdditionalIncludeDirectories "$BASE,..\common,..\vmpi,..\vmpi\mysql\include" + $PreprocessorDefinitions "$BASE;PROTECTED_THINGS_DISABLE" + $PreprocessorDefinitions "$BASE;MAPBASE;ZIP_SUPPORT_LZMA_ENCODE" + } +} + +$Project "BSPPack" +{ + $Folder "Source Files" + { + $File "bsppack.cpp" + + $File "..\common\bsplib.cpp" + $File "..\common\cmdlib.cpp" + $File "$SRCDIR\public\filesystem_helpers.cpp" + $File "$SRCDIR\public\zip_utils.cpp" + $File "$SRCDIR\public\filesystem_init.cpp" + $File "..\common\filesystem_tools.cpp" + $File "..\common\scriplib.cpp" + $File "$SRCDIR\public\lumpfiles.cpp" + } + + $Folder "Header Files" + { + $File "..\common\bsplib.h" + $File "..\common\cmdlib.h" + } + + $Folder "Link Libraries" + { + $Lib "mathlib" + $Lib tier2 + $Lib "$LIBCOMMON/lzma" + } +} diff --git a/src/utils/bspzip/bspzip.cpp b/src/utils/bspzip/bspzip.cpp new file mode 100644 index 00000000000..8320079ae2a --- /dev/null +++ b/src/utils/bspzip/bspzip.cpp @@ -0,0 +1,406 @@ +//========= Mapbase - https://github.com/mapbase-source/source-sdk-2013 ============// +// +// Purpose: Implementation of BSPZIP +// +// Author: Nooodles +// +//=============================================================================// +#include "../common/cmdlib.h" +#include "../common/bsplib.h" +#include "tier2/tier2.h" +#include "filesystem.h" +#include "const.h" + +void Usage( const char *argument ) +{ +#define PRINT_BSPZIP_USAGE( arg, params, desc ) if( !argument || !V_stricmp(arg, argument ) ) Msg( "bspzip " arg " " params "\n" desc ); + + if ( argument ) + Msg( "Invalid syntax!\n" ); + + PRINT_BSPZIP_USAGE( "-extract", " ", "" ); + PRINT_BSPZIP_USAGE( "-extractfiles", " ", "" ); + PRINT_BSPZIP_USAGE( "-dir", "", "" ); + PRINT_BSPZIP_USAGE( "-addfile", " ", "" ); + PRINT_BSPZIP_USAGE( "-addlist", " ", "" ); + PRINT_BSPZIP_USAGE( "-addorupdatelist", " ", "" ); + PRINT_BSPZIP_USAGE( "-extractcubemaps", " ", + " Extracts the cubemaps to .\n" ); + PRINT_BSPZIP_USAGE( "-deletecubemaps", "", + " Deletes the cubemaps from .\n" ); + PRINT_BSPZIP_USAGE( "-addfiles", " ", + " Adds files to .\n" ); + PRINT_BSPZIP_USAGE( "-repack", "-repack [ -compress ] ", + " Optimally repacks a BSP file, optionally using compressed BSP format.\n" + " Using on a compressed BSP without -compress will effectively decompress\n" + " a compressed BSP.\n" ); + exit( -1 ); +} + +int main( int argc, char **argv ) +{ + Msg( "\nMapbase - bspzip.exe (" __DATE__ ")\n" ); + + MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f ); + InitDefaultFileSystem(); + g_pFileSystem = g_pFullFileSystem; + + if ( argc < 2 ) + { + Msg( "No arguments provided.\n" ); + Usage( nullptr ); + } + + // current argv index + int argi = 1; + // how many potential arguments a command has + int argCount = argc - 2; + // skip over -game + if ( !V_stricmp( argv[argi], "-game" ) && argc >= 3 ) + { + argi += 2; + argCount -= 2; + } + + // Extract all files from the pak file into a specified directory + // Arguments: + if ( !V_stricmp( argv[argi], "-extractfiles" ) ) + { + if ( argCount < 2 ) + Usage( argv[argi] ); + + const char *bspfile = argv[argi + 1]; + const char *targetPath = argv[argi + 2]; + + Msg( "Opening bsp file: %s\n", bspfile ); + ::LoadBSPFile_FileSystemOnly( bspfile ); + + char targetPathFixed[MAX_PATH]; + V_FixupPathName( targetPathFixed, sizeof( targetPathFixed ), targetPath ); + + int id = 0; + char filePath[MAX_PATH]; + int fileSize = 0; + CUtlBuffer buf; + while ( GetPakFile()->GetNextFilename( id++, filePath, sizeof( filePath ), fileSize ) != -1 ) + { + char outPath[MAX_PATH]; + V_sprintf_safe( outPath, "%s/%s", targetPathFixed, filePath ); + V_FixSlashes( outPath ); + + Msg( "Writing file: %s\n", outPath ); + GetPakFile()->ReadFileFromZip( filePath, false, buf ); + g_pFullFileSystem->WriteFile( outPath, nullptr, buf ); + buf.Clear(); + } + return 0; + } + // Print out contents of the pak file + // Arguments: + else if ( !V_stricmp( argv[argi], "-dir" ) ) + { + if ( argCount < 1 ) + Usage( argv[argi] ); + + const char *bspfile = argv[argi + 1]; + + ::LoadBSPFile_FileSystemOnly( bspfile ); + ::PrintBSPPackDirectory(); + return 0; + } + // Add a list of files to a specific path in the pak file + // Arguments: + else if ( !V_stricmp( argv[argi], "-addfiles" ) ) + { + if ( argCount < 4 ) + Usage( argv[argi] ); + + const char *bspfile = argv[argi + 1]; + const char *relativePathPrefix = argv[argi + 2]; + const char *listfile = argv[argi + 3]; + const char *newbspfile = argv[argi + 4]; + + Msg( "Opening bsp file: %s\n", bspfile ); + ::LoadBSPFile_FileSystemOnly( bspfile ); + + CUtlBuffer bufListFile; + bufListFile.SetBufferType( true, false ); + if ( !g_pFullFileSystem->ReadFile( listfile, NULL, bufListFile ) ) + Error( "Unable to load file list" ); + + char szAbsolutePath[MAX_PATH]; + char szRelativePath[MAX_PATH]; + while ( bufListFile.GetBytesRemaining() ) + { + bufListFile.GetLine( szAbsolutePath, sizeof( szAbsolutePath ) ); + if ( !szAbsolutePath[0] ) + Error( "Error: Missing paired relative/full path names\n" ); + + V_StripTrailingWhitespace( szAbsolutePath ); + + const char *fileName = V_GetFileName( szAbsolutePath ); + V_sprintf_safe( szRelativePath, "%s/%s", relativePathPrefix, fileName ); + Msg( "Adding file : \"%s\" as \"%s\"\n", szAbsolutePath, szRelativePath ); + + GetPakFile()->AddFileToZip( szRelativePath, szAbsolutePath ); + } + + Msg( "Writing new bsp file : %s\n", newbspfile ); + + CUtlBuffer buf; + GetPakFile()->SaveToBuffer( buf ); + ::SetPakFileLump( bspfile, newbspfile, buf.Base(), buf.Size() ); + return 0; + } + // Add a single file to the pak file + // Arguments: + else if ( !V_stricmp( argv[argi], "-addfile" ) ) + { + if ( argCount < 4 ) + Usage( argv[argi] ); + + const char *bspfile = argv[argi + 1]; + const char *relativepathname = argv[argi + 2]; + const char *fullpathname = argv[argi + 3]; + const char *newbspfile = argv[argi + 4]; + + Msg( "Opening bsp file: %s\n", bspfile ); + ::LoadBSPFile_FileSystemOnly( bspfile ); + + Msg( "Adding file : \"%s\" as \"%s\"\n", fullpathname, relativepathname ); + GetPakFile()->AddFileToZip( relativepathname, fullpathname ); + + Msg( "Writing new bsp file : %s\n", newbspfile ); + CUtlBuffer buf; + GetPakFile()->SaveToBuffer( buf ); + ::SetPakFileLump( bspfile, newbspfile, buf.Base(), buf.Size() ); + return 0; + } + // Add (or add and update) a list of files to the pak file + // Arguments: + else if ( !V_stricmp( argv[argi], "-addlist" ) || !V_stricmp( argv[argi], "-addorupdatelist" ) ) + { + if ( argCount < 3 ) + Usage( argv[argi] ); + + bool updateFiles = !V_stricmp( argv[argi], "-addorupdatelist" ); + + const char *bspfile = argv[argi + 1]; + const char *listfile = argv[argi + 2]; + const char *newbspfile = argv[argi + 3]; + + // TODO validate file + Msg( "Opening bsp file: %s\n", bspfile ); + ::LoadBSPFile_FileSystemOnly( bspfile ); + CUtlBuffer bufListFile; + bufListFile.SetBufferType( true, false ); + if ( !g_pFullFileSystem->ReadFile( listfile, NULL, bufListFile ) ) + Error( "Unable to load file list" ); + + char szRelativePath[MAX_PATH]; + char szAbsolutePath[MAX_PATH]; + while ( bufListFile.GetBytesRemaining() ) + { + bufListFile.GetLine( szRelativePath, sizeof( szRelativePath ) ); + bufListFile.GetLine( szAbsolutePath, sizeof( szAbsolutePath ) ); + if ( !szAbsolutePath[0] ) + Error( "Error: Missing paired relative/full path names\n" ); + + V_StripTrailingWhitespace( szRelativePath ); + V_StripTrailingWhitespace( szAbsolutePath ); + + bool existingFile = false; + if ( updateFiles ) + { + // remove the existing file so it can be updated + existingFile = GetPakFile()->FileExistsInZip( szRelativePath ); + if ( existingFile ) + GetPakFile()->RemoveFileFromZip( szRelativePath ); + } + + if ( existingFile ) + Msg( "Updating file : \"%s\" as \"%s\"\n", szAbsolutePath, szRelativePath ); + else + Msg( "Adding file : \"%s\" as \"%s\"\n", szAbsolutePath, szRelativePath ); + + GetPakFile()->AddFileToZip( szRelativePath, szAbsolutePath ); + } + + Msg( "Writing new bsp file : %s\n", newbspfile ); + + CUtlBuffer buf; + GetPakFile()->SaveToBuffer( buf ); + ::SetPakFileLump( bspfile, newbspfile, buf.Base(), buf.Size() ); + return 0; + } + // extract all cubemaps from the pak file to a specified directory + // Arguments: + else if ( !V_stricmp( argv[argi], "-extractcubemaps" ) ) + { + if ( argCount < 2 ) + Usage( argv[argi] ); + + const char *bspfile = argv[argi + 1]; + const char *targetPath = argv[argi + 2]; + + Msg( "Opening bsp file: %s\n", bspfile ); + ::LoadBSPFile_FileSystemOnly( bspfile ); + + char targetPathFixed[MAX_PATH]; + V_FixupPathName( targetPathFixed, sizeof( targetPathFixed ), targetPath ); + + char szMapName[MAX_MAP_NAME]; + V_FileBase( bspfile, szMapName, sizeof( szMapName ) ); + + // path to where cubemaps would normally be + char mapMatPath[MAX_PATH]; + V_sprintf_safe( mapMatPath, "materials/maps/%s/", szMapName ); + int mapMatLen = V_strlen( mapMatPath ); + + // find our cubemap textures and extract them + int id = 0; + char filePath[MAX_PATH]; + int fileSize = 0; + CUtlBuffer buf; + int cubemapTextureCount = 0; + while ( GetPakFile()->GetNextFilename( id++, filePath, sizeof( filePath ), fileSize ) != -1 ) + { + // cubemaps are in the material/maps path, don't have any following /'s and start with c + char *matPath = V_stristr( filePath, mapMatPath ); + if ( matPath ) + { + matPath = filePath + mapMatLen; + char *slash = V_stristr( matPath, "/" ); + if ( !slash && matPath[0] && matPath[0] == 'c' ) + { + char outPath[MAX_PATH]; + V_sprintf_safe( outPath, "%s/%s", targetPathFixed, filePath ); + V_FixSlashes( outPath ); + + Msg( "Writing vtf file: %s\n", outPath ); + GetPakFile()->ReadFileFromZip( filePath, false, buf ); + g_pFullFileSystem->WriteFile( outPath, nullptr, buf ); + buf.Clear(); + cubemapTextureCount++; + } + } + } + + Msg( "%d cubemaps extracted.", cubemapTextureCount ); + return 0; + } + // Delete all cubemap textures the pak file + // Arguments: + else if ( !V_stricmp( argv[argi], "-deletecubemaps" ) ) + { + if ( argCount < 2 ) + Usage( argv[argi] ); + + const char *bspfile = argv[argi + 1]; + + Msg( "Opening bsp file: %s\n", bspfile ); + ::LoadBSPFile_FileSystemOnly( bspfile ); + + char szMapName[MAX_MAP_NAME]; + V_FileBase( bspfile, szMapName, sizeof( szMapName ) ); + + // path to where cubemaps would normally be + char mapMatPath[MAX_PATH]; + V_sprintf_safe( mapMatPath, "materials/maps/%s/", szMapName ); + int mapMatLen = V_strlen( mapMatPath ); + + // find our cubemap textures and extract them + int id = 0; + char filePath[MAX_PATH]; + int fileSize = 0; + CUtlBuffer buf; + int cubemapTextureCount = 0; + while ( GetPakFile()->GetNextFilename( id++, filePath, sizeof( filePath ), fileSize ) != -1 ) + { + // cubemaps are in the material/maps path, don't have any following /'s and start with c + char *matPath = V_stristr( filePath, mapMatPath ); + if ( matPath ) + { + matPath = filePath + mapMatLen; + char *slash = V_stristr( matPath, "/" ); + if ( !slash && matPath[0] && matPath[0] == 'c' ) + { + GetPakFile()->RemoveFileFromZip( filePath ); + cubemapTextureCount++; + } + } + } + + CUtlBuffer pakBuf; + GetPakFile()->SaveToBuffer( pakBuf ); + ::SetPakFileLump( bspfile, bspfile, pakBuf.Base(), pakBuf.Size() ); + return 0; + } + // Extract the pak file to a specified directory + // Arguments: + else if ( !V_stricmp( argv[argi], "-extract" ) ) + { + if ( argCount < 2 ) + Usage( argv[argi] ); + + const char *bspfile = argv[argi + 1]; + const char *zipfile = argv[argi + 2]; + + ::ExtractZipFileFromBSP( (char *) bspfile, (char *) zipfile ); + return 0; + } + // Repack a BSP with the option to compress it + // Arguments: [ -compress ] + else if ( !V_stricmp( argv[argi], "-repack" ) ) + { + if ( argCount < 1 ) + Usage( argv[argi] ); + + // check if our first argument is -compress + bool doCompression = !V_stricmp( argv[argi + 1], "-compress" ); + if ( doCompression && argCount < 2 ) + Usage( argv[argi] ); + + const char *bspfile = doCompression ? argv[argi + 2] : argv[argi + 1]; + if ( !g_pFullFileSystem->FileExists( bspfile ) ) + { + Warning( "Couldn't open input file %s - BSP recompress failed\n", bspfile ); + return false; + } + + CUtlBuffer inputBuffer; + if ( !g_pFullFileSystem->ReadFile( bspfile, nullptr, inputBuffer ) ) + { + Warning( "Couldn't read file %s - BSP compression failed\n", bspfile ); + return false; + } + + CUtlBuffer outputBuffer; + IZip::eCompressionType compressionType = doCompression ? IZip::eCompressionType_LZMA : IZip::eCompressionType_None; + CompressFunc_t funcCompress = doCompression ? RepackBSPCallback_LZMA : nullptr; + + if ( doCompression ) + Msg( "Compressing %s\n", bspfile ); + else + Msg( "Repacking %s\n", bspfile ); + + if ( !::RepackBSP( inputBuffer, outputBuffer, funcCompress, compressionType ) ) + { + Warning( "Internal error compressing BSP\n" ); + return false; + } + + if ( doCompression ) + Msg( "Successfully compressed %s -- %d -> %d\n", bspfile, inputBuffer.Size(), outputBuffer.Size() ); + else + Msg( "Successfully repacked %s -- %d -> %d\n", bspfile, inputBuffer.Size(), outputBuffer.Size() ); + + g_pFullFileSystem->WriteFile( bspfile, NULL, outputBuffer ); + return 0; + } + + // print all usage + Msg( "Unknown argument or invalid usage of \"%s\"\n", argv[argi] ); + Usage( nullptr ); + return 1; +} diff --git a/src/utils/bspzip/bspzip.vpc b/src/utils/bspzip/bspzip.vpc new file mode 100644 index 00000000000..e525ab801ca --- /dev/null +++ b/src/utils/bspzip/bspzip.vpc @@ -0,0 +1,51 @@ +//----------------------------------------------------------------------------- +// BSPZIP.VPC +// +// Project Script +//----------------------------------------------------------------------------- + +$Macro SRCDIR "..\.." +$Macro OUTBINDIR "$SRCDIR\..\game\bin" +$Macro OUTBINNAME "bspzip" + +$Include "$SRCDIR\vpc_scripts\source_exe_con_base.vpc" + +$Configuration +{ + $Compiler + { + $AdditionalIncludeDirectories "$BASE,..\common,..\vmpi,..\vmpi\mysql\include" + $PreprocessorDefinitions "$BASE;PROTECTED_THINGS_DISABLE" + $PreprocessorDefinitions "$BASE;TF2CLASSIC;MAPBASE;ZIP_SUPPORT_LZMA_ENCODE" + } +} + +$Project "BSPZIP" +{ + $Folder "Source Files" + { + $File "bspzip.cpp" + + $File "..\common\bsplib.cpp" + $File "..\common\cmdlib.cpp" + $File "$SRCDIR\public\filesystem_helpers.cpp" + $File "$SRCDIR\public\zip_utils.cpp" + $File "$SRCDIR\public\filesystem_init.cpp" + $File "..\common\filesystem_tools.cpp" + $File "..\common\scriplib.cpp" + $File "$SRCDIR\public\lumpfiles.cpp" + } + + $Folder "Header Files" + { + $File "..\common\bsplib.h" + $File "..\common\cmdlib.h" + } + + $Folder "Link Libraries" + { + $Lib "mathlib" + $Lib tier2 + $Lib "$LIBCOMMON/lzma" + } +} diff --git a/src/utils/common/bsplib.cpp b/src/utils/common/bsplib.cpp index bcda4c50c3c..3bafc27494f 100644 --- a/src/utils/common/bsplib.cpp +++ b/src/utils/common/bsplib.cpp @@ -2455,7 +2455,11 @@ void LoadBSPFile_FileSystemOnly( const char *filename ) // Load PAK file lump into appropriate data structure byte *pakbuffer = NULL; +#ifdef MAPBASE + int paksize = CopyVariableLump( FIELD_CHARACTER, LUMP_PAKFILE, (void **) &pakbuffer, -1 ); +#else int paksize = CopyVariableLump( FIELD_CHARACTER, LUMP_PAKFILE, ( void ** )&pakbuffer, 1 ); +#endif if ( paksize > 0 ) { GetPakFile()->ParseFromBuffer( pakbuffer, paksize ); diff --git a/src/vpc_scripts/groups.vgc b/src/vpc_scripts/groups.vgc index d1fecec5574..f15bc99758b 100644 --- a/src/vpc_scripts/groups.vgc +++ b/src/vpc_scripts/groups.vgc @@ -39,6 +39,8 @@ $Group "shaders" $Group "everything" { + "bsppack" + "bspzip" "captioncompiler" "client" "fgdlib" @@ -82,6 +84,8 @@ $Group "dedicated" $Group "maptools" { + "bsppack" + "bspzip" "vbsp" "vrad_dll" "vrad_launcher" diff --git a/src/vpc_scripts/projects.vgc b/src/vpc_scripts/projects.vgc index a745d1d8597..10beb53bfd9 100644 --- a/src/vpc_scripts/projects.vgc +++ b/src/vpc_scripts/projects.vgc @@ -8,6 +8,16 @@ // Project definitions // ///////////////////////// +$Project "bsppack" +{ + "utils\bsppack\bsppack.vpc" +} + +$Project "bspzip" +{ + "utils\bspzip\bspzip.vpc" +} + $Project "captioncompiler" { "utils\captioncompiler\captioncompiler.vpc" [$WINDOWS]