/* 文件名: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 <- {}; // 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 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; } // //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; // });