1745 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			1745 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			C++
		
	
	
	
| #pragma once
 | |
| #include <cwchar>
 | |
| #include "MinHook.h"
 | |
| #include "inlinehook.h"
 | |
| #include "RegisterSquirrel.hpp"
 | |
| 
 | |
| //游戏初始化完毕Flag
 | |
| static bool InitGameFlag = false;
 | |
| 
 | |
| //脚本是否请求到的Flag
 | |
| extern bool jiaoben;
 | |
| //脚本文件数组
 | |
| extern std::vector<std::string> BaseData;
 | |
| //加载脚本的逻辑
 | |
| void Suxn() {
 | |
|     size_t Ds = BaseData.size();
 | |
| 
 | |
|     for (size_t i = 0; i < Ds; i++)
 | |
|     {
 | |
|         std::string filenamebuf = "BaseData" + std::to_string(i);
 | |
|         std::string strbuf = BaseData[i];
 | |
|         wchar_t* filename = DNFTOOL::charTowchar_t((char*)filenamebuf.c_str());
 | |
|         wchar_t* str = DNFTOOL::charTowchar_t((char*)strbuf.c_str());
 | |
| 
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
| #ifdef SELL
 | |
|         //std::cout << strbuf << std::endl;
 | |
|         if (sq_mycompilebuffer(v, str, wcslen(str), L"interactive console", false) >= 0) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_call(v, 1, SQTrue, SQFalse);
 | |
|             Sq_pop(v, 1);
 | |
|         }
 | |
| #else
 | |
|         if (sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_call(v, 1, SQTrue, SQFalse);
 | |
|             Sq_pop(v, 1);
 | |
|         }
 | |
| #endif // SELL
 | |
| 
 | |
|         delete[] filename;
 | |
|         delete[] str;
 | |
|     }
 | |
|     BaseData.clear();
 | |
|     jiaoben = false;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| typedef struct REG
 | |
| {
 | |
|     DWORD EAX;
 | |
|     DWORD EBX;
 | |
|     DWORD ECX;
 | |
|     DWORD EDX;
 | |
|     DWORD ESI;
 | |
|     DWORD EDI;
 | |
|     DWORD ESP;
 | |
|     DWORD EBP;
 | |
|     DWORD VmAddress;
 | |
|     BYTE Cl;
 | |
| 
 | |
| } REG;
 | |
| REG PlayerEach = { 0 };
 | |
| void __declspec(naked)PlayerEach2() {
 | |
|     static int address = 0x11B34E0;
 | |
|     static int address1 = 0x001004B59;
 | |
|     _asm
 | |
|     {
 | |
|         pushad
 | |
|         pushfd
 | |
| 
 | |
|         mov PlayerEach.ECX, ecx
 | |
|         mov PlayerEach.EDI, edi
 | |
|     }
 | |
| 
 | |
|     if (PlayerEach.EDI == 2) {
 | |
|         PlayerEach.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_PlayerEachPos", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
 | |
|         {
 | |
|             Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|             Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, *(int*)(PlayerEach.ECX + 0x14));
 | |
|             Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, *(int*)(PlayerEach.ECX + 0x18));
 | |
|             Sq_call(*(HSQUIRRELVM*)0x1AF3544, 3, 0, 1);
 | |
|         }
 | |
|         Sq_settop(*(HSQUIRRELVM*)0x1AF3544, PlayerEach.VmAddress);
 | |
|     }
 | |
| 
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         call address
 | |
|         test al, al
 | |
|         jmp address1
 | |
|     }
 | |
| 
 | |
| }
 | |
| REG MouseAsm = { 0 };
 | |
