diff --git a/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut b/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut index b61a5f1..1a8e711 100644 --- a/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut +++ b/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut @@ -50,4 +50,46 @@ class GameManager extends Base_C_Object { NativePointer("0x8542AD9").writeInt(time); NativePointer("0x8542BDE").writeInt(time); } + + //开启创建鼠标妹 + function OpenCreateJob_CreatorMage() { + Sq_WriteByteArr(S_Ptr("0x81C029F"), [0xf]); + } + + //开启获得魔法封印时自动解除魔法封印 + function OpenRandomAutomaticUnblocking() { + Cb_User_Insert_Item_Leave_Func.Rindro <- function(args) { + local SUser = User(NativePointer(args[0]).readPointer()); + local InvenObj = SUser.GetInven(); + local idx = args.pop(); + if (idx > 0) { + local inven_item = InvenObj.GetSlot(1, idx); + local item_id = inven_item.GetIndex(); + local pvfitem = PvfItem.GetPvfItemById(item_id); + //如果是魔法封印装备 + if (!pvfitem.IsRandomOption()) { + return; + } + local random_option = NativePointer(inven_item.C_Object).add(37); + if (random_option.readU32() || random_option.add(4).readU32() || random_option.add(8).readShort()) { + return; + } + NativePointer(inven_item.C_Object).add(37).add(0).writeU8(1); + } + SUser.SendItemSpace(0); + return null; + } + } + + //开启自动热重载 + function OpenHotFix(Path = "/dp_s/MyProject") { + print("DP-S开启自动重载脚本功能,重载目录为: " + Path + " ."); + print("请注意如果你不处于DP-S开发环境,请关闭此功能,以免对性能造成影响"); + Sq_AutoReload(Path); + } +} +//热重载 +function _Reload_List_Write_(Path) { + sq_RunScript(Path); + print("位于 [" + Path + "] 的脚本已重载") } \ No newline at end of file diff --git a/Dps_A/BaseClass/HackerClass/HackerClass.nut b/Dps_A/BaseClass/HackerClass/HackerClass.nut new file mode 100644 index 0000000..1555600 --- /dev/null +++ b/Dps_A/BaseClass/HackerClass/HackerClass.nut @@ -0,0 +1,30 @@ +/* +文件名:HackerClass.nut +路径:Dps_A/BaseClass/HackerClass/HackerClass.nut +创建日期:2024-09-22 11:33 +文件用途:黑客类 +*/ +class _Hacker { + HookTable = null; + + constructor() { + HookTable = {}; + } + + function UnLoadHook(AddressStr) { + Sq_DeHookFunc(HookTable[AddressStr]); + } + + function LoadHook(AddressStr, ArgumentArr, EnterFunc, LeaveFunc) { + //如果已经HOOK过 需要先卸载原来的HOOK + if (HookTable.rawin(AddressStr)) { + UnLoadHook(AddressStr); + print("地址: " + AddressStr + " 已经装载了Hook,本次操作将会卸载之前的Hook在执行。") + } + + local Controler = Sq_HookFunc(S_Ptr(AddressStr), ArgumentArr, EnterFunc, LeaveFunc); + HookTable.rawset(AddressStr, Controler); + } +} +//初始化Hacker +Haker <- _Hacker(); \ No newline at end of file diff --git a/Dps_A/BaseClass/ItemClass/ItemClass.nut b/Dps_A/BaseClass/ItemClass/ItemClass.nut index d386d6d..d0f2af9 100644 --- a/Dps_A/BaseClass/ItemClass/ItemClass.nut +++ b/Dps_A/BaseClass/ItemClass/ItemClass.nut @@ -132,7 +132,4 @@ class Item extends Base_C_Object { } - - - } \ No newline at end of file diff --git a/Dps_A/BaseClass/MD5Class/MD5Class.nut b/Dps_A/BaseClass/MD5Class/MD5Class.nut index c57277f..317b7e8 100644 --- a/Dps_A/BaseClass/MD5Class/MD5Class.nut +++ b/Dps_A/BaseClass/MD5Class/MD5Class.nut @@ -21,6 +21,52 @@ class MD5 { Sq_CallFunc(MD5_Final_ptr, "void", ["pointer", "pointer"], Ctx, Result); } + function base64_encode(input) { + local base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + local inputLength = input.len(); + local i = 0; + local j = 0; + local charArray3 = array(3); + local charArray4 = array(4); + local encoded = ""; + + while (inputLength--) { + charArray3[i++] = input[inputLength]; + if (i == 3) { + charArray4[0] = (charArray3[0] & 0xfc) >> 2; + charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4); + charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6); + charArray4[3] = charArray3[2] & 0x3f; + + for (i = 0; i< 4; i++) { + encoded += base64_chars[charArray4[i]]; + } + i = 0; + } + } + + if (i) { + for (j = i; j< 3; j++) { + charArray3[j] = 0; + } + + charArray4[0] = (charArray3[0] & 0xfc) >> 2; + charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4); + charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6); + charArray4[3] = charArray3[2] & 0x3f; + + for (j = 0; j< i + 1; j++) { + encoded += base64_chars[charArray4[j]]; + } + + while (i++<3) { + encoded += "="; + } + } + + return encoded; + } + function GetFile(FileName) { local Io = IO(FileName, "r+"); @@ -37,6 +83,6 @@ class MD5 { local Result = Memory.alloc(16); MD5.MD5_Final(Result.C_Object, Ctx.C_Object); Io.Close(); - return Result.readUtf8String(16); + return base64_encode(Result.readUtf8String(16)); } } \ No newline at end of file diff --git a/Dps_A/BaseClass/MysqlClass/MysqlClass.nut b/Dps_A/BaseClass/MysqlClass/MysqlClass.nut index 554f336..b30bf88 100644 --- a/Dps_A/BaseClass/MysqlClass/MysqlClass.nut +++ b/Dps_A/BaseClass/MysqlClass/MysqlClass.nut @@ -231,8 +231,8 @@ class MysqlPool { } function GetInstance() { - // if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool(); - MysqlPool(); + if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool(); + // MysqlPool(); return getroottable()._MysqlPoolObject; } diff --git a/Dps_A/BaseClass/PvfClass/PvfItemClass.nut b/Dps_A/BaseClass/PvfClass/PvfItemClass.nut index 2700d3c..ac157b4 100644 --- a/Dps_A/BaseClass/PvfClass/PvfItemClass.nut +++ b/Dps_A/BaseClass/PvfClass/PvfItemClass.nut @@ -55,9 +55,19 @@ class PvfItem extends Base_C_Object { return PvfItem(Ret); } else return null; } - //Public - function GetPvfData(Idx) { - local Ret = Sq_CallFunc(S_Ptr("0x835FA32"), "pointer", ["pointer", "int"], Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer", []), Idx); - return NativePointer(Ret); + + //Public 是否是魔法封印 + function IsRandomOption() { + return Sq_CallFunc(S_Ptr("0x8514E5E"), "int", ["pointer"], this.C_Object); } +} + +//获取穿戴等级 +function PvfItem::GetUsableLevel() { + return Sq_CallFunc(S_Ptr("0x80F12EE"), "int", ["pointer"], this.C_Object); +} + +//是否为消耗品 +function PvfItem::IsStackable() { + return Sq_CallFunc(S_Ptr("0x80f12fa"), "int", ["pointer"], this.C_Object); } \ No newline at end of file diff --git a/Dps_A/BaseClass/TimerClass/TimerClass.nut b/Dps_A/BaseClass/TimerClass/TimerClass.nut index b72a60b..cf6df6d 100644 --- a/Dps_A/BaseClass/TimerClass/TimerClass.nut +++ b/Dps_A/BaseClass/TimerClass/TimerClass.nut @@ -7,14 +7,18 @@ class Timer { //执行任务队列树 Wait_Exec_Tree = null; + //定时执行任务队列树 + Date_Exec_Tree = null; constructor() { Wait_Exec_Tree = RedBlackTree(); + Date_Exec_Tree = RedBlackTree(); Cb_timer_dispatch_Func.rawset("__System__Timer__Event", Update.bindenv(this)); } - function Update() { + //检测延时任务 + function CheckTimeOut() { local Node = Wait_Exec_Tree.pop(); if (!Node) { return; @@ -24,7 +28,7 @@ class Timer { //执行时间 local exec_time = Node.time; //如果没到执行时间,放回去,等待下次扫描 - if (time() <= exec_time) { + if (clock() <= exec_time) { Wait_Exec_Tree.insert(exec_time, Node.Info); return; } @@ -42,10 +46,10 @@ class Timer { for (local i = 0; i< vargv.len(); i++) { target_arg_list.push(vargv[i]); } - //当前时间戳,单位:s - local time_sec = time(); + //当前时间戳,单位:秒 + local time_sec = clock(); //计算下一次执行的时间 - local exec_time_sec = time_sec + (delay_time - 1); + local exec_time_sec = time_sec + (delay_time / 1000.0).tofloat(); //设置下一次执行 local func_info = []; @@ -55,4 +59,74 @@ class Timer { _Timer_Object.Wait_Exec_Tree.insert(exec_time_sec, func_info); } + + //检测定时任务 + function CheckCronTask() { + local Node = Date_Exec_Tree.pop(); + if (!Node) { + return; + } + //取得函数体 + local Info = Node.Info; + //执行时间 + local exec_time = Node.time; + //如果没到执行时间,放回去,等待下次扫描 + if (time() <= exec_time) { + Date_Exec_Tree.insert(exec_time, Node.Info); + return; + } + //函数 + local func = Info[0]; + //参数 + local func_args = Info[1]; + //下次任务叠加时间 + local NextTimestep = Info[2]; + //执行函数 + func.acall(func_args); + //继续构建下一次任务 + Date_Exec_Tree.insert(time() + NextTimestep, Info); + } + + function SetCronTask(target_func, CronString, ...) { + local parts = split(CronString, "/"); + local minute = parts[0].tointeger(); + local hour = parts[1].tointeger(); + local day = parts[2].tointeger(); + local weekday = parts[3].tointeger(); + + local S_minute = minute * 60; + local S_hour = hour * 60 * 60; + local S_day = day * 24 * 60 * 60; + local S_weekday = weekday * 7 * 24 * 60 * 60; + + local AddTimestep = S_minute + S_hour + S_day + S_weekday; + local NowTimestep = time(); + + //下一次执行的时间 + local NextTimestep = AddTimestep + NowTimestep; + + local target_arg_list = []; + target_arg_list.push(getroottable()); + for (local i = 0; i< vargv.len(); i++) { + target_arg_list.push(vargv[i]); + } + + //设置下一次执行 + local func_info = []; + + //函数体 + func_info.push(target_func); + //参数列表 + func_info.push(target_arg_list); + //间隔时间戳时间 + func_info.push(AddTimestep); + + _Timer_Object.Date_Exec_Tree.insert(NextTimestep, func_info); + } + + + function Update() { + CheckTimeOut(); + CheckCronTask(); + } } \ No newline at end of file diff --git a/Dps_A/BaseClass/UserClass/UserClass.nut b/Dps_A/BaseClass/UserClass/UserClass.nut index e8c18d7..8157753 100644 --- a/Dps_A/BaseClass/UserClass/UserClass.nut +++ b/Dps_A/BaseClass/UserClass/UserClass.nut @@ -532,4 +532,71 @@ class User extends Base_C_Object { if (Ret) return AccountCargo(Ret, this); else return null; } +} + +//获取公会名称 +function User::GetGuildName() { + return Sq_CallFunc(S_Ptr("0x869742a"), "string", ["pointer"], this.C_Object); +} + + + +//获取副职业对象指针 +function User::GetCurCharacExpertJob() { + return Sq_CallFunc(S_Ptr("0x822f8d4"), "pointer", ["pointer"], this.C_Object); +} + +//获得角色副职业 +function User::GetCurCharacExpertJobType() { + return Sq_CallFunc(S_Ptr("0x822f894"), "int", ["pointer"], this.C_Object); +} + +//调用分解机 +function User::DisPatcher_DisJointItem_disjoint(Slot, ...) { + local UseIdx = 239; + local UsePtr = this.C_Object; + if (vargv.len() > 1) { + UseIdx = vargv[0]; + UsePtr = vargv[1]; + } + return Sq_CallFunc(S_Ptr("0x81f92ca"), "int", ["pointer", "int", "int", "int", "pointer", "int"], this.C_Object, Slot, 0, UseIdx, UsePtr, 0xFFFF); +} + +//发送Item邮件 Pubilc +function User::SendItemMail(UID, CID, ItemList, title, content) { + local SUser = World.GetUserByUid(UID); + local sql = "select letter_id from taiwan_cain_2nd.postal order by letter_id DESC"; + local column_type_list = ["int"]; + + local SqlObj = MysqlPool.GetInstance().GetConnect(); + local result = SqlObj.Select(sql, column_type_list); + local sl = 1; + if (result.len() > 0) { + sl = result[0][0] + 1; + } + + local time = date(); + local timeStr = time["year"] + "-" + (time["month"] + 1) + "-" + time["day"] + " " + time["hour"] + ":" + time["min"] + ":" + time["sec"]; + + foreach(value in ItemList) { + local sql1 = "insert into taiwan_cain_2nd.postal (occ_time,send_charac_name,receive_charac_no,amplify_option,amplify_value,seperate_upgrade,seal_flag,item_id,add_info,upgrade,gold,letter_id,avata_flag,creature_flag) values ('" + timeStr + "','" + title + "'," + CID + ",0,0,0,0," + value.item + "," + value.num + ",0,0," + sl + ",'0','0')"; + SqlObj.Select(sql1, []); + } + + local sql2 = "insert into taiwan_cain_2nd.letter (letter_id,charac_no,send_charac_name,letter_text,reg_date,stat) values ('" + sl + "'," + CID + ",'" + title + "','" + content + "','" + timeStr + "','1')"; + SqlObj.Select(sql2, []); + + MysqlPool.GetInstance().PutConnect(SqlObj); + + if (SUser) { + local Pack = Packet(); + Pack.Put_Header(0, 9); + local MailBox = Sq_CallFunc(S_Ptr("0x0823020C"), "int", ["pointer"], SUser.C_Object); + Sq_CallFunc(S_Ptr("0x0823455A"), "int", ["int"], MailBox); + local Not_Count = Sq_CallFunc(S_Ptr("0x084ED330"), "int", ["int"], MailBox); + Pack.Put_Short(Not_Count); + Pack.Finalize(true); + SUser.Send(Pack); + Pack.Delete(); + } } \ No newline at end of file diff --git a/Dps_A/CallBack/Gm_Input.nut b/Dps_A/CallBack/Gm_Input.nut index 510e7e6..3012997 100644 --- a/Dps_A/CallBack/Gm_Input.nut +++ b/Dps_A/CallBack/Gm_Input.nut @@ -193,6 +193,7 @@ Gm_InputFunc_Handle.T <- function(SUser, CmdString) { SUser.SendNotiPacketMessage("GetCharacCount: " + SUser.GetCharacCount(), 8); SUser.SendNotiPacketMessage("GetUID: " + SUser.GetUID(), 8); SUser.SendNotiPacketMessage("GetCID: " + SUser.GetCID(), 8); + SUser.SendNotiPacketMessage("GetUni: " + SUser.GetUniqueId(), 8); SUser.SendNotiPacketMessage("GetCharacJob: " + SUser.GetCharacJob(), 8); SUser.SendNotiPacketMessage("GetCharacName: " + SUser.GetCharacName(), 8); SUser.SendNotiPacketMessage("GetCharacLevel: " + SUser.GetCharacLevel(), 8); @@ -245,22 +246,242 @@ function TestThread(coro) { } -function TestL() { - print("注册 1 秒后执行") - Timer.SetTimeOut(TestL, 1); +function TestCronTask(str) { + print(str); + print("定时任务已执行一次"); } + + Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) { + // Timer.SetCronTask(TestCronTask, "1/0/0/0", "测试字符串参数"); + // print("注册任务"); + + // Sq_AutoReload("/dp_s/MyProject"); + + // local ms = 2000; + // local minutes = ms / 60000; + // local seconds = (ms % 60000) / 1000; + // local milliseconds = (ms % 1000) / 10; + // if (minutes > 0) { + // str = minutes + "分" + + // (seconds< 10 ? "0" : "") + seconds + "秒" + + // (milliseconds< 10 ? "0" : "") + milliseconds; // 补全毫秒数为两位 + // } else { + // str = seconds + "秒" + + // (milliseconds< 10 ? "0" : "") + milliseconds; // 补全毫秒数为两位 + // } + + // print(str); + + // User.SendItemMail(1, 7, [{ + // itemId = 3037, + // num = 100 + // }, { + // itemId = 3038, + // num = 100 + // }], "给你", "东西"); + + // Sq_CallFunc(S_Ptr("0x86C5A84"), "pointer", ["pointer", "pointer", "int", "int", "int", "int", "int", "int", "int", "int", "int"], Sq_Get_GameWorld(), SUser.C_Object, 1, 1, 200, 200, 0, 0, 0, 0, 0); + + // Haker.LoadHook(S_Ptr("0x86C5A84"), + // ["pointer", "pointer", "int", "int", "int", "int", "int", "int", "int", "int", "int", "pointer"], + // function(args) { + // print(args[0]); + // print(Sq_Get_GameWorld()); + // print(args[2]); + // print(args[3]); + // print(args[4]); + // print(args[5]); + // print(args[6]); + // print(args[7]); + // print(args[8]); + // print(args[9]); + // print(args[10]); + // return null; + // }, + // function(args) { + + // return null; + // }); - local md5 = MD5.GetFile("/dp_s/a.txt"); - print("Md5文本值: " + md5); - local Arr = []; - foreach(char in md5) { - Arr.append(char.tointeger()); - } - print("Md5字符值>>>"); - printT(Arr); + // local Sm = Memory.alloc(200); + // Sq_CallFunc(S_Ptr("0x8AA5CBA"), "int", ["pointer", "int", "pointer"], S_Ptr("0x949B140"), 7, Sm.C_Object); + // local Bsa = Sq_Point2Blob(Sm.C_Object, 120); + // local str = "[" + // foreach(value in Bsa) { + // str += value; + // str += "," + // } + // str += "]"; + // print(str); + // print("字符串: " + Sm.readUtf8String()); + + // getroottable()._nut_file_md5_table.rawset(file_name, file_md5_string); + + // local opendirAddr = Module.getExportByName(null, "opendir"); + + // function open_dir(dir_path) { + // local path_ptr = Memory.allocUtf8String(dir_path).C_Object; + // return Sq_CallFunc(opendirAddr, "pointer", ["pointer"], path_ptr); + // } + // local dir_pointer = open_dir("/dp_s/"); + // print("dir_pointer = " + dir_pointer); + + // local Pack = Packet(); + // Pack.Put_Header(1, 83); + // Pack.Put_Byte(1); + // Pack.Put_Byte(11) + // Pack.Put_Short(8195); + // Pack.Put_Int(1); + // Pack.Put_Short(65535); + // Pack.Put_Byte(1); + // Pack.Put_Byte(12); + // Pack.Put_Byte(1); + // Pack.Put_Byte(13); + // Pack.Put_Byte(25); + // Pack.Finalize(true); + // SUser.Send(Pack); + // Pack.Delete(); + + + + // GameManager.SetGameMaxLevel(95); + + // Sq_HookFunc(); + + // Sq_HookFunc(S_Ptr("0x8678526"), + // 2, + // function(a,args) { + // print("AAA动态HOOK成功 城镇移动HOOK"); + // print(CUser); + // print(id); + // }, + // function(a,args) { + // print("AAA动态HOOK成功 城镇移动HOOK"); + // print(CUser); + // print(id); + // }); + + + //给角色发消息var CUser_SendNotiPacketMessage = new NativeFunction(ptr(0x86886CE), 'int', ['pointer', 'pointer', 'int'], { "abi": "sysv" }); + + // Sq_CallFunc(S_Ptr("0x86886CE"), "int", ["pointer", "pointer","int"], SUser.C_Object, Memory.allocUtf8String("测试信息"),14); + // Sq_HookFunc(S_Ptr("0x8678526"), + + /* + // 发包 + Haker.LoadHook("0x86485BA", ["pointer", "pointer", "int"], + function(args) { + print(args[0]); + local Pack = NativePointer(args[1]); + Pack = NativePointer(Pack.readPointer()); + local headIndex = Pack.add(0x19).readU16(); + if (headIndex == 83) { + print("发了83包"); + + // local Bo = Sq_Point2Blob(args[1], 100); + + // local Str = "["; + // foreach(Value in Bo) { + // Str = format("%s%02X", Str, Value); + // Str += ","; + // } + // Str += "]"; + // print(Str); + + // local bufftype = Pack.add(0x28).readU8(); + // local itemSlot = Pack.add(0x29).readU16(); + // local itemCount = Pack.add(0x2B).readU32(); + // local upType = Pack.add(0x31).readU8(); + // local ret = Pack.add(0x33).readU8(); + // local newUpLevel = Pack.add(0x34).readU8(); + // local equSlot = Pack.add(0x35).readU16(); + // print("bufftype: " + bufftype); + // print("itemSlot: " + itemSlot); + // print("itemCount: " + itemCount); + // print("upType: " + upType); + // print("ret: " + ret); + // print("newUpLevel: " + newUpLevel); + // print("equSlot: " + equSlot); + } + return null; + }, + function(args) { + + return null; + }); + + Haker.LoadHook("0x080FC850", ["pointer", "pointer", "pointer", "int", "void"], + function(args) { + // local Arr = [0x95, 0xDA, 0xF6, 0x12, 0x25, 0xDF, 0xE0, 0x0B, 0x48, 0xDF, 0xCC, 0xC6, 0x95, 0xDA, 0x31, 0x3F, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0xBE, 0x6B, 0x00, 0x00, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xB9, 0xB8, 0xE5, 0xAD, 0x98, 0xE8, 0x80, 0x85, 0xE7, 0x9A, 0x84, 0xE5, 0xA5, 0xA7, 0xE7, 0xA5, 0x95]; + + // Sq_Memory_WriteByteArr(args[2], Arr); + + // local Address = NativePointer(args[2]).add(35); + // NativePointer(Address).writeU8(0x3c); + // // local Address2 = NativePointer(args[2]).add(36); + // NativePointer(Address).writeShort(65535); + // NativePointer(Address2).writeShort(0x3E); + + local Bo = Sq_Point2Blob(args[2], 100); + + local Str = "["; + foreach(Value in Bo) { + Str = format("%s%02X", Str, Value); + Str += ","; + } + Str += "]"; + print(Str); + return null; + }, + function(args) { + local Pos = NativePointer(args[2]).add(27).readU16(); + local SUser = User(args[1]); + SUser.SendUpdateItemList(1, 0, Pos); + + // local Pack = Packet(); + // Pack.Put_Header(1, 83); + // Pack.Put_Byte(1); + // Pack.Put_Byte(11) + // Pack.Put_Short(8195); + // Pack.Put_Int(0); + // Pack.Put_Short(65535); + // Pack.Put_Byte(0); + // Pack.Put_Byte(30); + // Pack.Put_Byte(0); + // Pack.Put_Byte(31); + // Pack.Put_Byte(25); + // Pack.Finalize(true); + // SUser.Send(Pack); + // Pack.Delete(); + + return null; + }); + */ + + // Sq_CallFunc(S_Ptr("0x84ECAA2"), "pointer", ["pointer", "float"], SUser.C_Object, 5.5); + + /* + + + + function(args) { + print("AAA动态HOOK成功 城镇移动HOOK"); + print(CUser); + print(id); + } + + */ + // local md5 = MD5.GetFile("/dp_s/a.txt"); + // print("Md5文本值: " + md5); + // local Arr = []; + // foreach(char in md5) { + // Arr.append(char.tointeger()); + // } + // print("Md5字符值>>>"); + // printT(Arr); // local Io = IO("/dp_s/a.txt", "r+"); @@ -336,19 +557,34 @@ Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) { // Timer.SetTimeOut(function() { // print("注册 2 秒后执行") // }, 2); + }; Gm_InputFunc_Handle.AAA <- function(SUser, CmdString) { - //查询的sql语句 - local sql = "SELECT m_id,charac_name,lev,village,job,exp,Hp FROM charac_info WHERE charac_no = 1;"; - //查询的元素类型,按sql中的顺序 - local column_type_list = ["int", "string", "int", "int", "int", "int", "int"]; + // //查询的sql语句 + // local sql = "SELECT m_id,charac_name,lev,village,job,exp,Hp FROM charac_info WHERE charac_no = 1;"; + // //查询的元素类型,按sql中的顺序 + // local column_type_list = ["int", "string", "int", "int", "int", "int", "int"]; + // local SqlObj = MysqlPool.GetInstance().GetConnect(); + // local result = SqlObj.Select(sql, column_type_list); + + // printT(result); + + // MysqlPool.GetInstance().PutConnect(SqlObj); + + + //从池子拿连接 local SqlObj = MysqlPool.GetInstance().GetConnect(); + + //建库 + local sql = "SELECT slot FROM frida.setCharacSlotLimit WHERE account_id = " + account_id + ";"; + local column_type_list = ["int"]; local result = SqlObj.Select(sql, column_type_list); + if (result.len() > 0) { - printT(result); + } + //把连接还池子 MysqlPool.GetInstance().PutConnect(SqlObj); - }; \ No newline at end of file diff --git a/Dps_A/ProjectClass/A_ServerControl/ServerControl.nut b/Dps_A/ProjectClass/A_ServerControl/ServerControl.nut index ae68f3f..32beb70 100644 --- a/Dps_A/ProjectClass/A_ServerControl/ServerControl.nut +++ b/Dps_A/ProjectClass/A_ServerControl/ServerControl.nut @@ -45,7 +45,6 @@ class ServerControl { } constructor() { - //分发来自网关的包 GatewaySocketPackFuncMap.rawset(20240730, function(Jso) { local UserList = []; @@ -75,9 +74,25 @@ class ServerControl { } } - }.bindenv(this)); + //给频道所有玩家分发网关的包 + GatewaySocketPackFuncMap.rawset(20240806, function(Jso) { + Jso.op <- Jso.realop; + local Str = Json.Encode(Jso); + Str = removeBackslashes(Str); + local Pack = Packet(); + Pack.Put_Header(1, 130); + Pack.Put_Byte(1); + Pack.Put_Int(Str.len()); + Pack.Put_Binary(Str); + Pack.Finalize(true); + World.SendAll(Pack); + Pack.Delete(); + }.bindenv(this)); + + + //给查询指定uid cid列表的玩家信息 GatewaySocketPackFuncMap.rawset(2023101902, function(Jso) { local UserList = []; @@ -172,6 +187,7 @@ class ServerControl { Cb_Use_Item_Sp_Func[ItemId] <- function(SUser, ItemId) { local T = { op = RealOp, + itemId = ItemId, uid = SUser.GetUID(), cid = SUser.GetCID() }; @@ -246,6 +262,14 @@ class ServerControl { } }); + //给指定玩家下发邮件 + GatewaySocketPackFuncMap.rawset(20240928, function(Jso) { + local UID = Jso.uid; + local CID = Jso.cid; + User.SendItemMail(UID, CID, Jso.result, Jso.title, Jso.content); + }); + + //给指定队伍设置复活币数量 GatewaySocketPackFuncMap.rawset(20240804, function(Jso) { local UID = Jso.uid; @@ -396,8 +420,8 @@ class ServerControl { //给注册玩家通关副本 GatewaySocketPackFuncMap.rawset(2023110704, function(Jso) { local RealOp = Jso.realop; - Cb_BossDie_Func[RealOp] <- function(SUser) { - local PartyObj = SUser.GetParty(); + Cb_ClearDungeon_Enter_Func[RealOp] <- function(arg) { + local PartyObj = Party(arg[0]); if (PartyObj) { local Bfobj = PartyObj.GetBattleField(); local DgnObj = Bfobj.GetDgn(); diff --git a/Dps_A/ProjectClass/MarrySystem/MarrySystem.nut b/Dps_A/ProjectClass/MarrySystem/MarrySystem.nut new file mode 100644 index 0000000..cec8a61 --- /dev/null +++ b/Dps_A/ProjectClass/MarrySystem/MarrySystem.nut @@ -0,0 +1,44 @@ +/* +文件名:MarrySystem.nut +路径:Dps_A/ProjectClass/MarrySystem/MarrySystem.nut +创建日期:2024-10-01 10:02 +文件用途:结婚系统 +*/ +class Marry { + //包头 + OP = 20078000; + + //查看是否结婚 + function CheckMarryCallBack(SUser, Jso) { + // print("申请查看结婚信息的人是: " + SUser.GetCharacName()); + local T = { + op = OP + 2, + Flag = false, //结婚返回true 未结婚返回flase + } + SUser.SendJso(T); + } + + //申请结婚 + function RequestMarry(SUser, Jso) { + local PSUser = World.GetUserByName(Jso.Name); + if (PSUser) { + local T = { + op = OP + 3, + cid = SUser.GetCID(), + cid2 = PSUser.GetCID(), + } + Socket.SendGateway(T); + } + } + + + constructor() { + //注册来自客户端的收包 + ClientSocketPackFuncMap.rawset(OP + 1, CheckMarryCallBack.bindenv(this)); + ClientSocketPackFuncMap.rawset(OP + 3, RequestMarry.bindenv(this)); + } + +} + + +ProjectInitFuncMap.P_Marry <- Marry(); \ No newline at end of file diff --git a/Dps_A/main.nut b/Dps_A/main.nut index 3193bb5..3cf143f 100644 --- a/Dps_A/main.nut +++ b/Dps_A/main.nut @@ -3,6 +3,8 @@ getroottable().DebugModelFlag <- false; function InitPluginInfo() { //初始化定时器 _Timer_Object <- Timer(); + //初始化自动重载 + GameManager.OpenHotFix("/dp_s/Dps_A"); local PoolObj = MysqlPool.GetInstance(); PoolObj.SetBaseConfiguration("127.0.0.1", 3306, "game", "uu5!^%jg"); @@ -11,6 +13,17 @@ function InitPluginInfo() { //初始化 PoolObj.Init(); + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + + //建库 + SqlObj.Select("create database if not exists frida default charset utf8;", []); + + SqlObj.Select("CREATE TABLE `frida`.`setCharacSlotLimit` (`account_id` INT NOT NULL,`slot` INT NOT NULL DEFAULT 2,PRIMARY KEY (`account_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;", []); + + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + // Sq_CreatCConnectPool(2, 4, "127.0.0.1", 3306, "game", "uu5!^%jg"); Sq_CreatSocketConnect("192.168.200.24", "65109"); } diff --git a/Dps_C/New_Hook.nut b/Dps_C/New_Hook.nut new file mode 100644 index 0000000..f96c8c7 --- /dev/null +++ b/Dps_C/New_Hook.nut @@ -0,0 +1,109 @@ +/* +文件名:New_Hook.nut +路径:Dps_A/New_Hook.nut +创建日期:2024-09-23 20:15 +文件用途:后续新增的玩家需求的HOOK +*/ +//通用HOOK入口函数 +function _Hook_Enter_Currency_Func_(args, TableObj) { + local Ret = null; + foreach(Func in TableObj) { + local Buf = Func(args); + if (Buf) Ret = Buf; + } + return Ret; +} +//通用HOOK出口函数 +function _Hook_Leave_Currency_Func_(args, TableObj) { + local Ret = null; + foreach(Func in TableObj) { + local Buf = Func(args); + if (Buf) Ret = Buf; + } + return Ret; +} + +//通用注册HOOK函数 +function _Hook_Register_Currency_Func_(AddressString, ArgRetArr, EnterTable, LeaveTable) { + Haker.LoadHook(AddressString, ArgRetArr, + function(args) { + return _Hook_Enter_Currency_Func_(args, EnterTable); + }, + function(args) { + return _Hook_Leave_Currency_Func_(args, LeaveTable); + } + ); +} + + +//玩家新增道具时 +Cb_User_Insert_Item_Enter_Func <- {}; +Cb_User_Insert_Item_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x8502D86", ["pointer", "pointer", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "char", "int", "char", "char", "int"], Cb_User_Insert_Item_Enter_Func, Cb_User_Insert_Item_Leave_Func); + + +//玩家捡起道具 +Cb_User_Get_Item_Enter_Func <- {}; +Cb_User_Get_Item_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x85B949C", ["pointer", "pointer", "int", "int", "int"], Cb_User_Get_Item_Enter_Func, Cb_User_Get_Item_Leave_Func); + +//服务器Chat日志HOOK +Cb_Server_Chat_Log_Enter_Func <- {}; +Cb_Server_Chat_Log_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x86C9638", ["pointer", "pointer", "char", "string", "char"], Cb_Server_Chat_Log_Enter_Func, Cb_Server_Chat_Log_Leave_Func); + +//玩家上线设置IP +Cb_User_Set_WebAddress_Enter_Func <- {}; +Cb_User_Set_WebAddress_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x84EC918", ["pointer", "pointer", "pointer"], Cb_User_Set_WebAddress_Enter_Func, Cb_User_Set_WebAddress_Leave_Func); + +//服务端关闭执行函数 +Cb_Server_Close_Enter_Func <- {}; +Cb_Server_Close_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x829F28B", ["pointer", "pointer"], Cb_Server_Close_Enter_Func, Cb_Server_Close_Leave_Func); + +//检查地下城的状况 +Cb_CheckInoutConditionDungeon_Enter_Func <- {}; +Cb_CheckInoutConditionDungeon_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x85ABC80", ["pointer", "pointer", "int", "int"], Cb_CheckInoutConditionDungeon_Enter_Func, Cb_CheckInoutConditionDungeon_Leave_Func); + +//地下城现场杀死地狱党组怪物Cnt +Cb_Field_KillHellPartyGroupMonsterCnt_Enter_Func <- {}; +Cb_Field_KillHellPartyGroupMonsterCnt_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x830D704", ["pointer", "pointer", "pointer", "bool"], Cb_Field_KillHellPartyGroupMonsterCnt_Enter_Func, Cb_Field_KillHellPartyGroupMonsterCnt_Leave_Func); + +//经验收益 +Cb_Gain_Exp_Sp_Enter_Func <- {}; +Cb_Gain_Exp_Sp_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x866A3FE", ["pointer", "int", "int", "int", "int", "int", "char"], Cb_Gain_Exp_Sp_Enter_Func, Cb_Gain_Exp_Sp_Leave_Func); + + +//货币收益 +Cb_Gain_Money_Enter_Func <- {}; +Cb_Gain_Money_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x84FF29C", ["int", "int", "char", "int", "int"], Cb_Gain_Money_Enter_Func, Cb_Gain_Money_Leave_Func); + +//GetItem检查错误 +Cb_GetItem_Check_Error_Enter_Func <- {}; +Cb_GetItem_Check_Error_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x81C35AC", ["pointer", "pointer", "pointer", "int"], Cb_GetItem_Check_Error_Enter_Func, Cb_GetItem_Check_Error_Leave_Func); + +//队伍清除副本 +Cb_ClearDungeon_Enter_Func <- {}; +Cb_ClearDungeon_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x85a9330", ["pointer", "void"], Cb_ClearDungeon_Enter_Func, Cb_ClearDungeon_Leave_Func); + +//检查选择进入副本时状态 +Cb_SelectDungeon_Check_Error_Enter_Func <- {}; +Cb_SelectDungeon_Check_Error_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x81C7F32", ["pointer", "pointer", "pointer", "int"], Cb_SelectDungeon_Check_Error_Enter_Func, Cb_SelectDungeon_Check_Error_Leave_Func); + +//切换装备 +Cb_CInventory_ChangeEquip_Enter_Func <- {}; +Cb_CInventory_ChangeEquip_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x84FC37E", ["pointer", "int", "pointer", "int"], Cb_CInventory_ChangeEquip_Enter_Func, Cb_CInventory_ChangeEquip_Leave_Func); + +//获取通关时间回调 +Cb_CParty_SetBestClearTime_Enter_Func <- {}; +Cb_CParty_SetBestClearTime_Leave_Func <- {}; +_Hook_Register_Currency_Func_("0x85BE178", ["pointer", "char", "int", "int", "bool"], Cb_CParty_SetBestClearTime_Enter_Func, Cb_CParty_SetBestClearTime_Leave_Func); \ No newline at end of file diff --git a/MyProject/asas.nut b/MyProject/asas.nut new file mode 100644 index 0000000..be14a5f --- /dev/null +++ b/MyProject/asas.nut @@ -0,0 +1,2 @@ +print("aaaa"); +print("aaaa"); \ No newline at end of file diff --git a/folder-alias.json b/folder-alias.json index 7a7d74b..be58cbe 100644 --- a/folder-alias.json +++ b/folder-alias.json @@ -127,5 +127,11 @@ }, "Dps_A/BaseClass/MD5Class": { "description": "MD5类" + }, + "Dps_A/BaseClass/HackerClass": { + "description": "黑客类" + }, + "Dps_A/BaseClass/HotFixClass": { + "description": "热更新" } } \ No newline at end of file diff --git a/lib/libAurora.so b/lib/libAurora.so index 139416e..e695848 100755 Binary files a/lib/libAurora.so and b/lib/libAurora.so differ