Patched the Quick Stats hotkey to open the hero menu

This commit is contained in:
Eddoursul 2023-12-18 14:04:00 +01:00
parent 2b3f294bb4
commit 4e2e2166c6
6 changed files with 35 additions and 236 deletions

BIN
SKSE/Plugins/EnderalSE.dll (Stored with Git LFS)

Binary file not shown.

View File

@ -1,217 +0,0 @@
// 1st field: User event name. DO NOT ALTER! This field is used to ID events in the code
// 2nd: Keyboard key ID that will proc this event. A value of 0xff means the event is unmapped for this device.
// 3rd: Mouse button ID that will proc this event.
// 4th: Gamepad button ID that will proc this event.
// 5th: If set to 1, this event can be remapped to a keyboard key
// 6th: If set to 1, this event can be remapped to a mouse button
// 7th: If set to 1, this event can be remapped to a gamepad button
// 8th (Optional): User event binary flag. Used to group together related user events, like "Movement" or
// "Menu", so they can be toggled on and off together
//
// Blank lines signify the start of a new input context.
// See ControlMap.h for more details on input contexts.
//
// Main Gameplay
Forward 0x11 0xff 0xff 1 1 0 0x801
Back 0x1f 0xff 0xff 1 1 0 0x801
Strafe Left 0x1e 0xff 0xff 1 1 0 0x801
Strafe Right 0x20 0xff 0xff 1 1 0 0x801
Move 0xff 0xff 0x000b 0 0 0 0x801
Look 0xff 0xa 0x000c 0 0 0 0x2
Left Attack/Block 0xff 0x1 0x0009 1 1 1 0x841
Right Attack/Block 0xff 0x0 0x000a 1 1 1 0x841
Activate 0x12 0xff 0x1000 1 1 1 0x804
Ready Weapon 0x13 0xff 0x4000 1 1 1 0x840
Tween Menu 0x0f 0xff 0x2000 1 1 1 0x908
Toggle POV 0x21 0xff 0x0080 1 1 1 0x820
Zoom Out 0xff 0x9 0xff 0 0 0 0x220
Zoom In 0xff 0x8 0xff 0 0 0 0x220
Jump 0x39 0xff 0x8000 1 1 1 0xC01
Sprint 0x38 0xff 0x0100 1 1 1 0x801
Shout 0x2c 0xff 0x0200 1 1 1 0x840
Sneak 0x1d 0xff 0x0040 1 1 1 0x881
Run 0x2a 0xff 0xff 1 1 0 0x801
Toggle Always Run 0x3a 0xff 0xff 1 1 0 0x801
Auto-Move 0x2e 0xff 0xff 1 1 0 0x801
Favorites 0x10 0xff 0x0001,0x0002 1 1 0 0x908
Hotkey1 0x02,0x4f 0xff 0x0004 0 0 0 0x908
Hotkey2 0x03,0x50 0xff 0x0008 0 0 0 0x908
Hotkey3 0x04,0x51 0xff 0xff 0 0 0 0x908
Hotkey4 0x05,0x4b 0xff 0xff 0 0 0 0x908
Hotkey5 0x06,0x4c 0xff 0xff 0 0 0 0x908
Hotkey6 0x07,0x4d 0xff 0xff 0 0 0 0x908
Hotkey7 0x08,0x47 0xff 0xff 0 0 0 0x908
Hotkey8 0x09,0x48 0xff 0xff 0 0 0 0x908
Quicksave 0x3f 0xff 0xff 1 0 0
Quickload 0x43 0xff 0xff 1 0 0
Wait 0x14 0xff 0x0020 1 1 1 0x808
Journal 0x24 0xff 0x0010 1 1 1 0x808
Pause 0x1 0xff 0xff 1 1 0 0x8
Screenshot 0xb7 0xff 0xff 0 0 0
Multi-Screenshot 0x1d+0xb7,0x9d+0xb7 0xff 0xff 0 0 0
Console 0x29,0x94 0xff 0xff 0 0 0 0x10
CameraPath 0x58 0xff 0xff 0 0 0
Quick Inventory 0x17 0xff 0xff 1 1 0 0x908
Quick Magic 0x19 0xff 0xff 1 1 0 0x908
Quick Stats 0xff 0xff 0xff 0 1 0 0x908
Quick Map 0x32 0xff 0xff 1 1 0 0x908
// Menu Mode
Accept !0,Activate !0,Activate !0,Activate 0 0 0 0x8
Cancel !0,Tween Menu,!0,Pause !0,Tween Menu,!0,Pause !0,Tween Menu 0 0 0 0x8
Up !0,Forward !0,Forward 0x0001 0 0 0 0x8
Down !0,Back !0,Back 0x0002 0 0 0 0x8
Left !0,Strafe Left !0,Strafe Left 0x0004 0 0 0 0x8
Right !0,Strafe Right !0,Strafe Right 0x0008 0 0 0 0x8
Left Stick 0xff 0xff 0x000b 0 0 0 0x8
Console 0x29 0xff 0xff 0 0 0 0x10
// Console
PickPrevious 0xff 0x8 0x0002 0 0 0 0x10
PickNext 0xff 0x9 0x0001 0 0 0 0x10
Up 0xc8 0xff 0xff 0 0 0 0x10
Down 0xd0 0xff 0xff 0 0 0 0x10
PageUp 0xc9 0xff 0xff 0 0 0 0x10
PageDown 0xd1 0xff 0xff 0 0 0 0x10
Console 0x29 0xff 0xff 0 0 0 0x10
NextFocus 0x0f 0xff 0x0200 0 0 0 0x10
PreviousFocus 0x2a+0x0f,0x36+0x0f 0xff 0x0100 0 0 0 0x10
// Item Menus
LeftEquip !0,Left Attack/Block !0,Left Attack/Block !0,Left Attack/Block 0 0 0 0x8
RightEquip !0,Right Attack/Block !0,Right Attack/Block !0,Right Attack/Block 0 0 0 0x8
Item Zoom 0x2e 0xff !0,Toggle POV 0 0 0 0x8
Rotate 0xff 0xff 0x000c 0 0 0 0x8
XButton !0,Ready Weapon !0,Ready Weapon !0,Ready Weapon 0 0 0 0x8
YButton !0,Toggle POV !0,Toggle POV !0,Jump 0 0 0 0x8
Cursor 0xff 0xa 0xff 0 0 0 0x8
// Inventory
ChargeItem !0,Wait !0,Wait !0,Shout 0 0 0 0x8
// Debug Text
PrevPage 0xc8 0xff 0xff 0 0 0 0x10
NextPage 0xd0 0xff 0xff 0 0 0 0x10
PrevSubPage 0xc9 0xff 0xff 0 0 0 0x10
NextSubPage 0xd1 0xff 0xff 0 0 0 0x10
// Favorites menu
Up !0,Forward !0,Forward 0x0001 0 0 0 0x8
Down !0,Back !0,Back 0x0002 0 0 0 0x8
Accept !0,Activate !0,Activate !0,Activate 0 0 0 0x8
Cancel !0,Favorites,!0,Tween Menu,!0,Pause !0,Favorites,!0,Tween Menu,!0,Pause !0,Tween Menu 0 0 0 0x8
Left Stick 0xff 0xff 0x000b 0 0 0 0x8
Cursor 0xff 0xa 0xff 0 0 0 0x8
// Map Menu
Cancel !0,Tween Menu,!0,Pause !0,Tween Menu,!0,Pause !0,Tween Menu 0 0 0 0x8
Look 0xff 0xff 0x000c 0 0 0 0x8
Zoom In 0xff 0x8 !0,Right Attack/Block 0 0 0 0x8
Zoom Out 0xff 0x9 !0,Left Attack/Block 0 0 0 0x8
MapLookMode 0xff 0x1 0xff 0 0 0 0x8
Click 0xff 0xff 0x1000 0 0 0 0x8
PlacePlayerMarker 0x19 0xff 0xff 0 0 0 0x8
Cursor 0xff 0xa 0x000b 0 0 0 0x8
PlayerPosition 0x12 0xff 0x8000 0 0 0 0x8
LocalMap 0x26 0xff 0x4000 0 0 0 0x8
LocalMapMoveMode 0xff 0x0 0xff 0 0 0 0x8
Journal 0x24 0xff 0x0010 0 0 0 0x8
Up !0,Forward !0,Forward 0xff 0 0 0 0x8
Down !0,Back !0,Back 0xff 0 0 0 0x8
Left !0,Strafe Left !0,Strafe Left 0xff 0 0 0 0x8
Right !0,Strafe Right !0,Strafe Right 0xff 0 0 0 0x8
// Stats
Rotate 0xff 0xff 0x000b 0 0 0 0x8
YButton !0,Toggle POV !0,Toggle POV !0,Jump 0 0 0 0x8
// Cursor
Cursor 0xff 0xa 0x000c 0 0 0 0x10
Click 0xff 0x0 0x1000 0 0 0 0x10
// Book
PrevPage 0xcb,0x1e 0x0,0x9 0x0004 0 0 0 0x8
NextPage 0xcd,0x20 0x1,0x8 0x0008 0 0 0 0x8
// Debug overlay
Console 0x29 0xff 0xff 0 0 0 0x10
NextFocus 0x0f 0xff 0x0200 0 0 0 0x10
PreviousFocus 0x2a+0x0f,0x36+0x0f 0xff 0x0100 0 0 0 0x10
Up 0xc8 0xff 0x0001 0 0 0 0x10
Down 0xd0 0xff 0x0002 0 0 0 0x10
Left 0xcb 0xff 0x0004 0 0 0 0x10
Right 0xcd 0xff 0x0008 0 0 0 0x10
PageUp 0xc9 0xff 0xff 0 0 0 0x10
PageDown 0xd1 0xff 0xff 0 0 0 0x10
ToggleMinimize 0x3f 0xff 0x0020 0 0 0 0x10
ToggleMove 0x3e 0xff 0x0080 0 0 0 0x10
Close 0x40 0xff 0xff 0 0 0 0x10
F1 0x3b 0xff 0xff 0 0 0 0x10
F2 0x3c 0xff 0xff 0 0 0 0x10
F3 0x3d 0xff 0xff 0 0 0 0x10
F7 0x41 0xff 0xff 0 0 0 0x10
F8 0x42 0xff 0xff 0 0 0 0x10
F9 0x43 0xff 0xff 0 0 0 0x10
F10 0x44 0xff 0xff 0 0 0 0x10
F11 0x57 0xff 0xff 0 0 0 0x10
F12 0x58 0xff 0xff 0 0 0 0x10
LTrigger 0xff 0xff 0x0009 0 0 0 0x10
RTrigger 0xff 0xff 0x000a 0 0 0 0x10
Backspace 0x0e 0xff 0xff 0 0 0 0x10
Enter 0x1c 0xff 0xff 0 0 0 0x10
B 0xff 0xff 0x2000 0 0 0 0x10
Y 0xff 0xff 0x8000 0 0 0 0x10
X 0xff 0xff 0x4000 0 0 0 0x10
// Journal
Zoom In 0xff 0x8 0xff 0 0 0 0x8
Zoom Out 0xff 0x9 0xff 0 0 0 0x8
XButton 0x2d,0x32 0xff !0,Ready Weapon 0 0 0 0x8
YButton 0x14 0xff !0,Jump 0 0 0 0x8
TabSwitch 0xff 0xff !0,Left Attack/Block,!0,Right Attack/Block 0 0 0 0x8
// TFC mode
CameraZUp 0xff 0x8 0x000a 0 0 0
CameraZDown 0xff 0x9 0x0009 0 0 0
WorldZUp 0xff 0x0 0x0200 0 0 0
WorldZDown 0xff 0x1 0x0100 0 0 0
LockToZPlane 0xff 0xff 0x4000 0 0 0
// Debug Map Menu-like mode (but not the actual map menu)
Look 0xff 0xff 0x000c 0 0 0 0x8
Zoom In 0xff 0x8 0x000a 0 0 0 0x8
Zoom Out 0xff 0x9 0x0009 0 0 0 0x8
Move 0xff 0xa 0x000b 0 0 0 0x8
// Lockpicking
RotatePick 0xff 0xa 0x000b 0 0 0 0x8
RotateLock !0,Forward,!0,Back,!0,Strafe Left,!0,Strafe Right !0,Forward,!0,Back,!0,Strafe Left,!0,Strafe Right 0x000c 0 0 0 0x8
DebugMode 0x35 0xff 0x4000 0 0 0 0x8
Cancel !0,Tween Menu,!0,Pause !0,Tween Menu,!0,Pause !0,Tween Menu 0 0 0 0x8
// Creations Menu
Accept 0x12,0x1c 0xff 0x1000 0 0 0 0x8
Cancel 0x0f,0x1 0xff 0x2000 0 0 0 0x8
Up 0x11,0xc8 0xff 0x0001 0 0 0 0x8
Down 0x1f,0xd0 0xff 0x0002 0 0 0 0x8
Left 0x1e,0xcb 0xff 0x0004 0 0 0 0x8
Right 0x20,0xcd 0xff 0x0008 0 0 0 0x8
HomeKey 0xc7 0xff 0xff 0 0 0 0x8
EndKey 0xcf 0xff 0xff 0 0 0 0x8
DeleteKey 0xd3 0xff 0xff 0 0 0 0x8
MouseClickAccept 0xff 0x0 0xff 0 0 0 0x8
Options 0x18 0xff 0x0010 0 0 0 0x8
Left Stick 0xff 0xff 0x000b 0 0 0 0x8
Console 0x29 0xff 0xff 0 0 0 0x10
MouseScrollDown 0xff 0x9 0xff 0 0 0 0x8
MouseScrollUp 0xff 0x8 0xff 0 0 0 0x8
LoadOrderAndDelete 0x14 0xff 0x8000 0 0 0 0x8
CategorySideBar 0x2a 0xff 0x0009 0 0 0 0x8
LikeUnlike 0x26 0xff 0x0200 0 0 0 0x8
SearchEdit 0x2d 0xff 0x0100 0 0 0 0x8
Filter 0x2f 0xff 0x000a 0 0 0 0x8
F1 0x3b 0xff 0xff 0 0 0 0x8
PurchaseCredits 0x19 0xff 0x4000 0 0 0 0x8
// Favor
Cancel !0,Tween Menu,!0,Pause !0,Tween Menu,!0,Pause !0,Tween Menu 0 0 0 0x108