| void __declspec(naked)MouseWheelUp() {
 | |
|     static int address = 0x11BDE12;
 | |
|     static int address1 = 0x0011BDEEE;
 | |
|     static int address2 = 0x0011BDEDF;
 | |
|     static int address3 = 0x0011BDECE;
 | |
|     _asm
 | |
|     {
 | |
|         pushad
 | |
|         pushfd
 | |
|         mov MouseAsm.EDI, edi
 | |
|         mov MouseAsm.ECX, ecx
 | |
|     }
 | |
| 
 | |
|     if ((int)*(BYTE*)0x1B46886 == 0) {
 | |
|         _asm {
 | |
|             popfd
 | |
|             popad
 | |
|             jmp address
 | |
|         }
 | |
|     }
 | |
|     else {
 | |
|         if (MouseAsm.EDI == 0x20A) {
 | |
|             if (MouseAsm.ECX == 0x780000) {
 | |
|                 _asm {
 | |
|                     popfd
 | |
|                     popad
 | |
|                     jmp address3
 | |
|                 }
 | |
|             }
 | |
|             else {
 | |
|                 _asm {
 | |
|                     popfd
 | |
|                     popad
 | |
|                     jmp address2
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         else {
 | |
|             _asm {
 | |
|                 popfd
 | |
|                 popad
 | |
|                 jmp address1
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| REG DrawWindow_BAsm = { 0 };
 | |
| void __declspec(naked)DrawWindow_B_Hook() {
 | |
|     static int address = 0xFFDA10;
 | |
|     static int address1 = 0x66BEA1;
 | |
|     _asm
 | |
|     {
 | |
|         pushad
 | |
|         pushfd
 | |
| 
 | |
|     }
 | |
| 
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         DrawWindow_BAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"L_DrawWindow_B", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
 | |
|         {
 | |
|             Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|             Sq_call(*(HSQUIRRELVM*)0x1AF3544, 1, 0, 1);
 | |
|         }
 | |
|         Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DrawWindow_BAsm.VmAddress);
 | |
|     }
 | |
| 
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         mov ecx, eax
 | |
|         call address
 | |
|         jmp address1
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| REG BuffIconHookAsm = { 0 };
 | |
| void __declspec(naked)BuffIcon_Hook() {
 | |
|     static int address = 0x4C8C1D;
 | |
|     static int address2 = 0x4C8C5B;
 | |
|     _asm
 | |
|     {
 | |
|         pushad
 | |
|         pushfd
 | |
| 
 | |
|     }
 | |
| 
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         add esi,0x88
 | |
|         sub edi,eax
 | |
|         mov BuffIconHookAsm.Cl, cl
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
| 
 | |
|     if (BuffIconHookAsm.Cl == 1) {
 | |
|         _asm {
 | |
|             popfd
 | |
|             popad
 | |
|             jmp address
 | |
|         }
 | |
|     }
 | |
|     else {
 | |
|         _asm {
 | |
|             popfd
 | |
|             popad
 | |
|             jmp address2
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 | |
| REG BuffIconHookBAsm = { 0 };
 | |
| void __declspec(naked)BuffIcon_Hook_B() {
 | |
|     static int address = 0x4BF566;
 | |
|     //static int address2 = 0x4C8C5B;
 | |
|     _asm
 | |
|     {
 | |
|         pushad
 | |
|         pushfd
 | |
| 
 | |
|     }
 | |
| 
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         sub edi,eax
 | |
|         add esi, 0x88
 | |
|         mov [ebp-40],esi
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)HudBloodBackground() {
 | |
|     static int address = 0x4CA055;
 | |
|     _asm
 | |
|     {
 | |
|         pushad
 | |
|         pushfd
 | |
| 
 | |
|     }
 | |
| 
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         DrawWindow_BAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"L_HUD_BloodBackground", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
 | |
|         {
 | |
|             Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|             Sq_call(*(HSQUIRRELVM*)0x1AF3544, 1, 0, 1);
 | |
|         }
 | |
|         Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DrawWindow_BAsm.VmAddress);
 | |
|     }
 | |
| 
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| 
 | |
| REG Damage_HookAsm = { 0 };
 | |
| void __declspec(naked)Damage_Hook() {
 | |
|     static int address = 0xE5A2E5;
 | |
|     _asm
 | |
|     {
 | |
|         pushad
 | |
|         pushfd
 | |
| 
 | |
|         mov Damage_HookAsm.EDI, edi
 | |
|         mov Damage_HookAsm.EBX, ebx
 | |
|         mov Damage_HookAsm.EBP, ebp
 | |
|     }
 | |
| 
 | |
| 
 | |
|     Damage_HookAsm.EAX = *(int*)0x1AB7CDC;
 | |
| 
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         int Address = Damage_HookAsm.EBX;//只要等于 red  或者  等于0  就说明是我自己的伤害
 | |
|         int Damage = *(DWORD*)(Damage_HookAsm.EBP - 0x17c);
 | |
| 
 | |
|         Damage_HookAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|         Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_PushDamageData", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2)))
 | |
|         {
 | |
|             Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544);
 | |
|             Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Address);
 | |
|             Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Damage_HookAsm.EAX);
 | |
|             Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Damage);
 | |
|             Sq_call(*(HSQUIRRELVM*)0x1AF3544, 4, 0, 1);
 | |
|         }
 | |
|         Sq_settop(*(HSQUIRRELVM*)0x1AF3544, Damage_HookAsm.VmAddress);
 | |
|         Damage_HookAsm.EBX = 0;
 | |
|         Damage_HookAsm.EBP = 0;
 | |
|     }
 | |
| 
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         mov eax, Damage_HookAsm.EAX
 | |
|         xor ecx,ecx
 | |
|         jmp address
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| void __declspec(naked)SelectCharacter_Hook() {
 | |
|     static int address = 0x10F79D1;
 | |
|     _asm
 | |
|     {
 | |
|         imul edx,edx,0x7a
 | |
|         xor eax, eax
 | |
|         add edx, 0xA1
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)SelectCharacter_Hook1() {
 | |
|     static int address = 0x10F7B4B;
 | |
|     _asm
 | |
|     {
 | |
|         imul eax, eax, 0x7a
 | |
|         xor edx, edx
 | |
|         add eax, 0xA1
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)SelectCharacter_Hook2() {
 | |
|     static int address = 0x10F7F91;
 | |
|     _asm
 | |
|     {
 | |
|         imul ecx, ecx, 0x7a
 | |
|         add ecx, 0xA1
 | |
|         xor edx, edx
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)SelectCharacter_Hook3() {
 | |
|     static int address = 0x10F8319;
 | |
|     _asm
 | |
|     {
 | |
|         imul edx, edx, 0x7a
 | |
|         xor eax, eax
 | |
|         add edx, 0xA1
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)SelectCharacter_Hook4() {
 | |
|     static int address = 0x10F843E;
 | |
|     _asm
 | |
|     {
 | |
|         imul eax, eax, 0x7a
 | |
|         xor ecx, ecx
 | |
|         add eax, 0xA1
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)SelectCharacter_Hook5() {
 | |
|     static int address = 0x10F85F2;
 | |
|     _asm
 | |
|     {
 | |
|         imul eax, eax, 0x7a
 | |
|         xor ecx, ecx
 | |
|         add eax, 0xA1
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)SelectCharacter_Hook6() {
 | |
|     static int address = 0x10F2C74;
 | |
|     _asm
 | |
|     {
 | |
|         imul eax, eax, 0x7a
 | |
|         add eax, 0xA1
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| void __declspec(naked)SelectCharacter_Hook7() {
 | |
|     static int address = 0x10F3480;
 | |
|     _asm
 | |
|     {
 | |
|         imul eax, eax, 0x7a
 | |
|         xor edx, edx
 | |
|         add eax, 0xA1
 | |
|         pushad
 | |
|         pushfd
 | |
|     }
 | |
|     _asm {
 | |
|         popfd
 | |
|         popad
 | |
|         jmp address
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| //窗口打开事件Hook
 | |
| typedef void(__fastcall _OpenWindow)(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3);
 | |
| static _OpenWindow* OldOpenWindow;
 | |
| void __fastcall NewOpenWindow(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3) {
 | |
|     if (*(DWORD*)0x1A5FB20 == thisc) {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"L_OpenOldWindowCallBack", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, a1);
 | |
|             Sq_call(v, 2, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|     }
 | |
|     OldOpenWindow(thisc, 0, a1, a2, a3);
 | |
| }
 | |
| 
 | |
| //鼠标事件
 | |
| typedef  void(_11BDC90)(int a1, unsigned int a2, int a3);
 | |
| static _11BDC90* Old11BDC90;
 | |
| void New11BDC90(int a1, unsigned int a2, int a3) {
 | |
|     if (InitGameFlag) {
 | |
|         int X = *(int*)0x1B4686C;
 | |
|         int Y = *(int*)0x1B46870;
 | |
|         if ((X | Y) >= 0) {
 | |
|             HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|             SQInteger Top = Sq_gettop(v);
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushstring(v, L"L_MouseCallBack", -1);
 | |
|             if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|                 Sq_pushroottable(v);
 | |
|                 Sq_pushinteger(v, a1);
 | |
|                 Sq_pushinteger(v, a2);
 | |
|                 Sq_pushinteger(v, X);
 | |
|                 Sq_pushinteger(v, Y);
 | |
|                 Sq_call(v, 5, SQFalse, SQTrue);
 | |
|             }
 | |
|             Sq_settop(v, Top);
 | |
|         }
 | |
|     }
 | |
|     Old11BDC90(a1, a2, a3);
 | |
|     return;
 | |
| }
 | |
| 
 | |
| //N键大地图
 | |
| typedef  int(_fastcall _1030C30)(int a1, int a2, BYTE* a3);
 | |
| static _1030C30* Old1030C30;
 | |
| int _fastcall New1030C30(int a1, int a2, BYTE* a3)
 | |
| {
 | |
|     int ret = Old1030C30(a1, a2, a3);
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_DrawMiniMapUI", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, 111);
 | |
|         Sq_call(v, 2, SQFalse, SQTrue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| //官方的组合NutHook
 | |
| typedef  int(_fastcall _674030)(wchar_t* thisc, DWORD Seat, wchar_t* a2, int a3);
 | |
| static _674030* Old674030;
 | |
| int _fastcall New674030(wchar_t* thisc, DWORD Seat, wchar_t* a2, int a3)
 | |
| {
 | |
|     int ret = Old674030(thisc, Seat, a2, a3);
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| //他人信息Hook
 | |
| typedef  int(_fastcall _FA42D0)(int a1, int seat, int a2, int a3);
 | |
| static _FA42D0* OldFA42D0;
 | |
| int _fastcall NewFA42D0(int a1, int seat, int a2, int a3)
 | |
| {
 | |
|     //OtherPlayerInfoType = a2 + 1;
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     SQBool Flag;
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"L_Other_Character_Info_Window", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, *(int*)(a1 + 0xc));
 | |
|         Sq_call(v, 2, SQTrue, SQTrue);
 | |
|         Sq_getbool(v, -1, &Flag);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
| 
 | |
|     if (!Flag)return OldFA42D0(a1, seat, a2, a3);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| //DrawMain HOOK
 | |
| typedef DWORD(_fastcall _4C61F0)(DWORD thisc, DWORD Seat);
 | |
| static _4C61F0* Old4C61F0;
 | |
| DWORD _fastcall New4C61F0(DWORD thisc, DWORD Seat)
 | |
| {
 | |
|     DWORD Ret = Old4C61F0(thisc, Seat);
 | |
|     if (BaseData.size() > 0 && jiaoben == true && InitGameFlag) {
 | |
|         Suxn();
 | |
|     }
 | |
|     static bool mouseInit = false;
 | |
| 
 | |
|     //进入角色调用
 | |
|     if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+", 0) == 0) {
 | |
|         if (!InitGameFlag)
 | |
|         {
 | |
|             InitGameFlag = true;
 | |
|         }
 | |
|     }
 | |
|     if (InitGameFlag) {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         //std::cout << "A: " << Sq_gettop(v) << std::endl;
 | |
|         //Old1359130(v, *(int*)((char*)0x19E364 + (4 * 5)), *(int*)((char*)0x19E364 + (4 * 6)));
 | |
|         //Old1359130(v, *(int*)((char*)0x19E364 + (4 * 2)), *(int*)((char*)0x19E364 + (4 * 3)));
 | |
|         //std::cout << "Q: " << Sq_gettop(v) << std::endl;
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"L_DrawWindow_A", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_call(v, 1, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
| 
 | |
|         Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"L_drawMainCustomUI_All", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_call(v, 1, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|         //std::cout << "H: " << Sq_gettop(v) << std::endl;
 | |
|     }
 | |
|     return Ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| //伤害字体 HOOK
 | |
| typedef DWORD(_cdecl _7EEED0)(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6);
 | |
| static _7EEED0* Old7EEED0;
 | |
| DWORD _cdecl New7EEED0(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6)
 | |
| {
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     SQBool Flag;
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_PushDamageFontData", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, a1);
 | |
|         Sq_pushinteger(v, a2);
 | |
|         Sq_pushinteger(v, a3);
 | |
|         Sq_pushinteger(v, a4);
 | |
|         Sq_pushinteger(v, a5);
 | |
|         Sq_pushinteger(v, a6);
 | |
|         Sq_pushinteger(v, Damage_HookAsm.EDI);
 | |
|         Sq_pushinteger(v, Damage_HookAsm.EBX);
 | |
|         Sq_call(v, 9, SQTrue, SQTrue);
 | |
|         Sq_getbool(v, -1, &Flag);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
|     if (Flag) {
 | |
|         return Old7EEED0(a1, a2, a3, a4, a5, a6);
 | |
|     }
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| //注册收包
 | |
| typedef void(__fastcall* init_pack_handler_t)(void* Ecx);
 | |
| static init_pack_handler_t Lpfn_Init = nullptr;
 | |
| typedef void(__cdecl* pack_handler_t)(int idx, int err, void*, void*);
 | |
| typedef void(__cdecl* register_pack_handler_t)(int idx, pack_handler_t handler, int zero);
 | |
| typedef bool(__cdecl* _Net_Get_Dword)(DWORD*);
 | |
| static  _Net_Get_Dword Net_Get_Dword = reinterpret_cast<_Net_Get_Dword>(0x011AEA60);
 | |
| typedef bool(__cdecl* _Net_Get_Buffer)(char*, int);
 | |
| static _Net_Get_Buffer Net_Get_Buffer = reinterpret_cast<_Net_Get_Buffer>(0x011AEA90);
 | |
| //130号收包
 | |
| void Pack_Control(int idx, int code, void* p3, void* p4)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         DWORD Size;
 | |
|         Net_Get_Dword(&Size);
 | |
|         char* Buffer = new char[Size + 1];
 | |
|         Net_Get_Buffer(Buffer, Size);
 | |
|         Buffer[Size] = '\0';
 | |
| 
 | |
|         wchar_t* ss = DNFTOOL::charTowchar_t(Buffer);
 | |
| 
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
| #ifdef SELL
 | |
|         Sq_pushstring(v, L"Sq_Pack_Control", -1);
 | |
| #else
 | |
|         Sq_pushstring(v, L"Sq_Pack_ControlLocal", -1);
 | |
| #endif // SELL
 | |
| 
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushstring(v, ss, -1);
 | |
|             Sq_call(v, 2, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|         delete[]ss;
 | |
|     }
 | |
| }
 | |
| void H_Register_Pack(void* Ecx)
 | |
| {
 | |
|     Lpfn_Init(Ecx);
 | |
|     auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
 | |
| 
 | |
|     Registerfunc(130, Pack_Control, 0);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| //HookNut函数注册
 | |
| typedef void(__cdecl _Register_Nut)();
 | |
| static _Register_Nut* Register_Nut_Old;
 | |
| void __cdecl H_Register_Nut()
 | |
| {
 | |
|     Register_Nut_Old();
 | |
|     static bool Init = false;
 | |
|     if (!Init) {
 | |
|         Init = true;
 | |
|         R_Register_Nut();
 | |
|     std::string BaseFile = "YosinBaseC";
 | |
|     std::string Base = R"(
 | |
| Lenheart_P_Update <- true;
 | |
| function     Sq_L_Medal    (x,y)    {}
 | |
| function     Sq_SettingWindowCallBack    (x,y)    {}
 | |
| function     Sq_BuffSwitchingCallBack    (x,y)    {}
 | |
| function     Sq_SwitchingCallBack    (x,y)    {}
 | |
| function     Sq_UpgradeCallBack    (x,y)    {}
 | |
| function     Sq_RecoveryCallBack    (x,y)    {}
 | |
| function     Sq_RecoveryTypeSetCallBack    (Type)    {}
 | |
| function     Sq_DrawMainMaxLayerCustomUI    (pack)    {}
 | |
| function     Lenheart    (VmTop)    {}
 | |
| function     Sq_MouseEventCallBack    (Lb, Rb, Mb)    {}
 | |
| function     Sq_SelectCharacter    (Chunk)    {}
 | |
| function     Sq_DrawMainTopLayerCustomUI    (pack)    {}
 | |
| function     Sq_GetExeStr_Event    (StrIndex)    {return StrIndex;}
 | |
| function     Sq_CreatChr    (chunk)    {}
 | |
| function     Sq_SendPackType_Event    (Type)    {}
 | |
| function     Sq_SendPackByte_Event    (Parm)    {}
 | |
| function     Sq_SendPackWord_Event    (Parm)    {}
 | |
| function     Sq_SendPackDWord_Event    (Parm)    {}
 | |
| function     Sq_SendPackChar_Event    (Parm)    {}
 | |
| function     Sq_SendPack_Event    ()    {}
 | |
| function     Sq_DrawItemBack    (Xpos, Ypos, Image)    {}
 | |
| function     Sq_DrawItemFront    (Xpos, Ypos, Image)    {}
 | |
| function     Sq_GetDrawMonBloodSw    ()    {return false;}
 | |
| function     Sq_DrawMonsterBlood    (Object, X, Y)    {}
 | |
| function     Sq_Set_Inventory_M_Pos    (This)    {}
 | |
| function     Sq_Get_Ex_IntData    (SkillAddress, Idx, objAddress)    {return 0;}
 | |
| function     Sq_Get_Ex_SkillCoolTime    (SkillAddress, Idx, objAddress)    {return 0;}
 | |
| function     Sq_Get_Ex_LevelData    (SkillAddress, Idx, objAddress)    {return 0;}
 | |
| function     Sq_PlayerEachPos    (x, y)    {}
 | |
| function     Sq_DrawMainMaxLayerCustomUI    (pack)    {}
 | |
| function     Sq_PushDamageFontData    (ObjAddress, X, Y, Z, Value, Type,A8,A9)    { return true;}
 | |
| function     Sq_PushDamageData(ObjAddress, MySelfAddress, Value);
 | |
| function     Sq_Pack_Control    (chunk)    {}
 | |
| function     Sq_MessageWindowDraw    (a,c)    {}
 | |
| function     Sq_Get_Event_Pos_X    ()    {return 1;}
 | |
| function     Sq_Get_Event_Pos_Y    ()    {return 1;}
 | |
| function     Sq_L_OtherPlayerInfo    (x, y, Type, Value, ImgBuf)    {local str = Value.tostring(); local lenght = L_sq_GetStringDrawLength(str); L_sq_DrawImg(ImgBuf, x + 70 - lenght, y + 5);  return Value;}
 | |
| function     Sq_DrawMiniMapUI (a)    {}
 | |
| function     Sq_CompleteTask(a1,a2,a3){}
 | |
| function     L_drawMainCustomUI_All(){}
 | |
| function L_MouseCallBack(a, b, c,d) {}
 | |
| function L_DrawWindow_A() {}
 | |
| function L_DrawWindow_B() {}
 | |
| function L_OpenOldWindowCallBack(WindowIndex) {}
 | |
| function L_Old_Window_Get(WindowObject) {}
 | |
| function L_Character_Info_Window(WindowObject) { return false;}
 | |
| function L_Other_Character_Info_Window(WindowObject) {return false;}
 | |
| function L_Old_Window_Visible(WindowObject,Flag) {}
 | |
| 
 | |
| 
 | |
| getroottable().LenheartBaseFuncTab <- {};
 | |
| getroottable().LenheartFuncTab <- {};
 | |
| getroottable().Rindro_Scr_Width <- L_sq_RA(0x4D848E);
 | |
| getroottable().Rindro_Scr_High <- L_sq_RA(0x4D8495);
 | |
| )";
 | |
|     //是否为本地
 | |
|     FILE* file = fopen("sqr/DofileList.nut", "rb");
 | |
|     if (file)
 | |
|     {
 | |
|         Base += "RINDROLOCAL <- true";
 | |
|         fclose(file);
 | |
|     }
 | |
|     else {
 | |
|         Base += "RINDROLOCAL <- false";
 | |
|     }
 | |
| 
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
| 
 | |
|     wchar_t* filename = DNFTOOL::charTowchar_t((char*)BaseFile.c_str());
 | |
|     wchar_t* str = DNFTOOL::charTowchar_t((char*)Base.c_str());
 | |
| 
 | |
|     if (sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_call(v, 1, SQTrue, SQFalse);
 | |
|         Sq_pop(v, 1);
 | |
|     }
 | |
| 
 | |
|     delete[]filename;
 | |
|     delete[]str;
 | |
| 
 | |
| #ifndef SELL//本地模式要加在整体脚本
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"dofile", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"sqr/DofileList.nut", -1);
 | |
|         Sq_call(v, 2, SQFalse, SQTrue);
 | |
|     }
 | |
|     Sq_pop(v, 2);
 | |
| #endif // !SELL
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| //HOOK绘制字体
 | |
| typedef void(__fastcall* DrawCode)(DWORD thisc, int Seat, int a3, int a4, int a5, int a6);
 | |
| static DrawCode DrawCodeF;
 | |
| typedef int(_fastcall _DrawOtherPlayer_Img)(int thisc, void*, int X, int Y, int Img);
 | |
| static _DrawOtherPlayer_Img* DrawOtherPlayer_Img = (_DrawOtherPlayer_Img*)0x11A8F60;
 | |
| void _fastcall H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, int a5, int a6)
 | |
| {
 | |
| 
 | |
| 
 | |
|     wchar_t* strbuffer = (wchar_t*)a6;
 | |
|     if (strbuffer == NULL)return;
 | |
| 
 | |
|     wchar_t* clone = new wchar_t[wcslen(strbuffer) + 2];
 | |
|     wcscpy(clone, strbuffer);
 | |
| 
 | |
|     std::string GameStr;
 | |
|     DNFTOOL::Wchar_tToString(GameStr, clone);
 | |
|     delete[]clone;
 | |
| 
 | |
| 
 | |
|     //if (GameStr.find("1/") != std::string::npos) {
 | |
|     //    std::cout << GameStr << std::endl;
 | |
|     //}
 | |
| 
 | |
|     return DrawCodeF(thisc, Seat, a3, a4, a5, a6);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| //HOOK Item颜色
 | |
| extern  std::map< int, int>ItemColorMap;
 | |
| typedef DWORD(_cdecl _OldHookEquNameColor)(int rarity);
 | |
| static _OldHookEquNameColor* OldHookEquNameColor;
 | |
| DWORD _cdecl HookEquNameColor(int rarity)
 | |
| {
 | |
|     DWORD OldColor = OldHookEquNameColor(rarity);
 | |
|     switch (rarity)
 | |
|     {
 | |
|     case 6:
 | |
|         return 0xFF0055FF;
 | |
|     case 7:
 | |
|         return 0xFF9314FF;
 | |
|     case 8:
 | |
|         return 0xFF1CBC0C;
 | |
|     case 9:
 | |
|         return 0xFFACFF08;
 | |
|     }
 | |
|     return OldColor;
 | |
| }
 | |
| typedef DWORD(_fastcall _OldHookItemColor)(DWORD thisc, DWORD Seat);
 | |
| static _OldHookItemColor* OldHookItemColor;
 | |
| DWORD _fastcall HookItemColor(DWORD thisc, DWORD Seat)
 | |
| {
 | |
|     int ItemCode = *(int*)(thisc + 0x1C);
 | |
|     if (ItemColorMap.count(ItemCode) == 1)
 | |
|     {
 | |
|         return ItemColorMap[ItemCode];
 | |
|     }
 | |
| 
 | |
|     //不在注册项目颜色map里就执行原颜色获取
 | |
|     int Rarity = *(int*)(thisc + 0xF4);
 | |
|     int color = HookEquNameColor(Rarity);
 | |
| 
 | |
|     return color;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| //Hook发包相关
 | |
| static SendPacksType _OldSendPackType;
 | |
| int __fastcall NewSendPacksType(DWORD thisc, int Seat, int Parm)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_SendPackType_Event", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, Parm);
 | |
|             Sq_call(v, 2, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|         return _OldSendPackType(thisc, 0, Parm);
 | |
|     }
 | |
|     return _OldSendPackType(thisc, 0, Parm);
 | |
| }
 | |
| static SendPacksByte _OldSendPackByte;
 | |
| int __fastcall NewSendPacksByte(DWORD thisc, int Seat, int Parm)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_SendPackByte_Event", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, Parm);
 | |
|             Sq_call(v, 2, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|     }
 | |
|     return _OldSendPackByte(thisc, 0, Parm);
 | |
| }
 | |
| static SendPacksWORD _OldSendPackWord;
 | |
| int __fastcall NewSendPacksWord(DWORD thisc, int Seat, int Parm)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_SendPackWord_Event", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, Parm);
 | |
|             Sq_call(v, 2, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|     }
 | |
|     return _OldSendPackWord(thisc, 0, Parm);
 | |
| }
 | |
| static SendPacksDWORD _OldSendPackDWord;
 | |
| int __fastcall NewSendPacksDWord(DWORD thisc, int Seat, int Parm)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_SendPackDWord_Event", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, Parm);
 | |
|             Sq_call(v, 2, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|     }
 | |
|     return _OldSendPackDWord(thisc, 0, Parm);
 | |
| }
 | |
| static SendPacksChar _OldSendPackChar;
 | |
| int __fastcall NewSendPacksChar(DWORD thisc, int Seat, char* Parm, int Size)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_SendPackChar_Event", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushstring(v, (SQChar*)Parm, Size);
 | |
|             Sq_call(v, 2, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|     }
 | |
|     return _OldSendPackChar(thisc, 0, Parm, Size);
 | |
| }
 | |
| static SendPacks* _OldSend;
 | |
| int NewSend()
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_SendPack_Event", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_call(v, 1, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|     }
 | |
|     return _OldSend();
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| //Exe索引字符串函数Hook
 | |
| typedef int(_cdecl _sub1220590)(int a1);
 | |
| static _sub1220590* sub1220590 = (_sub1220590*)0x1220590;
 | |
| int _cdecl Newsub1220590(int a1)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         SQInteger StrIndex = a1;
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_GetExeStr_Event", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, a1);
 | |
|             Sq_call(v, 2, SQTrue, SQTrue);
 | |
|             Sq_getinteger(v, -1, &StrIndex);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
|         return sub1220590(StrIndex);
 | |
|     }
 | |
|     return sub1220590(a1);
 | |
| }
 | |
| 
 | |
| 
 | |
| //绘制Item_图标
 | |
| typedef int(_fastcall _sub11A8F60)(DWORD a1, DWORD Seat, int a2, int a3, int a4);
 | |
| static _sub11A8F60* sub11A8F60;
 | |
| int _fastcall newsub11A8F60(DWORD a1, DWORD Seat, int a2, int a3, int a4)
 | |
| {
 | |
|     if (InitGameFlag)
 | |
|     {
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_DrawItemBack", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, a2);
 | |
|             Sq_pushinteger(v, a3);
 | |
|             Sq_pushinteger(v, a4);
 | |
|             Sq_call(v, 4, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
| 
 | |
|         int ret = sub11A8F60(a1, 0, a2, a3, a4);
 | |
| 
 | |
|         Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_DrawItemFront", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_pushinteger(v, a2);
 | |
|             Sq_pushinteger(v, a3);
 | |
|             Sq_pushinteger(v, a4);
 | |
|             Sq_call(v, 4, SQFalse, SQTrue);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
| 
 | |
|         return ret;
 | |
|     }
 | |
| 
 | |
|     return sub11A8F60(a1, 0, a2, a3, a4);
 | |
| }
 | |
| 
 | |
| //活动图标
 | |
| typedef DWORD** (_fastcall _Event)(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4);
 | |
| static _Event* OldEvent;
 | |
| DWORD** _fastcall NewEvent(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4)
 | |
| {
 | |
|     if ((int)a4 == 1 && (int)a3 == 96527 /*&& a2 <= 536 && ((a2 - 456)%20 == 0)*/)//事先修改了活动图标的Y轴 在进行HOOK以便修改
 | |
|     {
 | |
|         int X, Y;
 | |
|         HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|         SQInteger Top = Sq_gettop(v);
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_Get_Event_Pos_X", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_call(v, 1, SQTrue, SQTrue);
 | |
|             Sq_getinteger(v, -1, &X);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
| 
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushstring(v, L"Sq_Get_Event_Pos_Y", -1);
 | |
|         if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|             Sq_pushroottable(v);
 | |
|             Sq_call(v, 1, SQTrue, SQTrue);
 | |
|             Sq_getinteger(v, -1, &Y);
 | |
|         }
 | |
|         Sq_settop(v, Top);
 | |
| 
 | |
|         a2 += X;
 | |
|         a3 = (DWORD**)Y;
 | |
|     }
 | |
|     return OldEvent(thisc, Seat, a2, a3, a4);
 | |
| }
 | |
| 
 | |
| //选择频道
 | |
| typedef void(_fastcall _10F2700)(DWORD thisc, DWORD Seat, int a2);
 | |
| static _10F2700* Old10F2700;
 | |
| void _fastcall New10F2700(DWORD thisc, DWORD Seat, int a2)
 | |
| {
 | |
| 
 | |
|     Old10F2700(thisc, Seat, a2);
 | |
| 
 | |
|     static bool Flag = false;
 | |
|     if (!Flag && thisc) {
 | |
|         for (size_t i = 0; i < 29; i++)
 | |
|         {
 | |
|             int addr = *(int*)(thisc + (0x4 * i) + 0x1c);
 | |
|             int value = *(int*)(addr + 0x14);
 | |
|             *(int*)(addr + 0x14) = value + 133;
 | |
|         }
 | |
|         Flag = true;
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
|     return;
 | |
| }
 | |
| //选择服务器
 | |
| typedef void (_fastcall _FC9440)(DWORD thisc, DWORD Seat,int a2);
 | |
| static _FC9440* OldFC9440;
 | |
| void _fastcall NewFC9440(DWORD thisc, DWORD Seat,int a2)
 | |
| {
 | |
|     OldFC9440(thisc, Seat, a2);
 | |
|     
 | |
|     //游戏开始按钮
 | |
|     *(int*)((*(int*)(thisc + 0x1c0)) + 0x14) = 470;
 | |
| 
 | |
|     return;
 | |
| }
 | |
| //选择角色
 | |
| typedef void(_fastcall _10F7660)(DWORD thisc, DWORD Seat,int a3);
 | |
| static _10F7660* Old10F7660;
 | |
| void _fastcall New10F7660(DWORD thisc, DWORD Seat, int a3)
 | |
| {
 | |
|     Old10F7660(thisc, Seat, a3);
 | |
|     
 | |
|     static bool Flag = false;
 | |
|     if (!Flag && thisc) {
 | |
|         //其他按钮
 | |
|         for (size_t i = 0; i < 5; i++)
 | |
|         {
 | |
|             int addr = *(int*)(thisc + (0x4 * i) + 0x70);
 | |
|             int value = *(int*)(addr + 0x14);
 | |
|             *(int*)(addr + 0x14) = value + 133;
 | |
|         }
 | |
| 
 | |
|         //选择频道按钮
 | |
|         {
 | |
|             int addr = *(int*)(thisc  + 0x15c);
 | |
|             int value = *(int*)(addr + 0x14);
 | |
|             *(int*)(addr + 0x14) = value + 133;
 | |
|         }
 | |
| 
 | |
|         //滚轮进度条
 | |
|         for (size_t i = 0; i < 8; i++)
 | |
|         {
 | |
|             int addr = *(int*)(thisc + (0x4 * i) + 0xA0);
 | |
|             int value = *(int*)(addr + 0x14);
 | |
|             *(int*)(addr + 0x14) = value + 133;
 | |
|         }
 | |
| 
 | |
|         //滚轮上下按钮
 | |
|         for (size_t i = 0; i < 2; i++)
 | |
|         {
 | |
|             int addr = *(int*)(thisc + (0x4 * i) + 0x16c);
 | |
|             int value = *(int*)(addr + 0x14);
 | |
|             *(int*)(addr + 0x14) = value + 133;
 | |
|         }
 | |
| 
 | |
|         //冒险团描述和进度 按钮
 | |
|         {
 | |
|             int addr = *(int*)(thisc + 0x34c);
 | |
|             int value = *(int*)(addr + 0x14);
 | |
|             *(int*)(addr + 0x14) = value + 133;
 | |
| 
 | |
|             addr = *(int*)(addr + 0x2c0);
 | |
|             value = *(int*)(addr + 0x14);
 | |
|             *(int*)(addr + 0x14) = value + 133;
 | |
|         }
 | |
|         Flag = true;
 | |
|     }
 | |
| 
 | |
|     return ;
 | |
| }
 | |
| 
 | |
| //HOOK PushString
 | |
| typedef uint32_t(__cdecl* LSqPushStringFunc)(uint32_t v, const wchar_t* s, uint32_t l);
 | |
| LSqPushStringFunc LrealSqPushString;
 | |
| uint32_t __cdecl LMySqPushString(uint32_t v, const wchar_t* s, uint32_t l)
 | |
| {
 | |
|     //获取技能攻击力
 | |
|     if (!wcscmp(s, L"getCurrentModuleDamageRate")) {
 | |
|         return LrealSqPushString(v, L"L_getCurrentModuleDamageRate", l);
 | |
|     }
 | |
|     return LrealSqPushString(v, s, l);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| //GetIntData
 | |
| typedef DWORD(_fastcall _908510)(DWORD thisc, DWORD Seat, DWORD a2, int a3);
 | |
| static _908510* Old908510;
 | |
| DWORD _fastcall New908510(DWORD thisc, DWORD Seat, DWORD a2, int a3)
 | |
| {
 | |
|     if (a3 != *(int*)0x1AB7CDC)return Old908510(thisc, Seat, a2, a3);
 | |
| 
 | |
|     SQInteger NutAddValue = 0;
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, thisc);
 | |
|         Sq_pushinteger(v, a2);
 | |
|         Sq_pushinteger(v, a3);
 | |
|         Sq_call(v, 4, SQTrue, SQTrue);
 | |
|         Sq_getinteger(v, -1, &NutAddValue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
|     return NutAddValue + Old908510(thisc, Seat, a2, a3);
 | |
| }
 | |
| //读取冷却
 | |
| typedef DWORD(_fastcall _909020)(DWORD thisc, DWORD Seat, DWORD a2, int a3);
 | |
| static _908510* Old909020;
 | |
| DWORD _fastcall New909020(DWORD thisc, DWORD Seat, DWORD a2, int a3)
 | |
| {
 | |
|     if (a3 != *(int*)0x1AB7CDC)return Old909020(thisc, Seat, a2, a3);
 | |
|     SQInteger NutAddValue = 0;
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, thisc);
 | |
|         Sq_pushinteger(v, a2);
 | |
|         Sq_pushinteger(v, a3);
 | |
|         Sq_call(v, 4, SQTrue, SQTrue);
 | |
|         Sq_getinteger(v, -1, &NutAddValue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
|     return  NutAddValue + Old909020(thisc, Seat, a2, a3);
 | |
| }
 | |
| 
 | |
| //原生角色Get
 | |
| typedef DWORD(_fastcall _90A4A0)(DWORD thisc, DWORD Seat, DWORD a2, int a3);
 | |
| static  _90A4A0* Old90A4A0;
 | |
| DWORD _fastcall New90A4A0(DWORD thisc, DWORD Seat, DWORD a2, int a3) {
 | |
|     if (!InitGameFlag)return Old90A4A0(thisc, Seat, a2, a3);
 | |
|     if (a3 != *(int*)0x1AB7CDC)return Old90A4A0(thisc, Seat, a2, a3);
 | |
| 
 | |
|     SQInteger NutAddValue = 0;
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, thisc);
 | |
|         Sq_pushinteger(v, a2);
 | |
|         Sq_pushinteger(v, a3);
 | |
|         Sq_call(v, 4, SQTrue, SQTrue);
 | |
|         Sq_getinteger(v, -1, &NutAddValue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
|     int ret = NutAddValue + Old90A4A0(thisc, Seat, a2, a3);
 | |
|     return ret;
 | |
| }
 | |
| //获取技能对象
 | |
| typedef int __fastcall sub_TTTTTT(int a1, int a2, int a3);
 | |
| static sub_TTTTTT* TFuncsub_GetSkillAddress = (sub_TTTTTT*)0x8406C0;
 | |
| //Nut角色Get1
 | |
| typedef DWORD(_fastcall _BA89D0)(DWORD thisc, DWORD Seat, DWORD a2, DWORD a3, DWORD a4);
 | |
| static  _BA89D0* OldBA89D0;
 | |
| DWORD _fastcall NewBA89D0(DWORD thisc, DWORD Seat, DWORD a2, DWORD a3, DWORD a4) {
 | |
|     if (!InitGameFlag)return OldBA89D0(thisc, Seat, a2, a3, a4);
 | |
|     if (a3 != *(int*)0x1AB7CDC)return OldBA89D0(thisc, Seat, a2, a3, a4);
 | |
|     DWORD ADDRESS = TFuncsub_GetSkillAddress(thisc, 0, a3);
 | |
| 
 | |
|     SQInteger NutAddValue = 0;
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, ADDRESS);
 | |
|         Sq_pushinteger(v, a2);
 | |
|         Sq_pushinteger(v, thisc);
 | |
|         Sq_call(v, 4, SQTrue, SQTrue);
 | |
|         Sq_getinteger(v, -1, &NutAddValue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
|     int ret = NutAddValue + OldBA89D0(thisc, Seat, a2, a3, a4);
 | |
|     return ret;
 | |
| }
 | |
| //Nut角色Get2
 | |
| typedef DWORD(_5A40E0)(DWORD a1, DWORD a2, DWORD a3, DWORD a4);
 | |
| static  _5A40E0* Old5A40E0;
 | |
| DWORD  New5A40E0(DWORD a1, DWORD a2, DWORD a3, DWORD a4) {
 | |
|     if (!InitGameFlag)return  Old5A40E0(a1, a2, a3, a4);
 | |
|     if (a3 != *(int*)0x1AB7CDC)return Old5A40E0(a1, a2, a3, a4);
 | |
| 
 | |
|     DWORD ADDRESS = TFuncsub_GetSkillAddress(a1, 0, a2);
 | |
| 
 | |
|     SQInteger NutAddValue = 0;
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, ADDRESS);
 | |
|         Sq_pushinteger(v, a3);
 | |
|         Sq_pushinteger(v, a1);
 | |
|         Sq_call(v, 4, SQTrue, SQTrue);
 | |
|         Sq_getinteger(v, -1, &NutAddValue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
|     int ret = NutAddValue + Old5A40E0(a1, a2, a3, a4);
 | |
|     return ret;
 | |
| }
 | |
| //描述对象HOOK
 | |
| typedef struct LevelDataBuffer
 | |
| {
 | |
|     DWORD SkillAddresss;
 | |
|     DWORD SkillIdx;
 | |
|     DWORD ObjectAddress;
 | |
| 
 | |
| } RELevelDataBufferG;
 | |
| LevelDataBuffer _LevelDataBuffer = { 0 };
 | |
| typedef DWORD(_75D1F0)(DWORD thisc);
 | |
| static  _75D1F0* Old75D1F0;
 | |
| DWORD  New75D1F0(DWORD thisc) {
 | |
|     if (!InitGameFlag)return Old75D1F0(thisc);
 | |
|     if (_LevelDataBuffer.ObjectAddress != *(int*)0x1AB7CDC)return Old75D1F0(thisc);
 | |
| 
 | |
|     SQInteger NutAddValue = 0;
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, _LevelDataBuffer.SkillAddresss);
 | |
|         Sq_pushinteger(v, _LevelDataBuffer.SkillIdx);
 | |
|         Sq_pushinteger(v, _LevelDataBuffer.ObjectAddress);
 | |
|         Sq_call(v, 4, SQTrue, SQTrue);
 | |
|         Sq_getinteger(v, -1, &NutAddValue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
| 
 | |
|     if (NutAddValue != 0) {
 | |
|         int ret = NutAddValue + Old75D1F0(thisc);
 | |
|         _LevelDataBuffer.SkillAddresss = 0;
 | |
|         _LevelDataBuffer.SkillIdx = 0;
 | |
|         _LevelDataBuffer.ObjectAddress = 0;
 | |
|         return ret;
 | |
|     }
 | |
|     return Old75D1F0(thisc);
 | |
| }
 | |
| 
 | |
| 
 | |
| typedef DWORD(__fastcall _44E620)(void* thisc,DWORD Seat);
 | |
| static  _44E620* Old44E620;
 | |
| DWORD __fastcall New44E620(void* thisc, DWORD Seat) {
 | |
|     //*(int*)((char*)thisc + 0xC) = 256;
 | |
|     DWORD Ret = Old44E620(thisc, Seat);
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"L_Old_Window_Get", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, (int)thisc);
 | |
|         Sq_call(v, 2, SQFalse, SQTrue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
| 
 | |
|     return Ret;
 | |
| }
 | |
| 
 | |
| typedef char(__fastcall _11B3B70)(void* thisc, DWORD Seat,char Flag);
 | |
| static  _11B3B70* Old11B3B70;
 | |
| char __fastcall New11B3B70(void* thisc, DWORD Seat, char Flag) {
 | |
| 
 | |
|     char Ret = Old11B3B70(thisc, Seat, Flag);
 | |
| 
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"L_Old_Window_Visible", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, (int)thisc);
 | |
|         Sq_pushinteger(v, (int)Flag);
 | |
|         Sq_call(v, 3, SQFalse, SQTrue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
| 
 | |
|     return Ret;
 | |
| }
 | |
| 
 | |
| typedef char(__fastcall _11D43A0)(void* thisc, DWORD Seat);
 | |
| static  _11D43A0* Old11D43A0;
 | |
| char __fastcall New11D43A0(void* thisc, DWORD Seat) {
 | |
| 
 | |
|     //char Ret = Old11D43A0(thisc, Seat);
 | |
| 
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     SQBool Flag;
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"L_Character_Info_Window", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, (int)thisc);
 | |
|         Sq_call(v, 2, SQTrue, SQTrue);
 | |
|         Sq_getbool(v, -1, &Flag);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
| 
 | |
|     if(!Flag)return Old11D43A0(thisc, Seat);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| typedef DWORD(__fastcall _7CDA30)(void* thisc, DWORD Seat, DWORD*a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6);
 | |
| static  _7CDA30* Old7CDA30;
 | |
| DWORD __fastcall New7CDA30(void* thisc, DWORD Seat, DWORD* a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6) {
 | |
| 
 | |
|     DWORD Ret = Old7CDA30(thisc, Seat, a2, a3, a4, a5, a6);
 | |
| 
 | |
|     //std::cout << "相机坐标: " << *(int*)((int)thisc + 0x638) << std::endl;
 | |
| 
 | |
|     HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
 | |
|     SQInteger Top = Sq_gettop(v);
 | |
|     SQBool Flag;
 | |
|     Sq_pushroottable(v);
 | |
|     Sq_pushstring(v, L"L_Sync_Camera_Pos", -1);
 | |
|     if (SQ_SUCCEEDED(Sq_get(v, -2))) {
 | |
|         Sq_pushroottable(v);
 | |
|         Sq_pushinteger(v, *(int*)((int)thisc + 0x638));
 | |
|         Sq_call(v, 2, SQFalse, SQTrue);
 | |
|     }
 | |
|     Sq_settop(v, Top);
 | |
| 
 | |
|     return Ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| typedef int(_fastcall _Get_Img)(int thisc, void*, int a2);
 | |
| static _Get_Img* OldGet_Img;
 | |
| int _fastcall NewGet_Img(int thisc, void*, int a2) {
 | |
| 
 | |
|     if (a2 == 76) {
 | |
|         std::cout << 12123123 << std::endl;
 | |
|     }
 | |
|     return OldGet_Img(thisc, 0, a2);
 | |
| }
 | |
| 
 | |
| typedef int(_fastcall _4294A0)(int thisc, void*,int a2);
 | |
| static _4294A0* Old4294A0;
 | |
| int _fastcall New4294A0(int thisc, void*,int a2) {
 | |
| 
 | |
|     return 0;
 | |
|     return Old4294A0(thisc, 0,a2);
 | |
| }
 | |
| 
 | |
| 
 | |
| void RegisterHook() {
 | |
| 
 | |
|     //InlineHook///
 | |
| 
 | |
|     //玩家菜单选项HOOK 有回调
 | |
|     inlinehook SSS(0x001004B52, (int)&PlayerEach2);
 | |
|     SSS.Motify_address();
 | |
|     //修复滚轮
 | |
|     //inlinehook MMM(0x011BDE05, (int)&MouseWheelUp);
 | |
|     //MMM.Motify_address();
 | |
|     //窗口绘制HOOK
 | |
|     inlinehook WindowDrawHook(0x066BE9A, (int)&DrawWindow_B_Hook);
 | |
|     WindowDrawHook.Motify_address();
 | |
|     //伤害HOOK
 | |
|     inlinehook DamageHook(0xE5A2DE, (int)&Damage_Hook);
 | |
|     DamageHook.Motify_address();
 | |
| 
 | |
| 
 | |
| 
 | |
|     //Fundction Hook//
 | |
|     MH_Initialize();
 | |
| 
 | |
| 
 | |
|     //关闭原版商城
 | |
|     //MH_CreateHook((void*)0x4294A0, &New4294A0, reinterpret_cast<void**>(&Old4294A0));
 | |
|     //MH_EnableHook((void*)0x4294A0);
 | |
| 
 | |
| 
 | |
|     //MH_CreateHook((void*)0x11AA190, &NewGet_Img, reinterpret_cast<void**>(&OldGet_Img));
 | |
|     //MH_EnableHook((void*)0x11AA190);
 | |
| 
 | |
|     //镜头坐标HOOK
 | |
|     MH_CreateHook((void*)0x7CDA30, &New7CDA30, reinterpret_cast<void**>(&Old7CDA30));
 | |
|     MH_EnableHook((void*)0x7CDA30);
 | |
| 
 | |
| 
 | |
|     //窗口遍历事件
 | |
|     MH_CreateHook((void*)0x44E620, &New44E620, reinterpret_cast<void**>(&Old44E620));
 | |
|     MH_EnableHook((void*)0x44E620);
 | |
| 
 | |
|     //窗口打开事件Hook  为了写UI框架 打开原生窗口将渲染队列切换为下层
 | |
|     MH_CreateHook((void*)0xE6E070, &NewOpenWindow, reinterpret_cast<void**>(&OldOpenWindow));
 | |
|     MH_EnableHook((void*)0xE6E070);
 | |
| 
 | |
|     //鼠标事件HOOK
 | |
|     MH_CreateHook((void*)0x11BDC90, &New11BDC90, reinterpret_cast<void**>(&Old11BDC90));
 | |
|     MH_EnableHook((void*)0x11BDC90);
 | |
| 
 | |
|     //N键大地图
 | |
|     MH_CreateHook((void*)0x1030C30, &New1030C30, reinterpret_cast<void**>(&Old1030C30));
 | |
|     MH_EnableHook((void*)0x1030C30);
 | |
| 
 | |
|     //官方的组合NutHook
 | |
|     MH_CreateHook((void*)0x674030, &New674030, reinterpret_cast<void**>(&Old674030));
 | |
|     MH_EnableHook((void*)0x674030);
 | |
| 
 | |
| 
 | |
| 
 | |
|     //DrawMain HOOK
 | |
|     MH_CreateHook((void*)0x4C61F0, &New4C61F0, reinterpret_cast<void**>(&Old4C61F0));
 | |
|     MH_EnableHook((void*)0x4C61F0);
 | |
| 
 | |
|     //伤害字体 HOOK
 | |
|     MH_CreateHook((void*)0x7EEED0, &New7EEED0, reinterpret_cast<void**>(&Old7EEED0));
 | |
|     MH_EnableHook((void*)0x7EEED0);
 | |
| 
 | |
|     //Hook收包
 | |
|     MH_CreateHook((void*)0x721EA0, &H_Register_Pack, reinterpret_cast<void**>(&Lpfn_Init));
 | |
|     MH_EnableHook((void*)0x721EA0);
 | |
| 
 | |
|     //HookNut函数注册
 | |
|     MH_CreateHook((void*)0x67B910, &H_Register_Nut, reinterpret_cast<void**>(&Register_Nut_Old));
 | |
|     MH_EnableHook((void*)0x67B910);
 | |
| 
 | |
|     //Hook绘制字符
 | |
|     MH_CreateHook((void*)0x1206BD0, &H_Register_DrawCode, reinterpret_cast<void**>(&DrawCodeF));
 | |
|     MH_EnableHook((void*)0x1206BD0);
 | |
| 
 | |
| 
 | |
|     //HOOK获取绘制颜色
 | |
|     MH_CreateHook((void*)0x7AB080, &HookItemColor, reinterpret_cast<void**>(&OldHookItemColor));
 | |
|     MH_EnableHook((void*)0x7AB080);
 | |
| 
 | |
|     //HOOK根据品级得到颜色
 | |
|     MH_CreateHook((void*)0x7AAD00, &HookEquNameColor, reinterpret_cast<void**>(&OldHookEquNameColor));
 | |
|     MH_EnableHook((void*)0x7AAD00);
 | |
| 
 | |
|     //Hook发包相关
 | |
|     //HOOK发包类型
 | |
|     //MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast<void**>(&_OldSendPackType));
 | |
|     //MH_EnableHook((void*)0x1127D60);
 | |
|     //MH_CreateHook((void*)0x1128550, &NewSendPacksByte, reinterpret_cast<void**>(&_OldSendPackByte));
 | |
|     //MH_EnableHook((void*)0x1128550);
 | |
|     //MH_CreateHook((void*)0x1128580, &NewSendPacksWord, reinterpret_cast<void**>(&_OldSendPackWord));
 | |
|     //MH_EnableHook((void*)0x1128580);
 | |
|     //MH_CreateHook((void*)0x11285B0, &NewSendPacksDWord, reinterpret_cast<void**>(&_OldSendPackDWord));
 | |
|     //MH_EnableHook((void*)0x11285B0);
 | |
|     //MH_CreateHook((void*)0x11285E0, &NewSendPacksChar, reinterpret_cast<void**>(&_OldSendPackChar));
 | |
|     //MH_EnableHook((void*)0x11285E0);
 | |
|     MH_CreateHook((void*)0x1127EC0, &NewSend, reinterpret_cast<void**>(&_OldSend));
 | |
|     MH_EnableHook((void*)0x1127EC0);
 | |
| 
 | |
|     //exe字符串索引
 | |
|     MH_CreateHook((void*)0x1220590, &Newsub1220590, reinterpret_cast<void**>(&sub1220590));
 | |
|     MH_EnableHook((void*)0x1220590);
 | |
| 
 | |
|     //绘制Item_图标
 | |
|     MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast<void**>(&sub11A8F60));
 | |
|     MH_EnableHook((void*)0x11A8F60);
 | |
| 
 | |
|     //如果加载了百级UI
 | |
|     FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb");
 | |
|     if (file) {
 | |
|         //BUFF图标 显示
 | |
|         inlinehook BuffIconHook(0x04C8C14, (int)&BuffIcon_Hook);
 | |
|         BuffIconHook.Motify_address();
 | |
|         //BUFF图标 文字标识
 | |
|         inlinehook BuffIconHookB(0x04BF55E, (int)&BuffIcon_Hook_B);
 | |
|         BuffIconHookB.Motify_address();
 | |
|         //血槽背景
 | |
|         inlinehook HudBloodBackgroundHook(0x04CA035, (int)&HudBloodBackground);
 | |
|         HudBloodBackgroundHook.Motify_address();
 | |
| 
 | |
|         //活动图标
 | |
|         MH_CreateHook((void*)0x11B4030, &NewEvent, reinterpret_cast<void**>(&OldEvent));
 | |
|         MH_EnableHook((void*)0x11B4030);
 | |
| 
 | |
|         //选择服务器
 | |
|         //MH_CreateHook((void*)0xFC9440, &NewFC9440, reinterpret_cast<void**>(&OldFC9440));
 | |
|         //MH_EnableHook((void*)0xFC9440);
 | |
|         //选择频道界面
 | |
|         MH_CreateHook((void*)0x10F2700, &New10F2700, reinterpret_cast<void**>(&Old10F2700));
 | |
|         MH_EnableHook((void*)0x10F2700);
 | |
|         //选择角色
 | |
|         MH_CreateHook((void*)0x10F7660, &New10F7660, reinterpret_cast<void**>(&Old10F7660));
 | |
|         MH_EnableHook((void*)0x10F7660);
 | |
|         inlinehook SelectCharacter(0x10F79C9, (int)&SelectCharacter_Hook);
 | |
|         SelectCharacter.Motify_address();
 | |
|         inlinehook SelectCharacter1(0x10F7B43, (int)&SelectCharacter_Hook1);
 | |
|         SelectCharacter1.Motify_address();
 | |
|         inlinehook SelectCharacter2(0x10F7F89, (int)&SelectCharacter_Hook2);
 | |
|         SelectCharacter2.Motify_address();
 | |
|         inlinehook SelectCharacter3(0x10F8311, (int)&SelectCharacter_Hook3);
 | |
|         SelectCharacter3.Motify_address();
 | |
|         inlinehook SelectCharacter4(0x10F8436, (int)&SelectCharacter_Hook4);
 | |
|         SelectCharacter4.Motify_address();
 | |
|         inlinehook SelectCharacter5(0x10F85EA, (int)&SelectCharacter_Hook5);
 | |
|         SelectCharacter5.Motify_address();
 | |
|         inlinehook SelectCharacter6(0x10F2C6E, (int)&SelectCharacter_Hook6);
 | |
|         SelectCharacter6.Motify_address();
 | |
|         inlinehook SelectCharacter7(0x10F3478, (int)&SelectCharacter_Hook7);
 | |
|         SelectCharacter7.Motify_address();
 | |
|         fclose(file);
 | |
|     }
 | |
| 
 | |
|     //HOOK PushString
 | |
|     MH_CreateHook((void*)0x1358A60, &LMySqPushString, reinterpret_cast<void**>(&LrealSqPushString));
 | |
|     MH_EnableHook((void*)0x1358A60);
 | |
| 
 | |
|     //读取静态数据
 | |
|     MH_CreateHook((void*)0x908510, &New908510, reinterpret_cast<void**>(&Old908510));
 | |
|     MH_EnableHook((void*)0x908510);
 | |
|     //读取冷却
 | |
|     MH_CreateHook((void*)0x909020, &New909020, reinterpret_cast<void**>(&Old909020));
 | |
|     MH_EnableHook((void*)0x909020);
 | |
|     //读取动态数据
 | |
|     MH_CreateHook((void*)0x090A4A0, &New90A4A0, reinterpret_cast<void**>(&Old90A4A0));
 | |
|     MH_EnableHook((void*)0x090A4A0);
 | |
|     MH_CreateHook((void*)0x0BA89D0, &NewBA89D0, reinterpret_cast<void**>(&OldBA89D0));
 | |
|     MH_EnableHook((void*)0x0BA89D0);
 | |
|     MH_CreateHook((void*)0x05A40E0, &New5A40E0, reinterpret_cast<void**>(&Old5A40E0));
 | |
|     MH_EnableHook((void*)0x05A40E0);
 | |
|     //技能描述对象HOOK
 | |
|     MH_CreateHook((void*)0x075D1F0, &New75D1F0, reinterpret_cast<void**>(&Old75D1F0));
 | |
|     MH_EnableHook((void*)0x075D1F0);
 | |
| 
 | |
|     //窗口设置显示与隐藏
 | |
|     MH_CreateHook((void*)0x11B3B70, &New11B3B70, reinterpret_cast<void**>(&Old11B3B70));
 | |
|     MH_EnableHook((void*)0x11B3B70);
 | |
|     //个人面板的属性信息遍历
 | |
|     MH_CreateHook((void*)0x11D43A0, &New11D43A0, reinterpret_cast<void**>(&Old11D43A0));
 | |
|     MH_EnableHook((void*)0x11D43A0);
 | |
| 
 | |
| 
 | |
|     //他人信息Hook 数值
 | |
|     MH_CreateHook((void*)0xFA42D0, &NewFA42D0, reinterpret_cast<void**>(&OldFA42D0));
 | |
|     MH_EnableHook((void*)0xFA42D0);
 | |
|     //他人信息Hook 图标
 | |
|     //MH_CreateHook((void*)0xFA8230, &NewFA8230, reinterpret_cast<void**>(&OldFA8230));
 | |
|     //MH_EnableHook((void*)0xFA8230);
 | |
| } |