diff --git a/Base/_Tool/Hacker_RegApi.nut b/Base/_Tool/Hacker_RegApi.nut index e69de29..17cae70 100644 --- a/Base/_Tool/Hacker_RegApi.nut +++ b/Base/_Tool/Hacker_RegApi.nut @@ -0,0 +1,371 @@ +/* +文件名:Hacker_RegApi.nut +路径:Base/_Tool/Hacker_RegApi.nut +创建日期:2024-09-25 18:31 +文件用途:注册API +*/ +//工具类 +class R_Utils { + + String = { + FindLastSubstring = function(str, substring) { + local strLen = str.len(); + local subLen = substring.len(); + local lastIndex = -1; + for (local i = 0; i <= strLen - subLen; i++) { + local found = true; + for (local j = 0; j< subLen; j++) { + if (str[i + j] != substring[j]) { + found = false; + break; + } + } + if (found) { + lastIndex = i; + } + } + return lastIndex; + } + } + //播放音效 + function PlaySound(SoundName) { + L_Sq_CallFunc(0x75BD70, "void", FFI_MS_CDECL, ["pointer", "int", "int", "int"], Memory.allocUtf8String(SoundName).C_Object, -1, 0, 0); + } + + //读取文件内容 + function ReadScript(Path, Size, CodePage) { + local ReadPath = L_sq_P2I(Memory.allocUtf8String(Path).C_Object); + local Reader = Memory.alloc(Size); + local ReadBuffer = L_sq_P2I(Reader.C_Object); + L_Sq_CallFunc(0x11A2030, "int", FFI_FASTCALL, ["int", "int", "int", "int", "int", "int"], 0x1D17638, 0, ReadPath, ReadBuffer, 0x100000, 0x19DAF4); + + + if (CodePage == "utf8") + return Reader.readUtf8String(); + if (CodePage == "unicode") + return Reader.readUnicodeString(); + if (CodePage == "big5") + return Reader.readBig5String(); + } + + //读取文件 + function GetScriptFileReader(Path, ...) { + local AllocSize = 102400; + if (vargc > 0) AllocSize = vargv[0]; + //读取路径 + local ReadPath = L_sq_P2I(Memory.allocUtf8String(Path).C_Object); + //读取缓存 + local Reader = Memory.alloc(AllocSize); + local ReadBuffer = L_sq_P2I(Reader.C_Object); + //实际读取大小 + local ReadSizeer = Memory.alloc(4); + local ReadSizeBuffer = L_sq_P2I(ReadSizeer.C_Object); + + local Flag = L_Sq_CallFunc(0x59E3D0, "bool", FFI_MS_CDECL, ["int", "int", "int", "int"], ReadPath, ReadBuffer, AllocSize, ReadSizeBuffer); + if (Flag) { + return { + Buffer = Reader, + Size = ReadSizeer.readInt() + }; + } else return null; + } + + //读取配置表 + function ReadScriptConfig(Path, Size, ...) { + local CodePage = "utf8"; + if (vargc > 0) CodePage = vargv[0]; + local Script = R_Utils.ReadScript(Path, Size, CodePage); + local Func = compilestring("return " + Script); + local Ret = Func(); + return Ret; + } + + //获取一个指定装备的角色对象 + function GetCharacByEqu(Job, GrowType, Equ) { + local Obj = sq_CreateCharacter(Job, GrowType); + local ObjAddress = L_Sq_GetObjectAddress(Obj); + foreach(value in Equ) { + local ItemObject = L_sq_GetItem(value); + // L_Sq_CallFunc(0x825570, "void", FFI_THISCALL, ["int", "int"], ObjAddress, ItemObject); + L_Sq_CallFunc(0x8265A0, "void", FFI_THISCALL, ["int", "int", "int"], ObjAddress, ItemObject, -1); + } + return sq_GetCNRDObjectToSQRCharacter(Obj); + } + + //获取装备编号的得文件路径 + function GetEquPath(Equ) { + local EquPathAddress = L_Sq_CallFunc(0x1219E80, "int", FFI_THISCALL, ["int", "int"], 0x1d7993c, Equ); + if (EquPathAddress) { + return NativePointer(EquPathAddress).readUnicodeString(); + } + return null; + } + + //获取Lst文件的返回Array + function GetLstArr(Path, Header) { + local Arr = []; + local LstBuf = R_Utils.GetScriptFileReader(Path); + if (LstBuf) { + local IO = Sq_Point2Blob(L_sq_P2I(LstBuf.Buffer.C_Object), LstBuf.Size); + local i = 2; + while (i< LstBuf.Size) { + if ((LstBuf.Size - i) >= 10) { + IO.seek(i + 6); //内容指示位 + local FindKey = IO.readn('i'); + local Key = Rindro_Script.GetBinString(FindKey); + if (Key) { + local StrFilePath = Header + Key.tolower(); + Arr.append(StrFilePath); + } + } else break; + i += 10; + } + } + return Arr; + } + + //通过处理函数获取文件Table + function GetFileTableByHandle(Path, Func) { + local Data = {}; + local FileData = R_Utils.GetScriptFileReader(Path); + if (FileData) { + if (FileData.Size >= 7) { + //创建Blob对象 + local IO = Sq_Point2Blob(L_sq_P2I(FileData.Buffer.C_Object), FileData.Size); + //以5为单步从第二位开始遍历字节 + local i = 2; + while (true) { + if (i< FileData.Size && FileData.Size - i >= 5) { + i = Func(Data, IO, i); + } else break; + } + } + } + return Data; + } +} + + + + + + +//根据List读取文件地址 +// Rindro_Haker.LoadHook(0x1219E80, ["int", "int", "int"], +// function(args) { +// // print(format("%02x", args[0])); + +// // print(args[2]); +// return null; +// }, +// function(args) { +// // print(666); +// // print(format("%02x", args.pop())); +// // TTTAni <- args.pop(); + + +// // local Path = NativePointer(L_sq_I2P(args.pop())).readUnicodeString(); +// // if (Path != "character/swordman/weapon/katana/kat_lowkogaras.equ" && Path != "new_elvengard.twn") { +// // print(args[0]); +// // print(args[1]); +// // // print(format("%02x", args[1])); +// // print(Path); +// // } +// return null; +// }); + +//可能是构造装备以及构造其他东西 +// Rindro_Haker.LoadHook(0x972220, ["int", "int", "int", "int"], +// function(args) { +// // print(format("%02x", args[0])); +// // local AniPath = NativePointer(L_sq_I2P(args[0])).readUnicodeString(); +// if (args[0] == 10402) { +// print(args[0]); +// print(args[1]); +// print(args[2]); +// } +// // print(args[2]); +// return null; +// }, +// function(args) { +// // print(666); +// // print(format("%02x", args.pop())); +// // TTTAni <- args.pop(); +// return null; +// }); + +//绘制字符 +getroottable().DrawCodeCallBackFunc <- {}; +getroottable().DrawCodeChangeMap <- {}; +// Rindro_Haker.LoadHook(0x1206BD0, ["int", "int", "int", "pointer", "int", "void"], +// function(args) { +// // print("nut:" + format("%02x", args[3])); + +// if (args[3]) { +// // for (local i = 0; i< 10000; i++) { +// local DrawCode = NativePointer(args[3]).readUnicodeString(); + +// if (DrawCode.find("^1^") != null) { + +// args[3] = Str_Ptr("AAAAAA"); +// args[2] = sq_RGBA(255, 0, 240, 255);; +// return args; +// } +// else if (DrawCode.find("^2^") != null) { +// print(DrawCode); + +// args[3] = Str_Ptr("BBBBBB"); +// args[2] = sq_RGBA(200, 100, 20, 255);; +// return args; +// } +// // if (DrawCode in DrawCodeCallBackFunc) +// // DrawCodeCallBackFunc[DrawCode](args); +// // } +// } +// return null; +// }, +// function(args) { +// // print(666); +// // print(format("%02x", args.pop())); +// // TTTAni <- args.pop(); +// return null; +// }); + + +//绘制城镇回调 +getroottable().DrawTownCallBackFunc <- {}; +Rindro_Haker.LoadHook(0x1108700, ["int", "void"], + function(args) { + // print("nut:" + format("%02x", args[3])); + // print(format("%02x", args[0])); + foreach(Func in DrawTownCallBackFunc) { + Func(); + } + return null; + }, + function(args) { + // print(666); + // print(format("%02x", args.pop())); + // TTTAni <- args.pop(); + return null; + }); + + +//顺图 +function Rindro_Gm_MoveMap(obj) { + if (sq_IsKeyDown(OPTION_HOTKEY_PAUSE_IN_TOWER, ENUM_SUBKEY_TYPE_ALL) && RINDROLOCAL) { + if (KeyPress.isKeyPress(0)) L_sq_MoveMap(2); + if (KeyPress.isKeyPress(1)) L_sq_MoveMap(0); + if (KeyPress.isKeyPress(2)) L_sq_MoveMap(3); + if (KeyPress.isKeyPress(3)) L_sq_MoveMap(1); + } +} +getroottable()["LenheartFuncTab"].rawset("Rindro_Gm_MoveMapFuncN", Rindro_Gm_MoveMap); + + +//丢弃物品回调 +getroottable().DiscardItemCallBackFunc <- {}; + +function Sq_DiscardItem(Item) { + local Flag = true; + foreach(Func in DiscardItemCallBackFunc) { + local Ret = Func(Item); + if (!Ret) Flag = false; + } + return Flag; +} + +//从exe获取字符串 +getroottable()["Sq_GetExeStr_Map"] <- {}; + +function Sq_GetExeStr_Event(Index) { + if (Index in getroottable()["Sq_GetExeStr_Map"]) { + return getroottable()["Sq_GetExeStr_Map"][Index](Index); + } + return Index; +} + +getroottable().DrawAppendCallBackFunc <- {}; +Rindro_Haker.LoadHook(0x67C560, ["pointer", "int", "int", "int", "int", "void"], + function(args) { + foreach(Func in DrawAppendCallBackFunc) { + Func(args); + } + return null; + }, + function(args) { + + return null; + }); + + +/* + local Flag = L_Sq_CallFunc(0x59E3D0, "bool", FFI_MS_CDECL, ["int", "int", "int", "int"], ReadPath, ReadBuffer, AllocSize, ReadSizeBuffer); + if (Flag) { + return { + Buffer = Reader, + Size = ReadSizeer.readInt() + }; + } else return null; + */ + +// HOOK读取AP脚本 +// Rindro_Haker.LoadHook(0x121A100, ["int", "int", "int", "int", "int","bool"], +// function(args) { +// return null; +// }, +// function(args) { +// print(NativePointer(L_sq_I2P(args[1])).readUnicodeString()); +// if (NativePointer(L_sq_I2P(args[1])).readUnicodeString() == "SQR/../etc/rindro/ancientrelic/ancientrelic.nut") { +// printf("加载AP脚本"); +// local str = "function sq_AddFunctionName(appendage)\n{\n}\n print(778899);"; +// NativePointer(L_sq_I2P(args[4])).writeInt(str.len()); +// NativePointer(L_sq_I2P(args[2])).writeByteArray(str); +// } +// return null; +// }); + + +// getroottable().onAttackParentCallBackFunc <- {}; +// Rindro_Haker.LoadHook(0x9CFF50, ["pointer", "int", "int", "int", "int", "int"], +// function(args) { +// foreach(Func in onAttackParentCallBackFunc) { +// Func(args); +// } +// return null; +// }, +// function(args) { + +// return null; +// }); + + + +// //hook打开窗口 +// Rindro_Haker.LoadHook(0xE6E070, ["int","int","int","int","void"], +// function(args) { + +// return null; +// }, +// function(args) { +// // print(666); +// // print(format("%02x", args.pop())); +// // TTTAni <- args.pop(); +// return null; +// }); + + +// Rindro_Haker.LoadHook(0xE6E070, ["int", "int", "int", "int", "int"], +// function(args) { +// print("nut:" + format("%02x", args[0])); +// print("nut:" + format("%02x", args[1])); +// print("nut:" + format("%02x", args[2])); +// print("nut:" + format("%02x", args[3])); +// return null; +// }, +// function(args) { +// // print(666); +// // print(format("%02x", args.pop())); +// // TTTAni <- args.pop(); +// return null; +// }); \ No newline at end of file diff --git a/Base/_Tool/HookMap.nut b/Base/_Tool/HookMap.nut index 11cce55..d6d5266 100644 --- a/Base/_Tool/HookMap.nut +++ b/Base/_Tool/HookMap.nut @@ -40,4 +40,4 @@ function _Hook_Register_Currency_Func_(AddressString, ArgRetArr, TableName) { ); } -_Hook_Register_Currency_Func_(0xE6E070, ["int", "int", "int", "int"], "Cb_OpenWindow_"); +// _Hook_Register_Currency_Func_(0xE6E070, ["int", "int", "int", "int"], "Cb_OpenWindow_");