int GetCommandIndex(void* pController) {
static auto GetCommandIndex = reinterpret_cast<void* (__fastcall*)(void*, int*)>(MEM::GetAbsoluteAddress(MEM::FindPattern(CLIENT_DLL, "E8 ? ? ? ? 8B 8D ? ? ? ? 8D 51"), 1, 0));
int nIndex = 0;
GetCommandIndex(pController, &nIndex);
return nIndex;
}
CUserCmd* GetUserCmd(void* pController, DWORD SequenceNumber) {
static auto GetUserCmd = reinterpret_cast<CUserCmd * (__fastcall*)(void*, DWORD)>(MEM::GetAbsoluteAddress(MEM::FindPattern(CLIENT_DLL, "E8 ? ? ? ? 48 8B 0D ? ? ? ? 45 33 E4 48 89 44 24"), 1, 0));
return GetUserCmd(pController, SequenceNumber);
}
void* GetUserCmdEntry(void* pController, int nCommandIndex) {
static auto GetUserCmdEntry = reinterpret_cast<void* (__fastcall*)(void*, int)>(MEM::GetAbsoluteAddress(MEM::FindPattern(CLIENT_DLL, "E8 ? ? ? ? 48 8B CF 4C 8B E8 44 8B B8"), 1, 0));
return GetUserCmdEntry(pController, nCommandIndex);
}
CUserCmd* GetCmd() {
static void* CmdBaseAddress = MEM::ResolveRelativeAddress(MEM::FindPattern(CLIENT_DLL, "48 8B 0D ? ? ? ? E8 ? ? ? ? 48 8B CF 4C 8B E8"), 0x3, 0x7);
if (!CmdBaseAddress)
return nullptr;
auto pLocalController = CCSPlayerController::GetLocalPlayerController();
if (!pLocalController)
return nullptr;
int nIndex = GetCommandIndex(pLocalController);
if (!nIndex)
return nullptr;
int nCommandIndex = nIndex - 1;
if (nCommandIndex == -1)
nCommandIndex = 0xFFFFFFFF;
void* pCmdEntry = GetUserCmdEntry(CmdBaseAddress, nCommandIndex);
if (!pCmdEntry)
return nullptr;
DWORD SequenceNumber = [I]reinterpret_cast<DWORD[/I]>([I](__int64[/I])pCmdEntry + 0x5C00);
CUserCmd* pCmd = GetUserCmd(pLocalController, SequenceNumber);
return pCmd;
}