More code cleanup

- Set character set to multi-byte (this is because the game is also build with it).
- Utility function 'FileExists' now takes a raw string pointer, this avoids having to construct a fs::path each time its getting called (which is quite a lot!).
- Performed overall cleanup to code containing logic to override load paths. Mostly removing unnecessary copy constructions.
This commit is contained in:
Kawe Mazidjatari 2023-07-03 02:14:39 +02:00
parent 22f68ff22a
commit f6f3c7f9a2
11 changed files with 42 additions and 48 deletions

View File

@ -81,9 +81,6 @@ macro( add_module MODULE_TYPE MODULE_NAME REUSE_PCH FOLDER_NAME WARNINGS_AS_ERRO
$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>:/GS-> $<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>:/GS->
$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>:/Gy> $<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>:/Gy>
$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>:/fp:fast> $<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>:/fp:fast>
$<$<CXX_COMPILER_ID:MSVC>:/D_UNICODE>
$<$<CXX_COMPILER_ID:MSVC>:/DUNICODE>
) )
endif() endif()
endmacro() endmacro()

View File

@ -273,9 +273,7 @@ void QuerySystemInfo()
if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) // Only log the primary device. if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) // Only log the primary device.
{ {
char szDeviceName[128]; DevMsg(eDLL_T::NONE, "%-25s: '%s'\n", "GPU model identifier", dd.DeviceString);
wcstombs(szDeviceName, dd.DeviceString, sizeof(szDeviceName));
DevMsg(eDLL_T::NONE, "%-25s: '%s'\n", "GPU model identifier", szDeviceName);
} }
} }
#endif // !DEDICATED #endif // !DEDICATED

View File

@ -446,7 +446,7 @@ void Mod_PreloadLevelPaks(const char* pszLevelName)
if (nPakId == INVALID_PAK_HANDLE) if (nPakId == INVALID_PAK_HANDLE)
Error(eDLL_T::ENGINE, NO_ERROR, "%s: unable to load pak '%s' results '%d'\n", __FUNCTION__, szPathBuffer, nPakId); Error(eDLL_T::ENGINE, NO_ERROR, "%s: unable to load pak '%s' results '%d'\n", __FUNCTION__, szPathBuffer, nPakId);
else else
g_vLoadedPakHandle.push_back(nPakId); g_vLoadedPakHandle.AddToTail(nPakId);
} }
} }
@ -462,7 +462,7 @@ void Mod_UnloadPakFile(void)
g_pakLoadApi->UnloadPak(it); g_pakLoadApi->UnloadPak(it);
} }
} }
g_vLoadedPakHandle.clear(); g_vLoadedPakHandle.Purge();
g_vBadMDLHandles.clear(); g_vBadMDLHandles.clear();
} }

View File

