Skip to content

Instantly share code, notes, and snippets.

@Andre-3001
Last active December 21, 2023 19:14
  • Star 3 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
Star You must be signed in to star a gist
Embed
What would you like to do?
Long Keyboard v83 - Stable Beta Release
//### Readme:
//### ARRAYS - These go at the top of the file, or in a header or somewhere. Not inside Client::Functions
//### CLIENT EDITS - These go inside a function in the client class. ("Client::UpdateGame", etc.)
//### CODECAVES CLIENT EDITS - Same as Client Edits
//### CODECAVES - In a header or somewhere, as long as they are "#include#" in the file you call them from.
//### Enjoy, have fun, be nice, report bugs.
// ARRAYS ----
unsigned char Array_aDefaultQKM[] = {
42, 0, 0, 0,
82, 0, 0, 0,
71, 0, 0, 0,
73, 0, 0, 0,
2, 0, 0, 0,
3, 0, 0, 0,
4, 0, 0, 0,
5, 0, 0, 0,
6, 0, 0, 0,
30, 0, 0, 0,
31, 0, 0, 0,
32, 0, 0, 0,
33, 0, 0, 0,
29, 0, 0, 0,
83, 0, 0, 0,
79, 0, 0, 0,
81, 0, 0, 0,
16, 0, 0, 0,
17, 0, 0, 0,
18, 0, 0, 0,
19, 0, 0, 0,
20, 0, 0, 0,
44, 0, 0, 0,
45, 0, 0, 0,
46, 0, 0, 0,
47, 0, 0, 0,
52, 0, 0, 0
};
// 0x00BE2DB0 confirmed, s_ptShortKeyPos
unsigned char Array_ptShortKeyPos[] = {
7, 0, 0, 0,
8, 0, 0, 0,
42, 0, 0, 0,
8, 0, 0, 0,
77, 0, 0, 0,
8, 0, 0, 0,
112, 0, 0, 0,
8, 0, 0, 0,
147, 0, 0, 0,
8, 0, 0, 0,
182, 0, 0, 0,
8, 0, 0, 0,
217, 0, 0, 0,
8, 0, 0, 0,
252, 0, 0, 0,
8, 0, 0, 0,
287, 1, 0, 0,
8, 0, 0, 0,
322, 1, 0, 0,
8, 0, 0, 0,
357, 1, 0, 0,
8, 0, 0, 0,
392, 1, 0, 0,
8, 0, 0, 0,
427, 1, 0, 0,
8, 0, 0, 0,
7, 0, 0, 0,
41, 0, 0, 0,
42, 0, 0, 0,
41, 0, 0, 0,
77, 0, 0, 0,
41, 0, 0, 0,
112, 0, 0, 0,
41, 0, 0, 0,
147, 0, 0, 0,
41, 0, 0, 0,
182, 0, 0, 0,
41, 0, 0, 0,
217, 0, 0, 0,
41, 0, 0, 0,
252, 0, 0, 0,
41, 0, 0, 0,
287, 1, 0, 0,
41, 0, 0, 0,
322, 1, 0, 0,
41, 0, 0, 0,
357, 1, 0, 0,
41, 0, 0, 0,
392, 1, 0, 0,
41, 0, 0, 0,
427, 1, 0, 0,
41, 0, 0, 0
};
//Variant of Array_ptShortKeyPos
unsigned char Array_ptShortKeyPos_Fixed_Tooltips[] = {
7,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,147,0,0,0,0,0,0,0,182,0,0,0,0,0,0,0,217,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,287,1,0,0,0,0,0,0,322,1,0,0,0,0,0,0,357,1,0,0,0,0,0,0,392,1,0,0,0,0,0,0,427,1,0,0,0,0,0,0,7,0,0,0,33,0,0,0,42,0,0,0,33,0,0,0,77,0,0,0,33,0,0,0,112,0,0,0,33,0,0,0,147,0,0,0,33,0,0,0,182,0,0,0,33,0,0,0,217,0,0,0,33,0,0,0,252,0,0,0,33,0,0,0,287,1,0,0,33,0,0,0,322,1,0,0,33,0,0,0,357,1,0,0,33,0,0,0,392,1,0,0,33,0,0,0,427,1,0,0,33,0,0,0
};// This array will fix the janky offset of the tooltips
// s_aDefaultQKM_0
unsigned char Array_aDefaultQKM_0[] = {
42, 0, 0, 0,
82, 0, 0, 0,
71, 0, 0, 0,
73, 0, 0, 0, //4
29, 0, 0, 0,
83, 0, 0, 0,
79, 0, 0, 0,
81, 0, 0, 0, //8
42, 0, 0, 0,
82, 0, 0, 0,
71, 0, 0, 0,
73, 0, 0, 0, //12
29, 0, 0, 0,
83, 0, 0, 0,
79, 0, 0, 0,
81, 0, 0, 0, //16
84, 0, 0, 0,
85, 0, 0, 0,
86, 0, 0, 0,
87, 0, 0, 0, //20
88, 0, 0, 0,
89, 0, 0, 0,
29, 0, 0, 0,
29, 0, 0, 0, //24
29, 0, 0, 0,
29, 0, 0, 0,
29, 0, 0, 0,
};
unsigned char Array_Expanded[312] = { 4, 4, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 2, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 3, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 5, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 6, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 7, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 8, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 10, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 11, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 12, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 13, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 14, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 15, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 16, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 17, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 23, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 24, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 25, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 26, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
4, 27, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
5, 50, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
5, 51, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
5, 52, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
5, 53, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0 };
unsigned char Array_Expanded_Testing_Cooldown_fix[312] = { 0 };
unsigned char cooldown_Array[124] = { 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255,255, 255, 255, 255 };
// CLIENT EDITS ----
// CUIStatusBar::OnCreate
Memory::WriteByte(0x008D155C + 1, 0xF0); // Draw rest of quickslot bar
Memory::WriteByte(0x008D155C + 2, 0x03);
Memory::WriteByte(0x008D182E + 1, 0xF0); // Draw rest of hotkeys
Memory::WriteByte(0x008D182E + 2, 0x03);
Memory::WriteByte(0x008D1AC0 + 1, 0xF0); // Draw rest of cooldowns, who tf knows why. TY Rulax
Memory::WriteByte(0x008D1AC0 + 2, 0x03);
//----CQuickslotKeyMappedMan::CQuickslotKeyMappedMan?????
Memory::WriteInt(0x0072B7CE + 1, (DWORD)&Array_aDefaultQKM_0);
Memory::WriteInt(0x0072B8EB +1, (DWORD)&Array_aDefaultQKM_0);
//----CUIStatusBar::CQuickSlot::CompareValidateFuncKeyMappedInfo
Memory::WriteByte(0x008DD916, 0x1A); // increase 8 --> 26
Memory::WriteByte(0x008DD8AD, 0x1A); // increase 8 --> 26
Memory::WriteByte(0x008DD8FD, 0xBB);
Memory::WriteInt(0x008DD8FD + 1, (DWORD)&Array_Expanded);
Memory::WriteByte(0x008DD8FD + 5, 0x90); //Errant byte
Memory::WriteByte(0x008DD898, 0xB8);
Memory::WriteInt(0x008DD898 + 1, (DWORD)&Array_Expanded);
Memory::WriteByte(0x008DD898 + 5, 0x90); //Errant Byte
//----CUIStatusBar::CQuickSlot::Draw
Memory::WriteByte(0x008DE75E+3, 0x6C);
Memory::WriteByte(0x008DDF99, 0xB8);
Memory::WriteInt(0x008DDF99 + 1, (DWORD)&Array_Expanded);
Memory::FillBytes(0x008DDF99 + 5, 0x90, 3); // Nopping errant operations
//----CUIStatusBar::OnMouseMove
Memory::WriteByte(0x008D7F1E + 1, 0x34);
Memory::WriteByte(0x008D7F1E + 2, 0x85);
Memory::WriteInt(0x008D7F1E + 3, (DWORD)&Array_Expanded);
//----CUIStatusBar::CQuickSlot::GetPosByIndex
Memory::WriteInt(0x008DE94D + 2, (DWORD)&Array_ptShortKeyPos);
Memory::WriteInt(0x008DE955 + 2, (DWORD)&Array_ptShortKeyPos + 4);
Memory::WriteByte(0x008DE941 + 2, 0x1A); //change cmp 8 --> cmp 26
//CUIStatusBar::GetShortCutIndexByPos
Memory::WriteInt(0x008DE8F4 + 1, (DWORD)&Array_ptShortKeyPos_Fixed_Tooltips + 4);
Memory::WriteByte(0x008DE926 + 1, 0x3E);
//CUIStatusBar::CQuickSlot::DrawSkillCooltime
Memory::WriteByte(0x008E099F + 3, 0x1A);
Memory::WriteByte(0x008E069D, 0xBE);
Memory::WriteInt(0x008E069D + 1, (DWORD)&cooldown_Array); //Pass enlarged FFFFF array
Memory::WriteByte(0x008E069D + 5, 0x90); //Errant byte
Memory::WriteByte(0x008E06A3, 0xBF);
Memory::WriteInt(0x008E06A3 + 1, (DWORD)&Array_Expanded + 1);
Memory::WriteByte(0x008E06A3 + 5, 0x90);
//----CDraggableMenu::OnDropped
Memory::WriteByte(0x004F928A + 2, 0x1A); //change cmp 8 --> cmp 26
//----CDraggableMenu::MapFuncKey
Memory::WriteByte(0x004F93F9 + 2, 0x1A); //change cmp 8 --> cmp 26
//----CUIKeyConfig::OnDestroy
Memory::WriteByte(0x00833797 + 2, 0x6C); // Updates the offset to 108 (triple) (old->24h)
Memory::WriteByte(0x00833841 + 2, 0x6C); // Updates the offset to 108 (triple) (old->24h)
Memory::WriteByte(0x00833791 + 1, 0x68); // push 68h (triple)
Memory::WriteByte(0x0083383B + 1, 0x68); // push 68h (triple)
//----CUIKeyConfig::~CUIKeyConfig
Memory::WriteByte(0x0083287F + 2, 0x6C); // triple the base value at this hex (old->24h)
Memory::WriteByte(0x00832882 + 1, 0x68); // push 68h (triple)
//----CQuickslotKeyMappedMan::SaveQuickslotKeyMap
Memory::WriteByte(0x0072B8C0 + 2, 0x6C); // triple the base value at this hex (old->24h)
Memory::WriteByte(0x0072B8A0 + 1, 0x68); // push 68h, (triple) //CQuickslotKeyMappedMan::SaveQuickslotKeyMap
Memory::WriteByte(0x0072B8BD + 1, 0x68); // push 68h, (triple) //CQuickslotKeyMappedMan::SaveQuickslotKeyMap
//----CQuickslotKeyMappedMan::OnInit
Memory::WriteByte(0x0072B861 + 1, 0x68); // push 68h (triple) (these ones might have to be just 60)
Memory::WriteByte(0x0072B867 + 2, 0x6C); // triple the base value at this hex (old->24h)
//----CUIKeyConfig::CNoticeDlg::OnChildNotify????
Memory::WriteByte(0x00836A1E + 1, 0x68); // push 68h (triple)
Memory::WriteByte(0x00836A21 + 2, 0x6C); // triple the base value at this hex (old->24h)
// CODECAVES CLIENT EDITS ----
Memory::CodeCave(CompareValidateFuncKeyMappedInfo_cave, 0x8DD8B8, 5);
Memory::CodeCave(sub_9FA0CB_cave, 0x9FA0DB, 5);
Memory::CodeCave(sDefaultQuickslotKeyMap_cave, 0x72B7BC, 5);
Memory::CodeCave(DefaultQuickslotKeyMap_cave, 0x72B8E6, 5);
Memory::CodeCave(Restore_Array_Expanded, 0x008CFDFD, 6); //restores the skill array to 0s
// CODECAVES ---
DWORD Array_aDefaultQKM_Address = (DWORD)&Array_aDefaultQKM;
DWORD Array_mystery_Address = (DWORD)&Array_Expanded;
DWORD Array_mystery_Address_plus = (DWORD)&Array_Expanded+1;
DWORD cooldown_Array_Address = (DWORD)&cooldown_Array;
DWORD Array_Expanded_Testing_Cooldown_fix_Address = (DWORD)&Array_Expanded_Testing_Cooldown_fix;
DWORD CompareValidate_Retn = 0x8DD8BD;
_declspec(naked) void CompareValidateFuncKeyMappedInfo_cave()
{
_asm
{
push 0x138;
push 0x0;
push eax;
pushad;
popad;
jmp CompareValidate_Retn
//push 0x8DD8BD;
//ret;
}
}
DWORD sub_9FA0CB_cave_retn_1 = 0x9FA0E1;
_declspec(naked) void sub_9FA0CB_cave()
{
_asm {
test eax, eax;
jne label;
push 0xD4;
pushad;
popad;
// -> ZAllocEx<ZAllocAnonSelector>::Alloc(ZAllocEx<ZAllocAnonSelector>::_s_alloc, 0x44u);
//push 0x9FA0E1;
//ret;
jmp sub_9FA0CB_cave_retn_1
label:
push 0x138;
push 0x0;
push eax;
pushad;
popad;
// -> memset(this + 0xD20, 0, 0x60u);
//push 0x8DD8BD;
//ret;
jmp CompareValidate_Retn
}
}
//DWORD sDefaultQuickslotKeyMap_cave_retn = 0x72B7C2;
_declspec(naked) void sDefaultQuickslotKeyMap_cave()
{
_asm {
push ebx;
push esi;
push edi;
xor edx, edx;
mov ebx, ecx;
call label;
nop;
lea edi, dword ptr ds : [ebx + 0x4] ;
mov ecx, 0x1A;
mov esi, Array_aDefaultQKM_Address;
rep movsd;
lea edi, dword ptr ds : [ebx + 0x6C] ;
mov ecx, 0x1A;
mov esi, Array_aDefaultQKM_Address;
rep movsd;
pop edi;
pop esi;
pop ebx;
ret;
// 0xBF8EE8
label:
push esi;
mov esi, ecx;
lea eax, dword ptr ds : [esi + 0x4] ;
// -> _DWORD *__fastcall sub_72B7BC(_DWORD *a1)
push 0x72B7C2;
ret;
//jmp sDefaultQuickslotKeyMap_cave_retn
}
}
_declspec(naked) void DefaultQuickslotKeyMap_cave()
{
_asm {
push esi;
push edi;
lea eax, dword ptr ds : [ecx + 0x4] ;
mov esi, Array_aDefaultQKM_Address;
mov ecx, 0x1A;
mov edi, eax;
rep movsd;
pop edi;
pop esi;
ret;
}
}
_declspec(naked) void Restore_Array_Expanded() //Thank you Max
{
_asm {
lea eax, [esi + 0D7Ch]
push esi
push edi
push ecx
mov esi, [Array_Expanded_Testing_Cooldown_fix_Address]
mov edi, Array_mystery_Address
mov ecx, 78
rep movsd
pop ecx
pop edi
pop esi
push 0x008CFE03;
ret;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment