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.
 
 
 

55 lines
1.6 KiB

#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;
if (
key
// Escape triggers a kTab event, added kEscape just in case
&& (key->keyCode == RE::GFxKey::kTab || key->keyCode == RE::GFxKey::kEscape)
// Covers inventory and barter
&& !RE::UI::GetSingleton()->GameIsPaused()
&& RE::UI::GetSingleton()->IsMenuOpen(MENU_NAME)) {
OpenJournal(false);
return RE::UI_MESSAGE_RESULTS::kIgnore;
}
}
}
return _ProcessMessageFn(this, a_message);
}
// 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::VariantID(52428, 53327, 0x92F0F0) };
func(a_bool);
}
using ProcessMessageFn = decltype(&ProcessMessage);
inline static REL::Relocation<ProcessMessageFn> _ProcessMessageFn;
};