DNF_DLL/test/hook.cpp

2697 lines
73 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "pch.h"
#include "hook.h"
#include "inlinehook.h"
extern int LbState;
extern int RbState;
extern int MbState;
static int OtherPlayerInfoType = 0;
static bool HookOtherPlayerInfo = false;
static int OtherPlayerInfoImg = 0;
//游戏初始化完毕Flag
static bool InitGameFlag = false;
//注册nut
uint32_t __cdecl hook::H_Register_Nut(uint32_t v, void* f, int freeVarsCnt)
{
//wchar_t* funcName = nullptr;
//SQGetString(v, -1 - freeVarsCnt, &funcName);
//char* OutPutText = DNFTOOL::SquirrelU2W(funcName);
//std::string FuncName = OutPutText;
//delete []OutPutText;
//std::wcout << funcName << std::endl;
//wprintf(L"Function:%s Num:%d Address: 0x%p\n", funcName, freeVarsCnt,f);
static int build = 0;
if (build == 0 && f == (void*)0x005C5980)
{
squirrel::R_Register_Nut();
//squirrel::InitGameScript();//调用初始化程序
build = 1;
//Quick_SQdofileBuffer("BaseC_Tool", BaseC_Tool);
//Quick_SQdofileBuffer("BaseC_Tool1", BaseC_Tool1);
//Quick_SQdofileBuffer("BaseC_Tool2", BaseC_Tool2);
//Quick_SQdofileBuffer("BaseC_Tool3", BaseC_Tool3);
uint32_t v = GetSqVm();
std::string BaseFile = "YosinBaseC";
//std::string Base = "function Sq_Get_Ex_LevelData(a,b,c) {return 0;} function Sq_Get_Ex_IntData(a,b,c) {return 0;} function Sq_Get_Ex_SkillCoolTime(a,b,c) {return 0;} function Lenheart(pack) {} function Sq_DrawMainMaxLayerCustomUI(pack) { } function Sq_DrawMainTopLayerCustomUI(pack) {} function Sq_SelectCharacter(Chunk){} function Sq_SendPackType_Event(Chunk){} function Sq_SendPackByte_Event(Chunk){} function Sq_SendPackWord_Event(Chunk){} function Sq_SendPackDWord_Event(Chunk){} function Sq_SendPackChar_Event(Chunk){} function Sq_SendPack_Event(Chunk){} function Sq_Pack_Control(Chunk){} ";
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) { return 0;}
function Sq_Pack_Control (chunk) {}
function Sq_MessageWindowDraw (a,c) {}
function Sq_Get_Event_Pos (a) {return 1;}
function Sq_L_OtherPlayerInfo (x, y, Type, Value, ImgBuf) {local str = Value.tostring(); local lenght = LenheartTextClass.GetStringLength(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) {}
)";
wchar_t* sfile = DNFTOOL::charTowchar_t((char*)BaseFile.c_str());
wchar_t* ss = DNFTOOL::charTowchar_t((char*)Base.c_str());
squirrel::SQdofileBuffer(v, sfile, ss);
}
#if defined DOFILE_HOOK
if (f == (void*)0x013563C0)
{
return MLnewclosure(v, squirrel::LDofile, freeVarsCnt);
}
#endif
return MLnewclosure(v, f, freeVarsCnt);
}
void WReplace(wchar_t* pDstOut, wchar_t* pSrcIn, wchar_t* pSrcRpl, wchar_t* pDstRpl)
{
wchar_t* pi = pSrcIn;
wchar_t* po = pDstOut;
int nSrcRplLen = wcslen(pSrcRpl);
int nDstRplLen = wcslen(pDstRpl);
wchar_t* p = NULL;
int nLen = 0;
do
{
// 找到下一个替换点
p = wcsstr(pi, pSrcRpl);
if (p != NULL)
{
// 拷贝上一个替换点和下一个替换点中间的字符串
nLen = p - pi;
memcpy(po, pi, nLen * sizeof(wchar_t));
// 拷贝需要替换的字符串
memcpy(po + nLen, pDstRpl, nDstRplLen * sizeof(wchar_t));
}
else
{
wcscpy(po, pi);
// 如果没有需要拷贝的字符串,说明循环应该结束
break;
}
pi = p + nSrcRplLen;
po = po + nLen + nDstRplLen;
} while (p != NULL);
}
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);
}
else if (!wcscmp(s, L"changeTrhowState_ATMage")) {
return LrealSqPushString(v, L"changeThrowState_ATMage", l);
}
//wprintf(L"调用函数: %s", s);
return LrealSqPushString(v, s, l);
}
//注册收包
void hook::H_Register_Pack(void* Ecx)
{
Lpfn_Init(Ecx);
sock::R_Register_Pack();
}
//Hook文字
#ifdef CODEDRAW
struct CodeDrawObj
{
int Color;
std::string str;
};
extern std::map< std::string, CodeDrawObj>CodeDrawMap;
#endif
typedef DWORD(_fastcall _BFontInitW)(DWORD thisc, DWORD Seat);
static _BFontInitW* Wsub_1206570 = (_BFontInitW*)0x1206570;
typedef int(_fastcall _DrawOtherPlayer_Img)(int thisc, void*, int X, int Y, int Img);
static _DrawOtherPlayer_Img* DrawOtherPlayer_Img = (_DrawOtherPlayer_Img*)0x11A8F60;
//HOOK绘制字体
void _fastcall hook::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;
//他人信息描述HOOK
if (OtherPlayerInfoType != 0) {
if (!HookOtherPlayerInfo) {
HookOtherPlayerInfo = true;
}
else {
HookOtherPlayerInfo = false;
int Value = atoi(GameStr.c_str());
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_L_OtherPlayerInfo", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQPushInt(v, OtherPlayerInfoType - 1);
SQPushInt(v, Value);
if (OtherPlayerInfoImg) {
SQPushInt(v, OtherPlayerInfoImg);
//DrawOtherPlayer_Img(*(int*)0x1B45B94, 0, a3, a4 + 3, OtherPlayerInfoImg);
}
else {
SQPushInt(v, 0);
}
SQ_Call(v, 6, 1, 1);
SQGetInt(v, -1, &Value);
SQPop(v, 3);
wchar_t wcs[128];
int Type = OtherPlayerInfoType - 1;
if ((Type >= 12 && Type <= 16) || Type == 18 || Type == 19) {
wsprintf(wcs, L"+%d%S", Value, ".0%");
}
else {
wsprintf(wcs, L"%d", Value);
}
DrawCodeF(thisc, Seat, a3, a4, a5, (int)wcs);
OtherPlayerInfoType = 0;
//DrawCodeF(thisc, Seat, a3, a4, a5, a6);
return;
}
}
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 6) {
if (GameStr.find("ch20.天帷巨兽") != std::string::npos)
{
wchar_t* nclone = L"超时空之战-团本区域";
return DrawCodeF(thisc, Seat, a3, a4, a5, (int)nclone);
}
}
//if (GameStr.find("天界地区") != std::string::npos)
//{
// std::cout << GameStr << std::endl;
//}
//std::cout << GameStr << std::endl;
//if (GameStr.find("辅助装备") != std::string::npos)
//{
// wchar_t* nclone = new wchar_t[wcslen(strbuffer) + 8];
// WReplace(nclone, strbuffer, L"辅助装备", L"VIP装备");
// //string_replace(GameStr, "辅助装备", "VIP装备");
// //const wchar_t* newstrbuffer = DNFTOOL::GetWC((char*)GameStr.c_str());
// return DrawCodeF(thisc, Seat, a3, a4, a5, (int)nclone);
//}
//Hook文字
#ifdef CODEDRAW
if (CodeDrawMap.count(GameStr) == 1)
{
wchar_t* str = DNFTOOL::char2wchar(CodeDrawMap[GameStr].str.c_str());
DrawCodeF(thisc, Seat, a3, a4, CodeDrawMap[GameStr].Color, (int)str);
delete[]str;
return;
}
#endif
#ifdef MEDAL_SWITCH
if (GameStr.find("倾泪寒勋章") != std::string::npos || GameStr.find("傾淚寒勳章") != std::string::npos || GameStr.find("倾泪寒勳章") != std::string::npos || GameStr.find("yosin_medal") != std::string::npos)
{
Wsub_1206570(thisc, 0);
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_L_Medal", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
return;
}
#endif
//Hook游戏设置窗口CallBack ui/optionwindow
#ifdef SETTINGWINDOWS
if (GameStr.find("倾泪寒自定义设置") != std::string::npos)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SettingWindowCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
#endif
//buff换装
#ifdef BUFFSWITCHING_SWITCH
if (GameStr.find("LenheartBUFFSwitching") != std::string::npos)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_BuffSwitchingCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
if (GameStr.find("LenheartSwitching") != std::string::npos)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SwitchingCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
#endif
//强化系统
#ifdef NEWUPGRADE_SWITCH
if (GameStr.find("LenheartUpgrade") != std::string::npos)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_UpgradeCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
#endif
//Hook游戏背包窗口回收功能CallBack ui/inventory/inventory_bottom.ui
#ifdef RecoverySystem
if (GameStr.find("倾泪寒回收") != std::string::npos)
{
if (GameStr.find("倾泪寒回收功能") != std::string::npos)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_RecoveryCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3 - 800);
SQPushInt(v, a4);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
int Type = 0;
if (GameStr.find("倾泪寒回收装备") != std::string::npos)Type = 1;
else if (GameStr.find("倾泪寒回收消耗品") != std::string::npos)Type = 2;
else if (GameStr.find("倾泪寒回收材料") != std::string::npos)Type = 3;
else if (GameStr.find("倾泪寒回收副职业材料") != std::string::npos)Type = 5;
else if (GameStr.find("倾泪寒回收任务材料") != std::string::npos)Type = 4;
else if (GameStr.find("倾泪寒回收时装") != std::string::npos)Type = 6;
else if (GameStr.find("倾泪寒回收徽章") != std::string::npos)Type = 7;
else if (GameStr.find("倾泪寒回收宠物宠物") != std::string::npos)Type = 8;
else if (GameStr.find("倾泪寒回收宠物装备") != std::string::npos)Type = 9;
else if (GameStr.find("倾泪寒回收宠物消耗品") != std::string::npos)Type = 10;
if (Type > 0)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_RecoveryTypeSetCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, Type);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
}
if (GameStr.find("傾淚寒回收") != std::string::npos)
{
if (GameStr.find("傾淚寒回收功能") != std::string::npos)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_RecoveryCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a3 - 800);
SQPushInt(v, a4);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
int Type = 0;
if (GameStr.find("傾淚寒回收裝備") != std::string::npos)Type = 1;
else if (GameStr.find("傾淚寒回收消耗品") != std::string::npos)Type = 2;
else if (GameStr.find("傾淚寒回收材料") != std::string::npos)Type = 3;
else if (GameStr.find("傾淚寒回收副職業材料") != std::string::npos)Type = 5;
else if (GameStr.find("傾淚寒回收任務材料") != std::string::npos)Type = 4;
else if (GameStr.find("傾淚寒回收時裝") != std::string::npos)Type = 6;
else if (GameStr.find("傾淚寒回收徽章") != std::string::npos)Type = 7;
else if (GameStr.find("傾淚寒回收寵物寵物") != std::string::npos)Type = 8;
else if (GameStr.find("傾淚寒回收寵物裝備") != std::string::npos)Type = 9;
else if (GameStr.find("傾淚寒回收寵物消耗品") != std::string::npos)Type = 10;
if (Type > 0)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_RecoveryTypeSetCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, Type);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer);
}
}
#endif
#ifndef SELL
/*
//副屏绘制文字
if (a3 == 15 && a4 == 503)
{
for (DrawCodestruct iter : DrawCodeT3_STL)
{
wchar_t* str = DNFTOOL::char2wchar(iter.str.c_str());
DrawCodeF(thisc, Seat, iter.Xpos, iter.Ypos, iter.Color, (int)str);
delete[]str;
}
DrawCodeT3_STL.clear();
return;
}
*/
//Ver.1180.2.1r
if (GameStr.find("Ver. 1.180.2.1r") != std::string::npos)
{
return;
}
if (GameStr.find("ch11.格兰之森") != std::string::npos)
{
a3 += 32;
a4 -= 58;
}
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 6 && (GameStr.find("顺畅") != std::string::npos || GameStr.find("拥挤") != std::string::npos || GameStr.find("爆满") != std::string::npos))
{
a3 += 32;
a4 -= 58;
}
// ui/hud/hud.ui 请勿删除
//if (a3 == 9999 && a4 == 9999)
//{
// squirrel::SqrCallBackFunc();
// //imguiC::Init();
// return;
//}
#endif // !SELL
// ui/hud/hud.ui 特殊
// if (a3 == 9999 && a4 == 9998)
// {
// Wsub_1206570(thisc, 0);
// uint32_t v = GetSqVm();
// //SQPushRootTable(v);
// //SQPushString(v, L"Sq_DrawMainMaxLayerCustomUI", -1);
// //SQ_Get(v, -2);
// //SQPushRootTable(v);
// //SQPushString(v, L"Lenheart", -1);
// //SQ_Call(v, 2, 0, 1);
// //SQPop(v, 2);
//
//#ifdef MOUSE_SWITCH
// SQPushRootTable(v);
// SQPushString(v, L"Sq_MouseEventCallBack", -1);
// SQ_Get(v, -2);
// SQPushRootTable(v);
// SQPushInt(v, LbState);
// SQPushInt(v, RbState);
// SQPushInt(v, MbState);
// SQ_Call(v, 4, 0, 1);
// SQPop(v, 2);
//#endif // MOUSE_SWITCH
//
//
// for (DrawCodestruct iter : DrawCodeT1_STL)
// {
// wchar_t* str = DNFTOOL::char2wchar(iter.str.c_str());
// DrawCodeF(thisc, Seat, iter.Xpos, iter.Ypos, iter.Color, (int)str);
// delete[]str;
// }
// DrawCodeT1_STL.clear();
// return;
// }
// ui/selectcharacter/selectcharacterover.ui 选角色
//if (a3 == 9999 && a4 == 9489)
//{
// static bool Init = false;
// if (!Init)
// {
// squirrel::InitGameScript();//调用初始化程序
// Init = true;
// }
// uint32_t v = GetSqVm();
// SQPushRootTable(v);
// SQPushString(v, L"Sq_SelectCharacter", -1);
// SQ_Get(v, -2);
// SQPushRootTable(v);
// SQPushString(v, L"Lenheart", -1);
// SQ_Call(v, 2, 0, 1);
// SQPop(v, 2);
// return;
//}
// ui/event/creatednftwevent/creatednftwevent.ui 顶层绘制
//if (a3 == 8888 && a4 == 8884)
//{
// uint32_t v = GetSqVm();
// SQPushRootTable(v);
// SQPushString(v, L"Sq_DrawMainTopLayerCustomUI", -1);
// SQ_Get(v, -2);
// SQPushRootTable(v);
// SQPushString(v, L"Lenheart", -1);
// SQ_Call(v, 2, 0, 1);
// SQPop(v, 2);
// for (DrawCodestruct iter : DrawCodeT2_STL)
// {
// wchar_t* str = DNFTOOL::char2wchar(iter.str.c_str());
// DrawCodeF(thisc, Seat, iter.Xpos, iter.Ypos, iter.Color, (int)str);
// delete[]str;
// }
// DrawCodeT2_STL.clear();
// return;
//}
return DrawCodeF(thisc, Seat, a3, a4, a5, a6);
}
#ifdef GET_EXE_STR
//Exe索引字符串函数Hook
typedef int(_cdecl _sub1220590)(int a1);
static _sub1220590* sub1220590 = (_sub1220590*)0x1220590;
int _cdecl Newsub1220590(int a1)
{
if (a1 == 19082) {
std::cout << 111 << std::endl;
}
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return sub1220590(a1);
}
else
{
int StrIndex;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_GetExeStr_Event", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a1);
SQ_Call(v, 2, 1, 1);
SQGetInt(v, -1, &StrIndex);
SQPop(v, 3);
return sub1220590(StrIndex);
}
}
#endif
//HOOK创建角色
#ifdef CREAT_CHR_UI
typedef DWORD(_fastcall _OldCreatChr)(DWORD thisc, DWORD Seat, DWORD a3);
static _OldCreatChr* OldCreatChr;
DWORD _fastcall CreatChr(DWORD thisc, DWORD Seat, DWORD a2)
{
//std::cout << "a2:" << a2 << std::endl;
if (*(int*)0x1A5FE1C == 1)
{
if (*(int*)a2 == 25481068)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_CreatChr", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushString(v, L"Lenheart", -1);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
}
}
return OldCreatChr(thisc, 0, a2);
}
#endif // CREAT_CHR_UI
//HOOK Item颜色
#ifdef ITEMRARITY
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;
}
#endif
//HOOK 发包类型
#ifdef SENDPACKHOOK
static SendPacksType _OldSendPackType;
int __fastcall NewSendPacksType(DWORD thisc, int Seat, int Parm)
{
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return _OldSendPackType(thisc, 0, Parm);
}
else
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SendPackType_Event", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, Parm);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return _OldSendPackType(thisc, 0, Parm);
}
}
static SendPacksByte _OldSendPackByte;
int __fastcall NewSendPacksByte(DWORD thisc, int Seat, int Parm)
{
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return _OldSendPackByte(thisc, 0, Parm);
}
else
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SendPackByte_Event", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, Parm);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return _OldSendPackByte(thisc, 0, Parm);
}
}
static SendPacksWORD _OldSendPackWord;
int __fastcall NewSendPacksWord(DWORD thisc, int Seat, int Parm)
{
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return _OldSendPackWord(thisc, 0, Parm);
}
else
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SendPackWord_Event", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, Parm);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return _OldSendPackWord(thisc, 0, Parm);
}
}
static SendPacksDWORD _OldSendPackDWord;
int __fastcall NewSendPacksDWord(DWORD thisc, int Seat, int Parm)
{
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return _OldSendPackDWord(thisc, 0, Parm);
}
else
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SendPackDWord_Event", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, Parm);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return _OldSendPackDWord(thisc, 0, Parm);
}
}
static SendPacksChar _OldSendPackChar;
int __fastcall NewSendPacksChar(DWORD thisc, int Seat, char* Parm,int Size)
{
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return _OldSendPackChar(thisc, 0, Parm,Size);
}
else
{
wchar_t* buffer = DNFTOOL::charTowchar_t(Parm);
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SendPackChar_Event", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushString(v, buffer,Size);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
delete[] buffer;
return _OldSendPackChar(thisc, 0, Parm,Size);
}
}
static SendPacks* _OldSend;
int NewSend()
{
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return _OldSend();
}
else
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SendPack_Event", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQ_Call(v, 1, 0, 1);
SQPop(v, 2);
return _OldSend();
}
}
#endif
/*
//HOOK 获取ITEM 坐标
typedef int(_fastcall __GetItemPos)(DWORD thisc, DWORD Seat);
static __GetItemPos* GetItemPos;
int __fastcall NewGetItemPos(DWORD thisc, int Seat)
{
int PosX = *(int*)(thisc + 0x14);
int PosY = *(int*)(thisc + 0x18);
return PosX;
}
*/
//Img 绘制函数
//typedef int(_fastcall __sub_11A97E0)(DWORD a1, DWORD Seat, int a2, int a3,DWORD a4, int a5,int a6,int a7 ,int a8,float a9, float a10);
//static __sub_11A97E0* sub_11A97E0;
//int _fastcall Newsub_11A97E0(DWORD a1, DWORD Seat, int a2, int a3, DWORD a4, int a5, int a6, int a7, int a8, float a9, float a10)
//{
// if (a7 != 0)std::cout << a7 << std::endl;;
// static DWORD st = a4;
// return sub_11A97E0(a1, 0, a2, a3, st, a5, a6, a7, a8, a9, a10);
//}
//HOOK 绘制stackable
typedef int(_cdecl _sub7AA800)(int a1, int a2, int a3 , int a4, int a5 , int a6,char a7);
static _sub7AA800* sub7AA800;
int _cdecl newsub7AA800(int a1, int a2, int a3, int a4, int a5, int a6, char a7)
{
return sub7AA800(a1, a2, a3, a4, a5, a6, a7);
}
//HOOK 绘制Item
typedef int(_fastcall _sub11A8F60)(DWORD a1, DWORD Seat, int a2, int a3, int a4);
static _sub11A8F60* sub11A8F60;
typedef int(_fastcall _Load_Npk)(int thisc, void*, int a2, wchar_t* a3);
typedef int(_fastcall _Get_Img)(int thisc, void*, int a2);
static _Load_Npk* Load_Npk = (_Load_Npk*)0x11C0410;
static _Get_Img* Get_Img = (_Get_Img*)0x11AA190;
int _fastcall newsub11A8F60(DWORD a1, DWORD Seat, int a2, int a3, int a4)
{
//int n = Load_Npk(*(int*)0x1B4684C, 0, 0, L"character/swordman/effect/skillicon.img");
//int imgbuf = Get_Img(n,0,70);
//if (a4 == imgbuf) {
// std::cout << "sadsasd" << std::endl;
//}
//#if defined HUDUI_100
// //血槽
// if (a2 == 0 && a3 == 508) {
// static int hudimg = Load_Npk(*(int*)0x1B4684C, 0, 0, L"interface2/hud/hud.img");
// if (Get_Img(hudimg, 0, 0) == a4) {
// return 0;
// }
// }
//#endif
static bool OpenSw = false;
if (!OpenSw)
{
//std::cout << DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") << std::endl;
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return sub11A8F60(a1, 0, a2, a3, a4);
}
else
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_DrawItemBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a2);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 4, 0, 1);
SQPop(v, 2);
int ret = sub11A8F60(a1, 0, a2, a3, a4);
SQPushRootTable(v);
SQPushString(v, L"Sq_DrawItemFront", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a2);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 4, 0, 1);
SQPop(v, 2);
return ret;
}
}
/*
//模拟SQRCAll
typedef int(__sub_5AADF0)(void(__cdecl* a1)(int, int, int, int), int a2, int a3);
static __sub_5AADF0* sub_5AADF0;
int Newsub_5AADF0(void(__cdecl* a1)(int, int, int, int), int a2, int a3)
{
std::cout << "drawani: " << a1 << std::endl;
//std::cout << "TestDrawSkill" << std::endl;
//std::cout << "DrawSkillAddr:" << a1 << std::endl;
return sub_5AADF0(a1, a2, a3);
}
*/
//大部分IMG数字的调用函数
typedef int(_fastcall __sub_11B2390)(DWORD a1, DWORD Seat, int a2, int a3, int a4, int a5, DWORD* a6);
static __sub_11B2390* sub_11B2390;
int _fastcall Newsub_11B2390(DWORD a1, DWORD Seat, int a2, int a3, int a4, int a5, DWORD* a6)
{
//std::cout << "a2: " << a2 << std::endl;
//std::cout << "a3: " << a3 << std::endl;
//std::cout << "a4: " << a4 << std::endl;
//std::cout << "a5: " << a5 << std::endl;
return sub_11B2390(a1, 0, a2, a3, a4, a5, a6);
}
/*
//push string
std::map< std::wstring, int>BQS;
static SqPushStringFunc* OldSQPushString;
int NewSqPushStringFunc(uint32_t v, const wchar_t* s, int len)
{
std::wstring a = s;
if (BQS.count(a) != 1)
{
wprintf(L"Name:%s Len:%d\n", s, len);
BQS[a] = 1;
}
//std::wcout << funcName << std::endl;
return OldSQPushString(v, s, len);
}
*/
/*
typedef int(SQ_CompilebufferFunc)(uint32_t v, const wchar_t* s,int size, wchar_t* filename, BOOL printerror);
static SQ_CompilebufferFunc* SQ_Compilebuffer = (SQ_CompilebufferFunc*)0x135B2C0;
*/
/*
// HOOK exe 调用文本进 松鼠虚拟机
static SQ_CompilebufferFunc* OldSQ_Compilebuffer;
int NewSQ_Compilebuffer(uint32_t v, const wchar_t* s, int size, wchar_t* filename, BOOL printerror)
{
wprintf(L"File--%s: \n str--\n%s \n \n", filename, s);
return OldSQ_Compilebuffer(v, s, size, filename, printerror);
}
*/
#if defined MONSTER_BLOOD_UI
typedef int(_fastcall _Blood)(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2);
typedef int(_fastcall _DrawMonFace)(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2);
static _Blood* OldBlood;
static _Blood* OldBlood1;
static _Blood* OldBlood2;
static _DrawMonFace* DrawMonFace = (_DrawMonFace*)0x43a1b0;
int _fastcall NewBlood(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2)
{
BOOL DrawSw;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_GetDrawMonBloodSw", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQ_Call(v, 1, 1, 1);
SQGetBool(v, -1, &DrawSw);
SQPop(v, 3);
if (DrawSw == TRUE)
{
return 0;
}
else
{
int ret = OldBlood(thisc, 0, a1, a2);
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_DrawMonsterBlood", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, *(DWORD*)(thisc + 8));
SQPushInt(v, a1);
SQPushInt(v, a2);
SQ_Call(v, 4, 0, 1);
SQPop(v, 2);
return ret;
}
}
int _fastcall NewBlood1(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2)
{
BOOL DrawSw;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_GetDrawMonBloodSw", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQ_Call(v, 1, 1, 1);
SQGetBool(v, -1, &DrawSw);
SQPop(v, 3);
if (DrawSw == TRUE)
{
return 0;
}
else
{
int ret = OldBlood1(thisc, 0, a1, a2);
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_DrawMonsterBlood", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, *(DWORD*)(thisc + 8));
SQPushInt(v, a1);
SQPushInt(v, a2);
SQ_Call(v, 4, 0, 1);
SQPop(v, 2);
return ret;
}
}
int _fastcall NewBlood2(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2)
{
int ret = OldBlood2(thisc, 0, a1, a2);
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_DrawMonsterBlood", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, *(DWORD*)(thisc + 8));
SQPushInt(v, a1);
SQPushInt(v, a2);
SQ_Call(v, 4, 0, 1);
SQPop(v, 2);
return ret;
}
#endif
//背包鼠标位置HOOK开启 (为了拿到this对象地址)
#ifdef Inventory_M_Pos
typedef int(_fastcall _inventory_M_Pos)(DWORD thisc, DWORD Seat);
static _inventory_M_Pos* Old_inventory_M_Pos;
int _fastcall New_inventory_M_Pos(DWORD thisc, DWORD Seat)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Set_Inventory_M_Pos", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, thisc);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return Old_inventory_M_Pos(thisc, Seat);
}
#endif
typedef int(_cdecl _9D2300)(DWORD a1, DWORD a2,DWORD a3,char a4 , DWORD a5,char a6);
static _9D2300* Old_9D2300;
int _cdecl New_9D2300(DWORD a1, DWORD a2, DWORD a3, char a4, DWORD a5, char a6)
{
std::cout << a5 << std::endl;
return Old_9D2300(a1, a2,a3,a4,a5,a6);
}
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 StrIndex;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Get_Event_Pos", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, 1);
SQ_Call(v, 2, 1, 1);
SQGetInt(v, -1, &StrIndex);
SQPop(v, 3);
a2 += 144;
a3 = (DWORD**)StrIndex;
}
return OldEvent(thisc, Seat, a2, a3, a4);
}
//typedef DWORD(_Cutting)(DWORD a1, DWORD a2, DWORD a3, DWORD a4);
//static _Cutting* Old6F4370;
//static _Cutting* Old11AEE50;
////裁切函数HOOK
//DWORD New6F4370(DWORD a1, DWORD a2, DWORD a3, DWORD a4)
//{
// if (a1 == 0 && a3 == 800)//血球篮球的裁切策略 需要+14 因为球的坐标+了14
// {
// a2 += 14;
// a4 += 14;
// }
// return Old6F4370(a1, a2, a3, a4);
//}
////裁切函数HOOK
//DWORD New11AEE50(DWORD a1, DWORD a2, DWORD a3, DWORD a4)
//{
// if (a1 == 0 && a2 == 625)//血球篮球的裁切策略 需要+14 因为球的坐标+了14
// {
// a1 = 170;
// a2 = 548;
// }
// return Old11AEE50(a1, a2, a3, a4);
//}
//typedef DWORD(_fastcall _11A97E0)(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, WORD* a3, DWORD a4, DWORD a5, DWORD a6, DWORD a7, FLOAT a8, FLOAT a9);
//static _11A97E0* Old11A97E0;
//
////绘图HOOK
//DWORD _fastcall New11A97E0(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, WORD* a3, DWORD a4, DWORD a5, DWORD a6, DWORD a7, FLOAT a8, FLOAT a9)
//{
// if (a1 == 371 && a2 == 461) {
//
// }
// if (a1 == 13 && a2 == 524)
// {
// a1 = 224; //血球X坐标
// a2 = 538; //血球X坐标
// }
// if (a1 == 732 && a2 == 524)
// {
// a1 = 515; //蓝球X坐标
// a2 = 538; //蓝球X坐标
// }
//
// return Old11A97E0(thisc, Seat, a1, a2, a3, a4, a5, a6, a7, a8, a9);
//}
//typedef DWORD(_fastcall _11A8F60)(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, DWORD a3);
//static _11A8F60* Old11A8F60;
//
////绘图HOOK
//DWORD _fastcall New11A8F60(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, DWORD a3)
//{
//
// if (a1 == 13 && a2 == 524)
// {
// a1 = 224; //血球X坐标
// a2 = 538; //血球X坐标
// }
// else if (a1 == 732 && a2 == 524)
// {
// a1 = 515; //蓝球X坐标
// a2 = 538; //蓝球X坐标
// }
// else if (a1 == 88 && a2 == 591)//经验条X Y
// {
// a1 = 248;
// a2 = 596;
// }
//
// return Old11A8F60(thisc, Seat, a1, a2, a3);
//}
typedef DWORD(_fastcall _11816B0)(DWORD thisc, DWORD Seat, DWORD* a2, int a3);
static _11816B0* Old11816B0;
//绘图HOOK
DWORD _fastcall New11816B0(DWORD thisc, DWORD Seat, DWORD* a2, int a3)
{
wchar_t* str = (wchar_t*)a3;
char* OutPutText = DNFTOOL::SquirrelU2W(str);
std::string B = OutPutText;
if (B.find("prepareDraw_appendage") != std::string::npos) {
std::cout << 111 << std::endl;
}
delete[]OutPutText;
return Old11816B0(thisc, Seat, a2, a3);
}
typedef struct REG
{
DWORD EAX;
DWORD EBX;
DWORD ECX;
DWORD EDX;
DWORD ESI;
DWORD EDI;
DWORD ESP;
DWORD EBP;
} REG;
REG heart = { 0 };
//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);
int NutAddValue;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Get_Ex_IntData", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, thisc);
SQPushInt(v, a2);
SQPushInt(v, a3);
SQ_Call(v, 4, 1, 1);
SQGetInt(v, -1, &NutAddValue);
SQPop(v, 3);
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);
int NutAddValue;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Get_Ex_SkillCoolTime", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, thisc);
SQPushInt(v, a2);
SQPushInt(v, a3);
SQ_Call(v, 4, 1, 1);
SQGetInt(v, -1, &NutAddValue);
SQPop(v, 3);
return NutAddValue + Old909020(thisc, Seat, a2, a3);
}
typedef struct LevelDataBuffer
{
DWORD SkillAddresss;
DWORD SkillIdx;
DWORD ObjectAddress;
} RELevelDataBufferG;
LevelDataBuffer _LevelDataBuffer = { 0 };
//GetLevelData
typedef DWORD(_fastcall _908770)(DWORD thisc, DWORD Seat, DWORD a2, int a3,int a4,int a5,int a6,int a7,int a8,int a9);
static _908770* Old908770;
DWORD _fastcall New908770(DWORD thisc, DWORD Seat, DWORD a2, int a3, int a4, int a5, int a6, int a7, int a8,int a9)
{
if (a3 != *(int*)0x1AB7CDC)return Old908770(thisc, Seat, a2, a3, a4, a5, a6, a7, a8, a9);
/*
* thisc = 技能对象地址
* a2 = 技能数据号位
* a3 = 技能等级
* a4 = 角色对象地址
*/
_LevelDataBuffer.SkillAddresss = thisc;
_LevelDataBuffer.SkillIdx = a2;
_LevelDataBuffer.ObjectAddress = a3;
int ret = Old908770(thisc, Seat, a2, a3, a4, a5, a6, a7, a8, a9);
return ret;
}
//原生角色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) {
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return Old90A4A0(thisc, Seat, a2, a3);
}
if (a3 != *(int*)0x1AB7CDC)return Old90A4A0(thisc, Seat, a2, a3);
int NutAddValue;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Get_Ex_LevelData", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, thisc);
SQPushInt(v, a2);
SQPushInt(v, a3);
SQ_Call(v, 4, 1, 1);
SQGetInt(v, -1, &NutAddValue);
SQPop(v, 3);
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) {
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
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);
int NutAddValue;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Get_Ex_LevelData", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, ADDRESS);
SQPushInt(v, a2);
SQPushInt(v, thisc);
SQ_Call(v, 4, 1, 1);
SQGetInt(v, -1, &NutAddValue);
SQPop(v, 3);
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) {
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return Old5A40E0(a1, a2, a3, a4);
}
if (a3 != *(int*)0x1AB7CDC)return Old5A40E0(a1, a2, a3, a4);
DWORD ADDRESS = TFuncsub_GetSkillAddress(a1, 0, a2);
int NutAddValue;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Get_Ex_LevelData", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, ADDRESS);
SQPushInt(v, a3);
SQPushInt(v, a1);
SQ_Call(v, 4, 1, 1);
SQGetInt(v, -1, &NutAddValue);
SQPop(v, 3);
int ret = NutAddValue + Old5A40E0(a1, a2, a3, a4);
return ret;
}
//描述对象前置HOOK
typedef DWORD(_fastcall _90FB30)(DWORD thisc, DWORD Seat, DWORD a2, int a3);
static _90FB30* Old90FB30;
DWORD _fastcall New90FB30(DWORD thisc, DWORD Seat, DWORD a2, int a3) {
if (a3 != *(int*)0x1AB7CDC)return Old90FB30(thisc, 0, a2, a3);
_LevelDataBuffer.SkillAddresss = thisc;
_LevelDataBuffer.SkillIdx = a2;
_LevelDataBuffer.ObjectAddress = a3;
return Old90FB30(thisc, 0, a2, a3);
}
//描述对象HOOK
typedef DWORD( _75D1F0)(DWORD thisc);
static _75D1F0* Old75D1F0;
DWORD New75D1F0(DWORD thisc) {
static bool OpenSw = false;
if (!OpenSw)
{
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1)
{
OpenSw = true;
}
return Old75D1F0(thisc);
}
if (_LevelDataBuffer.ObjectAddress != *(int*)0x1AB7CDC)return Old75D1F0(thisc);
int NutAddValue;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_Get_Ex_LevelData", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, _LevelDataBuffer.SkillAddresss);
SQPushInt(v, _LevelDataBuffer.SkillIdx);
SQPushInt(v, _LevelDataBuffer.ObjectAddress);
SQ_Call(v, 4, 1, 1);
SQGetInt(v, -1, &NutAddValue);
SQPop(v, 3);
if (NutAddValue != 0) {
int ret = NutAddValue + Old75D1F0(thisc);
_LevelDataBuffer.SkillAddresss = 0;
_LevelDataBuffer.SkillIdx = 0;
_LevelDataBuffer.ObjectAddress = 0;
return ret;
}
return Old75D1F0(thisc);
}
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 == 239) {
std::cout << 12123123 << std::endl;
}
return OldGet_Img(thisc, 0, a2);
}
typedef int(_fastcall _11C0410)(int* thisc,void*, int a2, wchar_t* a3);
static _11C0410* Old11C0410;
int _fastcall New11C0410(int* thisc, void*, int a2, wchar_t* a3)
{
wchar_t* str = (wchar_t*)a3;
//if (!wcscmp(str, L"character/swordman/effect/frenzy/blood-spirits.img")) {
// std::cout << 111 << std::endl;
//}
char* OutPutText = DNFTOOL::wchar_tTochar(str);
static std::map<std::string, bool> UNN;
std::string B = OutPutText;
if(B.find(".img") != std::string::npos )
{
if (!UNN[B]) {
UNN[B] = true;
std::cout << B << std::endl;
}
}
//if (B.find("extrafeature") != std::string::npos) {
// std::cout << B << std::endl;
//}
delete[]OutPutText;
return Old11C0410(thisc,0,a2,a3);
}
void __declspec(naked)PlayerEach2() {
static int address = 0x11B34E0;
static int address1 = 0x001004B59;
_asm
{
pushad
pushfd
mov heart.ECX , ecx
mov heart.EDI, edi
}
if (heart.EDI == 2) {
SQPushRootTable(*(uint32_t*)0x1AF3544);
SQPushString(*(uint32_t*)0x1AF3544, L"Sq_PlayerEachPos", -1);
SQ_Get(*(uint32_t*)0x1AF3544, -2);
SQPushRootTable(*(uint32_t*)0x1AF3544);
SQPushInt(*(uint32_t*)0x1AF3544, *(int*)(heart.ECX + 0x14));
SQPushInt(*(uint32_t*)0x1AF3544, *(int*)(heart.ECX + 0x18));
SQ_Call(*(uint32_t*)0x1AF3544, 3, 0, 1);
SQPop(*(uint32_t*)0x1AF3544, 2);
}
_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 PassObjectPoAsm = { 0 };
typedef DWORD(_fastcall _6A4630)(DWORD thisc, DWORD Seat, DWORD a2, DWORD a3);
static _6A4630* Old6A4630 = (_6A4630*)0x6A4630;
static wchar_t* str = L"TETETETE";
void __declspec(naked)PassObjectPoJmp() {
static int address = 0xE5AE58;
static int address1 = 0xE5AE68;
_asm
{
pushad
pushfd
mov PassObjectPoAsm.EDI,edi
mov PassObjectPoAsm.EAX, eax
}
//printf("=%2x\n", *(DWORD*)(PassObjectPoAsm.EDI + 0xEE8));
// printf("=%2x\n", *(DWORD*)(PassObjectPoAsm.EDI + 0xEFC));
if (*(DWORD*)(PassObjectPoAsm.EDI + 0xEE8) == 0 && *(DWORD*)(PassObjectPoAsm.EDI + 0xEFC) == 0) {
*(DWORD*)(PassObjectPoAsm.EDI + 0xEE8) = (DWORD)str;
*(DWORD*)(PassObjectPoAsm.EDI + 0xEFC) = 0XF;
Old6A4630(PassObjectPoAsm.EDI, 0, (DWORD)0x1ACDD80, PassObjectPoAsm.EAX);
*(DWORD*)(PassObjectPoAsm.EDI + 0xEE8) = 0;
*(DWORD*)(PassObjectPoAsm.EDI + 0xEFC) = 0;
_asm {
popfd
popad
jmp address1
}
}
_asm {
popfd
popad
mov edx, [edi]
jmp address
}
}
void __declspec(naked)TestJmp() {
static int address = 0X04627A7;
static int address1 = 0x04627EB;
_asm
{
pushad
pushfd
mov PassObjectPoAsm.ECX, ecx
}
if (*(DWORD*)(PassObjectPoAsm.ECX + 0xC) == 24000001)
{
//printf("成功\n\n");
// printf("值=%d\n", *(DWORD*)(PassObjectPoAsm.ECX + 0xC));
*(DWORD*)(PassObjectPoAsm.ECX + 0xC) = 24000002;
//printf("成功值=%d\n", *(DWORD*)(PassObjectPoAsm.ECX + 0xC));
}
_asm {
popfd
popad
mov edx,dword ptr ds:[ebx]
cmp edx,dword ptr ds:[ecx+0xC]
jge dnf4627EB
jmp address
dnf4627EB:
jmp address1
}
}
void __declspec(naked)TestJmp1() {
static int address = 0X04627A7;
static int address1 = 0x04627EB;
_asm
{
pushad
pushfd
mov PassObjectPoAsm.ECX, ecx
}
if (*(DWORD*)(PassObjectPoAsm.ECX + 0xC) == 24000001)
{
//printf("成功\n\n");
//printf("值=%d\n", *(DWORD*)(PassObjectPoAsm.ECX + 0xC));
*(DWORD*)(PassObjectPoAsm.ECX + 0xC) = 24000002;
// printf("成功值=%d\n", *(DWORD*)(PassObjectPoAsm.ECX + 0xC));
}
_asm {
popfd
popad
mov eax,dword ptr ds:[edi]
cmp eax,dword ptr ds:[ecx+0xC]
jl dnf46259B
jmp address
dnf46259B :
jmp address1
}
}
void __declspec(naked)TestJmp2() {
static int address = 0X04627A7;
static int address1 = 0x46259B;
_asm
{
pushad
pushfd
mov PassObjectPoAsm.ECX, ecx
}
//printf("值=%d\n", *(DWORD*)(PassObjectPoAsm.ECX + 0xC));
if (*(DWORD*)(PassObjectPoAsm.ECX + 0xC) == 24000001)
{
// printf("成功\n\n");
*(DWORD*)(PassObjectPoAsm.ECX + 0xC) = 24000002;
}
_asm {
popfd
popad
mov edx, dword ptr ds : [ebx]
cmp edx, dword ptr ds : [ecx + 0xC]
jge dnf4627EB
jmp address
dnf4627EB :
jmp address1
}
}
void __declspec(naked)TestJmp3() {
static int address = 0x0462584;
static int address1 = 0x0046259B;
_asm
{
pushad
pushfd
mov PassObjectPoAsm.ECX, ecx
}
if (*(DWORD*)(PassObjectPoAsm.ECX + 0xC) == 24000001)
{
//printf("成功\n\n");
//printf("值=%d\n", *(DWORD*)(PassObjectPoAsm.ECX + 0xC));
*(DWORD*)(PassObjectPoAsm.ECX + 0xC) = 24000002;
//printf("成功值=%d\n", *(DWORD*)(PassObjectPoAsm.ECX + 0xC));
}
_asm {
popfd
popad
mov eax, dword ptr ds : [edi]
cmp eax, dword ptr ds : [ecx + 0xC]
jl dnf4627EB
jmp address
dnf4627EB :
jmp address1
}
}
//void __declspec(naked)DrawMainCallBack() {
//
// static int address = 0x1A5FB20;
// static int address3 = 0xE6DF4B;
// static int address1 = 0xE6D9AE;
// _asm
// {
// pushad
// pushfd
// }
//
// SQPushRootTable(*(uint32_t*)0x1AF3544);
// SQPushString(*(uint32_t*)0x1AF3544, L"Sq_DrawMainMaxLayerCustomUI", -1);
// SQ_Get(*(uint32_t*)0x1AF3544, -2);
// SQPushRootTable(*(uint32_t*)0x1AF3544);
// SQPushInt(*(uint32_t*)0x1AF3544, 111);
// SQ_Call(*(uint32_t*)0x1AF3544, 2, 0, 1);
// SQPop(*(uint32_t*)0x1AF3544, 2);
//
//
// _asm {
// popfd
// popad
// mov ecx, address
// test ecx, ecx
// jmp address1
// }
//}
typedef DWORD(_fastcall _4C61F0)(DWORD thisc, DWORD Seat);
static _4C61F0* Old4C61F0;
#include "json.hpp"
using json = nlohmann::json;
extern bool jiaoben;
extern std::vector<std::string> BaseData;
#include<fstream>
#include <dinput.h>
void outputWcharToFile(const wchar_t* str, const wchar_t* filename) {
std::wofstream file(filename);
if (file.is_open()) {
file << str;
file.close();
}
else {
std::wcerr << L"Error: Unable to open file " << filename << std::endl;
}
}
void Suxn() {
size_t Ds = BaseData.size();
for (size_t i = 0; i < Ds; i++)
{
std::string filename = "BaseData" + std::to_string(i);
std::string str = BaseData[i];
//std::cout << str << std::endl << std::flush;
wchar_t* sfile = DNFTOOL::charTowchar_t((char*)filename.c_str());
wchar_t* ss = DNFTOOL::charTowchar_t((char*)str.c_str());
//outputWcharToFile(ss, sfile);
//wprintf(L"Function:%s \n", ss);
//std::cout << i << std::endl;
uint32_t v = GetSqVm();
squirrel::SQdofileBuffer(v, sfile, ss);
}
BaseData.clear();
jiaoben = false;
}
//DrawMain HOOK
DWORD _fastcall New4C61F0(DWORD thisc, DWORD Seat)
{
static bool Init = false;
if (BaseData.size() > 0 && jiaoben == true && DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1) {
Suxn();
}
if (Init) {
//DrawMain
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_DrawMainMaxLayerCustomUI", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, 111);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
SQPushRootTable(v);
SQPushString(v, L"L_DrawWindow_A", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQ_Call(v, 1, 0, 1);
SQPop(v, 2);
}
#ifndef SELL
//循环调用
squirrel::SqrCallBackFunc();
#endif
static bool mouseInit = false;
//选择角色调用
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 0) {
if (!Init)
{
//Sleep(1000);
squirrel::InitGameScript();//调用初始化程序
Init = true;
mouseInit = true;
InitGameFlag = true;
}
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_SelectCharacter", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushString(v, L"Lenheart", -1);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
}
#ifdef MOUSE_SWITCH
//鼠标回调
if (mouseInit) {
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_MouseEventCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, LbState);
SQPushInt(v, RbState);
SQPushInt(v, MbState);
SQ_Call(v, 4, 0, 1);
SQPop(v, 2);
}
#endif // MOUSE_SWITCH
return Old4C61F0(thisc, Seat);
}
typedef DWORD(_cdecl _7EEED0)(DWORD a1 , DWORD a2 , DWORD a3, DWORD a4, DWORD a5, DWORD a6);
static _7EEED0* Old7EEED0;
//伤害字体 HOOK
DWORD _cdecl New7EEED0(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6)
{
int StrIndex;
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_PushDamageFontData", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a1);
SQPushInt(v, a2);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQPushInt(v, a5);
SQPushInt(v, a6);
SQ_Call(v, 7, 0, 1);
SQPop(v, 2);
SQGetInt(v, -1, &StrIndex);
if (StrIndex == 1) {
return 0;
}
else {
DWORD ret = Old7EEED0(a1, a2, a3, a4, a5, a6);
return ret;
}
}
typedef DWORD(_fastcall _F542F0)(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6);
static _F542F0* OldF542F0;
//
DWORD _cdecl NewF542F0(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6)
{
std::cout << a1 << std::endl;
std::cout << a2 << std::endl;
std::cout << a3 << std::endl;
std::cout << a4 << std::endl;
std::cout << a5 << std::endl;
std::cout << a6 << std::endl;
DWORD ret = OldF542F0(a1, a2, a3, a4, a5, a6);
return ret;
}
typedef DWORD(_499160)(DWORD a1);
static _499160* Old499160;
DWORD _cdecl New499160(DWORD a1)
{
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_MessageWindowDraw", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, 1);
SQPushInt(v, 1);
SQ_Call(v, 3, 0, 1);
SQPop(v, 2);
DWORD ret = Old499160(a1);
return ret;
}
int HookPlayerInfoString(wchar_t* str) {
if (str != NULL) {
wchar_t* clone = new wchar_t[wcslen(str) + 2];
wcscpy(clone, str);
std::string GameStr;
DNFTOOL::Wchar_tToString(GameStr, clone);
delete[]clone;
int Value = atoi(GameStr.c_str());
Value = 9999999;
wchar_t wcs[128];
wsprintf(wcs, L"%d", Value);
return (int) & wcs;
}
}
wchar_t PlayerInfowcs[128];
static int NewStrPlayerInfo;
void __declspec(naked)PlayerInfo() {
static int address = 0XEDE480;
static int address1 = 0X0EDE6CD;
_asm
{
pushad
pushfd
mov heart.ECX, ecx
mov heart.ESI, esi
}
//std::cout << "自己类型 = "<< heart.ECX << std::endl;
//wprintf(L"自己数值 = %s\n\n", heart.ESI + 0x18);
NewStrPlayerInfo = 9999999;
wsprintf((wchar_t*)(heart.ESI + 0x18), L"%d", NewStrPlayerInfo);
/*wchar_t* strbuffer = (wchar_t*)(heart.ESI + 0x18);
if (strbuffer != NULL) {
wchar_t* clone = new wchar_t[wcslen(strbuffer) + 2];
wcscpy(clone, strbuffer);
std::string GameStr;
DNFTOOL::Wchar_tToString(GameStr, clone);
delete[]clone;
int Value = atoi(GameStr.c_str());
Value = 9999999;
wchar_t wcs[128];
wsprintf(wcs, L"%d", Value);
}*/
//std::wcout << "Esi" << *(wchar_t*)(heart.ESI + 0x18) << std::endl;
//if (heart.EDI == 2) {
// SQPushRootTable(*(uint32_t*)0x1AF3544);
// SQPushString(*(uint32_t*)0x1AF3544, L"Sq_PlayerEachPos", -1);
// SQ_Get(*(uint32_t*)0x1AF3544, -2);
// SQPushRootTable(*(uint32_t*)0x1AF3544);
// SQPushInt(*(uint32_t*)0x1AF3544, *(int*)(heart.ECX + 0x14));
// SQPushInt(*(uint32_t*)0x1AF3544, *(int*)(heart.ECX + 0x18));
// SQ_Call(*(uint32_t*)0x1AF3544, 3, 0, 1);
// SQPop(*(uint32_t*)0x1AF3544, 2);
//}
_asm {
popfd
popad
push ecx
mov ecx, ebx
call address
jmp address1
}
}
void __declspec(naked)PlayerInfo2() {
static int address = 0XEDE480;
static int address1 = 0x0EDE6E3;
_asm
{
pushad
pushfd
mov heart.ECX, ecx
mov heart.ESI, esi
}
NewStrPlayerInfo = 9999999;
wsprintf((wchar_t*)(heart.ESI + 0x18), L"%d", NewStrPlayerInfo);
//std::wcout << "Esi" << *(wchar_t*)(heart.ESI + 0x18) << std::endl;
//if (heart.EDI == 2) {
// SQPushRootTable(*(uint32_t*)0x1AF3544);
// SQPushString(*(uint32_t*)0x1AF3544, L"Sq_PlayerEachPos", -1);
// SQ_Get(*(uint32_t*)0x1AF3544, -2);
// SQPushRootTable(*(uint32_t*)0x1AF3544);
// SQPushInt(*(uint32_t*)0x1AF3544, *(int*)(heart.ECX + 0x14));
// SQPushInt(*(uint32_t*)0x1AF3544, *(int*)(heart.ECX + 0x18));
// SQ_Call(*(uint32_t*)0x1AF3544, 3, 0, 1);
// SQPop(*(uint32_t*)0x1AF3544, 2);
//}
_asm {
popfd
popad
push ecx
lea ecx, [ebx + 0x7E]
call address
jmp address1
}
}
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;
return OldFA42D0(a1, seat, a2, a3);
}
typedef int(_FA3570)(DWORD* a1, int a2, int a3);
static _FA3570* OldFA3570;
int NewFA3570(DWORD* a1,int a2, int a3)
{
int ret = OldFA3570(a1, a2, a3);
OtherPlayerInfoImg = ret;
return 0;
}
typedef void(_fastcall _4B8430)(int a1, int seat, int a2);
static _4B8430* Old4B8430;
void _fastcall New4B8430(int a1, int seat, int a2)
{
//return Old4B8430(a1, seat, a2);
}
//绘制技能
typedef void(_fastcall _909D70)(int a1, int seat, int a2,int a3,int a4,int a5,int a6, int a7,int a8,int a9,int a10,int a11);
static _909D70* Old909D70;
void _fastcall New909D70(int a1, int seat, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11)
{
return Old909D70(a1,seat,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
//return Old4B8430(a1, seat, a2);
}
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);
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_DrawMiniMapUI", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, 111);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
return ret;
}
typedef int(_fastcall _8EE1E0)(DWORD thisc,DWORD Seat, int a2, char a3,char a4);
static _8EE1E0* Old8EE1E0;
int _fastcall New8EE1E0(DWORD thisc, DWORD Seat, int a2, char a3, char a4)
{
int ret = Old8EE1E0(thisc, Seat,a2, a3,a4);
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"Sq_CompleteTask", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a2);
SQPushInt(v, a3);
SQPushInt(v, a4);
SQ_Call(v, 4, 0, 1);
SQPop(v, 2);
return ret;
}
typedef int(_fastcall _674030)(wchar_t* thisc, DWORD Seat, int a2, int a3);
static _674030* Old674030;
int _fastcall New674030(wchar_t* thisc, DWORD Seat, int a2, int a3)
{
wchar_t* strbuffer = (wchar_t*)a2;
wchar_t* clone = new wchar_t[wcslen(strbuffer) + 2];
wcscpy(clone, strbuffer);
std::string GameStr;
DNFTOOL::Wchar_tToString(GameStr, clone);
delete[]clone;
int ret = Old674030(thisc, Seat, a2, a3);
if (GameStr.find("drawMainCustomUI_") != std::string::npos) {
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"L_drawMainCustomUI_All", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQ_Call(v, 1, 0, 1);
SQPop(v, 2);
}
return ret;
}
int AByteLittleToInt(unsigned char* Count)
{
int int1 = Count[0] & 0xff;
int int2 = (Count[1] & 0xff) << 8;
int int3 = (Count[2] & 0xff) << 16;
int int4 = (Count[3] & 0xff) << 24;
return int1 | int2 | int3 | int4;
}
typedef int(_fastcall _6FE1D0)(DWORD* thisc, DWORD Seat, int a2, int a3);
static _6FE1D0* Old6FE1D0;
int _fastcall New6FE1D0(DWORD* thisc, DWORD Seat, int a2, int a3)
{
std::cout << "类型为: " << (int)*(unsigned __int16*)(a2 + 1) << std::endl;
if (a2) {
//std::cout << "地址为:" << std::hex << a2 << std::endl;
// 假设你有一个地址的指针,比如:
char* address = (char*)a2; // 假设地址是0x1234
// 读取两个字节并转换为int
unsigned char byte1 = address[0];
unsigned char byte2 = address[1];
// 输出转换后的小端序int
//std::cout << "转换后的小端序int第一位为" << (int)byte1 << std::endl;
//std::cout << "转换后的小端序int第二位为" << (int)byte2 << std::endl << std::endl << std::endl;
if ((int)byte2 == 23) {
for (size_t i = 0; i < 0x1f; i++)
{
std::cout << (int)address[i] << " ";
}
std::cout << std::endl;
return 0;
}
}
//std::cout << (*(BYTE*)(a2)) << std::endl;
//std::cout << (*(BYTE*)(a2+1)) << std::endl;
//std::cout << (*(BYTE*)(a2+2)) << std::endl;
//std::cout << (*(BYTE*)(a2+3)) << std::endl;
int ret = Old6FE1D0(thisc, 0, a2, a3);
return ret;
}
//鼠标事件
typedef void( _11BDC90)(int a1, unsigned int a2, int a3);
static _11BDC90* Old11BDC90;
void New11BDC90(int a1, unsigned int a2, int a3) {
static bool Init = false;
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 0) {
if (!Init)
{
Init = true;
}
}
if (Init) {
int X = *(int*)0x1B4686C;
int Y = *(int*)0x1B46870;
if ((X | Y) >= 0) {
uint32_t v = GetSqVm();
DWORD VmTop = SQGetTop(v);
SQPushRootTable(v);
SQPushString(v, L"L_MouseCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a1);
SQPushInt(v, a2);
sq_pushinteger((HSQUIRRELVM)v, X);
sq_pushinteger((HSQUIRRELVM)v, Y);
SQ_Call(v, 5, 0, 1);
SQPop(v, 2);
}
}
Old11BDC90(a1, a2, a3);
return;
}
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) {
uint32_t v = GetSqVm();
SQPushRootTable(v);
SQPushString(v, L"L_OpenOldWindowCallBack", -1);
SQ_Get(v, -2);
SQPushRootTable(v);
SQPushInt(v, a1);
SQ_Call(v, 2, 0, 1);
SQPop(v, 2);
}
OldOpenWindow(thisc, 0, a1, a2, a3);
}
void __declspec(naked)DrawWindow_B_Hook() {
static int address = 0xFFDA10;
static int address1 = 0x66BEA1;
_asm
{
pushad
pushfd
}
if (InitGameFlag)
{
SQPushRootTable(*(uint32_t*)0x1AF3544);
SQPushString(*(uint32_t*)0x1AF3544, L"L_DrawWindow_B", -1);
SQ_Get(*(uint32_t*)0x1AF3544, -2);
SQPushRootTable(*(uint32_t*)0x1AF3544);
SQ_Call(*(uint32_t*)0x1AF3544, 1, 0, 1);
SQPop(*(uint32_t*)0x1AF3544, 2);
}
_asm {
popfd
popad
mov ecx,eax
call address
jmp address1
}
}
int hook::RegisterHook()
{
//玩家菜单选项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();
//个人信息
//inlinehook WWW(0xEDE6C5, (int)&PlayerInfo);
//WWW.Motify_address();
////个人信息
//inlinehook EEE(0xEDE6DA, (int)&PlayerInfo2);
//EEE.Motify_address();
MH_Initialize();
//窗口打开事件Hook
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);
//完成任务HOOK
MH_CreateHook((void*)0x8EE1E0, &New8EE1E0, reinterpret_cast<void**>(&Old8EE1E0));
MH_EnableHook((void*)0x8EE1E0);
//官方的组合NutHook
MH_CreateHook((void*)0x674030, &New674030, reinterpret_cast<void**>(&Old674030));
MH_EnableHook((void*)0x674030);
//MH_CreateHook((void*)0x909D70, &New909D70, reinterpret_cast<void**>(&Old909D70));
//MH_EnableHook((void*)0x909D70);
//他人信息数值Hook
//他人信息类型Hook
MH_CreateHook((void*)0xFA42D0, &NewFA42D0, reinterpret_cast<void**>(&OldFA42D0));
MH_EnableHook((void*)0xFA42D0);
//他人信息数值Hook
MH_CreateHook((void*)0xFA3570, &NewFA3570, reinterpret_cast<void**>(&OldFA3570));
MH_EnableHook((void*)0xFA3570);
//MH_CreateHook((void*)0xEDE480, &NewEDE480, reinterpret_cast<void**>(&OldEDE480));
//MH_EnableHook((void*)0xEDE480);
//MH_CreateHook((void*)0xF542F0, &NewF542F0, reinterpret_cast<void**>(&OldF542F0));
//MH_EnableHook((void*)0xF542F0);
//MH_CreateHook((void*)0x9D2300, &New_9D2300, reinterpret_cast<void**>(&Old_9D2300));
//MH_EnableHook((void*)0x9D2300);
//消息框绘制HOOK
MH_CreateHook((void*)0x499160, &New499160, reinterpret_cast<void**>(&Old499160));
MH_EnableHook((void*)0x499160);
//DrawMain HOOK
MH_CreateHook((void*)0x4C61F0, &New4C61F0, reinterpret_cast<void**>(&Old4C61F0));
MH_EnableHook((void*)0x4C61F0);
#ifdef FONT_BANK_SYSTEM
//伤害字体 HOOK
MH_CreateHook((void*)0x7EEED0, &New7EEED0, reinterpret_cast<void**>(&Old7EEED0));
MH_EnableHook((void*)0x7EEED0);
#endif
//HOOK背包鼠标位置
#ifdef Inventory_M_Pos
MH_CreateHook((void*)0x11D24F0, &New_inventory_M_Pos, reinterpret_cast<void**>(&Old_inventory_M_Pos));
MH_EnableHook((void*)0x11D24F0);
#endif
//HOOK怪物血条
#if defined MONSTER_BLOOD_UI
MH_CreateHook((void*)0x43d770, &NewBlood, reinterpret_cast<void**>(&OldBlood));
MH_EnableHook((void*)0x43d770);
MH_CreateHook((void*)0x43d620, &NewBlood1, reinterpret_cast<void**>(&OldBlood1));
MH_EnableHook((void*)0x43d620);
MH_CreateHook((void*)0x43d4d0, &NewBlood2, reinterpret_cast<void**>(&OldBlood2));
MH_EnableHook((void*)0x43d4d0);
#endif
//Hook收包
MH_CreateHook((void*)INIT_PACK_ADDRESS, &H_Register_Pack, reinterpret_cast<void**>(&Lpfn_Init));
MH_EnableHook((void*)INIT_PACK_ADDRESS);
//HookNut函数注册
MH_CreateHook((void*)INIT_NUT_ADDRESS, &H_Register_Nut, reinterpret_cast<void**>(&MLnewclosure));
MH_EnableHook((void*)INIT_NUT_ADDRESS);
//Hook绘制字符
MH_CreateHook((void*)INIT_NUT_DRAWCODE, &H_Register_DrawCode, reinterpret_cast<void**>(&DrawCodeF));
MH_EnableHook((void*)INIT_NUT_DRAWCODE);
#ifdef CREAT_CHR_UI
MH_CreateHook((void*)0x10f3050, &CreatChr, reinterpret_cast<void**>(&OldCreatChr));
MH_EnableHook((void*)0x10f3050);
#endif // CREAT_CHR_UI
#ifdef ITEMRARITY
//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);
#endif
#ifdef SENDPACKHOOK
//HOOK发包类型
MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast<void**>(&_OldSendPackType));
MH_EnableHook((void*)0x1127D60);
#ifdef SENDPACKHOOK_EX
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);
#endif // !SENDPACKHOOK_EX
#endif
#ifdef DRAWITEM
//HOOK Item绘制
//MH_CreateHook((void*)0x7AA800, &newsub7AA800, reinterpret_cast<void**>(&sub7AA800));
//MH_EnableHook((void*)0x7AA800);
#endif
#ifdef GET_EXE_STR
//exe字符串索引
MH_CreateHook((void*)0x1220590, &Newsub1220590, reinterpret_cast<void**>(&sub1220590));
MH_EnableHook((void*)0x1220590);
#endif
MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast<void**>(&sub11A8F60));
MH_EnableHook((void*)0x11A8F60);
FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb");
if (file) {
//MH_CreateHook((void*)0x11A97E0, &New11A97E0, reinterpret_cast<void**>(&Old11A97E0));
//MH_EnableHook((void*)0x11A97E0);
//MH_CreateHook((void*)0x6F4370, &New6F4370, reinterpret_cast<void**>(&Old6F4370));
//MH_EnableHook((void*)0x6F4370);
//MH_CreateHook((void*)0x11AEE50, &New11AEE50, reinterpret_cast<void**>(&Old11AEE50));
//MH_EnableHook((void*)0x11AEE50);
MH_CreateHook((void*)0x11B4030, &NewEvent, reinterpret_cast<void**>(&OldEvent));
MH_EnableHook((void*)0x11B4030);
//绘制经验条Hook
MH_CreateHook((void*)0x4B8430, &New4B8430, reinterpret_cast<void**>(&Old4B8430));
MH_EnableHook((void*)0x4B8430);
}
//获取坐标
//MH_CreateHook((void*)0x48c690, &NewGetItemPos, reinterpret_cast<void**>(&GetItemPos));
//MH_EnableHook((void*)0x48c690);
//nut调用绘制技能的函数
//MH_CreateHook((void*)0x5DCDA0, &Newsub_5DCDA0, reinterpret_cast<void**>(&sub_5DCDA0));
//MH_EnableHook((void*)0x5DCDA0);
//绘制技能图标的函数
//MH_CreateHook((void*)0x5A4BE0, &Newsub_5A4BE0, reinterpret_cast<void**>(&sub_5A4BE0));
//MH_EnableHook((void*)0x5A4BE0);
//img绘制的函数
//MH_CreateHook((void*)0x11A97E0, &Newsub_11A97E0, reinterpret_cast<void**>(&sub_11A97E0));
//MH_EnableHook((void*)0x11A97E0);
//大部分IMG数字的调用函数
//MH_CreateHook((void*)0x11B2390, &Newsub_11B2390, reinterpret_cast<void**>(&sub_11B2390));
//MH_EnableHook((void*)0x11B2390);
//模拟Sqrcall
//MH_CreateHook((void*)0x5AACB0, &Newsub_5AADF0, reinterpret_cast<void**>(&sub_5AADF0));
//MH_EnableHook((void*)0x5AACB0);
//MH_CreateHook((void*)0x5A4BE0, &Newsub_5A4BE0, reinterpret_cast<void**>(&sub_5A4BE0));
//MH_EnableHook((void*)0x5A4BE0);
//HOOK PushString
MH_CreateHook((void*)0x1358A60, &LMySqPushString, reinterpret_cast<void**>(&LrealSqPushString));
MH_EnableHook((void*)0x1358A60);
//MH_CreateHook((void*)0x11816B0, &New11816B0, reinterpret_cast<void**>(&Old11816B0));
//MH_EnableHook((void*)0x11816B0);
//读取静态数据
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*)0x0908770, &New908770, reinterpret_cast<void**>(&Old908770));
//MH_EnableHook((void*)0x0908770);
////读取动态数据
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);
//MH_CreateHook((void*)0x90FB30, &New90FB30, reinterpret_cast<void**>(&Old90FB30));
//MH_EnableHook((void*)0x90FB30);
MH_CreateHook((void*)0x075D1F0, &New75D1F0, reinterpret_cast<void**>(&Old75D1F0));
MH_EnableHook((void*)0x075D1F0);
//MH_CreateHook((void*)0x11C0410, &New11C0410, reinterpret_cast<void**>(&Old11C0410));
//MH_EnableHook((void*)0x11C0410);
//MH_CreateHook((void*)0x11AA190, &NewGet_Img, reinterpret_cast<void**>(&OldGet_Img));
//MH_EnableHook((void*)0x11AA190);
//MH_CreateHook((void*)0x10041D0, &New10041D0, reinterpret_cast<void**>(&Old10041D0));
//MH_EnableHook((void*)0x10041D0);
// HOOK exe 调用文本进 松鼠虚拟机
//MH_CreateHook((void*)0x135B2C0, &NewSQ_Compilebuffer, reinterpret_cast<void**>(&OldSQ_Compilebuffer));
//MH_EnableHook((void*)0x135B2C0);
//收包HOOK
//MH_CreateHook((void*)0x06FE1D0, &New6FE1D0, reinterpret_cast<void**>(&Old6FE1D0));
//MH_EnableHook((void*)0x06FE1D0);
return 0;
}