-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
ikeeponwalking.ixx
83 lines (75 loc) · 3.2 KB
/
ikeeponwalking.ixx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module;
#include <common.hxx>
export module ikeeponwalking;
import common;
import settings;
import natives;
class IKeepOnWalking
{
public:
IKeepOnWalking()
{
FusionFix::onInitEventAsync() += []()
{
CIniReader iniReader("");
static int32_t nWalkKey = iniReader.ReadInteger("MISC", "WalkKey", VK_MENU);
static bool bDoNotRunInside = iniReader.ReadInteger("MISC", "DoNotRunInside", 0) != 0;
auto pattern = hook::pattern("D9 44 24 18 5F 5B 5D");
static auto flag = false;
if (!pattern.empty())
flag = true;
else
pattern = hook::pattern("D9 44 24 1C 5E 5B 5D");
static uintptr_t loc_A2A60F = (uintptr_t)pattern.get_first(0);
pattern = hook::pattern("80 F9 7F 76 57");
struct SprintHook
{
void operator()(injector::reg_pack& regs)
{
if ((*(uint8_t*)(regs.eax + 4) ^ *(uint8_t*)(regs.eax + 6)) <= 127)
{
if (*(float*)(regs.esp + (flag ? 0x14 : 0x1C)) > 1.0f)
*(float*)(regs.esp + (flag ? 0x18 : 0x1C)) = 1.0f;
*(uintptr_t*)(regs.esp - 4) = loc_A2A60F;
}
auto alwaysrunPref = FusionFixSettings.GetRef("PREF_ALWAYSRUN");
auto bShouldRun = alwaysrunPref->get();
auto bDontRunNow = bShouldRun && bDoNotRunInside && Natives::IsInteriorScene();
if (!FusionFixSettings.Get("PREF_SPRINT")) // toggle
{
if (bShouldRun)
{
static auto bRunState = true;
static auto oldWalkKeyState = GetAsyncKeyState(nWalkKey);
auto curWalkKeyState = GetAsyncKeyState(nWalkKey);
if (curWalkKeyState != oldWalkKeyState)
bRunState = !bRunState;
oldWalkKeyState = curWalkKeyState;
if (bRunState)
{
if (!bDontRunNow)
*(float*)(regs.esp + (flag ? 0x18 : 0x1C)) = 1.0f;
}
}
}
else if (bShouldRun && !GetAsyncKeyState(nWalkKey)) // hold
{
if (!bDontRunNow)
*(float*)(regs.esp + (flag ? 0x18 : 0x1C)) = 1.0f;
}
}
}; injector::MakeInline<SprintHook>(pattern.get_first(0));
pattern = find_pattern("77 5F 8B 8E", "77 46 8B 8F");
static raw_mem GamepadCB(pattern.get_first(0), { 0x90, 0x90 }); // NOP
FusionFixSettings.SetCallback("PREF_ALWAYSRUN", [](int32_t value)
{
if (value)
GamepadCB.Write();
else
GamepadCB.Restore();
});
if (FusionFixSettings("PREF_ALWAYSRUN"))
GamepadCB.Write();
};
}
} IKeepOnWalking;