@ -38,29 +38,23 @@ bool CBaseFileSystem::VCheckDisk(const char* pszFilePath)
{ {
// Only load material files from the disk if the mode isn't zero, // Only load material files from the disk if the mode isn't zero,
// use -novpk to load valve materials from the disk. // use -novpk to load valve materials from the disk.
if (FileSystem()->CheckVPKMode(0) && strstr(pszFilePath, ".vmt")) if (FileSystem()->CheckVPKMode(0) && V_strstr(pszFilePath, ".vmt"))
{ {
return false; return false;
} }
std::string svFilePath = ConvertToWinPath(pszFilePath); if (V_IsAbsolutePath(pszFilePath))
if (svFilePath.find("\\*\\") != string::npos)
{
// Erase '//*/'.
svFilePath.erase(0, 4);
}
fs::path filePath(svFilePath);
if (filePath.is_absolute())
{ {
// Skip absolute file paths. // Skip absolute file paths.
return false; return false;
} }
// TODO: obtain 'mod' SearchPath's instead. CUtlString filePath;
svFilePath.insert(0, "platform\\"); filePath.Format("platform/%s", pszFilePath);
filePath.FixSlashes();
filePath = filePath.Replace("\\*\\", "");
if (::FileExists(svFilePath) /*|| ::FileExists(pszFilePath)*/) if (::FileExists(filePath.Get()))
{ {
return true; return true;
} }

View File

@ -3,7 +3,7 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Internals // Internals
BOOL IsBadReadPtrV2(void* ptr); BOOL IsBadReadPtrV2(void* ptr);
BOOL FileExists(const fs::path& svFilePath); BOOL FileExists(LPCTSTR szPath);
BOOL FileEmpty(ifstream& pFile); BOOL FileEmpty(ifstream& pFile);
MODULEINFO GetModuleInfo(const char* szModule); MODULEINFO GetModuleInfo(const char* szModule);

View File

@ -10,7 +10,11 @@
#include "rtech/rtech_game.h" #include "rtech/rtech_game.h"
#include "rtech/rtech_utils.h" #include "rtech/rtech_utils.h"
vector<RPakHandle_t> g_vLoadedPakHandle; // Pak handles that have been loaded with the level
// from within the level settings KV (located in
// scripts/levels/settings/*.kv). On level unload,
// each pak listed in this vector gets unloaded.
CUtlVector<RPakHandle_t> g_vLoadedPakHandle;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: load user-requested pak files on-demand // Purpose: load user-requested pak files on-demand
@ -23,10 +27,14 @@ vector<RPakHandle_t> g_vLoadedPakHandle;
RPakHandle_t CPakFile::LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc, int nIdx, bool bUnk) RPakHandle_t CPakFile::LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc, int nIdx, bool bUnk)
{ {
RPakHandle_t pakHandle = INVALID_PAK_HANDLE; RPakHandle_t pakHandle = INVALID_PAK_HANDLE;
string svPakFileModPath = "paks\\Win32\\" + string(szPakFileName);
string svPakFilePathBase = "paks\\Win64\\" + string(szPakFileName);
if (FileExists(svPakFileModPath) || FileExists(svPakFilePathBase)) CUtlString pakBasePath;
CUtlString pakOverridePath;
pakBasePath.Format(PLATFORM_PAK_PATH "%s", szPakFileName);
pakOverridePath.Format(PLATFORM_PAK_OVERRIDE_PATH "%s", szPakFileName);
if (FileExists(pakOverridePath.Get()) || FileExists(pakBasePath.Get()))
{ {
DevMsg(eDLL_T::RTECH, "Loading pak file: '%s'\n", szPakFileName); DevMsg(eDLL_T::RTECH, "Loading pak file: '%s'\n", szPakFileName);
pakHandle = CPakFile_LoadAsync(szPakFileName, pMalloc, nIdx, bUnk); pakHandle = CPakFile_LoadAsync(szPakFileName, pMalloc, nIdx, bUnk);

View File

@ -47,7 +47,7 @@ public:
}; };
extern CPakFile* g_pakLoadApi; extern CPakFile* g_pakLoadApi;
extern vector<RPakHandle_t> g_vLoadedPakHandle; extern CUtlVector<RPakHandle_t> g_vLoadedPakHandle;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
class V_RTechGame : public IDetour class V_RTechGame : public IDetour

View File

@ -498,28 +498,27 @@ void** RTech::LoadShaderSet(void** VTablePtr)
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
int32_t RTech::OpenFile(const CHAR* szFilePath, void* unused, LONGLONG* fileSizeOut) int32_t RTech::OpenFile(const CHAR* szFilePath, void* unused, LONGLONG* fileSizeOut)
{ {
string svModFile = szFilePath; const CHAR* szFileToLoad = szFilePath;
string svBaseFile = szFilePath; CUtlString pakBasePath(szFilePath);
const string svModDir = "paks\\Win32\\";
const string svBaseDir = "paks\\Win64\\";
if (strstr(ConvertToWinPath(szFilePath).c_str(), svBaseDir.c_str())) if (pakBasePath.Find(PLATFORM_PAK_PATH) != -1)
{ {
svBaseFile.erase(0, 11); // Erase 'base_dir'. pakBasePath = pakBasePath.Replace(PLATFORM_PAK_PATH, PLATFORM_PAK_OVERRIDE_PATH);
svModFile = svModDir + svBaseFile; // Prepend 'mod_dir'.
if (!FileExists(svModFile)) if (FileExists(pakBasePath.Get()))
{ {
svModFile = szFilePath; szFileToLoad = pakBasePath.Get();
} }
} }
const HANDLE hFile = CreateFileA(svModFile.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_SUPPORTS_GHOSTING, 0); const HANDLE hFile = CreateFileA(szFileToLoad, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_SUPPORTS_GHOSTING, 0);
if (hFile == INVALID_HANDLE_VALUE) if (hFile == INVALID_HANDLE_VALUE)
return -1; return -1;
if (rtech_debug->GetBool()) if (rtech_debug->GetBool())
DevMsg(eDLL_T::RTECH, "Opened file: '%s'\n", svModFile.c_str()); DevMsg(eDLL_T::RTECH, "Opened file: '%s'\n", szFileToLoad);
if (fileSizeOut) if (fileSizeOut)
{ {

View File

@ -181,9 +181,7 @@ void CCrashHandler::FormatSystemInfo()
if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) // The primary device is the only relevant device. if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) // The primary device is the only relevant device.
{ {
char szDeviceName[128]; m_svBuffer.append(Format("\tgpu_model = \"%s\"\n", dd.DeviceString));
wcstombs(szDeviceName, dd.DeviceString, sizeof(szDeviceName));
m_svBuffer.append(Format("\tgpu_model = \"%s\"\n", szDeviceName));
m_svBuffer.append(Format("\tgpu_flags = 0x%08X // primary device\n", dd.StateFlags)); m_svBuffer.append(Format("\tgpu_flags = 0x%08X // primary device\n", dd.StateFlags));
} }
} }

View File

@ -7,9 +7,12 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// For checking if a specific file exists. // For checking if a specific file exists.
BOOL FileExists(const fs::path& svFilePath) BOOL FileExists(LPCTSTR szPath)
{ {
return fs::exists(svFilePath); DWORD dwAttrib = GetFileAttributes(szPath);
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -108,11 +108,8 @@ void CNetAdr::ToAdrinfo(addrinfo* pHint) const
if (results != 0) if (results != 0)
{ {
WCHAR* wszError = gai_strerror(results); CHAR* wszError = gai_strerror(results);
_bstr_t bStr(wszError); Warning(eDLL_T::ENGINE, "Address info translation failed: (%s)\n", wszError);
const char* pszError = bStr;
Warning(eDLL_T::ENGINE, "Address info translation failed: (%s)\n", pszError);
} }
} }