Initial refactoring (WARNING: largely untested)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#include "framework.h"
|
||||
#include "PluginConfigApi.h"
|
||||
#include "framework.h"
|
||||
#include <detours.h>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
@@ -52,20 +52,163 @@ unsigned int last_unload_a2 = 0, last_reload_a2 = 0;
|
||||
__int64 last_unload_a3 = 0, last_reload_a3 = 0;*/
|
||||
|
||||
bool dobeep = true, allowReloading = true, debug = false;
|
||||
int nNoHandScaling, nDefaultHandSize, nSingMissed, nForceMouth, nForceExpressions, nForceLook;
|
||||
|
||||
void loadConfig()
|
||||
{
|
||||
dobeep = GetPrivateProfileIntW(L"general", L"beep", 1, CONFIG_FILE) > 0 ? true : false;
|
||||
allowReloading = GetPrivateProfileIntW(L"general", L"reloading", 0, CONFIG_FILE) > 0 ? true : false;
|
||||
{
|
||||
dobeep = GetPrivateProfileIntW(L"wig", L"beep", 1, CONFIG_FILE) > 0 ? true : false;
|
||||
allowReloading = GetPrivateProfileIntW(L"wig", L"reloading", 0, CONFIG_FILE) > 0 ? true : false;
|
||||
debug = GetPrivateProfileIntW(L"general", L"debug", 0, CONFIG_FILE) > 0 ? true : false;
|
||||
|
||||
nSingMissed = GetPrivateProfileIntW(L"patches", L"sing_missed", FALSE, CONFIG_FILE) > 0 ? true : false;
|
||||
nNoHandScaling = GetPrivateProfileIntW(L"patches", L"no_hand_scaling", FALSE, CONFIG_FILE) > 0 ? true : false;
|
||||
nDefaultHandSize = GetPrivateProfileIntW(L"patches", L"default_hand_size", -1, CONFIG_FILE);
|
||||
nForceMouth = GetPrivateProfileIntW(L"patches", L"force_mouth", 0, CONFIG_FILE);
|
||||
nForceExpressions = GetPrivateProfileIntW(L"patches", L"force_expressions", 0, CONFIG_FILE);
|
||||
nForceLook = GetPrivateProfileIntW(L"patches", L"force_look", 0, CONFIG_FILE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void pvPatches()
|
||||
{
|
||||
cout << "[CustoMixer] Applying PV patches..." << endl;
|
||||
|
||||
// Sing missed notes
|
||||
if (nSingMissed)
|
||||
{
|
||||
InjectCode((void*)0x140109044, { 0xEB });
|
||||
// Breaks border:
|
||||
// InjectCode((void*)0x140109096, { 0xEB });
|
||||
}
|
||||
|
||||
// Force mouth animations
|
||||
{
|
||||
if (nForceMouth == 1) // PDA
|
||||
{
|
||||
printf("[Patches] Forcing PDA mouth...\n");
|
||||
int* mouth_table = (int*)(0x1409A1DC0);
|
||||
DWORD oldProtect;
|
||||
VirtualProtect(mouth_table, 44, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
for (int i = 0; i < 11; i++)
|
||||
{
|
||||
mouth_table[i]++;
|
||||
}
|
||||
VirtualProtect(mouth_table, 44, oldProtect, nullptr);
|
||||
printf("[Patches] PDA mouth forced\n");
|
||||
}
|
||||
else if (nForceMouth == 2) // FT
|
||||
{
|
||||
printf("[Patches] Forcing FT mouth...\n");
|
||||
int* mouth_table_oldid = (int*)(0x1409A1E1C);
|
||||
DWORD oldProtect;
|
||||
VirtualProtect(mouth_table_oldid, 44, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
for (int i = 0; i < 11; i++)
|
||||
{
|
||||
mouth_table_oldid[i]--;
|
||||
}
|
||||
VirtualProtect(mouth_table_oldid, 44, oldProtect, nullptr);
|
||||
printf("[Patches] FT mouth forced\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Force expressions
|
||||
{
|
||||
if (nForceExpressions == 1) // PDA
|
||||
{
|
||||
printf("[Patches] Forcing PDA expressions...\n");
|
||||
int* exp_table = (int*)(0x140A21900);
|
||||
DWORD oldProtect;
|
||||
VirtualProtect(exp_table, 104, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
for (int i = 0; i < 26; i++)
|
||||
{
|
||||
exp_table[i] += 2;
|
||||
}
|
||||
VirtualProtect(exp_table, 104, oldProtect, nullptr);
|
||||
printf("[Patches] PDA expressions forced\n");
|
||||
}
|
||||
else if (nForceExpressions == 2) // FT
|
||||
{
|
||||
printf("[Patches] Forcing FT expressions...\n");
|
||||
int* exp_table_oldid = (int*)(0x140A219D0);
|
||||
DWORD oldProtect;
|
||||
VirtualProtect(exp_table_oldid, 104, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
for (int i = 0; i < 26; i++)
|
||||
{
|
||||
exp_table_oldid[i] -= 2;
|
||||
}
|
||||
VirtualProtect(exp_table_oldid, 104, oldProtect, nullptr);
|
||||
printf("[Patches] FT expressions forced\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Force look animations
|
||||
{
|
||||
if (nForceLook == 1) // PDA
|
||||
{
|
||||
printf("[Patches] Forcing PDA look...\n");
|
||||
int* look_table = (int*)(0x1409A1D70);
|
||||
DWORD oldProtect;
|
||||
VirtualProtect(look_table, 36, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
look_table[i]++;
|
||||
}
|
||||
VirtualProtect(look_table, 36, oldProtect, nullptr);
|
||||
printf("[Patches] PDA look forced\n");
|
||||
}
|
||||
else if (nForceLook == 2) // FT
|
||||
{
|
||||
printf("[Patches] Forcing FT look...\n");
|
||||
int* look_table_oldid = (int*)(0x1409A1D9C);
|
||||
DWORD oldProtect;
|
||||
VirtualProtect(look_table_oldid, 36, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
look_table_oldid[i]--;
|
||||
}
|
||||
VirtualProtect(look_table_oldid, 36, oldProtect, nullptr);
|
||||
printf("[Patches] FT look forced\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Disable hand scaling
|
||||
if (nNoHandScaling)
|
||||
{
|
||||
InjectCode((void*)0x0000000140120709, { 0xE9, 0x82, 0x0A, 0x00 });
|
||||
}
|
||||
|
||||
// Default hand size
|
||||
if (nDefaultHandSize != -1 && nDefaultHandSize < 1)
|
||||
{
|
||||
MessageBoxW(nullptr, L"The default hand size is lower than 1 and higher than -1 (default). Hands may disappear.\n\nIf this is not intentional, set it back to -1.", L"CustoMixer", MB_ICONWARNING);
|
||||
|
||||
printf("[Patches] Changing default hand size...\n");
|
||||
const float num = (float)nDefaultHandSize / 10000.0;
|
||||
DWORD oldProtect;
|
||||
float* addr1 = (float*)(0x140506B59);
|
||||
float* addr2 = (float*)(0x140506B60);
|
||||
/*float* addr3 = (float*)(0x140506B67);
|
||||
float* addr4 = (float*)(0x140506B71);*/
|
||||
VirtualProtect(addr1, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
VirtualProtect(addr2, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
/*VirtualProtect(addr3, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
VirtualProtect(addr4, 4, PAGE_EXECUTE_READWRITE, &oldProtect);*/
|
||||
*addr1 = *addr2 /*= *addr3 = *addr4*/ = num;
|
||||
VirtualProtect(addr1, 4, oldProtect, nullptr);
|
||||
VirtualProtect(addr2, 4, oldProtect, nullptr);
|
||||
/*VirtualProtect(addr3, 4, oldProtect, nullptr);
|
||||
VirtualProtect(addr4, 4, oldProtect, nullptr);*/
|
||||
printf("[Patches] New default hand size: %f\n", num);
|
||||
}
|
||||
|
||||
cout << "[CustoMixer] PV patches applied." << endl;
|
||||
}
|
||||
|
||||
void setPartToUpdate(char part, string message, unsigned short beepfreq)
|
||||
{
|
||||
part_to_update = part;
|
||||
cout << "[DivaWig] " << message << endl;
|
||||
cout << "[CustoMixer] " << message << endl;
|
||||
if (dobeep) Beep(beepfreq, 300);
|
||||
|
||||
this_thread::sleep_for(chrono::seconds(1));
|
||||
@@ -76,7 +219,7 @@ void unloadAll()
|
||||
unloadFunc((uint64_t*)0x1411B7060, 0, 5387286240);
|
||||
unloadFunc((uint64_t*)0x1411B7060, 0, 5387319280);
|
||||
unloadFunc((uint64_t*)0x1411B7060, 0, 5387352320);
|
||||
cout << "[DivaWig] All unloaded!" << endl;
|
||||
cout << "[CustoMixer] All unloaded!" << endl;
|
||||
if (dobeep) Beep(500, 100);
|
||||
this_thread::sleep_for(chrono::seconds(1));;
|
||||
}
|
||||
@@ -84,7 +227,7 @@ void unloadAll()
|
||||
void unload(__int64 performer_address)
|
||||
{
|
||||
unloadFunc((uint64_t*)0x1411B7060, 0, performer_address);
|
||||
cout << "[DivaWig] Performer " << performer_address/33040 + 1 << " unloaded!" << endl;
|
||||
cout << "[CustoMixer] Performer " << performer_address/33040 + 1 << " unloaded!" << endl;
|
||||
if (dobeep) Beep(500, 100);
|
||||
this_thread::sleep_for(chrono::seconds(1));;
|
||||
}
|
||||
@@ -94,7 +237,7 @@ void loadAll()
|
||||
loadFunc((uint64_t*)0x1411B7060, 0, 5387286240);
|
||||
loadFunc((uint64_t*)0x1411B7060, 0, 5387319280);
|
||||
loadFunc((uint64_t*)0x1411B7060, 0, 5387352320);
|
||||
cout << "[DivaWig] All loaded!" << endl;
|
||||
cout << "[CustoMixer] All loaded!" << endl;
|
||||
if (dobeep) Beep(600, 100);
|
||||
this_thread::sleep_for(chrono::seconds(1));;
|
||||
}
|
||||
@@ -102,14 +245,14 @@ void loadAll()
|
||||
void load(__int64 performer_address)
|
||||
{
|
||||
loadFunc((uint64_t*)0x1411B7060, 0, performer_address);
|
||||
cout << "[DivaWig] Performer " << performer_address / 33040 + 1 << " loaded!" << endl;
|
||||
cout << "[CustoMixer] Performer " << performer_address / 33040 + 1 << " loaded!" << endl;
|
||||
if (dobeep) Beep(600, 100);
|
||||
this_thread::sleep_for(chrono::seconds(1));
|
||||
}
|
||||
|
||||
/*void hookedUnload(uint64_t* a1, unsigned int a2, __int64 a3)
|
||||
{
|
||||
cout << "[DivaWig] hookedUnload a1: " << a1 << "; a2: " << a2 << "; a3: " << a3 << endl;
|
||||
cout << "[CustoMixer] hookedUnload a1: " << a1 << "; a2: " << a2 << "; a3: " << a3 << endl;
|
||||
last_unload_a1 = a1;
|
||||
last_unload_a2 = a2;
|
||||
last_unload_a3 = a3;
|
||||
@@ -118,7 +261,7 @@ void load(__int64 performer_address)
|
||||
|
||||
void hookedLoad(uint64_t* a1, unsigned int a2, __int64 a3)
|
||||
{
|
||||
cout << "[DivaWig] hookedReload a1: " << a1 << "; a2: " << a2 << "; a3: " << a3 << endl;
|
||||
cout << "[CustoMixer] hookedReload a1: " << a1 << "; a2: " << a2 << "; a3: " << a3 << endl;
|
||||
last_reload_a1 = a1;
|
||||
last_reload_a2 = a2;
|
||||
last_reload_a3 = a3;
|
||||
@@ -163,7 +306,7 @@ void inputLoop(__int64 a1)
|
||||
|
||||
__int64 hookedWig(__int64 classp, int module_part, int part_id)
|
||||
{
|
||||
if (debug) cout << "[DivaWig] Performer: " << (classp-5387286232)/33040+1 << "; Module part: " << module_part << " (" << Strings[module_part] << ")" << "; Default part: " << part_id << "." << endl;
|
||||
if (debug) cout << "[CustoMixer] Performer: " << (classp-5387286232)/33040+1 << "; Module part: " << module_part << " (" << Strings[module_part] << ")" << "; Default part: " << part_id << "." << endl;
|
||||
|
||||
if (part_to_update == ALL || part_to_update == module_part)
|
||||
*(int*)(classp + 4i64 * module_part + 8) = part_id;
|
||||
@@ -185,19 +328,19 @@ void hookedThi(unsigned int* a1, unsigned int module_part)
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
|
||||
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
|
||||
{
|
||||
loadConfig();
|
||||
pvPatches();
|
||||
DisableThreadLibraryCalls(hModule);
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
cout << "[DivaWig] Hooking functions..." << endl;
|
||||
cout << "[CustoMixer] Hooking functions..." << endl;
|
||||
DetourAttach(&(PVOID&)originalWig, (PVOID)hookedWig);
|
||||
DetourAttach(&(PVOID&)originalSec, (PVOID)hookedSec);
|
||||
DetourAttach(&(PVOID&)originalThi, (PVOID)hookedThi);
|
||||
DetourAttach(&(PVOID&)pvTimerUpdate, (PVOID)inputLoop);
|
||||
cout << "[DivaWig] Functions hooked." << endl;
|
||||
cout << "[CustoMixer] Functions hooked." << endl;
|
||||
DetourTransactionCommit();
|
||||
|
||||
/*if (allowReloading)
|
||||
@@ -221,20 +364,28 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
const std::vector<LPCWSTR> typeList = { L"Default", L"PDA", L"PDAFT/PDFT/PDM39" };
|
||||
|
||||
PluginConfig::PluginConfigOption config[] = {
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"beep", L"general", CONFIG_FILE, L"Beep", L"Beep when selecting the part that should be updated.", true } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"reloading", L"general", CONFIG_FILE, L"Unloading and loading (experimental)", L"Allow unloading (CTRL+U or U+number) and loading (CTRL+L or L+number).", false } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"debug", L"general", CONFIG_FILE, L"Debug", L"Print extra information.", false } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"beep", L"wig", CONFIG_FILE, L"Beep", L"Beep when selecting the part that should be updated.", true } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"reloading", L"wig", CONFIG_FILE, L"Unloading and loading (experimental)", L"Allow unloading (CTRL+U or U+number) and loading (CTRL+L or L+number).", false } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"sing_missed", L"patches", CONFIG_FILE, L"Sing Missed Notes", L"Sing Missed Notes.", false } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"no_hand_scaling", L"patches", CONFIG_FILE, L"No Hand Scaling", L"Disable scripted hand scaling.", false } },
|
||||
{ PluginConfig::CONFIG_NUMERIC, new PluginConfig::PluginConfigNumericData{ L"default_hand_size", L"patches", CONFIG_FILE, L"Default Hand Size:", L"-1: default\n12200: PDA", -1, -1, INT_MAX } },
|
||||
{ PluginConfig::CONFIG_DROPDOWN_INDEX, new PluginConfig::PluginConfigDropdownIndexData{ L"force_mouth", L"patches", CONFIG_FILE, L"Mouth Animations:", L"Change the mouth animations.", 0, typeList}},
|
||||
{ PluginConfig::CONFIG_DROPDOWN_INDEX, new PluginConfig::PluginConfigDropdownIndexData{ L"force_expressions", L"patches", CONFIG_FILE, L"Expr. Animations:", L"Change the expressions.", 0, typeList}},
|
||||
{ PluginConfig::CONFIG_DROPDOWN_INDEX, new PluginConfig::PluginConfigDropdownIndexData{ L"force_look", L"patches", CONFIG_FILE, L"Look Animations:", L"Change the look animations.", 0, typeList}},
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"debug", L"general", CONFIG_FILE, L"Debug", L"Print extra information.", false } },
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
|
||||
{
|
||||
return L"DivaWig";
|
||||
return L"CustoMixer";
|
||||
}
|
||||
|
||||
extern "C" __declspec(dllexport) LPCWSTR GetPluginDescription(void)
|
||||
{
|
||||
return L"DivaWig Plugin by nas\n\nDivaWig lets you mix some module parts by pressing CTRL+0~9.";
|
||||
return L"CustoMixer Plugin by nas\n\nCustoMixer lets you change some PV settings, and mix module parts by pressing CTRL+0~9.";
|
||||
}
|
||||
|
||||
extern "C" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)
|
||||
|
||||
Reference in New Issue
Block a user