From 83d7f0b9f444c43e3a42ac0f8d63f65cd89d7cca Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sat, 15 Jul 2023 16:24:01 +0200 Subject: [PATCH] Light code cleanup - Use game's filesystem in 'Mod_GetAllInstalledMaps'. - Reorder parameters of 'AddFilesToList', and add option to override path separator. --- r5dev/engine/cmodel_bsp.cpp | 27 +++++++++++++---------- r5dev/pluginsystem/modsystem.cpp | 2 +- r5dev/pluginsystem/pluginsystem.cpp | 2 +- r5dev/public/tier2/fileutils.h | 6 ++--- r5dev/tier2/fileutils.cpp | 34 +++++++++++++++-------------- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/r5dev/engine/cmodel_bsp.cpp b/r5dev/engine/cmodel_bsp.cpp index 39d0fb43..8b5549aa 100644 --- a/r5dev/engine/cmodel_bsp.cpp +++ b/r5dev/engine/cmodel_bsp.cpp @@ -8,6 +8,7 @@ #include "core/stdafx.h" #include "tier0/memstd.h" #include "tier0/jobthread.h" +#include "tier2/fileutils.h" #include "engine/sys_dll2.h" #include "engine/host_cmd.h" #include "engine/cmodel_bsp.h" @@ -21,11 +22,15 @@ #endif // !DEDICATED vector<string> g_InstalledMaps; -string s_svLevelName; +string s_LevelName; + +std::regex s_ArchiveRegex{ R"([^_]*_(.*)(.bsp.pak000_dir).*)" }; + bool s_bLevelResourceInitialized = false; bool s_bBasePaksInitialized = false; KeyValues* s_pLevelSetKV = nullptr; + //----------------------------------------------------------------------------- // Purpose: checks if level has changed // Input : *pszLevelName - @@ -33,7 +38,7 @@ KeyValues* s_pLevelSetKV = nullptr; //----------------------------------------------------------------------------- bool Mod_LevelHasChanged(const char* pszLevelName) { - return (s_svLevelName.compare(pszLevelName) != 0); + return (s_LevelName.compare(pszLevelName) != 0); } //----------------------------------------------------------------------------- @@ -41,17 +46,17 @@ bool Mod_LevelHasChanged(const char* pszLevelName) //----------------------------------------------------------------------------- void Mod_GetAllInstalledMaps() { + CUtlVector<CUtlString> fileList; + AddFilesToList(fileList, "vpk", "vpk", nullptr, '/'); + std::lock_guard<std::mutex> l(g_InstalledMapsMutex); g_InstalledMaps.clear(); // Clear current list. - fs::directory_iterator directoryIterator("vpk"); - std::regex archiveRegex{ R"([^_]*_(.*)(.bsp.pak000_dir).*)" }; - std::smatch regexMatches; - - for (const fs::directory_entry& directoryEntry : directoryIterator) + std::cmatch regexMatches; + FOR_EACH_VEC(fileList, i) { - std::string fileName = directoryEntry.path().u8string(); - std::regex_search(fileName, regexMatches, archiveRegex); + const CUtlString& fileName = fileList[i]; + std::regex_search(fileName.Get(), regexMatches, s_ArchiveRegex); if (!regexMatches.empty()) { @@ -347,7 +352,7 @@ void Mod_ProcessPakQueue() if (s_bBasePaksInitialized && !s_bLevelResourceInitialized) { - Mod_PreloadLevelPaks(s_svLevelName.c_str()); + Mod_PreloadLevelPaks(s_LevelName.c_str()); s_bLevelResourceInitialized = true; } *(_DWORD*)v15 = g_pakLoadApi->LoadAsync(v17, AlignedMemAlloc(), 4, 0); @@ -387,7 +392,7 @@ void Mod_LoadPakForMap(const char* pszLevelName) if (Mod_LevelHasChanged(pszLevelName)) s_bLevelResourceInitialized = false; - s_svLevelName = pszLevelName; + s_LevelName = pszLevelName; // Dedicated should not load loadscreens. #ifndef DEDICATED diff --git a/r5dev/pluginsystem/modsystem.cpp b/r5dev/pluginsystem/modsystem.cpp index e7ce4f2c..bd12ab8d 100644 --- a/r5dev/pluginsystem/modsystem.cpp +++ b/r5dev/pluginsystem/modsystem.cpp @@ -46,7 +46,7 @@ void CModSystem::Init() modsystem_debug->SetValue(true); CUtlVector<CUtlString> modFileList; - RecursiveFindFilesMatchingName(&modFileList, + RecursiveFindFilesMatchingName(modFileList, MOD_BASE_DIRECTORY, MOD_SETTINGS_FILE, "PLATFORM", '/'); FOR_EACH_VEC(modFileList, i) diff --git a/r5dev/pluginsystem/pluginsystem.cpp b/r5dev/pluginsystem/pluginsystem.cpp index 477c5dd4..f687b02d 100644 --- a/r5dev/pluginsystem/pluginsystem.cpp +++ b/r5dev/pluginsystem/pluginsystem.cpp @@ -20,7 +20,7 @@ void CPluginSystem::PluginSystem_Init() FileSystem()->CreateDirHierarchy("bin\\x64_retail\\plugins"); CUtlVector< CUtlString > pluginPaths; - AddFilesToList(pluginPaths, "bin\\x64_retail\\plugins", NULL, "dll"); + AddFilesToList(pluginPaths, "bin\\x64_retail\\plugins", "dll"); for (int i = 0; i < pluginPaths.Count(); ++i) { diff --git a/r5dev/public/tier2/fileutils.h b/r5dev/public/tier2/fileutils.h index 9ae60ba2..c05b220f 100644 --- a/r5dev/public/tier2/fileutils.h +++ b/r5dev/public/tier2/fileutils.h @@ -24,13 +24,13 @@ void ComputeModFilename( const char *pContentFileName, char *pBuf, size_t nBufLe void ComputeModContentFilename( const char *pGameFileName, char *pBuf, size_t nBufLen ); // Finds all files matching the a name within a directory and its sub directories. Output entries are paths to found files (relative to and including szStartDirectory). -void RecursiveFindFilesMatchingName( CUtlVector< CUtlString > *pOutFileList, const char* szStartDirectory, const char* szTargetFileName, const char *pPathID, char separator = CORRECT_PATH_SEPARATOR); +void RecursiveFindFilesMatchingName( CUtlVector< CUtlString > &fileList, const char* szStartDirectory, const char* szTargetFileName, const char *pPathID, char separator = CORRECT_PATH_SEPARATOR); // Builds a list of all files under a directory with a particular extension. -void AddFilesToList( CUtlVector< CUtlString > &list, const char *pDirectory, const char *pPath = nullptr, const char *pExtension = nullptr ); +void AddFilesToList( CUtlVector< CUtlString > &fileList, const char *pDirectory, const char *pExtension = nullptr, const char* pPathID = nullptr, char separator = CORRECT_PATH_SEPARATOR ); // Returns the search path as a list of paths. -void GetSearchPath( CUtlVector< CUtlString > &path, const char *pPathID ); +void GetSearchPath( CUtlVector< CUtlString > &pathList, const char *pPathID ); // Given file name generate a full path using the following rules. // 1. if its full path already return. diff --git a/r5dev/tier2/fileutils.cpp b/r5dev/tier2/fileutils.cpp index 9073844a..92f5eda4 100644 --- a/r5dev/tier2/fileutils.cpp +++ b/r5dev/tier2/fileutils.cpp @@ -108,12 +108,13 @@ void ComputeModContentFilename( const char *pGameFileName, char *pBuf, size_t nB //----------------------------------------------------------------------------- // Purpose: Search start directory, recurse into sub directories collecting all files matching the target name. -// Input : *outFileList - +// Input : &fileList - // *szStartDirectory - // *szTargetFileName - // *pathID - +// separator - //----------------------------------------------------------------------------- -void RecursiveFindFilesMatchingName( CUtlVector< CUtlString > *pOutFileList, const char* szStartDirectory, const char* szTargetFileName, const char *pPathID, char separator ) +void RecursiveFindFilesMatchingName( CUtlVector< CUtlString > &fileList, const char* szStartDirectory, const char* szTargetFileName, const char *pPathID, char separator ) { char searchString[MAX_PATH]; Q_snprintf( searchString, sizeof( searchString ), "%s/*.*", szStartDirectory ); @@ -127,14 +128,14 @@ void RecursiveFindFilesMatchingName( CUtlVector< CUtlString > *pOutFileList, con { char newSearchPath[MAX_PATH]; Q_snprintf( newSearchPath, sizeof( newSearchPath ), "%s/%s", szStartDirectory, curFile ); - RecursiveFindFilesMatchingName( pOutFileList, newSearchPath, szTargetFileName, pPathID, separator); + RecursiveFindFilesMatchingName( fileList, newSearchPath, szTargetFileName, pPathID, separator); } else if ( V_StringMatchesPattern( curFile, szTargetFileName ) ) { CUtlString outFile; outFile.Format( "%s/%s", szStartDirectory, curFile ); V_FixSlashes( outFile.Get(), separator ); - pOutFileList->AddToTail( outFile ); + fileList.AddToTail( outFile ); } curFile = FileSystem()->FindNext( handle ); @@ -144,15 +145,16 @@ void RecursiveFindFilesMatchingName( CUtlVector< CUtlString > *pOutFileList, con //----------------------------------------------------------------------------- // Builds a list of all files under a directory with a particular extension. -// Input : &list - +// Input : &fileList - // *pDirectory - -// *pPathID - // *pExtension - +// *pPathID - +// separator - //----------------------------------------------------------------------------- -void AddFilesToList( CUtlVector< CUtlString > &list, const char *pDirectory, const char *pPathID, const char *pExtension ) +void AddFilesToList( CUtlVector< CUtlString > &fileList, const char *pDirectory, const char *pExtension, const char* pPathID, char separator ) { char pSearchString[MAX_PATH]; - Q_snprintf( pSearchString, MAX_PATH, "%s\\*", pDirectory ); + Q_snprintf( pSearchString, MAX_PATH, "%s/*", pDirectory ); bool bIsAbsolute = V_IsAbsolutePath( pDirectory ); @@ -165,7 +167,7 @@ void AddFilesToList( CUtlVector< CUtlString > &list, const char *pDirectory, con for ( ; pFoundFile; pFoundFile = FileSystem()->FindNext( hFind ) ) { char pChildPath[MAX_PATH]; - Q_snprintf( pChildPath, MAX_PATH, "%s\\%s", pDirectory, pFoundFile ); + Q_snprintf( pChildPath, MAX_PATH, "%s/%s", pDirectory, pFoundFile ); if ( FileSystem()->FindIsDirectory( hFind ) ) { @@ -192,8 +194,8 @@ void AddFilesToList( CUtlVector< CUtlString > &list, const char *pDirectory, con } V_strlower( pFullPath ); - V_FixSlashes( pFullPath ); - list.AddToTail( pFullPath ); + V_FixSlashes( pFullPath, separator ); + fileList.AddToTail( pFullPath ); } FileSystem()->FindClose(hFind); @@ -201,16 +203,16 @@ void AddFilesToList( CUtlVector< CUtlString > &list, const char *pDirectory, con int nCount = subDirs.Count(); for ( int i = 0; i < nCount; ++i ) { - AddFilesToList( list, subDirs[i], pPathID, pExtension ); + AddFilesToList( fileList, subDirs[i], pExtension, pPathID, separator ); } } //----------------------------------------------------------------------------- // Purpose: Returns the search path as a list of paths. -// Input : &path - +// Input : &pathList - // *pPathID - //----------------------------------------------------------------------------- -void GetSearchPath(CUtlVector< CUtlString >& path, const char* pPathID) +void GetSearchPath(CUtlVector< CUtlString >& pathList, const char* pPathID) { int nMaxLen = FileSystem()->GetSearchPath(pPathID, false, NULL, 0); char* pBuf = (char*)stackalloc(nMaxLen); @@ -220,10 +222,10 @@ void GetSearchPath(CUtlVector< CUtlString >& path, const char* pPathID) while (NULL != (pSemi = strchr(pBuf, ';'))) { *pSemi = 0; - path.AddToTail(pBuf); + pathList.AddToTail(pBuf); pBuf = pSemi + 1; } - path.AddToTail(pBuf); + pathList.AddToTail(pBuf); } //-----------------------------------------------------------------------------