diff --git a/src/Components/Modules/RawFiles.cpp b/src/Components/Modules/RawFiles.cpp index 54b80d7b..81da05da 100644 --- a/src/Components/Modules/RawFiles.cpp +++ b/src/Components/Modules/RawFiles.cpp @@ -34,17 +34,24 @@ namespace Components return; } - std::string filename = params[1]; - const char* data = Game::LoadModdableRawfile(0, filename.data()); + FileSystem::File file(params[1]); + if (file.Exists()) + { + Utils::IO::WriteFile("raw/" + file.GetName(), file.GetBuffer()); + Logger::Print("File '%s' written to raw!\n", file.GetName().data()); + return; + } + + const char* data = Game::LoadModdableRawfile(0, file.GetName().data()); if (data) { - Utils::IO::WriteFile("raw/" + filename, data); - Logger::Print("File '%s' written to raw!\n", filename.data()); + Utils::IO::WriteFile("raw/" + file.GetName(), data); + Logger::Print("File '%s' written to raw!\n", file.GetName().data()); } else { - Logger::Print("File '%s' does not exist!\n", filename.data()); + Logger::Print("File '%s' does not exist!\n", file.GetName().data()); } }); } diff --git a/src/Game/Functions.cpp b/src/Game/Functions.cpp index 9e3d9424..8dfdc001 100644 --- a/src/Game/Functions.cpp +++ b/src/Game/Functions.cpp @@ -245,6 +245,8 @@ namespace Game int* gameTypeCount = (int*)0x62E50A0; gameTypeName_t* gameTypes = (gameTypeName_t*)0x62E50A4; + searchpath_t* fs_searchpaths = (searchpath_t*)0x63D96E0; + XBlock** g_streamBlocks = (XBlock**)0x16E554C; bool* g_lobbyCreateInProgress = (bool*)0x66C9BC2; diff --git a/src/Game/Functions.hpp b/src/Game/Functions.hpp index 8e0d025f..2c317cfb 100644 --- a/src/Game/Functions.hpp +++ b/src/Game/Functions.hpp @@ -536,6 +536,8 @@ namespace Game extern int* gameTypeCount; extern gameTypeName_t* gameTypes; + extern searchpath_t* fs_searchpaths; + extern XBlock** g_streamBlocks; extern bool* g_lobbyCreateInProgress; diff --git a/src/Game/Structs.hpp b/src/Game/Structs.hpp index 3053ee77..27783d30 100644 --- a/src/Game/Structs.hpp +++ b/src/Game/Structs.hpp @@ -2495,6 +2495,41 @@ namespace Game DWORD unk; } PartyData_t; + typedef struct fileInPack_s + { + DWORD idk; + char* name; + DWORD idk2; + } fileInPack_t; + + typedef struct + { + char pakFilename[256]; // c:\quake3\baseq3\pak0.pk3 + char pakBasename[256]; // pak0 + char pakGamename[256]; // baseq3 + void* handle; // handle to zip file + int checksum; + int pure_checksum; // checksum for pure + int idk; // ? + int numfiles; // number of files in pk3 + int referenced; // referenced file flags + int hashSize; // hash table size (power of 2) + fileInPack_t* *hashTable; // hash table + fileInPack_t* buildBuffer; + } pack_t; + + typedef struct { + char path[256]; // c:\quake3 + char gamedir[256]; // baseq3 + } directory_t; + + typedef struct searchpath_s + { + searchpath_s* next; + pack_t* pack; + directory_t* dir; + } searchpath_t; + struct SafeArea { int fontHeight;