Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/public/zip_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 -
Expand Down Expand Up @@ -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;
Expand Down
74 changes: 74 additions & 0 deletions src/utils/bsppack/bsppack.cpp
Original file line number Diff line number Diff line change
@@ -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 );
51 changes: 51 additions & 0 deletions src/utils/bsppack/bsppack.vpc
Original file line number Diff line number Diff line change
@@ -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"
}
}
Loading