forked from HydrogensaysHDT/hdt-skyrimse-mods
/
Hooks.cpp
99 lines (80 loc) · 2.23 KB
/
Hooks.cpp
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <detours.h>
#include "skse64/NiObjects.h"
#include "Hooks.h"
#include "HookEvents.h"
#include "Offsets.h"
namespace hdt
{
struct Unk001CB0E0
{
MEMBER_FN_PREFIX(Unk001CB0E0);
DEFINE_MEMBER_FN_HOOK(unk001CB0E0, NiAVObject*, offset::ArmorAttachFunction, NiNode* armor, NiNode* skeleton, void* unk3, char unk4, char unk5, void* unk6);
NiAVObject* unk001CB0E0(NiNode* armor, NiNode* skeleton, void* unk3, char unk4, char unk5, void* unk6)
{
ArmorAttachEvent event;
event.armorModel = armor;
event.skeleton = skeleton;
g_armorAttachEventDispatcher.dispatch(event);
auto ret = CALL_MEMBER_FN(this, unk001CB0E0)(armor, skeleton, unk3, unk4, unk5, unk6);
event.attachedNode = ret;
event.hasAttached = true;
g_armorAttachEventDispatcher.dispatch(event);
return ret;
}
};
void hookArmor()
{
DetourAttach((void**)Unk001CB0E0::_unk001CB0E0_GetPtrAddr(), (void*)GetFnAddr(&Unk001CB0E0::unk001CB0E0));
}
void unhookArmor()
{
DetourDetach((void**)Unk001CB0E0::_unk001CB0E0_GetPtrAddr(), (void*)GetFnAddr(&Unk001CB0E0::unk001CB0E0));
}
struct UnkEngine
{
MEMBER_FN_PREFIX(UnkEngine);
DEFINE_MEMBER_FN_HOOK(onFrame, void, offset::GameLoopFunction);
void onFrame();
char unk[0x16];
bool gamePaused; // 16
};
void UnkEngine::onFrame()
{
CALL_MEMBER_FN(this, onFrame)();
FrameEvent e;
e.gamePaused = this->gamePaused;
g_frameEventDispatcher.dispatch(e);
}
auto oldShutdown = (void (*)(bool))(RelocationManager::s_baseAddr + offset::GameShutdownFunction);
void shutdown(bool arg0)
{
g_shutdownEventDispatcher.dispatch(ShutdownEvent());
oldShutdown(arg0);
}
void hookEngine()
{
DetourAttach((void**)UnkEngine::_onFrame_GetPtrAddr(), (void*)GetFnAddr(&UnkEngine::onFrame));
DetourAttach((void**)&oldShutdown, (void*)shutdown);
}
void unhookEngine()
{
DetourDetach((void**)UnkEngine::_onFrame_GetPtrAddr(), (void*)GetFnAddr(&UnkEngine::onFrame));
DetourDetach((void**)&oldShutdown, (void*)shutdown);
}
void hookAll()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
hookEngine();
hookArmor();
DetourTransactionCommit();
}
void unhookAll()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
unhookEngine();
unhookArmor();
DetourTransactionCommit();
}
}