From 8c1d7a5324a6d195c7cd2be978067ccff495ee6c Mon Sep 17 00:00:00 2001 From: lybxlpsv Date: Tue, 9 Jul 2019 22:35:23 +0700 Subject: [PATCH] hacky attempt to enable module selection without card --- .../TLAC/Components/PlayerDataManager.cpp | 157 ++++++++++++++++++ .../TLAC/Components/PlayerDataManager.h | 5 +- 2 files changed, 161 insertions(+), 1 deletion(-) diff --git a/source/plugins/TLAC/Components/PlayerDataManager.cpp b/source/plugins/TLAC/Components/PlayerDataManager.cpp index 71f794d..ec30a67 100644 --- a/source/plugins/TLAC/Components/PlayerDataManager.cpp +++ b/source/plugins/TLAC/Components/PlayerDataManager.cpp @@ -43,6 +43,106 @@ namespace TLAC::Components printf("[TLAC] PlayerDataManager::Update(): Loading config...\n"); LoadConfig(); } + + int* pvId = (int*)0x00000001418054C4; + int* modState = (int*)0x00000001411A9790; + + if (!customPlayerData->UseCard) + { + if (*(char*)0x000000014CC5E270 == 32) + { + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BC8E6 + 0) = 0x00; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck); + pvModuleLoaded = false; + } + else { + if (!pvModuleLoaded) + { + pvModuleLoaded = true; + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BC8E6 + 0) = 0x01; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck); + } + } + + if ((initPvId == false) || ((lastModState == 0) && (*modState == 1))) + { + if ((lastModState == 0) && (*modState == 1)) + { + *(int*)0x00000001411A8A10 = *(int*)0x00000001411A8A28; + *(int*)(0x00000001411A8A10 + 4) = *(int*)(0x00000001411A8A28 + 4); + *(int*)(0x00000001411A8A10 + 8) = *(int*)(0x00000001411A8A28 + 8); + *(int*)(0x00000001411A8A10 + 12) = *(int*)(0x00000001411A8A28 + 12); + *(int*)(0x00000001411A8A10 + 16) = *(int*)(0x00000001411A8A28 + 16); + *(int*)(0x00000001411A8A10 + 18) = *(int*)(0x00000001411A8A28 + 18); + } + + initPvId = true; + lastModState = *modState; + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405CBBA3 + 0) = 0x90; + *((BYTE*)0x00000001405CBBA3 + 1) = 0x90; + *((BYTE*)0x00000001405CBBA3 + 2) = 0x90; + *((BYTE*)0x00000001405CBBA3 + 3) = 0x90; + *((BYTE*)0x00000001405CBBA3 + 4) = 0x90; + *((BYTE*)0x00000001405CBBA3 + 5) = 0x90; + *((BYTE*)0x00000001405CBBA3 + 6) = 0x90; + *((BYTE*)0x00000001405CBBA3 + 7) = 0x90; + VirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck); + } + + if ( ((*modState == 0) && (*pvId != lastPvId)) || ((lastModState == 1) && (*modState == 0))) + { + if ((lastModState == 1) && (*modState == 0)) + { + *(int*)0x00000001411A8A28 = *(int*)0x00000001411A8A10; + *(int*)(0x00000001411A8A28 + 4) = *(int*)(0x00000001411A8A10 + 4); + *(int*)(0x00000001411A8A28 + 8) = *(int*)(0x00000001411A8A10 + 8); + *(int*)(0x00000001411A8A28 + 12) = *(int*)(0x00000001411A8A10 + 12); + *(int*)(0x00000001411A8A28 + 16) = *(int*)(0x00000001411A8A10 + 16); + *(int*)(0x00000001411A8A28 + 18) = *(int*)(0x00000001411A8A10 + 18); + } + + initPvId = false; + lastPvId = *pvId; + lastModState = *modState; + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405CBBA3 + 0) = 0x42; + *((BYTE*)0x00000001405CBBA3 + 1) = 0x89; + *((BYTE*)0x00000001405CBBA3 + 2) = 0x84; + *((BYTE*)0x00000001405CBBA3 + 3) = 0xb6; + *((BYTE*)0x00000001405CBBA3 + 4) = 0xc0; + *((BYTE*)0x00000001405CBBA3 + 5) = 0x01; + *((BYTE*)0x00000001405CBBA3 + 6) = 0x00; + *((BYTE*)0x00000001405CBBA3 + 7) = 0x00; + VirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck); + } + } + else { + if (*(char*)0x000000014CC5E270 == 32) + { + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BC8E6 + 0) = 0x01; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck); + pvModuleLoaded = false; + } + else { + if (!pvModuleLoaded) + { + pvModuleLoaded = true; + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BC8E6 + 0) = 0x00; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck); + } + } + } } void PlayerDataManager::ApplyPatch() @@ -104,6 +204,63 @@ namespace TLAC::Components customPlayerData->ShowGreatClearBorder = config.GetBooleanValue("border_great"); customPlayerData->UseCard = config.GetBooleanValue("use_card"); customPlayerData->GameModifierOptions = config.GetBooleanValue("gamemode_options"); + + if(!customPlayerData->UseCard) + { + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x000000014010523F, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x0000000140105239 + 0) = 0x30; + *((BYTE*)0x0000000140105239 + 1) = 0xC0; + *((BYTE*)0x0000000140105239 + 2) = 0x90; + VirtualProtect((BYTE*)0x0000000140105239, 3, oldProtect, &bck); + + VirtualProtect((BYTE*)0x00000001405BCC48, 6, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BCC48 + 0) = 0x90; + *((BYTE*)0x00000001405BCC48 + 1) = 0x90; + *((BYTE*)0x00000001405BCC48 + 2) = 0x90; + *((BYTE*)0x00000001405BCC48 + 3) = 0x90; + *((BYTE*)0x00000001405BCC48 + 4) = 0x90; + *((BYTE*)0x00000001405BCC48 + 5) = 0x90; + VirtualProtect((BYTE*)0x00000001405BCC48, 6, oldProtect, &bck); + + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BC8E6 + 0) = 0x01; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck); + + } + else { + DWORD oldProtect, bck; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BC8E6 + 0) = 0x00; + VirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck); + + VirtualProtect((BYTE*)0x00000001405BCC48, 6, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405BCC48 + 0) = 0xC7; + *((BYTE*)0x00000001405BCC48 + 1) = 0x03; + *((BYTE*)0x00000001405BCC48 + 2) = 0x00; + *((BYTE*)0x00000001405BCC48 + 3) = 0x00; + *((BYTE*)0x00000001405BCC48 + 4) = 0x00; + *((BYTE*)0x00000001405BCC48 + 5) = 0x00; + VirtualProtect((BYTE*)0x00000001405BCC48, 6, oldProtect, &bck); + + VirtualProtect((BYTE*)0x000000014010523F, 3, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x0000000140105239 + 0) = 0x0F; + *((BYTE*)0x0000000140105239 + 1) = 0x94; + *((BYTE*)0x0000000140105239 + 2) = 0xC1; + VirtualProtect((BYTE*)0x0000000140105239, 3, oldProtect, &bck); + + //just incase the player is reloading + VirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect); + *((BYTE*)0x00000001405CBBA3 + 0) = 0x42; + *((BYTE*)0x00000001405CBBA3 + 1) = 0x89; + *((BYTE*)0x00000001405CBBA3 + 2) = 0x84; + *((BYTE*)0x00000001405CBBA3 + 3) = 0xb6; + *((BYTE*)0x00000001405CBBA3 + 4) = 0xc0; + *((BYTE*)0x00000001405CBBA3 + 5) = 0x01; + *((BYTE*)0x00000001405CBBA3 + 6) = 0x00; + *((BYTE*)0x00000001405CBBA3 + 7) = 0x00; + VirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck); + } } void PlayerDataManager::ApplyCustomData() diff --git a/source/plugins/TLAC/Components/PlayerDataManager.h b/source/plugins/TLAC/Components/PlayerDataManager.h index c9122f8..2cc3d3b 100644 --- a/source/plugins/TLAC/Components/PlayerDataManager.h +++ b/source/plugins/TLAC/Components/PlayerDataManager.h @@ -20,7 +20,10 @@ namespace TLAC::Components private: PlayerData* playerData; CustomPlayerData* customPlayerData; - + int lastPvId = -1; + bool initPvId = false; + bool pvModuleLoaded = false; + int lastModState = 0; void ApplyPatch(); void LoadConfig(); void ApplyCustomData();