1
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

73 lines
1.6 KiB

#pragma once
class MainMenuPatch : public RE::MainMenu
{
public:
static void Install()
{
REL::Relocation<uintptr_t> vtbl(RE::VTABLE_MainMenu[0]);
_ProcessMessage = vtbl.write_vfunc(0x4, &ProcessMessageEx);
}
private:
void ProcessEx(RE::GPtr<RE::GFxMovieView> a_movie)
{
RE::GFxValue entryList;
if (!uiMovie->Invoke("_root.MenuHolder.Menu_mc.MainList.__get__entryList", &entryList, nullptr, 0)) {
return;
}
std::array values{
"$CREATIONS",
"$CREATION CLUB",
"$DOWNLOADABLE CONTENT",
"$MOD MANAGER",
"$HELP",
};
bool bUpdated = false;
const auto size = entryList.GetArraySize();
for (uint32_t i = size; i > 0; i--) {
RE::GFxValue entry;
if (!entryList.GetElement(i - 1, &entry))
continue;
RE::GFxValue entryText;
if (!entry.GetMember("text", &entryText))
continue;
const std::string text = entryText.GetString();
if (text.empty())
continue;
for (const auto name : values) {
if (text == name) {
bUpdated = true;
entryList.RemoveElement(i - 1);
}
}
}
if (bUpdated) {
uiMovie->Invoke("_root.MenuHolder.Menu_mc.MainList.InvalidateData", nullptr, nullptr, 0);
}
}
RE::UI_MESSAGE_RESULTS ProcessMessageEx(RE::UIMessage* a_message)
{
if (a_message->type == RE::UI_MESSAGE_TYPE::kShow) {
_show = true;
} else if (_show && (iIterations < 15) && a_message->type == RE::UI_MESSAGE_TYPE::kUpdate) {
iIterations++;
ProcessEx(uiMovie);
}
return _ProcessMessage(this, a_message);
}
inline static REL::Relocation<decltype(&ProcessMessageEx)> _ProcessMessage;
inline static bool _show{ false };
inline static uint32_t iIterations{ 0 };
};