1
0
mirror of synced 2024-11-23 22:41:00 +01:00

add a bunch of QoL

This commit is contained in:
doomertheboomer 2024-06-13 21:33:27 +07:00
parent c46a004f3a
commit 78b5d26604
6 changed files with 435 additions and 242 deletions

View File

@ -136,7 +136,7 @@
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions> <IntrinsicFunctions>false</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>false</SDLCheck>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard> <LanguageStandard>stdcpp20</LanguageStandard>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

View File

@ -5,6 +5,14 @@
bool kinectRunning = false; bool kinectRunning = false;
bool kinectStarted = false; bool kinectStarted = false;
bool threadsCreated = false;
bool mainInitialized = false;
bool isDown = false;
bool isJump = false;
bool downHack = true;
bool jumpHack = true;
VRFoot feet[16]; VRFoot feet[16];
@ -52,7 +60,51 @@ void (*touch_callback)(
const void *user_data); const void *user_data);
std::uint8_t* PatternScan(void* module, const char* signature)
{
static auto pattern_to_byte = [](const char* pattern) {
auto bytes = std::vector<int>{};
auto start = const_cast<char*>(pattern);
auto end = const_cast<char*>(pattern) + strlen(pattern);
for (auto current = start; current < end; ++current) {
if (*current == '?') {
++current;
if (*current == '?')
++current;
bytes.push_back(-1);
}
else {
bytes.push_back(strtoul(current, &current, 16));
}
}
return bytes;
};
auto dosHeader = (PIMAGE_DOS_HEADER)module;
auto ntHeaders = (PIMAGE_NT_HEADERS)((std::uint8_t*)module + dosHeader->e_lfanew);
auto sizeOfImage = ntHeaders->OptionalHeader.SizeOfImage;
auto patternBytes = pattern_to_byte(signature);
auto scanBytes = reinterpret_cast<std::uint8_t*>(module);
auto s = patternBytes.size();
auto d = patternBytes.data();
for (auto i = 0ul; i < sizeOfImage - s; ++i) {
bool found = true;
for (auto j = 0ul; j < s; ++j) {
if (scanBytes[i + j] != d[j] && d[j] != -1) {
found = false;
break;
}
}
if (found) {
return &scanBytes[i];
}
}
return nullptr;
}
void* TouchSDK_Constructor(void* in) { void* TouchSDK_Constructor(void* in) {
@ -210,8 +262,14 @@ void fire_touches(drs_touch_t* events, size_t event_count) {
touch_callback(&dev, game_touches.get(), (int)event_count, 0, user_data); touch_callback(&dev, game_touches.get(), (int)event_count, 0, user_data);
} }
void pollKinect() { DWORD pollKinect(LPVOID _) {
/*
std::thread t([] { std::thread t([] {
});
t.detach();
*/
// initialize Kinect // initialize Kinect
HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON); HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON);
if (FAILED(hr)) { if (FAILED(hr)) {
@ -229,7 +287,7 @@ void pollKinect() {
} }
// load config from ini // load config from ini
std::cout << "Loading depthrush.ini\n"; std::cout << "Loading calibration from depthrush.ini\n";
mINI::INIFile file("depthrush.ini"); mINI::INIFile file("depthrush.ini");
mINI::INIStructure ini; mINI::INIStructure ini;
file.read(ini); file.read(ini);
@ -245,10 +303,21 @@ void pollKinect() {
float zGrad = std::stof(readValue); float zGrad = std::stof(readValue);
readValue = ini["calibration"]["zOffset"]; readValue = ini["calibration"]["zOffset"];
float zOffset = std::stof(readValue); float zOffset = std::stof(readValue);
readValue = ini["calibration"]["errorMargin"];
float errorMargin = std::stof(readValue); // stepping error margin
readValue = ini["calibration"]["jumpHeight"];
float jumpHeight = std::stof(readValue); // jumping error margin
// main loop to read and process skeleton data // main loop to read and process skeleton data
NUI_SKELETON_FRAME skeletonFrame = { 0 }; NUI_SKELETON_FRAME skeletonFrame = { 0 };
float errorMargin = 0.03; // for down & jumps
float joints[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
float prevJoints[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
float highestDown = 0;
std::chrono::steady_clock::time_point jumpTime;
std::chrono::steady_clock::time_point landTime;
while (true) { while (true) {
// get the latest skeleton frame // get the latest skeleton frame
hr = NuiSkeletonGetNextFrame(0, &skeletonFrame); hr = NuiSkeletonGetNextFrame(0, &skeletonFrame);
@ -263,20 +332,18 @@ void pollKinect() {
Vector4 leftLegPos = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_ANKLE_LEFT]; Vector4 leftLegPos = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_ANKLE_LEFT];
Vector4 rightLegPos = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_ANKLE_RIGHT]; Vector4 rightLegPos = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_ANKLE_RIGHT];
// print the coordinates of both legs // clamp
//std::cout << "Left Leg: X = " << leftLegPos.x << ", Y = " << leftLegPos.y << ", Z = " << leftLegPos.z << std::endl; feet[1].event.x = std::clamp((xGrad * leftLegPos.x + xOffset), 0.0f, 1.0f);
//std::cout << "Right Leg: X = " << rightLegPos.x << ", Y = " << rightLegPos.y << ", Z = " << rightLegPos.z << std::endl; feet[1].event.y = std::clamp((zGrad * leftLegPos.z + zOffset), 0.0f, 1.0f);
feet[2].event.x = std::clamp((xGrad * rightLegPos.x + xOffset), 0.0f, 1.0f);
feet[1].event.x = xGrad * leftLegPos.x + xOffset; feet[2].event.y = std::clamp((zGrad * rightLegPos.z + zOffset), 0.0f, 1.0f);
feet[1].event.y = 0.5;
feet[2].event.x = xGrad * rightLegPos.x + xOffset;
feet[2].event.y = 0.5;
// Fix feet height // Fix feet height
float fixedLeft = leftLegPos.y - (yGrad * leftLegPos.z + yOffset); float fixedLeft = leftLegPos.y - (yGrad * leftLegPos.z + yOffset);
float fixedRight = rightLegPos.y - (yGrad * rightLegPos.z + yOffset); float fixedRight = rightLegPos.y - (yGrad * rightLegPos.z + yOffset);
// check for stepping // check for stepping if not jumping
if (isJump == false) {
if (fixedLeft > (fixedRight + errorMargin)) { if (fixedLeft > (fixedRight + errorMargin)) {
feet[2].touching = true; feet[2].touching = true;
feet[1].touching = false; feet[1].touching = false;
@ -292,7 +359,50 @@ void pollKinect() {
feet[2].touching = true; feet[2].touching = true;
// std::cout << "both step\n"; // std::cout << "both step\n";
} }
}
// y axis tracking (jump and down)
for (int j = 0; j < 20; j++) { // get current coords
joints[j] = skeletonFrame.SkeletonData[i].SkeletonPositions[j].y;
}
// get highest down value
for (int j = 0; j < 20; j++) {
if (joints[j] - prevJoints[j] < highestDown) {
highestDown = joints[j];
}
}
// down handling
if (highestDown < -0.2) {
isDown = true;
}
else {
isDown = false;
}
// jump handling
if (fixedLeft > jumpHeight && fixedRight > jumpHeight && isJump == false) {
jumpTime = std::chrono::high_resolution_clock::now();
isJump = true;
}
if (isJump) {
landTime = std::chrono::high_resolution_clock::now();
feet[1].touching = false;
feet[2].touching = false;
// jump for 180ms
if (std::chrono::duration_cast<std::chrono::milliseconds>(landTime - jumpTime).count() > 180) {
isJump = false;
}
}
// save current coords as previous coord
for (int j = 0; j < 20; j++) {
prevJoints[j] = skeletonFrame.SkeletonData[i].SkeletonPositions[j].y;
}
highestDown = 0;
} }
} }
} }
@ -301,14 +411,16 @@ void pollKinect() {
NuiSkeletonTrackingDisable(); NuiSkeletonTrackingDisable();
NuiShutdown(); NuiShutdown();
return 0; return 0;
});
t.detach();
} }
void startInputSpam() { DWORD startInputSpam(LPVOID _) {
/*
std::thread t([] { std::thread t([] {
puts("starting kinect thread");
});
t.detach();
*/
puts("starting input spam thread");
// temporarily hardcode both kinect feet to touching at size 0.1 // temporarily hardcode both kinect feet to touching at size 0.1
feet[1].touching = true; feet[1].touching = true;
@ -447,14 +559,44 @@ void startInputSpam() {
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
} }
kinectStarted = false; kinectStarted = false;
return nullptr; return 0;
});
t.detach();
} }
typedef __int64(__fastcall* PinitializeJudgementMemory)(float a1, float a2, char a3, __int64 a4, __int64 a5, char a6, float* a7);
static PinitializeJudgementMemory Orig_initializeJudgementMemory;
__int64 __fastcall Hook_initializeJudgementMemory(float a1, float a2, char a3, __int64 a4, __int64 a5, char a6, float* a7) {
// a4 is a1 + 168 usually
__int64 tmp = a4;
uintptr_t ptr = (uintptr_t)tmp - 16;
int noteType = *(int*)ptr;
float tMinus = fabs(a2 - a1);
if (noteType == 3) {
if (tMinus <= 150 && isDown && downHack) { // 150ms timing window for downs
std::cout << "Hitting down!\n";
return 5;
}
}
if (noteType == 4) {
if (tMinus <= 200 && isJump && jumpHack) { // 200ms timing window for jump
std::cout << "Hitting jump!\n";
return 5;
}
}
return Orig_initializeJudgementMemory(a1, a2, a3, a4, a5, a6, a7);
}
void hookDancepad() { void hookDancepad() {
if (!mainInitialized) {
MH_Initialize(); MH_Initialize();
// Pad hooks
MH_CreateHookApi(L"TouchSDKDll.dll", "??0TouchSDK@@QEAA@XZ", TouchSDK_Constructor, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "??0TouchSDK@@QEAA@XZ", TouchSDK_Constructor, NULL);
MH_CreateHookApi(L"TouchSDKDll.dll", "?SendData@TouchSDK@@QEAA_NU_DeviceInfo@@QEAEH1HH@Z", TouchSDK_SendData, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?SendData@TouchSDK@@QEAA_NU_DeviceInfo@@QEAEH1HH@Z", TouchSDK_SendData, NULL);
MH_CreateHookApi(L"TouchSDKDll.dll", "?SetSignalInit@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_SetSignalInit, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?SetSignalInit@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_SetSignalInit, NULL);
@ -472,9 +614,41 @@ void hookDancepad() {
MH_CreateHookApi(L"TouchSDKDll.dll", "?GetTouchSDKVersion@TouchSDK@@QEAAIXZ", TouchSDK_GetTouchSDKVersion, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?GetTouchSDKVersion@TouchSDK@@QEAAIXZ", TouchSDK_GetTouchSDKVersion, NULL);
MH_CreateHookApi(L"TouchSDKDll.dll", "?InitTouch@TouchSDK@@QEAAHPEAU_DeviceInfo@@HP6AXU2@PEBU_TouchPointData@@HHPEBX@ZP6AX1_N3@ZPEAX@Z", TouchSDK_InitTouch, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?InitTouch@TouchSDK@@QEAAHPEAU_DeviceInfo@@HP6AXU2@PEBU_TouchPointData@@HHPEBX@ZP6AX1_N3@ZPEAX@Z", TouchSDK_InitTouch, NULL);
std::cout << "Loading settings from depthrush.ini\n";
mINI::INIFile file("depthrush.ini");
mINI::INIStructure ini;
file.read(ini);
std::string& readValue = ini["hacks"]["downHack"];
downHack = !strcmp(readValue.c_str(), "1");
std::string& readValue2 = ini["hacks"]["jumpHack"];
jumpHack = !strcmp(readValue2.c_str(), "1");
// Game hooks
// uintptr_t imageBase = 0x180000000;
// HOOK(0x1806D5180, initializeJudgementMemory);
if (downHack == true || jumpHack == true) {
// if hacks are enabled
std::cout << "Hacks enabled, hooking!\n";
auto pointer = PatternScan((void*)0x180000000, "40 53 48 83 EC 20 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 18 48 8B 5C 24 60 0F 28 E0 0F 28 D9");
HOOK(pointer, initializeJudgementMemory);
}
MH_EnableHook(MH_ALL_HOOKS); MH_EnableHook(MH_ALL_HOOKS);
mainInitialized = true;
}
if (threadsCreated == false) {
CreateThread(NULL, 0, startInputSpam, NULL, 0, NULL);
CreateThread(NULL, 0, pollKinect, NULL, 0, NULL);
threadsCreated = true;
}
/*
startInputSpam(); // spams input to the game startInputSpam(); // spams input to the game
pollKinect(); pollKinect();
*/
return;
} }

View File

@ -5,12 +5,32 @@
#include <winnt.h> #include <winnt.h>
#include <iostream> #include <iostream>
#include <NuiApi.h> #include <NuiApi.h>
#include <stdint.h>
#include <algorithm>
#include "kiero/kiero.h" #include "kiero/kiero.h"
#include "kiero/minhook/include/MinHook.h" #include "kiero/minhook/include/MinHook.h"
#include "kiero/injector/injector.hpp" #include "kiero/injector/injector.hpp"
#include "kiero/injector/calling.hpp"
#include "d3d9.h" #include "d3d9.h"
#include "ini.h" #include "ini.h"
#include "drs.h" #include "drs.h"
typedef LRESULT(CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); typedef LRESULT(CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
typedef uintptr_t PTR; typedef uintptr_t PTR;
#define HOOK(addr, detour) MH_CreateHook((LPVOID)(addr), \
Hook_##detour, \
reinterpret_cast<LPVOID*>(&Orig_##detour))
inline void safeJMP(injector::memory_pointer_tr at, injector::memory_pointer_raw dest, bool vp = true)
{
MH_Initialize();
MH_CreateHook((void*)at.as_int(), (void*)dest.as_int(), nullptr);
MH_EnableHook((void*)at.as_int());
}
inline void safeUNJMP(injector::memory_pointer_tr pTarget) {
MH_DisableHook((void*)pTarget.as_int());
MH_RemoveHook((void*)pTarget.as_int());
}

View File

@ -656,6 +656,5 @@ inline memory_pointer_aslr aslr_ptr(T p)
} // namespace } // namespace

View File

@ -2,17 +2,6 @@
static uintptr_t imageBase; static uintptr_t imageBase;
inline void safeJMP(injector::memory_pointer_tr at, injector::memory_pointer_raw dest, bool vp = true)
{
MH_Initialize();
MH_CreateHook((void*)at.as_int(), (void*)dest.as_int(), nullptr);
MH_EnableHook((void*)at.as_int());
}
inline void safeUNJMP(injector::memory_pointer_tr pTarget) {
MH_DisableHook((void*)pTarget.as_int());
MH_RemoveHook((void*)pTarget.as_int());
}
static int returnTrue() { static int returnTrue() {
return 1; return 1;
@ -24,7 +13,6 @@ static int returnFalse() {
BOOL WINAPI DllMain(HMODULE hMod, DWORD dwReason, LPVOID lpReserved) BOOL WINAPI DllMain(HMODULE hMod, DWORD dwReason, LPVOID lpReserved)
{ {
DisableThreadLibraryCalls(hMod); DisableThreadLibraryCalls(hMod);

View File

@ -71,13 +71,25 @@ int calibration() {
// Save values // Save values
mINI::INIFile file("depthrush.ini"); mINI::INIFile file("depthrush.ini");
mINI::INIStructure ini; mINI::INIStructure ini;
// Read the existing contents of the file
if (file.read(ini)) {
std::cout << "Existing file loaded.\n";
}
else {
std::cout << "File does not exist or failed to load, creating new.\n";
}
// Update the structure with new values
ini["calibration"]["xGrad"] = std::to_string(xGrad); ini["calibration"]["xGrad"] = std::to_string(xGrad);
ini["calibration"]["xOffset"] = std::to_string(xOffset); ini["calibration"]["xOffset"] = std::to_string(xOffset);
ini["calibration"]["yGrad"] = std::to_string(yGrad); ini["calibration"]["yGrad"] = std::to_string(yGrad);
ini["calibration"]["yOffset"] = std::to_string(yOffset); ini["calibration"]["yOffset"] = std::to_string(yOffset);
ini["calibration"]["zGrad"] = std::to_string(zGrad); ini["calibration"]["zGrad"] = std::to_string(zGrad);
ini["calibration"]["zOffset"] = std::to_string(zOffset); ini["calibration"]["zOffset"] = std::to_string(zOffset);
file.generate(ini);
// Write the updated structure back to the file
file.write(ini);
std::cout << "Save complete.\n"; std::cout << "Save complete.\n";
std::cout << "Proceeding to Kinect Preview..\n"; std::cout << "Proceeding to Kinect Preview..\n";