enderalse/source/Enderal DLL/src/Patches/DialogueMenuPatch.h

51 lines
1.6 KiB
C
Raw Normal View History

#pragma once
inline bool bTabBlocked = false;
class DialogueMenuPatch final : public RE::DialogueMenu
{
public:
static void Install()
{
REL::Relocation<uintptr_t> vtbl(RE::VTABLE_DialogueMenu[0]);
_ProcessMessageFn = vtbl.write_vfunc(0x4, &ProcessMessageEx);
}
static void BlockTab(bool a_block = true)
{
bTabBlocked = a_block;
}
private:
RE::UI_MESSAGE_RESULTS ProcessMessageEx(RE::UIMessage& a_message)
{
if (bTabBlocked && a_message.type == RE::UI_MESSAGE_TYPE::kScaleformEvent) {
RE::BSUIScaleformData* data = static_cast<RE::BSUIScaleformData*>(a_message.data);
if (data && data->scaleformEvent->type == RE::GFxEvent::EventType::kKeyDown) {
RE::GFxKeyEvent* key = (RE::GFxKeyEvent*)data->scaleformEvent;
// Escape triggers a kTab event, added kEscape just in case
if (key && (key->keyCode == RE::GFxKey::kTab || key->keyCode == RE::GFxKey::kEscape) && !RE::UI::GetSingleton()->IsMenuOpen(RE::ContainerMenu::MENU_NAME) && !RE::UI::GetSingleton()->IsMenuOpen(RE::BarterMenu::MENU_NAME)) {
OpenJournal(false);
return RE::UI_MESSAGE_RESULTS::kIgnore;
}
}
}
return _ProcessMessageFn(this, a_message);
}
2023-12-21 11:41:08 +00:00
// When opening from dialogue menu, a_bool must be false to not break framerate of the UI
void static OpenJournal(bool a_bool)
{
using func_t = decltype(&OpenJournal);
// Checked: 1.5.97, 1.6.640, 1.6.659, 1.6.1130
REL::Relocation<func_t> func{ REL::RelocationID(52428, 53327) };
func(a_bool);
}
2023-12-21 11:41:08 +00:00
using ProcessMessageFn = decltype(&ProcessMessage);
inline static REL::Relocation<ProcessMessageFn> _ProcessMessageFn;
};