From d5644c6d62c47c65bcf4656d5069027b80bd68c4 Mon Sep 17 00:00:00 2001 From: Zipperiusz Date: Sun, 13 Oct 2024 01:47:10 +0200 Subject: [PATCH 1/2] Merge effect files on game start --- Script_G3Fixes.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/Script_G3Fixes.cpp b/Script_G3Fixes.cpp index adb0898..23da422 100644 --- a/Script_G3Fixes.cpp +++ b/Script_G3Fixes.cpp @@ -7,6 +7,56 @@ gSScriptInit & GetScriptInit() return s_ScriptInit; } +void SearchAndMergeEffects(const bCString& directory) { + bTObjArray arrFiles; + bTObjArray arrDirs; + eCVirtualFileSystem& vfs = eCVirtualFileSystem::GetInstance(); + + vfs.FindFiles(directory, arrFiles); + vfs.FindDirectories(directory, arrDirs); + + for (auto it = arrFiles.Begin(); it != arrFiles.End(); it++) { + bTObjArray< bCString > fileSplitted = SplitString(*it, ".", GEFalse, GEFalse); + bCString fileName = fileSplitted.GetAt(0); + bCString fileExt = fileSplitted.GetAt(1); + + // Ignore original g3.efm + if (fileExt != "efm" || fileName == "g3") continue; + + bTObjArray< bCString > dirSplitted = SplitString(directory, "/", GEFalse, GEFalse); + dirSplitted.Add(*it); + bCString filePath = JoinString(dirSplitted, 0, "/"); + + auto EffectModule = eCModuleAdmin::GetInstance().FindModule("gCEffectModule"); + auto EffectModulePtr = reinterpret_cast(&EffectModule); + + if (EffectModulePtr == 0) + return; + DWORD gCEffectSystemPtr = *(DWORD*)EffectModulePtr + 0x14; + if (gCEffectSystemPtr == 0) + return; + gCEffectMap* EffectMap = (gCEffectMap*)(*(DWORD*)gCEffectSystemPtr + 0x4); + if (EffectMap == nullptr) + return; + + gCEffectMap NewEM; + NewEM.Load(filePath); + for (auto iter = NewEM.Begin(); iter != NewEM.End(); iter++) { + std::cout << "EffectName: " << iter.GetKey() << "\n"; + EffectMap->RemoveAt(iter.GetKey()); + gCEffectCommandSequence* effectCommand = EffectMap->InsertNewAt(iter.GetKey()); + *effectCommand = iter.GetNode()->m_Element; + } + std::cout << filePath << " merged!" << "\n"; + } + + // Recursive search + for (auto it = arrDirs.Begin(); it != arrDirs.End(); it++) { + bCString subDirPath = directory + "/" + *it; + SearchAndMergeEffects(subDirPath); + } +} + void TryFixMist(void) { auto Player = Entity::GetPlayer(); @@ -57,6 +107,9 @@ void GE_STDCALL AfterApplicationProcess(void) WriteNops(RVA_Game(0xa65bd), 0xa65c6 - 0xa65bd); } } + + SearchAndMergeEffects("Data"); + } GEBool IsFriendlyCompanion(Entity* Self, Entity* Other) @@ -1057,6 +1110,7 @@ void RemoveWaterfallSounds() } } + void RenderIcon(CFFGFCWnd* DesktopWindow) { if (!gCSession::GetSession().IsValid() || gCSession::GetSession().IsPaused() || !gCSession::GetSession().GetGUIManager()) From f87cbd275b6041a69d71a50dbd8e66413e36f43f Mon Sep 17 00:00:00 2001 From: Zipperiusz Date: Sun, 13 Oct 2024 02:09:15 +0200 Subject: [PATCH 2/2] Move findmodule outside loop --- Script_G3Fixes.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/Script_G3Fixes.cpp b/Script_G3Fixes.cpp index 23da422..4c8dd56 100644 --- a/Script_G3Fixes.cpp +++ b/Script_G3Fixes.cpp @@ -15,6 +15,20 @@ void SearchAndMergeEffects(const bCString& directory) { vfs.FindFiles(directory, arrFiles); vfs.FindDirectories(directory, arrDirs); + auto EffectModule = eCModuleAdmin::GetInstance().FindModule("gCEffectModule"); + auto EffectModulePtr = reinterpret_cast(&EffectModule); + + if (EffectModulePtr == 0) + return; + DWORD gCEffectSystemPtr = *(DWORD*)EffectModulePtr + 0x14; + if (gCEffectSystemPtr == 0) + return; + gCEffectMap* EffectMap = (gCEffectMap*)(*(DWORD*)gCEffectSystemPtr + 0x4); + if (EffectMap == nullptr) + return; + + gCEffectMap NewEM; + for (auto it = arrFiles.Begin(); it != arrFiles.End(); it++) { bTObjArray< bCString > fileSplitted = SplitString(*it, ".", GEFalse, GEFalse); bCString fileName = fileSplitted.GetAt(0); @@ -26,21 +40,8 @@ void SearchAndMergeEffects(const bCString& directory) { bTObjArray< bCString > dirSplitted = SplitString(directory, "/", GEFalse, GEFalse); dirSplitted.Add(*it); bCString filePath = JoinString(dirSplitted, 0, "/"); - - auto EffectModule = eCModuleAdmin::GetInstance().FindModule("gCEffectModule"); - auto EffectModulePtr = reinterpret_cast(&EffectModule); - - if (EffectModulePtr == 0) - return; - DWORD gCEffectSystemPtr = *(DWORD*)EffectModulePtr + 0x14; - if (gCEffectSystemPtr == 0) - return; - gCEffectMap* EffectMap = (gCEffectMap*)(*(DWORD*)gCEffectSystemPtr + 0x4); - if (EffectMap == nullptr) - return; - - gCEffectMap NewEM; NewEM.Load(filePath); + for (auto iter = NewEM.Begin(); iter != NewEM.End(); iter++) { std::cout << "EffectName: " << iter.GetKey() << "\n"; EffectMap->RemoveAt(iter.GetKey()); @@ -1428,8 +1429,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID) { case DLL_PROCESS_ATTACH: ::DisableThreadLibraryCalls(hModule); - //AllocConsole(); - //freopen_s((FILE**)stdout, "CONOUT$", "w", stdout); + AllocConsole(); + freopen_s((FILE**)stdout, "CONOUT$", "w", stdout); break; case DLL_PROCESS_DETACH: break;