mirror of
https://github.com/YimMenu/YimMenuV2.git
synced 2026-10-11 09:48:08 +08:00
Cache Script Pointers (#211)
* Cache Script Pointers * Rewrite script pointers
This commit is contained in:
1 parent
2f1727530f
commit
16a6bc9081
23 files changed
+505
-237
No files matched your search
@@ -0,0 +1,75 @@
|
||||
#include "ScriptPointers.hpp"
|
||||
#include "core/filemgr/FileMgr.hpp"
|
||||
#include "core/memory/ModuleMgr.hpp"
|
||||
|
||||
namespace YimMenu
|
||||
{
|
||||
ScriptPointers::ScriptPointers() :
|
||||
m_CacheFile(FileMgr::GetProjectFile("./scr_pointers.bin"))
|
||||
{
|
||||
}
|
||||
|
||||
void ScriptPointers::InitImpl()
|
||||
{
|
||||
m_CacheFile.Load();
|
||||
if (m_CacheFile.UpToDate(ModuleMgr.Get("GTA5_Enhanced.exe"_J)->GetNtHeader()->FileHeader.TimeDateStamp))
|
||||
{
|
||||
Load();
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptPointers::CachePointerImpl(joaat_t nameHash, std::uint32_t address)
|
||||
{
|
||||
m_ScriptPointers.emplace(nameHash, address);
|
||||
Save();
|
||||
}
|
||||
|
||||
std::uint32_t ScriptPointers::GetPointerImpl(joaat_t nameHash)
|
||||
{
|
||||
if (auto it = m_ScriptPointers.find(nameHash); it != m_ScriptPointers.end())
|
||||
{
|
||||
return it->second;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ScriptPointers::Save()
|
||||
{
|
||||
auto dataSize = sizeof(std::uint32_t) + sizeof(scrPointerSaveStruct) * m_ScriptPointers.size();
|
||||
auto data = std::make_unique<uint8_t[]>(dataSize);
|
||||
auto dataPtr = data.get();
|
||||
|
||||
*(std::uint32_t*)dataPtr = m_ScriptPointers.size();
|
||||
dataPtr += sizeof(std::uint32_t);
|
||||
|
||||
for (auto& [hash, val] : m_ScriptPointers)
|
||||
{
|
||||
auto saveStruct = (scrPointerSaveStruct*)dataPtr;
|
||||
saveStruct->m_NameHash = hash;
|
||||
saveStruct->m_Address = val;
|
||||
dataPtr += sizeof(scrPointerSaveStruct);
|
||||
}
|
||||
|
||||
m_CacheFile.SetHeaderVersion(ModuleMgr.Get("GTA5_Enhanced.exe"_J)->GetNtHeader()->FileHeader.TimeDateStamp);
|
||||
m_CacheFile.SetData(std::move(data), dataSize);
|
||||
m_CacheFile.Write();
|
||||
}
|
||||
|
||||
void ScriptPointers::Load()
|
||||
{
|
||||
auto data = m_CacheFile.Data();
|
||||
|
||||
auto numPointers = *(std::uint32_t*)data;
|
||||
data += sizeof(std::uint32_t);
|
||||
|
||||
for (int i = 0; i < numPointers; i++)
|
||||
{
|
||||
auto saveStruct = (scrPointerSaveStruct*)data;
|
||||
m_ScriptPointers.emplace(saveStruct->m_NameHash, saveStruct->m_Address);
|
||||
data += sizeof(scrPointerSaveStruct);
|
||||
}
|
||||
|
||||
LOG(INFO) << "Loaded " << m_ScriptPointers.size() << " script pointers from cache.";
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user