View File

@ -15,6 +15,6 @@ namespace AchievementFix
} }
std::uint8_t code[] = { 0xB0, 0x00, 0xC3, NOP }; std::uint8_t code[] = { 0xB0, 0x00, 0xC3, NOP };
REL::safe_write(target.address(), code, 4); REL::safe_write(target.address(), code, sizeof(code));
} }
} }

View File

@ -49,7 +49,7 @@ auto EventListener::ProcessEvent(
if (a_event->menuName == RE::DialogueMenu::MENU_NAME) { if (a_event->menuName == RE::DialogueMenu::MENU_NAME) {
// Make sure Tab is not blocked. If it should be, a Papyrus script will block it a few frames later. // Make sure Tab is not blocked. If it should be, a Papyrus script will block it a few frames later.
DialogueMenuPatch::BlockTab(false); DialogueMenuPatch::BlockTab(false);
} else if (a_event->menuName == "CustomMenu") { } else if (a_event->menuName == "CustomMenu" && RE::UI::GetSingleton()->IsMenuOpen(RE::TweenMenu::MENU_NAME)) {
CloseTweenMenu(); CloseTweenMenu();
} }
} else { } else {

View File

@ -2,8 +2,6 @@
namespace MapMarkerPlacement namespace MapMarkerPlacement
{ {
constexpr std::uint8_t NOP{ 0x90 };
struct IsFastTravelEnabled struct IsFastTravelEnabled
{ {
static bool thunk(RE::PlayerCharacter* a_this, bool a_hideNotification) static bool thunk(RE::PlayerCharacter* a_this, bool a_hideNotification)
@ -38,8 +36,8 @@ namespace MapMarkerPlacement
// Place a marker without asking, if a location isn't discovered yet // Place a marker without asking, if a location isn't discovered yet
REL::Relocation<std::uintptr_t> target2{ REL::RelocationID(52208, 53095), REL::Relocate(0x17A, 0x183) }; REL::Relocation<std::uintptr_t> target2{ REL::RelocationID(52208, 53095), REL::Relocate(0x17A, 0x183) };
std::uint8_t code[] = { 0xB0, 0x01, NOP, NOP, NOP }; std::uint8_t code[] = { 0xB0, 0x01, REL::NOP, REL::NOP, REL::NOP };
REL::safe_write(target2.address(), code, 5); REL::safe_write(target2.address(), code, sizeof(code));
logger::info("Applied undiscovered map marker placement fix"sv); logger::info("Applied undiscovered map marker placement fix"sv);
} }

View File

@ -1,12 +1,5 @@
#pragma once #pragma once
inline void OpenMenu(RE::IMenu* tweenMenu, std::int32_t index)
{
using func_t = decltype(&OpenMenu);
REL::Relocation<func_t> func{ REL::RelocationID(51845, 51845) };
return func(tweenMenu, index);
}
class TweenMenuPatch final : public RE::TweenMenu class TweenMenuPatch final : public RE::TweenMenu
{ {
public: public:
@ -14,10 +7,35 @@ public:
{ {
REL::Relocation<uintptr_t> vtbl(RE::VTABLE_TweenMenu[0]); REL::Relocation<uintptr_t> vtbl(RE::VTABLE_TweenMenu[0]);
_AcceptFn = vtbl.write_vfunc(0x1, &AcceptEx); _AcceptFn = vtbl.write_vfunc(0x1, &AcceptEx);
REL::Relocation<std::uintptr_t> target{ REL::RelocationID(51400, 52249), REL::Relocate(0x409, 0x421) };
REL::safe_fill(target.address(), REL::NOP, 45);
auto& trampoline = SKSE::GetTrampoline();
SKSE::AllocTrampoline(14);
_OpenStats = trampoline.write_call<5>(target.address(), OpenStats);
REL::Relocation<std::uintptr_t> target2{ REL::RelocationID(51400, 52249), REL::Relocate(0x409, 0x439) };
std::uint8_t code[] = { 0x40, 0xB5, 0x01 };
REL::safe_write(target2.address(), code, sizeof(code));
}
static uint64_t OpenStats(uint32_t arg_1, uint32_t arg_2, uint32_t arg_3, uint32_t arg_4, uint32_t arg_5)
{
SKSE::ModCallbackEvent modEvent{ "Enderal_OpenHeroMenu", "", 0.0f, nullptr };
SKSE::GetModCallbackEventSource()->SendEvent(&modEvent);
return 0;
} }
private: private:
static void OpenMenu(RE::IMenu* tweenMenu, std::int32_t index)
{
using func_t = decltype(&OpenMenu);
REL::Relocation<func_t> func{ REL::RelocationID(51845, 52718) };
return func(tweenMenu, index);
}
void AcceptEx(CallbackProcessor* a_cbReg) void AcceptEx(CallbackProcessor* a_cbReg)
{ {
_AcceptFn(this, a_cbReg); _AcceptFn(this, a_cbReg);
@ -26,14 +44,14 @@ private:
a_cbReg->Process("OpenHighlightedMenu", [](const RE::FxDelegateArgs& args) { a_cbReg->Process("OpenHighlightedMenu", [](const RE::FxDelegateArgs& args) {
auto index = args[0].GetSInt(); auto index = args[0].GetSInt();
if (index <= 1) { if (index <= 1) {
RE::BSTSmartPointer<RE::BSScript::IStackCallbackFunctor> stackCallback; SKSE::ModCallbackEvent modEvent{ "Enderal_OpenHeroMenu", "", 0.0f, nullptr };
RE::BSScript::Internal::VirtualMachine::GetSingleton()->DispatchStaticCall("_00E_HeroMenu", "Show", RE::MakeFunctionArguments(), stackCallback); SKSE::GetModCallbackEventSource()->SendEvent(&modEvent);
} else if (index <= 4) { } else if (index <= 4) {
OpenMenu(RE::UI::GetSingleton()->GetMenu(MENU_NAME).get(), index); OpenMenu(RE::UI::GetSingleton()->GetMenu(MENU_NAME).get(), index);
} }
}); });
} }
using AcceptFn = decltype(&Accept); inline static REL::Relocation<decltype(&Accept)> _AcceptFn;
inline static REL::Relocation<AcceptFn> _AcceptFn; inline static REL::Relocation<decltype(OpenStats)> _OpenStats;
}; };