From 107076c26acb5606a6df3bd6a104c8474268c925 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Tue, 6 Dec 2016 21:16:02 +0100 Subject: [PATCH] [FastFiles] Partially correct fastfile progress --- src/Components/Modules/FastFiles.cpp | 27 ++++++++++++++++++++++++++ src/Components/Modules/FastFiles.hpp | 7 +++++++ src/Components/Modules/ZoneBuilder.cpp | 2 +- src/Game/Functions.cpp | 1 + src/Game/Functions.hpp | 3 +++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Components/Modules/FastFiles.cpp b/src/Components/Modules/FastFiles.cpp index d5b3d953..2b91f31c 100644 --- a/src/Components/Modules/FastFiles.cpp +++ b/src/Components/Modules/FastFiles.cpp @@ -6,6 +6,9 @@ namespace Components symmetric_CTR FastFiles::CurrentCTR; std::vector FastFiles::ZonePaths; + unsigned int FastFiles::CurrentZone; + unsigned int FastFiles::MaxZones; + unsigned char FastFiles::ZoneKey[1191] = { 0x30,0x82,0x04,0xA3,0x02,0x01,0x00,0x02,0x82,0x01,0x01, @@ -269,6 +272,7 @@ namespace Components void FastFiles::ReadVersionStub(unsigned int* version, int size) { + FastFiles::CurrentZone++; Game::DB_ReadXFileUncompressed(version, size); // Allow loading of custom version @@ -361,6 +365,22 @@ namespace Components } } + float FastFiles::GetFullLoadedFraction() + { + float singleProgress = 1.0f / FastFiles::MaxZones; + float partialProgress = singleProgress * (FastFiles::CurrentZone - 1); + float currentProgress = std::max(std::min(Game::DB_GetLoadedFraction(), 1.0f), 0.0f); + return partialProgress + (currentProgress * singleProgress); + } + + void FastFiles::LoadZonesStub(Game::XZoneInfo *zoneInfo, unsigned int zoneCount) + { + FastFiles::CurrentZone = 0; + FastFiles::MaxZones = zoneCount; + + Utils::Hook::Call(0x5BBAC0)(zoneInfo, zoneCount); + } + FastFiles::FastFiles() { Dvar::Register("ui_zoneDebug", false, Game::dvar_flag::DVAR_FLAG_SAVED, "Display current loaded zone."); @@ -414,6 +434,13 @@ namespace Components // General read Utils::Hook(0x5B98E4, FastFiles::AuthLoadInflateDecryptBase, HOOK_CALL).install()->quick(); + // Fix fastfile progress + Utils::Hook(0x4E5DE3, FastFiles::LoadZonesStub, HOOK_CALL).install()->quick(); + Utils::Hook(0x407761, FastFiles::GetFullLoadedFraction, HOOK_CALL).install()->quick(); + Utils::Hook(0x49FA1E, FastFiles::GetFullLoadedFraction, HOOK_CALL).install()->quick(); + Utils::Hook(0x589090, FastFiles::GetFullLoadedFraction, HOOK_CALL).install()->quick(); + Utils::Hook(0x629FC0, FastFiles::GetFullLoadedFraction, HOOK_JUMP).install()->quick(); + // Add custom zone paths FastFiles::AddZonePath("zone\\patch\\"); FastFiles::AddZonePath("zone\\dlc\\"); diff --git a/src/Components/Modules/FastFiles.hpp b/src/Components/Modules/FastFiles.hpp index f1cca893..f0efc937 100644 --- a/src/Components/Modules/FastFiles.hpp +++ b/src/Components/Modules/FastFiles.hpp @@ -17,6 +17,8 @@ namespace Components static void LoadLocalizeZones(Game::XZoneInfo *zoneInfo, unsigned int zoneCount, int sync); + static float GetFullLoadedFraction(); + static unsigned char ZoneKey[1191]; private: @@ -31,6 +33,9 @@ namespace Components unsigned char data[1]; }; + static unsigned int CurrentZone; + static unsigned int MaxZones; + static Key CurrentKey; static symmetric_CTR CurrentCTR; static std::vector ZonePaths; @@ -46,5 +51,7 @@ namespace Components static void AuthLoadInflateDecryptBase(); static void AuthLoadInflateDecryptBaseFunc(unsigned char* buffer); static int InflateInitDecrypt(z_streamp strm, const char *version, int stream_size); + + static void LoadZonesStub(Game::XZoneInfo *zoneInfo, unsigned int zoneCount); }; } diff --git a/src/Components/Modules/ZoneBuilder.cpp b/src/Components/Modules/ZoneBuilder.cpp index e8284836..6747ebcd 100644 --- a/src/Components/Modules/ZoneBuilder.cpp +++ b/src/Components/Modules/ZoneBuilder.cpp @@ -316,7 +316,7 @@ namespace Components this->buffer.enterCriticalSection(); Game::XFile* header = reinterpret_cast(this->buffer.data()); header->size = this->buffer.length() - sizeof(Game::XFile); // Write correct data size - header->externalSize = this->externalSize; // This actually stores how much external data has to be loaded. It's used to calculate the loadscreen progress + header->externalSize = 0;//this->externalSize; // This actually stores how much external data has to be loaded. It's used to calculate the loadscreen progress // Write stream sizes for (int i = 0; i < Game::MAX_XFILE_COUNT; ++i) diff --git a/src/Game/Functions.cpp b/src/Game/Functions.cpp index fe48ca27..753009cd 100644 --- a/src/Game/Functions.cpp +++ b/src/Game/Functions.cpp @@ -42,6 +42,7 @@ namespace Game DB_EnumXAssets_t DB_EnumXAssets = (DB_EnumXAssets_t)0x4B76D0; DB_EnumXAssets_Internal_t DB_EnumXAssets_Internal = (DB_EnumXAssets_Internal_t)0x5BB0A0; DB_FindXAssetHeader_t DB_FindXAssetHeader = (DB_FindXAssetHeader_t)0x407930; + DB_GetLoadedFraction_t DB_GetLoadedFraction = (DB_GetLoadedFraction_t)0x468380; DB_GetXAssetNameHandler_t* DB_GetXAssetNameHandlers = (DB_GetXAssetNameHandler_t*)0x799328; DB_GetXAssetSizeHandler_t* DB_GetXAssetSizeHandlers = (DB_GetXAssetSizeHandler_t*)0x799488; DB_GetXAssetTypeName_t DB_GetXAssetTypeName = (DB_GetXAssetTypeName_t)0x4CFCF0; diff --git a/src/Game/Functions.hpp b/src/Game/Functions.hpp index 70197cd2..1d54bf67 100644 --- a/src/Game/Functions.hpp +++ b/src/Game/Functions.hpp @@ -93,6 +93,9 @@ namespace Game typedef XAssetHeader (__cdecl * DB_FindXAssetHeader_t)(XAssetType type, const char* name); extern DB_FindXAssetHeader_t DB_FindXAssetHeader; + typedef float(__cdecl * DB_GetLoadedFraction_t)(); + extern DB_GetLoadedFraction_t DB_GetLoadedFraction; + typedef const char* (__cdecl * DB_GetXAssetNameHandler_t)(XAssetHeader* asset); extern DB_GetXAssetNameHandler_t* DB_GetXAssetNameHandlers;