#pragma once #include #pragma comment(lib, "XInput.lib") namespace BinkInterruptPatch { struct BinkListener { static bool thunk() { auto result = func(); if (SKSE::WinAPI::GetKeyState(VK_SPACE) & 0x8000 || SKSE::WinAPI::GetKeyState(VK_ESCAPE) & 0x8000 || SKSE::WinAPI::GetKeyState(VK_LBUTTON) & 0x8000 || SKSE::WinAPI::GetKeyState(VK_RBUTTON) & 0x8000) { return false; } if (RE::BSInputDeviceManager::GetSingleton()->IsGamepadEnabled()) { for (DWORD index = 0; index < XUSER_MAX_COUNT; index++) { XINPUT_STATE state; if (XInputGetState(index, &state) == ERROR_SUCCESS) { if ((state.Gamepad.wButtons & XINPUT_GAMEPAD_A) || (state.Gamepad.wButtons & XINPUT_GAMEPAD_START)) { return false; } } } } return result; } static inline REL::Relocation func; }; void Install() { REL::Relocation target{ REL::RelocationID(87887, 90256), REL::Relocate(0x9F, 0x16F) }; auto& trampoline = SKSE::GetTrampoline(); SKSE::AllocTrampoline(14); BinkListener::func = trampoline.write_call<5>(target.address(), BinkListener::thunk); } }