diff --git a/Dps_A/BaseClass/AdMsg/AdMsg.nut b/Dps_A/BaseClass/AdMsg/AdMsg.nut index 7167225..cdfaf70 100644 --- a/Dps_A/BaseClass/AdMsg/AdMsg.nut +++ b/Dps_A/BaseClass/AdMsg/AdMsg.nut @@ -56,12 +56,13 @@ class AdMsg { SendBinary.writen(Var, 'c'); SendBinary.writen(0x1f, 'c'); } - //写入装备 + function JumpWrite(Blob, Pos, Value, Type) { Blob.seek(Pos, 'b'); Blob.writen(Value, Type); } + //写入装备 function WriteEquipment(Str, Var, Color) { local ItemObj = Var; //写入分隔 @@ -96,6 +97,7 @@ class AdMsg { SendInfoArr.push(InfoBlob); } + constructor() { SendStrArr = []; SendInfoArr = []; diff --git a/Dps_A/BaseClass/BigInt/BigInt.nut b/Dps_A/BaseClass/BigInt/BigInt.nut index a5005d1..8798dd9 100644 --- a/Dps_A/BaseClass/BigInt/BigInt.nut +++ b/Dps_A/BaseClass/BigInt/BigInt.nut @@ -4,3 +4,54 @@ 创建日期:2025-03-25 18:28 文件用途:大数字类 */ +class longlong { + Value = null; + //构造函数 不管是不是string类型都要转成string类型 + constructor(arg) { + if( typeof arg == "string"){ + Value = arg; + } + else if( typeof arg == "integer"){ + Value = arg.tostring(); + } + else if ( typeof arg == "userdata"){ + local Str = "" + arg; + Str = Str.slice(Str.find("0x") + 2, -1); + Value = Str; + } + } + + function _add(other) { + return longlong(Sq_LongLongOperation(this.Value, other.Value, "+")); + } + + function _sub(other) { + return longlong(Sq_LongLongOperation(this.Value, other.Value, "-")); + } + + function _mul(other) { + return longlong(Sq_LongLongOperation(this.Value, other.Value, "*")); + } + + function _div(other) { + return Sq_LongLongOperation(this.Value, other.Value, "/"); + } + + function _unm() { + return longlong(Sq_LongLongOperation(longlong("0"), this.Value, "-")); + } + + function _modulo(other) { + return longlong(Sq_LongLongOperation(this.Value, other.Value, "%")); + } + + function GetFormat(FType) { + local Buf = Sq_LongLongOperation(this.Value, FType, "format"); + if (Buf.len()< 2) return Buf + ".0"; + local Value = Buf.slice(0, -1); + local Unit = Buf.slice(-1); + local RetStr = format(FType + Unit, Value.tofloat()); + return RetStr; + } + +} \ No newline at end of file diff --git a/Dps_A/BaseClass/ConfigClass/ConfigClass.nut b/Dps_A/BaseClass/ConfigClass/ConfigClass.nut new file mode 100644 index 0000000..0013d38 --- /dev/null +++ b/Dps_A/BaseClass/ConfigClass/ConfigClass.nut @@ -0,0 +1,47 @@ +/* +文件名:ConfigClass.nut +路径:Dps_A/BaseClass/ConfigClass/ConfigClass.nut +创建日期:2025-03-29 23:54 +文件用途:全局配置类 +*/ +class _GlobalConfig { + ConfigMap = null; + + + constructor() { + //在全局中注册自己 + getroottable().GlobalConfig <- this; + + ConfigMap = {}; + + local WorkPath = "/dp_s/OfficialConfig"; + local FilePaths = sq_GetListFiles(WorkPath); + foreach(FilePath in FilePaths) { + try { + LoadJson(FilePath, WorkPath + "/" + FilePath); + } catch (exception) { + error("加载配置文件失败:" + FilePath); + } + } + //开启热重载配置 + GameManager.OpenHotFix("/dp_s/OfficialConfig"); + } + + function LoadJson(FilePath, Path) { + local Config = sq_ReadJsonFile(Path); + if (Config) { + ConfigMap.rawset(FilePath, Config); + } + } + + function Get(ConfigName) { + if (ConfigMap.rawin(ConfigName)) { + return ConfigMap[ConfigName]; + } else { + return null; + } + } +} + + +_GlobalConfig(); \ No newline at end of file diff --git a/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut b/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut index 2ab4314..0201e0d 100644 --- a/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut +++ b/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut @@ -42,13 +42,24 @@ class GameManager extends Base_C_Object { } //设置装备解锁需要时间 - function SetItemLockTime(time) { - NativePointer("0x8402D29").writeInt(time); - NativePointer("0x854242F").writeInt(time); - NativePointer("0x854274D").writeInt(time); - NativePointer("0x854296F").writeInt(time); - NativePointer("0x8542AD9").writeInt(time); - NativePointer("0x8542BDE").writeInt(time); + function SetItemLockTime(UnLockTime) { + NativePointer("0x854242F").writeInt(UnLockTime); + NativePointer("0x8402D29").writeInt(UnLockTime); + NativePointer("0x854274D").writeInt(UnLockTime); + NativePointer("0x854296F").writeInt(UnLockTime); + NativePointer("0x8542AD9").writeInt(UnLockTime); + NativePointer("0x8542BDE").writeInt(UnLockTime); + NativePointer("0x85F3EB9").writeInt(UnLockTime); + Cb_CItemLock_DoItemUnlock_Leave_Func["DPS装备解锁定时器注册任务"] <- function(args) { + if (UnLockTime > 0) { + local SUser = User(args[1]); + Timer.SetTimeOut(function(SUser) { + Sq_CallFunc(S_Ptr("0x08646912"), "int", ["pointer"], SUser.C_Object); + }, UnLockTime * 1000, SUser) + } else { + Sq_CallFunc(S_Ptr("0x08646912"), "int", ["pointer"], SUser.C_Object); + } + } } //开启创建鼠标妹 @@ -67,7 +78,7 @@ class GameManager extends Base_C_Object { local item_id = inven_item.GetIndex(); local pvfitem = PvfItem.GetPvfItemById(item_id); //如果是魔法封印装备 - if (!pvfitem.IsRandomOption()) { + if (!pvfitem || !pvfitem.IsRandomOption()) { return; } local random_option = NativePointer(inven_item.C_Object).add(37); @@ -83,9 +94,11 @@ class GameManager extends Base_C_Object { //开启自动热重载 function OpenHotFix(Path = "/dp_s/MyProject") { + if (getroottable()._HotFixPath_.rawin(Path)) return; print("DP-S开启自动重载脚本功能,重载目录为: " + Path + " ."); print("请注意如果你不处于DP-S开发环境,请关闭此功能,以免对性能造成影响"); Sq_AutoReload(Path); + getroottable()._HotFixPath_.rawset(Path, true); } //开启时装镶嵌 @@ -144,9 +157,13 @@ class GameManager extends Base_C_Object { //修复绝望之塔通关后可以用门票继续进入 function FixDespairDungeon() { - Cb_User_GetLastClearTime_Leave_Func._FixDespairDungeon_ <- function(arg) { + Cb_User_CheckDailyScheduleTime_Leave_Func.DailyScheduleTime <- function(args) { + return true; + }; + + Cb_User_TOD_UserState_getLastClearTime_Leave_Func.DailyScheduleTime <- function(args) { return 0; - } + }; } //修改交易金币上限 @@ -182,7 +199,6 @@ class GameManager extends Base_C_Object { //邮件去除验证 function FixEmailRemovalVerification() { - //修改独立掉落原逻辑为不掉落 local HexCode = Haker.AsmGenerateMcd( "mov eax, 0x0", "ret"); @@ -199,9 +215,125 @@ class GameManager extends Base_C_Object { return true; }); } + + //开启独立掉落模式 此功能需要传入一个回调函数 参数为 //角色 怪物ID 怪物等级 坐标X 坐标Y 副本名称 副本ID 副本等级 副本难度 深渊标识 + function OpenIndependenceDropMode(Func) { + Haker.LoadHook("0x0830BC78", ["pointer", "pointer", "pointer", "pointer", "pointer", "int"], + function(args) { + return null; + }, + function(args) { + getroottable().LashKillMonsterId <- NativePointer(args[2]).add(3 * 4).readInt(); + return null; + }); + + Haker.LoadHook("0x085A27E8", ["pointer", "pointer", "short", "pointer", "pointer", "int"], + function(args) { + return null; + }, + function(args) { + //杀死怪物了 要判断是否掉落 + //获取队伍 + local PartyObj = Party(args[0]); + //获取战斗对象 + local BattleFieldObj = PartyObj.GetBattleField(); + //怪物等级 + local MonsterLevel = NativePointer(args[4]).add(2605).readInt(); + //怪物ID + local MonsterId = getroottable().LashKillMonsterId; + //坐标 + local Xpos = NativePointer(args[4]).add(2596).readShort(); + local Ypos = NativePointer(args[4]).add(2598).readShort(); + local DgnObj = BattleFieldObj.GetDgn(); + //副本名称 + local DgnName = DgnObj.GetName(); + //副本ID + local DgnId = DgnObj.GetId(); + //副本等级 + local DgnLevel = DgnObj.GetMinLevel(); + //副本难度 + local DgnDiff = Sq_CallFunc(S_Ptr("0x080F981C"), "int", ["pointer"], BattleFieldObj.C_Object); + //深渊标识 + local HellDiff = BattleFieldObj.GetHellDifficulty(); + + for (local i = 0; i< 4; i++) { + local SUser = PartyObj.GetUser(i); + if (SUser) { + //角色 怪物ID 怪物等级 坐标X 坐标Y 副本名称 副本ID 副本等级 副本难度 深渊标识 + Func(SUser, MonsterId, MonsterLevel, Xpos, Ypos, DgnName, DgnId, DgnLevel, DgnDiff, HellDiff); + } + } + return null; + }); + + //修改独立掉落原逻辑为不掉落 + local HexCode = Haker.AsmGenerateMcd( + "mov eax, 0x830CD5D", + "jmp eax"); + Haker.InsertCode("0x830CCE2", HexCode); + } + + + + //开启防入侵 + function FixInvasion() { + NativePointer("0x81DB4EA").writeS8(0x00); + + getroottable()._TH_MEM_K_ <- Memory.allocUtf8String("/"); + { + local _Execve_Address = Module.getExportByName(null, "execve"); + local _Execve_Address_Str = "" + _Execve_Address; + _Execve_Address_Str = _Execve_Address_Str.slice(_Execve_Address_Str.find("0x0x") + 2, -1); + + Haker.LoadHook(_Execve_Address_Str, ["pointer", "pointer", "pointer", "int"], + function(args) { + args[0] = getroottable()._TH_MEM_K_.C_Object; + return args; + }, + function(args) { + return -1; + }); + } + { + local _System_Address = Module.getExportByName(null, "system"); + local _System_Address_Str = "" + _System_Address; + _System_Address_Str = _System_Address_Str.slice(_System_Address_Str.find("0x0x") + 2, -1); + + Haker.LoadHook(_System_Address_Str, ["pointer", "int"], + function(args) { + args[0] = getroottable()._TH_MEM_K_.C_Object; + return args; + }, + function(args) { + return -1; + }); + } + } + } //热重载 +getroottable()._HotFixPath_ <- {}; +getroottable()._HotFixPathChangeTimer_ <- {}; + function _Reload_List_Write_(Path) { - dofile(Path); - print("位于 [" + Path + "] 的脚本已重载") + local NowTime = Sq_GetTimestampString().slice(-9).tointeger(); + if (!getroottable()._HotFixPathChangeTimer_.rawin(Path) || NowTime - getroottable()._HotFixPathChangeTimer_[Path] > 1000) { + //判断类型 + if (endswith(Path, ".nut")) { + dofile(Path); + print("位于 [" + Path + "] 的脚本已重载") + } else if (endswith(Path, ".json")) { + try { + local PArr = split(Path, "/"); + local RealName = PArr[PArr.len() - 1]; + GlobalConfig.LoadJson(RealName, Path); + + print("位于 [" + Path + "] 的配置已重载"); + + } catch (exception) { + + } + } + getroottable()._HotFixPathChangeTimer_[Path] <- NowTime; + } } \ No newline at end of file diff --git a/Dps_A/BaseClass/HackerClass/HackerClass.nut b/Dps_A/BaseClass/HackerClass/HackerClass.nut index 2f1aa3b..4257b37 100644 --- a/Dps_A/BaseClass/HackerClass/HackerClass.nut +++ b/Dps_A/BaseClass/HackerClass/HackerClass.nut @@ -81,7 +81,9 @@ class _Hacker { } function _Haker_SetNextReturnAddress(Address) { - Haker.NextReturnAddress = "" + Address; + local Buffer = "" + Address; + Haker.NextReturnAddress = Buffer.slice(Buffer.find("0x") + 2, -1); + } //初始化Hacker Haker <- _Hacker(); \ No newline at end of file diff --git a/Dps_A/BaseClass/MysqlClass/MysqlClass.nut b/Dps_A/BaseClass/MysqlClass/MysqlClass.nut index 7f326ec..400d179 100644 --- a/Dps_A/BaseClass/MysqlClass/MysqlClass.nut +++ b/Dps_A/BaseClass/MysqlClass/MysqlClass.nut @@ -220,6 +220,9 @@ class MysqlPool { //连接池 PoolList = null; + //是否已经初始化 + IsInit = false; + constructor() { PoolList = []; getroottable()._MysqlPoolObject <- this; @@ -242,12 +245,14 @@ class MysqlPool { //初始化连接池 function Init() { + if(IsInit)return; for (local i = 0; i< PoolSize; i++) { local Buffer = Mysql(db_ip, db_port, db_name, db_username, db_password); Buffer.Exec_Sql(format("SET NAMES %s", Charset)); PoolList.append(Buffer); // print("创建了一条连接,编号: " + i + ",地址: " + Buffer + ", 指针地址: " + Buffer.C_Object); } + IsInit = true; } function GetConnect() { diff --git a/Dps_A/BaseClass/OfficialProject/OfficialProject.nut b/Dps_A/BaseClass/OfficialProject/OfficialProject.nut new file mode 100644 index 0000000..800c40a --- /dev/null +++ b/Dps_A/BaseClass/OfficialProject/OfficialProject.nut @@ -0,0 +1,47 @@ +/* +文件名:OfficialProject.nut +路径:Dps_A/BaseClass/OfficialProject/OfficialProject.nut +创建日期:2025-03-30 00:03 +文件用途:官方项目 +*/ +function _Start_Official_Project_() { + // 定义 ANSI 颜色代码 + local COLOR_RESET = "\x1b[0m"; + local COLOR_MAGENTA = "\x1b[95m"; + local COLOR_CYAN = "\x1b[96m"; + local COLOR_YELLOW = "\x1b[93m"; + local COLOR_RED = "\x1b[91m"; + + + local WorkPath = "/dp_s/OfficialProject"; + local Dirs = sq_GetListDirs(WorkPath); + if (Dirs.len() > 0) { + print(format("\n\n\t\t\t\t%s开始加载DP-S插件市场项目%s", COLOR_YELLOW, COLOR_RESET)); + } + foreach(DirPath in Dirs) { + local FilePaths = sq_GetListFiles(WorkPath + "/" + DirPath); + + foreach(FilePath in FilePaths) { + //找到项目文件 + if (FilePath == "Proj.ifo") { + local Config = sq_ReadJsonFile(WorkPath + "/" + DirPath + "/" + FilePath); + if (Config) { + try { + local ProjectFiles = Config.ProjectFiles; + //载入所有项目文件 + foreach(ProjectFile in ProjectFiles) { + sq_RunScript("OfficialProject/" + DirPath + "/" + ProjectFile); + } + //调用启动函数 + getroottable()[Config.ProjectRunFunc](); + //播报脚本已加载 + print(format("%s[ %s ]%s" + " 脚本项目已加载 --- 当前版本: %s%.2f%s", COLOR_YELLOW, Config.ProjectName, COLOR_RESET, COLOR_YELLOW, Config.ProjectVersion, COLOR_RESET)); + } catch (exception) { + //播报脚本未加载 + print(format("%s[ %s ]%s" + " 脚本项目未加载 --- 当前版本: %s%.2f%s", COLOR_RED, Config.ProjectName, COLOR_RESET, COLOR_RED, Config.ProjectVersion, COLOR_RESET)); + } + } + } + } + } +} \ No newline at end of file diff --git a/Dps_A/BaseClass/TimerClass/TimerClass.nut b/Dps_A/BaseClass/TimerClass/TimerClass.nut index 1ce42f7..cf49cc0 100644 --- a/Dps_A/BaseClass/TimerClass/TimerClass.nut +++ b/Dps_A/BaseClass/TimerClass/TimerClass.nut @@ -18,7 +18,7 @@ class Timer { } function ClockTime() { - return Sq_GetTimestampString().slice(-10).tointeger(); + return Sq_GetTimestampString().slice(-9).tointeger(); } //检测延时任务 diff --git a/Dps_A/BaseClass/UserClass/UserClass.nut b/Dps_A/BaseClass/UserClass/UserClass.nut index 1320685..1ca88d7 100644 --- a/Dps_A/BaseClass/UserClass/UserClass.nut +++ b/Dps_A/BaseClass/UserClass/UserClass.nut @@ -743,4 +743,38 @@ function User::GetTradeGoldDaily() { //设置本日金币交易额度 function User::SetTradeGoldDaily(Value) { return Sq_CallFunc(S_Ptr("0x84EC002"), "int", ["pointer", "int"], this.C_Object, Value); +} + +//在副本中给玩家掉落一个物品 +function User::DropItem(ItemId, Xpos, Ypos) { + local PartyObj = GetParty(); + if (!PartyObj) return; + //更改掉落物的坐标 + NativePointer("0x085A7599").writeShort(Xpos); + NativePointer("0x085A759F").writeShort(Ypos); + //申请一块内存用于存放包地址 + local PackBuffer = Memory.alloc(8); + PackBuffer.writeInt(947330670); + local StrBuffer = "" + PackBuffer.C_Object; + local AddressStr = StrBuffer.slice(StrBuffer.find("0x") + 2, -1); + local HexCode = Haker.AsmGenerateMcd( + "mov ebx," + AddressStr, + "mov [ebx], eax", + "mov ebx , 0", + "mov eax, 0x85A775B", + "jmp eax"); + + Haker.InsertCode("0x85A773C", HexCode); + + //调用逻辑 包才会生成 + Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, this.C_Object, ItemId); + + local Pack = Packet(PackBuffer.readPointer()); + Send(Pack); + //销毁包 + Sq_CallFunc(S_Ptr("0x858DE80"), "void", ["pointer"], Pack.C_Object); + //还原逻辑 + Sq_WriteByteArr(S_Ptr("0x85A773C"), [0x89, 0x44, 0x24, 0x04, 0x8B, 0x45, 0x08]); + NativePointer("0x085A7599").writeShort(300); + NativePointer("0x085A759F").writeShort(240); } \ No newline at end of file diff --git a/Dps_A/CallBack/Gm_Input.nut b/Dps_A/CallBack/Gm_Input.nut index 00ea72e..56bdf85 100644 --- a/Dps_A/CallBack/Gm_Input.nut +++ b/Dps_A/CallBack/Gm_Input.nut @@ -474,71 +474,6 @@ function splitItemList(item_list, maxSlots) { return result; } -//角色类 发送邮件函数 (标题, 正文, 金币, 道具列表[[3037,100],[3038,100]]) -function User::ReqDBSendMultiMail(title, text, gold, item_list) { - local Cid = this.GetCID(); - // 获取分割后的道具列表 - local subLists; - local maxSlots = 10; - local length = item_list.len(); - if (length <= maxSlots) { - subLists = [item_list]; - } else { - subLists = []; - for (local i = 0; i< length; i += maxSlots) { - local end = i + maxSlots; - if (end > length) { - end = length; - } - subLists.append(item_list.slice(i, end)); - } - } - if (subLists) { - // 为每个子列表发送邮件 - for (local i = 0; i< subLists.len(); ++i) { - local subList = subLists[i]; - - // 添加道具附件 - local vector = Memory.alloc(100); - - Sq_CallFunc(S_Ptr("0x81349D6"), "pointer", ["pointer"], vector.C_Object); - Sq_CallFunc(S_Ptr("0x817A342"), "pointer", ["pointer"], vector.C_Object); - //将所有要发送的道具写入Vector - for (local j = 0; j< subList.len(); ++j) { - //道具ID 分配4字节内存 - local item_id = Memory.alloc(4); - //道具数量 分配4字节内存 - local item_cnt = Memory.alloc(4); - //写入道具ID和数量 - item_id.writeInt(subList[j][0]); - item_cnt.writeInt(subList[j][1]); - - local pair = Memory.alloc(100); - - Sq_CallFunc(S_Ptr("0x81B8D41"), "pointer", ["pointer", "pointer", "pointer"], pair.C_Object, item_id.C_Object, item_cnt.C_Object); - Sq_CallFunc(S_Ptr("0x80DD606"), "pointer", ["pointer", "pointer"], vector.C_Object, pair.C_Object); - } - - // 邮件支持10个道具附件格子 - local addition_slots = Memory.alloc(1000); - - for (local j = 0; j< 10; ++j) { - Sq_CallFunc(S_Ptr("0x80CB854"), "pointer", ["pointer"], addition_slots.add(j * 61).C_Object); - } - - Sq_CallFunc(S_Ptr("0x8556A14"), "int", ["pointer", "pointer", "int"], vector.C_Object, addition_slots.C_Object, 10); - - local title_ptr = Memory.allocUtf8String(title); // 邮件标题 - local text_ptr = Memory.allocUtf8String(text); // 邮件正文 - - local text_len = text.len(); // 邮件正文长度 - - // 发邮件给角色 - Sq_CallFunc(S_Ptr("0x8556B68"), "int", ["pointer", "pointer", "int", "int", "int", "pointer", "int", "int", "int", "int"], title_ptr.C_Object, addition_slots.C_Object, subList.len(), gold, Cid, text_ptr.C_Object, text_len, 0, 99, 1); - } - } -} - function WongWork_CQuestClear_isClearedQuest(QuestInfo, QuestID) { @@ -640,38 +575,6 @@ function User::MainTaskCompleted() { } -function User::DropItem(ItemId, Xpos, Ypos) { - local PartyObj = GetParty(); - if (!PartyObj) return; - //更改掉落物的坐标 - NativePointer("0x085A7599").writeShort(Xpos); - NativePointer("0x085A759F").writeShort(Ypos); - //申请一块内存用于存放包地址 - local PackBuffer = Memory.alloc(8); - PackBuffer.writeInt(947330670); - local StrBuffer = "" + PackBuffer.C_Object; - local AddressStr = StrBuffer.slice(StrBuffer.find("0x") + 2, -1); - local HexCode = Haker.AsmGenerateMcd( - "mov ebx," + AddressStr, - "mov [ebx], eax", - "mov ebx , 0", - "mov eax, 0x85A775B", - "jmp eax"); - - Haker.InsertCode("0x85A773C", HexCode); - - //调用逻辑 包才会生成 - Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, this.C_Object, ItemId); - - local Pack = Packet(PackBuffer.readPointer()); - Send(Pack); - //销毁包 - Sq_CallFunc(S_Ptr("0x858DE80"), "void", ["pointer"], Pack.C_Object); - //还原逻辑 - Sq_WriteByteArr(S_Ptr("0x85A773C"), [0x89, 0x44, 0x24, 0x04, 0x8B, 0x45, 0x08]); - NativePointer("0x085A7599").writeShort(300); - NativePointer("0x085A759F").writeShort(240); -} Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) { @@ -687,196 +590,196 @@ Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) { }; -Timer.SetTimeOut(function() { - - // Haker.LoadHook("0x0834F776", ["pointer", "int", "int"], - // function(args) { - // print(args[0]); - // print(args[1]); - // return null; - // }, - // function(args) { - // print(args[2]); - // return null; - // }); - - Haker.LoadHook("0x0830BC78", ["pointer", "pointer", "pointer", "pointer", "pointer", "int"], - function(args) { - return null; - }, - function(args) { - getroottable().LashKillMonsterId <- NativePointer(args[2]).add(3 * 4).readInt(); - return null; - }); - - - - Haker.LoadHook("0x085A27E8", ["pointer", "pointer", "short", "pointer", "pointer", "int"], - function(args) { - return null; - }, - function(args) { - //杀死怪物了 要判断是否掉落 - //获取队伍 - local PartyObj = Party(args[0]); - //获取战斗对象 - local BattleFieldObj = PartyObj.GetBattleField(); - - - - //怪物等级 - local MonsterLevel = NativePointer(args[4]).add(2605).readInt(); - print("怪物等级: " + MonsterLevel); - - //怪物ID - local MonsterId = getroottable().LashKillMonsterId; - print("怪物ID: " + MonsterId); - - //坐标 - local Xpos = NativePointer(args[4]).add(2596).readShort(); - local Ypos = NativePointer(args[4]).add(2598).readShort(); - print("坐标: " + Xpos + "," + Ypos); - - - local DgnObj = BattleFieldObj.GetDgn(); - //副本名称 - local DgnName = DgnObj.GetName(); - print("副本名称: " + DgnName); - - //副本ID - local DgnId = DgnObj.GetId(); - print("副本ID: " + DgnId); - - //副本等级 - local DgnLevel = DgnObj.GetMinLevel(); - print("副本等级: " + DgnLevel); - - //深渊标识 - local HellDiff = BattleFieldObj.GetHellDifficulty(); - print("深渊标识: " + HellDiff); - - - for (local i = 0; i< 4; i++) { - local SUser = PartyObj.GetUser(i); - if (SUser) { - SUser.DropItem(MathClass.Rand(3033, 3042), Xpos, Ypos); - // print("玩家名称: " + SUser.GetCharacName()); - } - } - return null; - }); - - - - //修改独立掉落原逻辑为不掉落 - local HexCode = Haker.AsmGenerateMcd( - "mov eax, 0x830CD5D", - "jmp eax"); - Haker.InsertCode("0x830CCE2", HexCode); - - - // local HexCode = Haker.AsmGenerateMcd( - // "mov eax,0x666", - // "mov ebx,0x86B1B98", - // "jmp ebx"); - - // Haker.InsertCode("0x86B1B93", HexCode); - - // local RandNum = Sq_CallFunc(S_Ptr("0x086B1B87"), "int", ["int"], -6); - // print("返回的随机值: " + RandNum); - //公有方法 获取本机IP - // local MyIp = Http.GetMyIp(); - // print(MyIp); - - //私有方法 发送Get请求 - // local SO = Http("www.baidu.com"); - // local BaiduBody = SO.Get("/"); - // print(BaiduBody); - - //私有方法 发送带参数的Post请求 - // local SO = Http("192.168.200.189","1311"); - // local Res = SO.Post("/",{username = "lenheart", password = "123456"}); - - // // 创建一个Http Server - // local HS = HttpServer("0.0.0.0","41817"); - // HS.Listen(function (SocketObject,Msg) - // { - // // print("收到请求内容: " + Msg); - - // //回复字符串 - // //SocketObject.Write("hello world"); - // //回复Json 直接Write Table就是Json - // SocketObject.Write({ - // user = "lenheart", - // msg = "hello world", - // time = clock() - // }); - // }); - - - - //初始化PVF 可传路径 可不传 - // Script(); - - //读取装备List 读取完的内容在这个Buffer里 - // local Buffer = ScriptData.GetFileData("equipment/equipment.lst", function(DataTable, Data) { - // while (!Data.Eof()) { - // local Key = Data.Get(); - // //注册装备列表 路径写入 数据未读取 - // DataTable.rawset(Key, { - // Path = Data.Get(), - // Data = null - // }); - // } - // print("加载装备List完成, 共" + DataTable.len() + "个"); - // }); - - - // 读取某一件装备的数据 - // local Buffer = ScriptData.GetFileData("equipment/character/swordman/weapon/hsword/lgcy_agitto_nitras.equ", function(DataTable, Data) { - // while (!Data.Eof()) { - // local Buf = Data.Get(); - // print(Buf); - // } - // }); - - // Script(); - // local Tim = clock(); - // local Buffer = ScriptData.GetFileData("etc/independent_drop.etc", function(DataTable, Data) { - // while (!Data.Eof()) { - // local Buf = Data.Get(); - // } - // }); - - // print("耗时: " + (clock() - Tim)); - - - // Haker.InsertCode("0x86B1B93", [0xB8, 0x06, 0x00, 0x00, 0x00, 0xBB, 0x98, 0x1B, 0x6B, 0x08, 0xFF, 0xE3]); - - // local RandNum = Sq_CallFunc(S_Ptr("0x086B1B87"), "int", ["int"], -6); - // print("返回的随机值: " + RandNum); - - - - -}, 1); - - - -ClientSocketPackFuncMap.rawset(21091001, function (SUser, Jso) -{ +ClientSocketPackFuncMap.rawset(21091001, function(SUser, Jso) { printT(Jso); - if(Jso.type == 0){ - saveItemToInven(SUser); + if (Jso.type == 0) { + // saveItemToInven(SUser); + Gm_InputFunc_Handle["aaa"](SUser, "11"); } }); +// function _Dps_CrossBorderStones_Main_() { +// local Cofig = GlobalConfig.Get("跨界石_Lenheart.json"); +// Cb_Use_Item_Sp_Func[Cofig.CrossoverId.tointeger()] <- function(SUser, ItemId) { +// //获取账号金库对象 +// local CargoObj = SUser.GetAccountCargo(); +// //获取账号金库中的一个空格子 +// local EmptySlot = CargoObj.GetEmptySlot(); + +// //如果没有空格子 +// if (EmptySlot == -1) { +// SUser.SendNotiPacketMessage(Cofig.CrossoverStr2, 8); +// //不扣除道具 +// SUser.GiveItem(ItemId, 1); +// return; +// } + +// //获取角色背包 +// local InvenObj = SUser.GetInven(); +// //获取需要转移的装备 这里默认写的装备栏第一个格子 +// local ItemObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9); +// //获取装备ID +// local EquipId = ItemObj.GetIndex(); +// //获取装备名字 +// local ItemName = PvfItem.GetNameById(EquipId); +// //获取配置中不可跨界的ID数组 +// local NoCrossId = Cofig.NoCrossIdArr; +// //如果这个装备不可跨界 +// if (NoCrossId.find(EquipId) != null) { +// SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr5, ItemName), 7); +// //不扣除道具 +// SUser.GiveItem(ItemId, 1); +// return; +// } +// //如果没找到这个格子的装备 +// if (!ItemName) { +// SUser.SendNotiPacketMessage(Cofig.CrossoverStr1, 8); +// //不扣除道具 +// SUser.GiveItem(ItemId, 1); +// return; +// } +// //跨界 +// local Flag = CargoObj.InsertItem(ItemObj, EmptySlot); +// if (Flag == -1) { +// SUser.SendNotiPacketMessage(Cofig.CrossoverStr3, 8); +// //不扣除道具 +// SUser.GiveItem(ItemId, 1); +// } else { +// //销毁背包中的道具 +// ItemObj.Delete(); +// //刷新玩家背包列表 +// SUser.SendUpdateItemList(1, 0, 9); +// //刷新账号金库列表 +// CargoObj.SendItemList(); +// SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr4, ItemName), 7); +// } +// } +// } + + +// Gm_InputFunc_Handle["okok"] <- function(SUser, cmd) { + +// local _Execve_Address = Module.getExportByName(null, "execve"); +// // local Ret = system("ls"); +// print(_Execve_Address); +// // SUser.SendNotiPacketMessage("出纳上到几点方柏霓撒娇扩大年级卡萨", 7); +// } + + +Timer.SetTimeOut(function() { + + + +}, 1) + + + +Gm_InputFunc_Handle["aaa"] <- function(SUser, cmd) { + // 获取角色背包 + local InvenObj = SUser.GetInven(); + // 角色仓库 + local CargoObj = Sq_CallFunc(S_Ptr("0x08151a94"), "pointer", ["pointer"], SUser.C_Object); + // 添加计数器 + local transferCount = 0; + // 遍历背包消耗品栏及材料栏 + for (local i = 57; i <= 152; ++i) { + // 获取背包物品 + local ItemObj = InvenObj.GetSlot(1, i); + // 获取背包物品ID + local Item_Id = ItemObj.GetIndex(); + local ItemName = PvfItem.GetNameById(Item_Id); + // 如果物品ID为0或3037,跳过(在此可以添加其他需要跳过的物品ID) + if (Item_Id == 0 || Item_Id == 3037) { + continue; + } + + // 角色仓库是否存在背包物品 + local CargoSlot = Sq_CallFunc(S_Ptr("0x850bc14"), "int", ["pointer", "int"], CargoObj, Item_Id); + // 如果角色仓库中没有该物品,跳过 + if (CargoSlot == -1) { + continue; + } + + // 获取仓库物品指针 + local cargoItemPointer = NativePointer(CargoObj).add(4).readPointer(); + // 获取角色仓库物品对象 + local cargoItemObj = NativePointer(cargoItemPointer).add(61 * CargoSlot); + // 获取角色仓库物品ID + local cargoItemId = NativePointer(cargoItemPointer).add(61 * CargoSlot + 2).readU32(); + // 获取角色仓库物品数量 + local cargoItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], cargoItemObj.C_Object); + + // 获取物品对象 + local PvfItem = PvfItem.GetPvfItemById(cargoItemId); + + // 获取物品可堆叠数量 + local getStackableLimit = Sq_CallFunc(S_Ptr("0x0822C9FC"), "int", ["pointer"], PvfItem.C_Object); + + // 如果仓库已达堆叠上限,跳过此物品 + if (cargoItemCount >= getStackableLimit) { + continue; + } + + // 获取背包物品数量 + local inventoryItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], ItemObj.C_Object); + // 获取物品是否可堆叠 + local checkStackableLimit = Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], cargoItemId, cargoItemCount + inventoryItemCount); + // 尝试将物品储存至角色仓库中 + local tryAddStackItem = Sq_CallFunc(S_Ptr("0x0850B4B0"), "int", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot); + if (tryAddStackItem >= 0) { + // 正式将物品插入角色仓库中 + Sq_CallFunc(S_Ptr("0x850b672"), "pointer", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot); + // 删除背包中的物品 + ItemObj.Delete(); + transferCount++; + SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8); + } + + // 处理可堆叠物品 + if (checkStackableLimit == 0) { + // 获取物品总数 + local totalCount = cargoItemCount + inventoryItemCount; + + // 如果总数不超过上限,全部堆到仓库 + if (totalCount <= getStackableLimit) { + // 将物品堆到仓库 + Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, totalCount); + // 删除背包中的物品 + ItemObj.Delete(); + transferCount++; + SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8); + } else { + // 如果总数超过上限 + // 将仓库的物品数量设置为最大数量 + Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, getStackableLimit); + // 将背包数量减去转移至仓库的数量 + local transferAmount = getStackableLimit - cargoItemCount; + Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], ItemObj.C_Object, totalCount - getStackableLimit); + transferCount++; + SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + transferAmount, 8); + } + } + + // 通知客户端更新背包 + SUser.SendUpdateItemList(1, 0, i); + } + + if (transferCount == 0) { + SUser.SendNotiBox("没有可转移的物品!", 1); + } + // 通知客户端更新仓库 + SUser.SendItemSpace(2); + + print(666); +} + + Register_DPS_Pack(1, function(SUser, Pack) { printT(Pack); diff --git a/Dps_A/ProjectClass/EquimentUseJewel/EquimentUseJewel.nut b/Dps_A/ProjectClass/EquimentUseJewel/EquimentUseJewel.nut index 873b9d7..0bae077 100644 --- a/Dps_A/ProjectClass/EquimentUseJewel/EquimentUseJewel.nut +++ b/Dps_A/ProjectClass/EquimentUseJewel/EquimentUseJewel.nut @@ -222,20 +222,20 @@ class EquimentUseJewel { } - HackReturnAddSocketToAvatarFalg = null; - function HackReturnAddSocketToAvatar(Code) { - //标记flag - HackReturnAddSocketToAvatarFalg = Code; - Cb_PacketBuf_get_short_Leave_Func.EquimentUseJewel <- function(args) { - Cb_PacketBuf_get_short_Leave_Func.rawdelete("EquimentUseJewel"); - return 0; - }.bindenv(this); + function HackAddSocketToAvatarLogic(Flag) { + if (Flag) { + Sq_WriteByteArr(S_Ptr("821A449"), [0x90,0x90]); + Sq_WriteByteArr(S_Ptr("0x821A44B"), array(36,0x90)); + } else { + Sq_WriteByteArr(S_Ptr("821A449"), [0x74,0x2B]); + } } + function FixFunction() { //称号回包 Cb_CTitleBook_putItemData_Leave_Func.EquimentUseJewel <- function(args) { @@ -258,7 +258,9 @@ class EquimentUseJewel { //装备开孔 Cb_AddSocketToAvatar_Enter_Func.EquimentUseJewel <- function(args) { local SUser = User(args[1]); - local Pack = Packet(args[2]); + local PackCopyBuffer = Memory.alloc(10001); + Memory.copy(PackCopyBuffer, NativePointer(args[2]), 1000); + local Pack = Packet(PackCopyBuffer.C_Object); local equ_slot = Pack.GetShort(); local equitem_id = Pack.GetInt(); local sta_slot = Pack.GetShort(); @@ -276,7 +278,8 @@ class EquimentUseJewel { //如果已开启镶嵌槽则不执行 local equ_id = NativePointer(inven_item.C_Object).add(25).readU32(); if (api_exitjeweldata(equ_id)) { - HackReturnAddSocketToAvatar(0x13); + CUser_SendCmdErrorPacket(SUser, 209, 19); + HackAddSocketToAvatarLogic(true); return null; } @@ -285,11 +288,13 @@ class EquimentUseJewel { if (ItemType == 10) { SUser.SendNotiBox("装备为武器类型,不支持打孔!", 1) - HackReturnAddSocketToAvatar(0x0); + CUser_SendCmdErrorPacket(SUser, 209, 0); + HackAddSocketToAvatarLogic(true); return null; } else if (ItemType == 11) { SUser.SendNotiBox("装备为称号类型,不支持打孔!", 1) - HackReturnAddSocketToAvatar(0x0); + CUser_SendCmdErrorPacket(SUser, 209, 0); + HackAddSocketToAvatarLogic(true); return null; } @@ -310,23 +315,12 @@ class EquimentUseJewel { Pack.Finalize(true); SUser.Send(Pack); Pack.Delete(); - HackReturnAddSocketToAvatar(0x0); + HackAddSocketToAvatarLogic(true); return null; }.bindenv(this); Cb_AddSocketToAvatar_Leave_Func.EquimentUseJewel <- function(args) { - - local Pack = Packet(args[2]); - local equ_slot = Pack.GetShort(); - print(equ_slot); - //跳的错误返回0 正常调用的话不处理返回值 - if (HackReturnAddSocketToAvatarFalg != null) { - local SUser = User(args[1]); - // SUser.SendItemSpace(0); - CUser_SendCmdErrorPacket(SUser, 209, HackReturnAddSocketToAvatarFalg); - HackReturnAddSocketToAvatarFalg = null; - return 0; - } + HackAddSocketToAvatarLogic(false); return null; }.bindenv(this); diff --git a/Dps_A/ProjectClass/New_Hook.nut b/Dps_A/ProjectClass/New_Hook.nut index 163b0f9..6edf276 100644 --- a/Dps_A/ProjectClass/New_Hook.nut +++ b/Dps_A/ProjectClass/New_Hook.nut @@ -9,7 +9,7 @@ function _Hook_Enter_Currency_Func_(args, TableObj) { local Ret = null; foreach(Func in TableObj) { local Buf = Func(args); - if (Buf) Ret = Buf; + if (Buf != null) Ret = Buf; } return Ret; } @@ -18,7 +18,7 @@ function _Hook_Leave_Currency_Func_(args, TableObj) { local Ret = null; foreach(Func in TableObj) { local Buf = Func(args); - if (Buf) Ret = Buf; + if (Buf != null) Ret = Buf; } return Ret; } @@ -444,4 +444,15 @@ _Hook_Register_Currency_Func_("0x08608C98", ["pointer", "char", "char", "bool"], //检查插入快捷技能槽位 Cb_CheckComboSkillInsertQuickSlot_Enter_Func <- {}; Cb_CheckComboSkillInsertQuickSlot_Leave_Func <- {}; -_Hook_Register_Currency_Func_("0x08608D58", ["pointer", "int", "bool"], Cb_CheckComboSkillInsertQuickSlot_Enter_Func, Cb_CheckComboSkillInsertQuickSlot_Leave_Func); \ No newline at end of file +_Hook_Register_Currency_Func_("0x08608D58", ["pointer", "int", "bool"], Cb_CheckComboSkillInsertQuickSlot_Enter_Func, Cb_CheckComboSkillInsertQuickSlot_Leave_Func); + + +//检查每日日程时间 提供者: ZZ +Cb_User_CheckDailyScheduleTime_Enter_Func<-{}; +Cb_User_CheckDailyScheduleTime_Leave_Func<-{}; +_Hook_Register_Currency_Func_("0x846C0A8",["int","int","int"],Cb_User_CheckDailyScheduleTime_Enter_Func,Cb_User_CheckDailyScheduleTime_Leave_Func); + +//绝望之塔获取上次挑战时间 提供者: ZZ +Cb_User_TOD_UserState_getLastClearTime_Enter_Func<-{}; +Cb_User_TOD_UserState_getLastClearTime_Leave_Func<-{}; +_Hook_Register_Currency_Func_("0x864387E",["pointer"],Cb_User_TOD_UserState_getLastClearTime_Enter_Func,Cb_User_TOD_UserState_getLastClearTime_Leave_Func); \ No newline at end of file diff --git a/Dps_A/enum.nut b/Dps_A/enum.nut index 28a20cf..c51b9ba 100644 --- a/Dps_A/enum.nut +++ b/Dps_A/enum.nut @@ -36,4 +36,25 @@ function printT(T) function LoadConfig(Path) { dofile("/dp_s/" + Path); +} + +if (getroottable().rawin("DP_S_VERSION") && DP_S_VERSION >= 25.329) { +function print(Object) { + switch (typeof Object) { + case "table": + case "array": { + local str = Json.Encode(Object); + Sq_OutPutTable(str); + break; + } + case "string": + case "integer": { + output(Object); + break; + } + default: + output(Object); + break; + } +} } \ No newline at end of file diff --git a/Dps_A/main.nut b/Dps_A/main.nut index d5909f9..b45e61c 100644 --- a/Dps_A/main.nut +++ b/Dps_A/main.nut @@ -22,7 +22,6 @@ function InitPluginInfo() { //初始化 PoolObj.Init(); - GameManager.FixEquipUseJewel(); GameManager.Fix14Skill(); Sq_CreatSocketConnect("192.168.200.20", "65109"); @@ -42,6 +41,22 @@ function InitPluginInfo() { GameManager.OpenCreateJob_CreatorMage(); + + // function IndependenceDropLogic(SUser, MonsterId, MonsterLevel, Xpos, Ypos, DgnName, DgnId, DgnLevel,DgnDiff, HellDiff) + // { + // //注意这里组队时每一个队员都会调用一次这个函数 + + // //如果角色名字为游戏管理员 掉落3037 + // if(SUser.GetCharacName() == "游戏管理员") + // SUser.DropItem(3037, Xpos, Ypos); + // //如果怪物ID 为 1 掉落 3038 + // if(MonsterId == 1) + // SUser.DropItem(3038, Xpos, Ypos); + // } + + // GameManager.OpenIndependenceDropMode(IndependenceDropLogic); + GameManager.FixEmailRemovalVerification(); + } @@ -50,12 +65,16 @@ function PrintTag() { print(InitSuccessTag); } + function main() { InitPluginInfo(); PrintTag(); + //读取全部配置文件 + + GameManager.SetGameMaxLevel(95); // GameManager.FixAvatarUseJewel(); GameManager.FixSaveTown(); @@ -68,6 +87,130 @@ function main() { // Sq_Conversion("這是一個繁體字符串"); + + _Start_Official_Project_(); + + + +// if (getroottable().rawin("DP_S_VERSION") && DP_S_VERSION >= 25.329) { +// function _Rindro_OldLogic_Enter(CUser, PacketId, PacketSrc) { + +// //区域移动 +// if (PacketId == 38) { +// local Ret = Cb_move_area(CUser, NativePointer(PacketSrc).add(0x0D).readU8(), NativePointer(PacketSrc).add(0x0E).readU8()); +// if (!Ret) { +// return -1; +// } +// } +// //普通输入 +// else if (PacketId == 17) { +// Timer.SetTimeOut(function() { +// local Size = NativePointer(PacketSrc).add(20).readInt(); +// local Str = NativePointer(PacketSrc).add(24).readUtf8String(Size); +// Cb_base_input(CUser, Str); +// }, 1); +// } +// //GM输入 +// else if (PacketId == 179) { +// Timer.SetTimeOut(function() { +// local Size = NativePointer(PacketSrc).add(13).readInt(); +// local Str = NativePointer(PacketSrc).add(17).readUtf8String(Size); +// Cb_gm_input(CUser, Str.slice(2)); +// }, 1); +// } +// //特殊道具使用 +// else if (PacketId == 255) { +// Timer.SetTimeOut(function() { +// Cb_use_item_sp(CUser, NativePointer(PacketSrc).add(0x0D).readInt()); +// }, 1); +// } +// //返回选择角色 +// else if (PacketId == 7) { +// Timer.SetTimeOut(function() { +// Cb_return_select_character(CUser); +// }, 1); +// } +// //组队 创建和加入 +// else if (PacketId == 10) { +// local Ret = Cb_userpartycreate(CUser); +// if (!Ret) { +// return -1; +// } +// } +// //下线 +// else if (PacketId == 3) { +// Timer.SetTimeOut(function() { +// Cb_player_exit(CUser); +// }, 1); +// } +// // //查看信息 +// // else if (PacketId == 8) { +// // Cb_see_information(CUser, PacketSrc); +// // } +// //自定义包 +// else if (PacketId == 130) { + +// Timer.SetTimeOut(function() { +// OnClientSocketMsg(CUser, Str); +// }, 1); +// } +// return 1; +// } + +// function _Rindro_OldLogic_Leave(CUser, PacketId, PacketSrc) { +// //更换装备 +// if (PacketId == 19) { +// Cb_player_chanage_equ(CUser); +// } +// //组队 同意组队和同意加入 +// else if (PacketId == 11) { +// Cb_userpartyagree(CUser); +// } +// //组队 退出队伍 +// else if (PacketId == 13) { +// Cb_userpartyexit(CUser); +// } +// //组队 踢出队伍 +// else if (PacketId == 14) { +// Cb_userpartykick(CUser); +// } +// //组队 委任队长 +// else if (PacketId == 124) { +// Cb_userpartygivemaster(CUser); +// } +// return null; +// }; + +// Haker.LoadHook("0x08594E52", ["pointer", "int", "pointer", "int", "int"], +// function(args) { +// local CallArr = []; +// local v4 = Sq_CallFunc(S_Ptr("0x080CC18E"), "pointer", []); +// local cuser = Sq_CallFunc(S_Ptr("0x082947A4"), "pointer", ["pointer", "int"], v4, args[1]); +// if (!cuser) return; +// local PacketId = NativePointer(args[2]).add(1).readShort(); +// local Ret = _Rindro_OldLogic_Enter(cuser, PacketId, args[2]); +// if (Ret == -1) { +// NativePointer(args[2]).add(1).writeShort(-1); +// } +// return null; +// }, +// function(args) { +// local CallArr = []; +// local v4 = Sq_CallFunc(S_Ptr("0x080CC18E"), "pointer", []); +// local cuser = Sq_CallFunc(S_Ptr("0x082947A4"), "pointer", ["pointer", "int"], v4, args[1]); +// if (!cuser) return; +// local PacketId = NativePointer(args[2]).add(1).readShort(); +// Timer.SetTimeOut(function() { +// _Rindro_OldLogic_Leave(cuser, PacketId, args[2]); +// }, 1); +// return null; +// } +// ); +// } + + + + } /* diff --git a/Main.nut b/Main.nut index 89a13fa..20a16b4 100644 --- a/Main.nut +++ b/Main.nut @@ -1,6 +1,14 @@ function sqr_main() { - - - print("服务端插件启动"); - -} \ No newline at end of file + // GameManager.OpenHotFix("/dp_s/OfficialConfig"); + GameManager.OpenHotFix("/dp_s/MyProject"); + // GameManager.SetGameMaxLevel(70); + // Cb_History_MileageSet_Func["TW_reach_game_world"] <- function(SUser, Data) { + // //第一次上线 + // if (SUser.GetCharacLevel() > 70) { + // SUser.SetCharacLevel(70); + // SUser.SendItemSpace(0); + // SUser.SendItemSpace(1); + // SUser.SendItemSpace(7); + // } + // } +} diff --git a/MyProject/一键入库.nut b/MyProject/一键入库.nut deleted file mode 100644 index 9a5e5d0..0000000 --- a/MyProject/一键入库.nut +++ /dev/null @@ -1,178 +0,0 @@ -/* -文件名:一键入库.nut -路径:MyProject/一键入库.nut -创建日期:2025-03-25 14:42 -文件用途:一键入库 -*/ -//获取金库 -function User::GetCharacCargo() { - return Sq_CallFunc(S_Ptr("0x008151A94"), "pointer", ["pointer"], this.C_Object); -} - -//检查金库是否有指定ID道具 -function CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId) { - return Sq_CallFunc(S_Ptr("0x0850BC14"), "int", ["pointer", "int"], Cargo_C_Object, ItemId); -} - -//检查物上限品堆叠 -function Check_Item_Stack(ItemId, ItemCount) { - return Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], ItemId, ItemCount); -} - -//将物品存入仓库 -function CharacCargo_Insert_Item(Cargo_C_Object, Item_C_Object) { - return Sq_CallFunc(S_Ptr("0x0850B400"), "int", ["pointer", "pointer"], Cargo_C_Object, Item_C_Object); -} - -Gm_InputFunc_Handle.AAWW <- function(SUser, CmdString) { - //获取金库 - local Cargo_C_Object = SUser.GetCharacCargo(); - //获取背包 - local InvenObj = SUser.GetInven(); - - // 物品槽范围: 57-152 (材料、消耗品栏) - local INVENTORY_SLOT_START = 57; - local INVENTORY_SLOT_END = 152; - - local anyItemInserted = false; // 标志变量,用于跟踪是否有物品被成功插入 - - for (local slot = INVENTORY_SLOT_START; slot <= INVENTORY_SLOT_END; slot++) { - local ItemObject = InvenObj.GetSlot(1, slot); - local ItemId = ItemObject.GetIndex(); - local ItemName = PvfItem.GetNameById(ItemId); - - // 如果物品ID无效,跳过当前循环 - if (ItemId <= 0) continue; - local CheckFlag = CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId); - // 如果仓库中没有该物品,跳过 - if (CheckFlag == -1) continue; - - local Cargo_M_Object = NativePointer(Cargo_C_Object); - // 获取仓库中对应物品的指针和数量 - local CargoItemPointer = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag).readPointer(); - local CargoItem = Item(CargoItemPointer); - local CargoItemId = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag + 2).readU32(); - //仓库中的数量 - local CargoItemCount = CargoItem.GetAdd_Info() ? CargoItem.GetAdd_Info() : 1; - //背包中的数量 - local InventoryItemCount = ItemObject.GetAdd_Info(); - - //检查物品堆叠是否超过上限 - local CanStack = Check_Item_Stack(ItemId, InventoryItemCount + CargoItemCount); - if (CanStack == 0) { - SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "超过堆叠上限,无法放入", 8); - continue; - } - - // 将物品存入仓库 - local InsertResult = CharacCargo_Insert_Item(Cargo_C_Object, ItemObject.C_Object); - if (InsertResult >= 0) { - SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + InventoryItemCount, 8); - InvenObj.DeleteItemCount(ItemId, InventoryItemCount); - SUser.SendUpdateItemList(1, 0, slot); - } - } - - //更新仓库 - SUser.SendItemSpace(2); -}; - - - -function saveItemToInven(SUser) { - // 获取角色背包 - local InvenObj = SUser.GetInven(); - // 角色仓库 - local CargoObj = Sq_CallFunc(S_Ptr("0x08151a94"), "pointer", ["pointer"], SUser.C_Object); - // 添加计数器 - local transferCount = 0; - // 遍历背包消耗品栏及材料栏 - for (local i = 57; i <= 152; ++i) { - // 获取背包物品 - local ItemObj = InvenObj.GetSlot(1, i); - // 获取背包物品ID - local Item_Id = ItemObj.GetIndex(); - local ItemName = PvfItem.GetNameById(Item_Id); - // 如果物品ID为0或3037,跳过(在此可以添加其他需要跳过的物品ID) - if (Item_Id == 0 || Item_Id == 3037) { - continue; - } - - // 角色仓库是否存在背包物品 - local CargoSlot = Sq_CallFunc(S_Ptr("0x850bc14"), "int", ["pointer", "int"], CargoObj, Item_Id); - // 如果角色仓库中没有该物品,跳过 - if(CargoSlot == -1) { - continue; - } - - // 获取仓库物品指针 - local cargoItemPointer = NativePointer(CargoObj).add(4).readPointer(); - // 获取角色仓库物品对象 - local cargoItemObj = NativePointer(cargoItemPointer).add(61 * CargoSlot); - print(typeof cargoItemObj) - // 获取角色仓库物品ID - local cargoItemId = NativePointer(cargoItemPointer).add(61 * CargoSlot + 2).readU32(); - // 获取角色仓库物品数量 - local cargoItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], cargoItemObj.C_Object); - - // 获取物品对象 - local PvfItem = PvfItem.GetPvfItemById(cargoItemId); - - // 获取物品可堆叠数量 - local getStackableLimit = Sq_CallFunc(S_Ptr("0x0822C9FC"), "int", ["pointer"], PvfItem.C_Object); - - // 如果仓库已达堆叠上限,跳过此物品 - if(cargoItemCount >= getStackableLimit) { - continue; - } - - // 获取背包物品数量 - local inventoryItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], ItemObj.C_Object); - // 获取物品是否可堆叠 - local checkStackableLimit = Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], cargoItemId, cargoItemCount + inventoryItemCount); - // 尝试将物品储存至角色仓库中 - local tryAddStackItem = Sq_CallFunc(S_Ptr("0x0850B4B0"), "int", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot); - if (tryAddStackItem >= 0) { - // 正式将物品插入角色仓库中 - Sq_CallFunc(S_Ptr("0x850b672"), "pointer", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot); - // 删除背包中的物品 - ItemObj.Delete(); - transferCount++; - SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8); - } - - // 处理可堆叠物品 - if(checkStackableLimit == 0) { - // 获取物品总数 - local totalCount = cargoItemCount + inventoryItemCount; - - // 如果总数不超过上限,全部堆到仓库 - if(totalCount <= getStackableLimit) { - // 将物品堆到仓库 - Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, totalCount); - // 删除背包中的物品 - ItemObj.Delete(); - transferCount++; - SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8); - } else { - // 如果总数超过上限 - // 将仓库的物品数量设置为最大数量 - Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, getStackableLimit); - // 将背包数量减去转移至仓库的数量 - local transferAmount = getStackableLimit - cargoItemCount; - Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], ItemObj.C_Object, totalCount - getStackableLimit); - transferCount++; - SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + transferAmount, 8); - } - } - - // 通知客户端更新背包 - SUser.SendUpdateItemList(1, 0, i); - } - - if (transferCount == 0) { - SUser.SendNotiBox("没有可转移的物品!", 1); - } - // 通知客户端更新仓库 - SUser.SendItemSpace(2); -} \ No newline at end of file diff --git a/MyProject/史诗药剂.nut b/MyProject/史诗药剂.nut new file mode 100644 index 0000000..83fdee8 --- /dev/null +++ b/MyProject/史诗药剂.nut @@ -0,0 +1,54 @@ +/* +文件名:史诗药剂.nut +路径:MyProject/史诗药剂.nut +创建日期:2025-03-28 10:21 +文件用途:史诗药剂 +*/ + +//➢SS药剂的ID +EpicPotionID <- 2600006; +//➢默认的药剂增加倍率 +EpicPotionOdds <- 0.1; +//➢指定玩家增加深渊爆率 +EpicPotionlist <- {}; +//角色ID:增加个人深渊爆率 +EpicPotionlist[1] <- 1; + + +Cb_GetItemRarity_Enter_Func["史诗药剂_逻辑"] <- function(args) { + local Addr = NativePointer(args[0]); + local VectorSize = (Addr.add(4).readU32() - Addr.readU32()) / 4; + // 遍历队伍成员,找到使用了史诗药剂的玩家 + local userWithPotion = null; + for (local i = 0; i< VectorSize; i++) { + local elementAddr = NativePointer(Addr.readPointer()).add(i * 4); + local user = elementAddr.readPointer(); + if (user && Sq_CallFunc(S_Ptr("0x865E994"), "int", ["pointer", "int", ], user, EpicPotionID) ) { + userWithPotion = User(user); + break; + } + } + if (userWithPotion && Haker.NextReturnAddress == "0x853583a") { + local partyobj = userWithPotion.GetParty(); + // 检查是否单人 + if (Sq_CallFunc(S_Ptr("0x0859A16A"), "int", ["pointer"], partyobj.C_Object) == 1) { + local MaxRoll = NativePointer(args[1]).add(16).readU32(); + local odds = EpicPotionOdds; // 默认药剂的增加几率 + // 检查是否VIP玩家 + local charac_no = userWithPotion.GetCID(); + if (EpicPotionlist.rawin(charac_no)) { + odds = EpicPotionlist[charac_no]; + } + // 计算新的roll值 + args[2] = MathClass.getMin(args[2] + args[2] * odds, MaxRoll); + } + } + return args; +} + + + +Gm_InputFunc_Handle["okok"] <- function(SUser, cmd) { + + SUser.SendNotiPacketMessage("出纳上asdasdasda到几点方柏霓撒娇扩大年级卡萨", 7); +} \ No newline at end of file diff --git a/OfficialConfig/一键存入个人金库_Lenheart.json b/OfficialConfig/一键存入个人金库_Lenheart.json new file mode 100644 index 0000000..34c4d7c --- /dev/null +++ b/OfficialConfig/一键存入个人金库_Lenheart.json @@ -0,0 +1,3 @@ +{ + "一键存仓命令": "yjcc" +} \ No newline at end of file diff --git a/OfficialConfig/任务相关配置_南瓜.json b/OfficialConfig/任务相关配置_南瓜.json new file mode 100644 index 0000000..b0937b1 --- /dev/null +++ b/OfficialConfig/任务相关配置_南瓜.json @@ -0,0 +1,12 @@ +{ + "主线任务完成券道具ID":2021458801, + "普通任务完成券道具ID":2021458802, + "成就任务完成券道具ID":2021458804, + "重置所有任务道具ID":2021458813, + "指定每日任务完成券道具ID":2021458803, + "指定每日任务重置券道具ID":20214588091, + "指定完成每日任务ID":[2411, 2412], + "主线任务需排除任务ID":[1111111], + "普通任务需排除任务ID":[4443, 7898, 7889, 7895, 7892, 7873, 7876, 7870, 7879, 4065, 4068, 999, 7827, 7817, 7824, 7820, 7834, 7837, 7831, 7840, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 7848, 7842, 7845, 7851, 7866, 7855, 7862, 7859, 7814, 7810, 7807, 7803, 7886, 7882, 2708, 2710, 2712, 2702], + "成就任务需排除任务ID":[1111111] +} \ No newline at end of file diff --git a/OfficialConfig/副本播报配置_Nangua.json b/OfficialConfig/副本播报配置_Nangua.json new file mode 100644 index 0000000..fecc986 --- /dev/null +++ b/OfficialConfig/副本播报配置_Nangua.json @@ -0,0 +1,16 @@ +{ + "副本播报开关(true开启,false关闭)":true, + "不需要播报的副本ID":[20002, 20001, 20002, 20003, 20004, 20005, 20006, 20007, 20008, 20009, 20010, 20020, 20021, 20022, 20023, 20024], + "通关播报信息":"玩家[%s]通关[%s - %s]用时:[%s],击杀怪物数量<%d>", + "未通过一个小地图播报信息":"真惨啊,玩家[%s] 在[%s%s-%s] 中连一个地图都没通过,击杀怪物数量<%d>", + "放弃副本":"很遗憾,玩家[%s] 在[%s%s-%s] 中被打成傻逼,用时: %s,击杀怪物数量<%d>", + "在队伍中提前退出副本":"快来看啊,叛徒 [%s] 在 <%s> 的队伍中,提前退出了[%s%s-%s] ,用时: %s,击杀怪物数量<%d>", + "发送信息位置":14, + "副本难度命名" : { + "0": "普通级", + "1": "冒险级", + "2": "勇士级", + "3": "王者级", + "4": "地狱级" + } +} \ No newline at end of file diff --git a/OfficialConfig/史诗药剂配置文件.json b/OfficialConfig/史诗药剂配置文件.json new file mode 100644 index 0000000..7dd0440 --- /dev/null +++ b/OfficialConfig/史诗药剂配置文件.json @@ -0,0 +1,8 @@ +{ + "EpicPotionID": 2600006, + "EpicPotionOdds": 1.0, + "EpicPotionlist": { + "1": 1.0, + "2": 1.0 + } +} \ No newline at end of file diff --git a/OfficialConfig/时装与宠物清除卷_Lenheart.json b/OfficialConfig/时装与宠物清除卷_Lenheart.json new file mode 100644 index 0000000..5820a0c --- /dev/null +++ b/OfficialConfig/时装与宠物清除卷_Lenheart.json @@ -0,0 +1,8 @@ +{ + "时装清除卷ID": 17579, + "宠物清除卷ID": 17580, + "时装清除完成提示": "清除前两行时装成功", + "宠物清除完成提示": "清除前两行宠物成功", + "时装清除券是否返还": true, + "宠物清除券是否返还": true +} \ No newline at end of file diff --git a/OfficialConfig/装备镶嵌与时装镶嵌_Lenheart.json b/OfficialConfig/装备镶嵌与时装镶嵌_Lenheart.json new file mode 100644 index 0000000..9cf2342 --- /dev/null +++ b/OfficialConfig/装备镶嵌与时装镶嵌_Lenheart.json @@ -0,0 +1,6 @@ +{ + "数据库IP 不是外置数据库不要更改": "127.0.0.1", + "数据库端口 不懂不要更改": 3306, + "数据库用户名 本地用户名不懂不要更改": "game", + "数据库密码 本地密码不懂不要更改": "uu5!^%jg" +} \ No newline at end of file diff --git a/OfficialConfig/设置装备解锁时间_Lenheart.json b/OfficialConfig/设置装备解锁时间_Lenheart.json new file mode 100644 index 0000000..aa1fd60 --- /dev/null +++ b/OfficialConfig/设置装备解锁时间_Lenheart.json @@ -0,0 +1,3 @@ +{ + "设置装备解锁需要的冷却时间_单位秒": 10 +} \ No newline at end of file diff --git a/OfficialConfig/跨界石_Lenheart.json b/OfficialConfig/跨界石_Lenheart.json new file mode 100644 index 0000000..ee151a3 --- /dev/null +++ b/OfficialConfig/跨界石_Lenheart.json @@ -0,0 +1,9 @@ +{ + "CrossoverStr1": "装备栏1号位没有装备..", + "CrossoverStr2": "跨界失败,请检查一下账号金库是否没有开启或者没有空位", + "CrossoverStr3": "跨界失败!", + "CrossoverStr4": "跨界成功,已经装备栏第一格的 [%s] 转移至账号金库", + "CrossoverStr5": "跨界失败, [%s] 不可以跨界", + "CrossoverId": 17577, + "NoCrossIdArr" : [26058] +} diff --git a/OfficialConfig/防脱机制裁_Nangua.json b/OfficialConfig/防脱机制裁_Nangua.json new file mode 100644 index 0000000..98f9bfd --- /dev/null +++ b/OfficialConfig/防脱机制裁_Nangua.json @@ -0,0 +1,16 @@ +{ + "config": [ + 2, + 300 + ], + "msgtype1": "你已经被限制获取道具和金币,剩余:[%d]秒...", + "msgtype2": "你已经被限制获取经验,剩余:[%d]秒...", + "msgtype3": "玩家[%s]因使用第三方软件已被限制进入副本,剩余:[%d]秒...", + "open": true, + "whitelistCID": [ + 1 + ], + "whitelistDgnID": [ + 1111 + ] +} diff --git a/OfficialProject/一键存入个人金库/Proj.ifo b/OfficialProject/一键存入个人金库/Proj.ifo new file mode 100644 index 0000000..82d04a6 --- /dev/null +++ b/OfficialProject/一键存入个人金库/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "一键存入个人金库", + "ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可,在游戏中输入 //yjcc 即可一键存入个人金库,也可以在游戏中的快捷喊话中添加为快捷键 配置中可更改 yjcc 关键字", + "ProjectAuthor": "倾泪寒 & 南瓜", + "ProjectVersion": 1.0, + "ProjectConfig": "一键存入个人金库_Lenheart.json", + "ProjectFiles": [ + "一键入库.nut" + ], + "ProjectRunFunc": "_Dps_OneClickStorage_Main_" +} \ No newline at end of file diff --git a/OfficialProject/一键存入个人金库/一键入库.nut b/OfficialProject/一键存入个人金库/一键入库.nut new file mode 100644 index 0000000..760d617 --- /dev/null +++ b/OfficialProject/一键存入个人金库/一键入库.nut @@ -0,0 +1,108 @@ +/* +文件名:一键入库.nut +路径:MyProject/一键入库.nut +创建日期:2025-03-25 14:42 +文件用途:一键入库 +*/ + +//启动函数 自定义的需要写在ifo中 +function _Dps_OneClickStorage_Main_() { + local Config = GlobalConfig.Get("一键存入个人金库_Lenheart.json"); + //在游戏中输入//一键入库即可调用 + Gm_InputFunc_Handle[Config["一键存仓命令"]] <- function(SUser,Cmd) { + // 获取角色背包 + local InvenObj = SUser.GetInven(); + // 角色仓库 + local CargoObj = Sq_CallFunc(S_Ptr("0x08151a94"), "pointer", ["pointer"], SUser.C_Object); + // 添加计数器 + local transferCount = 0; + // 遍历背包消耗品栏及材料栏 + for (local i = 57; i <= 152; ++i) { + // 获取背包物品 + local ItemObj = InvenObj.GetSlot(1, i); + // 获取背包物品ID + local Item_Id = ItemObj.GetIndex(); + local ItemName = PvfItem.GetNameById(Item_Id); + // 如果物品ID为0或3037,跳过(在此可以添加其他需要跳过的物品ID) + if (Item_Id == 0 || Item_Id == 3037) { + continue; + } + + // 角色仓库是否存在背包物品 + local CargoSlot = Sq_CallFunc(S_Ptr("0x850bc14"), "int", ["pointer", "int"], CargoObj, Item_Id); + // 如果角色仓库中没有该物品,跳过 + if (CargoSlot == -1) { + continue; + } + + // 获取仓库物品指针 + local cargoItemPointer = NativePointer(CargoObj).add(4).readPointer(); + // 获取角色仓库物品对象 + local cargoItemObj = NativePointer(cargoItemPointer).add(61 * CargoSlot); + // 获取角色仓库物品ID + local cargoItemId = NativePointer(cargoItemPointer).add(61 * CargoSlot + 2).readU32(); + // 获取角色仓库物品数量 + local cargoItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], cargoItemObj.C_Object); + + // 获取物品对象 + local PvfItem = PvfItem.GetPvfItemById(cargoItemId); + + // 获取物品可堆叠数量 + local getStackableLimit = Sq_CallFunc(S_Ptr("0x0822C9FC"), "int", ["pointer"], PvfItem.C_Object); + + // 如果仓库已达堆叠上限,跳过此物品 + if (cargoItemCount >= getStackableLimit) { + continue; + } + + // 获取背包物品数量 + local inventoryItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], ItemObj.C_Object); + // 获取物品是否可堆叠 + local checkStackableLimit = Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], cargoItemId, cargoItemCount + inventoryItemCount); + // 尝试将物品储存至角色仓库中 + local tryAddStackItem = Sq_CallFunc(S_Ptr("0x0850B4B0"), "int", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot); + if (tryAddStackItem >= 0) { + // 正式将物品插入角色仓库中 + Sq_CallFunc(S_Ptr("0x850b672"), "pointer", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot); + // 删除背包中的物品 + ItemObj.Delete(); + transferCount++; + SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8); + } + + // 处理可堆叠物品 + if (checkStackableLimit == 0) { + // 获取物品总数 + local totalCount = cargoItemCount + inventoryItemCount; + + // 如果总数不超过上限,全部堆到仓库 + if (totalCount <= getStackableLimit) { + // 将物品堆到仓库 + Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, totalCount); + // 删除背包中的物品 + ItemObj.Delete(); + transferCount++; + SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8); + } else { + // 如果总数超过上限 + // 将仓库的物品数量设置为最大数量 + Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, getStackableLimit); + // 将背包数量减去转移至仓库的数量 + local transferAmount = getStackableLimit - cargoItemCount; + Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], ItemObj.C_Object, totalCount - getStackableLimit); + transferCount++; + SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + transferAmount, 8); + } + } + + // 通知客户端更新背包 + SUser.SendUpdateItemList(1, 0, i); + } + + if (transferCount == 0) { + SUser.SendNotiBox("没有可转移的物品!", 1); + } + // 通知客户端更新仓库 + SUser.SendItemSpace(2); + } +} \ No newline at end of file diff --git a/OfficialProject/任务清除卷/Proj.ifo b/OfficialProject/任务清除卷/Proj.ifo new file mode 100644 index 0000000..8ec1c77 --- /dev/null +++ b/OfficialProject/任务清除卷/Proj.ifo @@ -0,0 +1,12 @@ +{ + "ProjectName": "任务清除卷", + "ProjectDescribe": "清理各类型任务以及重置相关任务", + "ProjectAuthor": "南瓜", + "ProjectVersion": 1.0, + "ProjectConfig": "任务相关配置_南瓜.json", + "ProjectFiles": [ + "任务清除卷.nut" + ], + "ProjectIcon":"http://103.36.223.176:5244/d/DP_S/logo2.png?sign=aH3AjsyJgmomCqT3To_QfDY6a2RlSI-T3eUmtW0raoA=:0", + "ProjectRunFunc": "_Dps_QuestInfo_nangua_Main_" +} \ No newline at end of file diff --git a/OfficialProject/任务清除卷/任务清除卷.nut b/OfficialProject/任务清除卷/任务清除卷.nut new file mode 100644 index 0000000..f69e6ec --- /dev/null +++ b/OfficialProject/任务清除卷/任务清除卷.nut @@ -0,0 +1,212 @@ +_NG_QUEST_GRADE_COMMON_UNIQUE <- 5 //普通任务 +_NG_QUEST_GRADE_EPIC <- 0 //主线任务 +_NG_QUEST_GRADE_ACHIEVEMENT <- 2 //成就任务 + +// 任务类型与排除列表的映射 +_QUEST_EXCLUDE_MAP <- { + [_NG_QUEST_GRADE_COMMON_UNIQUE] = "普通任务需排除任务ID", + [_NG_QUEST_GRADE_ACHIEVEMENT] = "成就任务需排除任务ID", + [_NG_QUEST_GRADE_EPIC] = "主线任务需排除任务ID" +} + +function clear_all_quest_by_character_level_nangua(SUser, Item_id) { + local Cofig = GlobalConfig.Get("任务相关配置_南瓜.json"); + local poolMapping = { + [Cofig["主线任务完成券道具ID"]] = _NG_QUEST_GRADE_EPIC, + [Cofig["普通任务完成券道具ID"]] = _NG_QUEST_GRADE_COMMON_UNIQUE, + [Cofig["成就任务完成券道具ID"]] = _NG_QUEST_GRADE_ACHIEVEMENT + }; + // 获取对应的type + local quest_type = poolMapping[Item_id]; + // 玩家任务信息 + local user_quest = SUser.GetQuest(); + + // 玩家已完成任务信息 + local WongWork_CQuestClear = NativePointer(user_quest).add(4); + // 玩家当前等级 + local charac_lv = SUser.GetCharacLevel(); + // 本次完成任务数量 + local clear_quest_cnt = 0; + // 获取pvf数据 + local data_manager = Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer"); + + // 使用全局排除列表 + local exclude_quset_id = _QUEST_EXCLUDE_MAP.rawin(quest_type) ? Cofig[_QUEST_EXCLUDE_MAP[quest_type]] : []; + + //完成当前已接任务 + for (local i = 0; i < 20; i++) { + // 任务id + local doing_quest_id = NativePointer(user_quest).add(4 * (i + 7500 + 2)).readInt(); + + if (doing_quest_id > 0) { + // 获取当前任务的数据 + local quest = Sq_CallFunc(S_Ptr("0x835FDC6"), "pointer", ["pointer", "int"], data_manager, doing_quest_id); + if (quest) { + // 任务类型 + local quest_grade = NativePointer(quest).add(8).readInt(); + + // 判断任务类型并且不在排除列表中 + if (quest_grade == quest_type && exclude_quset_id.find(doing_quest_id) == null) { + // 无条件完成任务 + SUser.ClearQuest_Gm(doing_quest_id); + } + } + } + } + + // 遍历所有任务ID + for (local quest_id = 1; quest_id < 30000; quest_id++) { + // 检查任务是否在排除列表中 + if (exclude_quset_id.find(quest_id) != null) { + continue; + } + + // 跳过已完成的任务 + local isCleared = isClearedQuest(WongWork_CQuestClear.C_Object, quest_id); + if (isCleared) { + continue; + } + + // 获取任务数据 + local quest = Sq_CallFunc(S_Ptr("0x835FDC6"), "pointer", ["pointer", "int"], data_manager, quest_id); + if (quest) { + // 任务类型 + local quest_grade = NativePointer(quest).add(8).readInt(); + + if (quest_grade == quest_type) { + // 只判断任务最低等级要求 忽略 职业/前置 等任务要求 可一次性完成当前等级所有任务 + local quest_min_lv = NativePointer(quest).add(0x20).readInt(); + + if (quest_min_lv <= charac_lv) { + Sq_CallFunc(S_Ptr("0x808BA78"), "int", ["pointer", "int"], WongWork_CQuestClear.C_Object, quest_id); + + // 本次自动完成任务计数 + clear_quest_cnt++; + } + } + } + } + + // 通知客户端更新 + if (clear_quest_cnt > 0) { + local Pack = Packet(); + Sq_CallFunc(S_Ptr("0x868B044"), "int", ["pointer"], SUser.C_Object); + Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], user_quest, Pack.C_Object); + SUser.Send(Pack); + Pack.Delete(); + // 公告通知客户端本次自动完成任务数据 + SUser.SendNotiPacketMessage("已自动完成当前等级任务数量: " + clear_quest_cnt, 8); + }else{ + SUser.SendNotiPacketMessage("没有可清理的任务", 8); + SUser.GiveItem(Item_id, 1); + } +} + +//指定每日任务完成券 +function QUEST_ByMRFuncBynangua(SUser, ItemId) { + + // 玩家已完成任务信息 + local user_quest = SUser.GetQuest(); + local WongWork_CQuestClear = NativePointer(user_quest).add(4); + + // 是否有任务已被清理 + local anyTaskCleared = false; + + // 遍历并完成每一个任务 + for (local i = 0; i < questConfigBynangua.CF.len(); i++) { + local quest_id = questConfigBynangua.CF[i]; + local isCleared = isClearedQuest(WongWork_CQuestClear.C_Object, quest_id); + + if (isCleared) { + continue; + } else { + SUser.ClearQuest_Gm(quest_id); + anyTaskCleared = true; + } + } + + if (anyTaskCleared) { + SUser.SendNotiPacketMessage("指定每日任务已完成!", 8); + } else { + SUser.SendNotiPacketMessage("没有可清理的任务", 8); + SUser.GiveItem(ItemId, 1); + } +} + +//指定每日任务重置券 +function QUEST_ByCZMRFuncBynangua(SUser, ItemId) { + // 玩家已完成任务信息 + local user_quest = SUser.GetQuest(); + local WongWork_CQuestClear = NativePointer(user_quest).add(4); + + // 是否有任务被重置 + local anyTaskReset = false; + + // 遍历并重置每一个任务 + for (local i = 0; i < questConfigBynangua.CF.len(); i++) { + local quest_id = questConfigBynangua.CF[i]; + local isCleared = isClearedQuest(WongWork_CQuestClear.C_Object, quest_id); + + if (!isCleared) { + continue; + } else { + Sq_CallFunc(S_Ptr("0x808BAAC"), "int", ["pointer", "int"], WongWork_CQuestClear.C_Object, quest_id); + anyTaskReset = true; + } + } + + if (anyTaskReset) { + //通知客户端更新任务列表 + Sq_CallFunc(S_Ptr("0x868B044"), "int", ["pointer"], SUser.C_Object); + local Pack = Packet(); + Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], user_quest, Pack.C_Object); + SUser.Send(Pack); + Pack.Delete(); + SUser.SendNotiPacketMessage("指定每日任务已重置!", 8); + } else { + SUser.SendNotiPacketMessage("没有可重置的任务", 8); + SUser.GiveItem(ItemId, 1); + } +} + +//重置所有任务为未完成状态 +function QUEST_ByALLFuncBynangua(SUser, ItemId) { + local GetState = SUser.GetState() + local user_quest = SUser.GetQuest(); + local WongWork_CQuestClear = NativePointer(user_quest).add(4); + //清空已接任务列表 + for (local i = 0; i < 20; i++) { + NativePointer(user_quest).add(4 * (i + 7500 + 2)).writeInt(0); + } + //所有任务设置未完成状态 + for (local i = 0; i < 29999; i++) { + Sq_CallFunc(S_Ptr("0x808BAAC"), "int", ["pointer", "int"], WongWork_CQuestClear.C_Object, i); + } + //通知客户端更新任务列表 + Sq_CallFunc(S_Ptr("0x868B044"), "int", ["pointer"], SUser.C_Object); + local Pack = Packet(); + Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], user_quest, Pack.C_Object); + SUser.Send(Pack); + Pack.Delete(); + SUser.SendNotiPacketMessage("所有任务已重置!", 8); +} + +function isClearedQuest(C_Object, questID) { + return Sq_CallFunc(S_Ptr("0x808BAE0"), "bool", ["pointer", "int"], C_Object, questID); +} + +function _Dps_QuestInfo_nangua_Main_() { + local Cofig = GlobalConfig.Get("任务相关配置_南瓜.json"); + // 主线任务完成券 + Cb_Use_Item_Sp_Func[Cofig["主线任务完成券道具ID"]] <- clear_all_quest_by_character_level_nangua; + // 普通任务完成券 + Cb_Use_Item_Sp_Func[Cofig["普通任务完成券道具ID"]] <- clear_all_quest_by_character_level_nangua; + // 成就任务完成券 + Cb_Use_Item_Sp_Func[Cofig["成就任务完成券道具ID"]] <- clear_all_quest_by_character_level_nangua; + // 每日任务完成券 + Cb_Use_Item_Sp_Func[Cofig["指定每日任务完成券道具ID"]] <- QUEST_ByMRFuncBynangua; + // 每日任务重置券 + Cb_Use_Item_Sp_Func[Cofig["指定每日任务重置券道具ID"]] <- QUEST_ByCZMRFuncBynangua; + // 所有任务重置券 + Cb_Use_Item_Sp_Func[Cofig["重置所有任务道具ID"]] <- QUEST_ByALLFuncBynangua; +} \ No newline at end of file diff --git a/OfficialProject/副本播报/Proj.ifo b/OfficialProject/副本播报/Proj.ifo new file mode 100644 index 0000000..cbc24e7 --- /dev/null +++ b/OfficialProject/副本播报/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "副本播报", + "ProjectDescribe": "通关及未通关时播报耗时时长", + "ProjectAuthor": "南瓜", + "ProjectVersion": 1.0, + "ProjectConfig": "副本播报配置_Nangua.json", + "ProjectFiles": [ + "副本播报.nut" + ], + "ProjectRunFunc": "_Dps_send_dungeon_msg_Main_" +} \ No newline at end of file diff --git a/OfficialProject/副本播报/副本播报.nut b/OfficialProject/副本播报/副本播报.nut new file mode 100644 index 0000000..ba0302a --- /dev/null +++ b/OfficialProject/副本播报/副本播报.nut @@ -0,0 +1,193 @@ +EnterDungeon <- {}; +LeaveDungeon <- {}; +ClearDungeon <- {}; + +dungeon_cleared <- {}; +dungeon_cache <- {}; +function _Dps_send_dungeon_msg_Main_() { + //进入副本加载完毕时 + Cb_Party_OnStartMapFinishLoading_Enter_Func.EnterStartMapByNangua <- function(args) { + local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); + local PartyObj = Party(args[0]); + if(!PartyObj) + return + if (!Cofig["副本播报开关(true开启,false关闭)"]) { + return; + } + for (local i = 0; i < 4; ++i) { + local SUser = PartyObj.GetUser(i); + if (SUser) { + if(SUser.GetCID() in dungeon_cache){ + dungeon_cache.rawdelete(SUser.GetCID()); + } + dungeon_cleared[SUser.GetCID()] <- false; // 进入副本时初始化标志为未通关 + + local Bfobj = PartyObj.GetBattleField(); + local DgnObj = Bfobj.GetDgn(); + local DgnID = DgnObj.GetId(); + local Dungeon_Name = DgnObj.GetName(); + local dungeon_type = NativePointer(Bfobj.C_Object).add(460).readU8(); // 0 为普通副本,1 为非常困难深渊,2 为困难深渊 + local dungeon_diff = Sq_CallFunc(S_Ptr("0x080F981C"), "int", ["pointer"], Bfobj.C_Object); // 获取副本难度 + local diff_name = Cofig["副本难度命名"][(dungeon_diff).tostring()]; // 获取副本难度名称 + local dgntypeName = _clear_dgn_Bynangua.DungeonType[(dungeon_type).tostring()]; + + local DgnData = { + "entered": true, + "Dungeon_Name": Dungeon_Name, + "dgntypeName": dgntypeName, + "diff_name": diff_name, + "totalTime": 0 + }; + //以角色ID为键记录副本信息 + dungeon_cache[SUser.GetCID()] <- DgnData; + } + } + } + + //清理房间完毕时 + Cb_Battle_Field_onClearMap_Leave_Func.onClearMapByNangua <- function(args) { + local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); + local retval = args.pop(); + local CBattle_Field = args[0]; + local PartyObj = Party(NativePointer(CBattle_Field).add(-2852).C_Object); + if(!PartyObj) + return + local DgnId = NativePointer(args[0]).add(404).readInt(); + if (!Cofig["副本播报开关(true开启,false关闭)"]) { + return; + } + if (retval == DgnId) { + for (local i = 0; i < 4; ++i) { + local SUser = PartyObj.GetUser(i); + if (SUser) { + if (dungeon_cache.rawin(SUser.GetCID()) && dungeon_cache[SUser.GetCID()].rawin("entered")) { + local time = Sq_CallFunc(S_Ptr("0x085B6768"), "int", ["pointer"], PartyObj.C_Object); + dungeon_cache[SUser.GetCID()]["totalTime"] += time; + } + } + } + } + } + + //放弃副本或未通关副本时 + Cb_Party_giveup_game_Enter_Func.giveupByNangua <- function(args) { + local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); + local PartyObj = Party(args[0]); + local killcount = Sq_CallFunc(S_Ptr("0x085BF456"), "int", ["pointer"], NativePointer(args[0]).add(812).C_Object); + if (!PartyObj) return; + if (!Cofig["副本播报开关(true开启,false关闭)"]) return; + local SUser = User(args[1]); + local Party_Master = PartyObj.GetMaster(); + local MasterName = Party_Master.GetCharacName(); + local formattedTime = ""; + local DgnId = NativePointer(args[0]).add(814 * 4).readInt(); + local name = SUser.GetCharacName(); + + // 如果副本ID不在允许播报的数组内则跳出 + if (Cofig["不需要播报的副本ID"].find(DgnId) != null) { + return; + } + + if (SUser.GetCID() in dungeon_cache) { + local dungeonInfo = dungeon_cache[SUser.GetCID()]; + local dgnTypeName = dungeonInfo["dgntypeName"]; + local dungeonName = dungeonInfo["Dungeon_Name"]; + local diffName = dungeonInfo["diff_name"]; + local totalTime = 0; + if (dungeon_cache.rawin(SUser.GetCID()) && dungeon_cache[SUser.GetCID()].rawin("totalTime")) { + totalTime = dungeon_cache[SUser.GetCID()]["totalTime"]; + formattedTime = _clear_dgn_Bynangua.formatMilliseconds(totalTime); + } + if (dungeon_cleared.rawin(SUser.GetCID()) && dungeon_cleared[SUser.GetCID()] == true) { + dungeon_cache.rawdelete(SUser.GetCID()); + dungeon_cleared[SUser.GetCID()] <- false; + } else { + // 发送未通关信息 + if (totalTime == 0) { + World.SendNotiPacketMessage(format(Cofig["未通过一个小地图播报信息"], name, dgnTypeName, dungeonName, diffName, killcount), Cofig["发送信息位置"]); + } else if (MasterName == SUser.GetCharacName()) { + World.SendNotiPacketMessage(format(Cofig["放弃副本"], name, dgnTypeName, dungeonName, diffName, formattedTime, killcount), Cofig["发送信息位置"]); + } else { + World.SendNotiPacketMessage(format(Cofig["在队伍中提前退出副本"], name, MasterName, dgnTypeName, dungeonName, diffName, formattedTime, killcount), Cofig["发送信息位置"]) + } + dungeon_cache.rawdelete(SUser.GetCID()); + } + } + } + //通关副本时 + Cb_CParty_SetBestClearTime_Enter_Func.ClearTimeByNangua <- function (args) { + local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); + local PartyObj = Party(args[0]); + local killcount = Sq_CallFunc(S_Ptr("0x085BF456"), "int", ["pointer"], NativePointer(args[0]).add(812).C_Object); + if(!PartyObj) + return + local dungeon_diff = args[2]; + local clearTime = args[3]; + local Bfobj = PartyObj.GetBattleField(); + local DgnObj = Bfobj.GetDgn(); + local diff_name = Cofig["副本难度命名"][(dungeon_diff).tostring()]; + if (!Cofig["副本播报开关(true开启,false关闭)"]) { + return; + } + if (DgnObj) { + local Dungeon_Name = DgnObj.GetName(); + local MemberNames = []; + for (local i = 0; i < 4; ++i) { + local SUser = PartyObj.GetUser(i); + if (SUser) { + local name = SUser.GetCharacName(); + MemberNames.append(name); + dungeon_cleared[SUser.GetCID()] <- true; + } + } + + local joinedNames = _clear_dgn_Bynangua.join(MemberNames, ", "); + local time = _clear_dgn_Bynangua.formatMilliseconds(clearTime); + World.SendNotiPacketMessage(format(Cofig["通关播报信息"], joinedNames, Dungeon_Name, diff_name, time, killcount), Cofig["发送信息位置"]); + for (local i = 0; i < 4; ++i) { + local TUser = PartyObj.GetUser(i); + if (TUser) { + local CID = TUser.GetCID(); + if (CID) { + dungeon_cache.rawdelete(CID); + } + } + } + } + } +} + +class _clear_dgn_Bynangua { + DungeonType = { + "0": "", + "1": "非常困难级深渊-", + "2": "困难级深渊-", + }; + + function join(array, delimiter) { + local result = ""; + for (local i = 0; i < array.len(); ++i) { + if (i > 0) { + result += delimiter; + } + result += array[i]; + } + return result; + } + function formatMilliseconds(ms) { + local str = ""; + 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; + } + return str; + } +} + diff --git a/OfficialProject/史诗药剂/Proj.ifo b/OfficialProject/史诗药剂/Proj.ifo new file mode 100644 index 0000000..11c4737 --- /dev/null +++ b/OfficialProject/史诗药剂/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "史诗药剂", + "ProjectDescribe": "通过指定ID的道具,使玩家获得爆率加成。", + "ProjectAuthor": "倾泪寒 & 南瓜", + "ProjectVersion": 1.4, + "ProjectConfig": "史诗药剂配置文件.json", + "ProjectFiles": [ + "史诗药剂.nut" + ], + "ProjectRunFunc": "_Dps_EpicPotion_Main_" +} \ No newline at end of file diff --git a/OfficialProject/史诗药剂/史诗药剂.nut b/OfficialProject/史诗药剂/史诗药剂.nut new file mode 100644 index 0000000..b7e45c1 --- /dev/null +++ b/OfficialProject/史诗药剂/史诗药剂.nut @@ -0,0 +1,42 @@ +/* +文件名:史诗药剂.nut +路径:MyProject/史诗药剂.nut +创建日期:2025-03-28 10:21 +文件用途:史诗药剂 +*/ + +//启动函数 自定义的需要写在ifo中 +function _Dps_EpicPotion_Main_() { + //注册获取道具稀有度进入回调 + Cb_GetItemRarity_Enter_Func["史诗药剂_逻辑"] <- function(args) { + local Cofig = GlobalConfig.Get("史诗药剂配置文件.json"); + local Addr = NativePointer(args[0]); + local VectorSize = (Addr.add(4).readU32() - Addr.readU32()) / 4; + // 遍历队伍成员,找到使用了史诗药剂的玩家 + local userWithPotion = null; + for (local i = 0; i< VectorSize; i++) { + local elementAddr = NativePointer(Addr.readPointer()).add(i * 4); + local user = elementAddr.readPointer(); + if (user && Sq_CallFunc(S_Ptr("0x865E994"), "int", ["pointer", "int"], user, Cofig.EpicPotionID)) { + userWithPotion = User(user); + break; + } + } + if (userWithPotion && Haker.NextReturnAddress == "0x853583a") { + local partyobj = userWithPotion.GetParty(); + // 检查是否单人 + if (Sq_CallFunc(S_Ptr("0x0859A16A"), "int", ["pointer", ], partyobj.C_Object) == 1) { + local MaxRoll = NativePointer(args[1]).add(16).readU32(); + local odds = Cofig.EpicPotionOdds; // 默认药剂的增加几率 + // 检查是否VIP玩家 + local charac_no = userWithPotion.GetCID(); + if (Cofig.EpicPotionlist.rawin(charac_no)) { + odds = Cofig.EpicPotionlist[charac_no]; + } + // 计算新的roll值 + args[2] = MathClass.getMin(args[2] + args[2] * odds, MaxRoll); + } + } + return args; + } +} \ No newline at end of file diff --git a/OfficialProject/时装与宠物清除卷/Proj.ifo b/OfficialProject/时装与宠物清除卷/Proj.ifo new file mode 100644 index 0000000..eef7b6b --- /dev/null +++ b/OfficialProject/时装与宠物清除卷/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "时装与宠物清除卷", + "ProjectDescribe": "通过指定ID的道具,将装备背包第前两行的时装或宠物清除。", + "ProjectAuthor": "倾泪寒", + "ProjectVersion": 1.2, + "ProjectConfig": "时装与宠物清除卷_Lenheart.json", + "ProjectFiles": [ + "时装与宠物清除卷.nut" + ], + "ProjectRunFunc": "_Dps_FashionAndPetClearanceRoll_Main_" +} \ No newline at end of file diff --git a/OfficialProject/时装与宠物清除卷/时装与宠物清除卷.nut b/OfficialProject/时装与宠物清除卷/时装与宠物清除卷.nut new file mode 100644 index 0000000..557d8ce --- /dev/null +++ b/OfficialProject/时装与宠物清除卷/时装与宠物清除卷.nut @@ -0,0 +1,54 @@ +/* +文件名:时装与宠物清除卷.nut +路径:OfficialProject/时装与宠物清除卷/时装与宠物清除卷.nut +创建日期:2025-04-01 21:42 +文件用途: +*/ +function _Dps_FashionAndPetClearanceRoll_Main_() { + local Cofig = GlobalConfig.Get("时装与宠物清除卷_Lenheart.json"); + //宠物删除 + Cb_Use_Item_Sp_Func[Cofig["宠物清除卷ID"]] <- function(SUser, ItemId) { + if(Cofig["宠物清除券是否返还"])SUser.GiveItem(ItemId, 1); + local Cid = SUser.GetCID(); + local InvenObj = SUser.GetInven(); + if (InvenObj) { + for (local i = 0; i< 13; i++) { + local ItemObj = InvenObj.GetSlot(3, i); + local Flag = false; + if (ItemObj) { + ItemObj.Delete(); + } + } + local Sql = "delete from taiwan_cain_2nd.creature_items where charac_no=" + Cid + " and slot < 13 ;"; + local SqlObj = MysqlPool.GetInstance().GetConnect(); + SqlObj.Exec_Sql(Sql); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + SUser.SendItemSpace(7); + SUser.SendNotiPacketMessage(Cofig["宠物清除完成提示"], 8); + } + } + + //时装删除 + Cb_Use_Item_Sp_Func[Cofig["时装清除卷ID"]] <- function(SUser, ItemId) { + if(Cofig["时装清除券是否返还"])SUser.GiveItem(ItemId, 1); + local Cid = SUser.GetCID(); + local InvenObj = SUser.GetInven(); + if (InvenObj) { + for (local i = 0; i< 13; i++) { + local ItemObj = InvenObj.GetSlot(2, i); + if (ItemObj) { + ItemObj.Delete(); + } + } + local Sql = "delete from taiwan_cain_2nd.user_items where charac_no=" + Cid + " and slot >= 10 and slot <= 23"; + local SqlObj = MysqlPool.GetInstance().GetConnect(); + SqlObj.Exec_Sql(Sql); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + SUser.SendItemSpace(1); + SUser.SendNotiPacketMessage(Cofig["时装清除完成提示"], 8); + } + } + +} \ No newline at end of file diff --git a/OfficialProject/服务器防入侵/Proj.ifo b/OfficialProject/服务器防入侵/Proj.ifo new file mode 100644 index 0000000..bd29659 --- /dev/null +++ b/OfficialProject/服务器防入侵/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "服务器防入侵", + "ProjectDescribe": "本项目会持续更新,因特殊原因逻辑不会公开", + "ProjectAuthor": "倾泪寒", + "ProjectVersion": 1.0, + "ProjectConfig": "", + "ProjectFiles": [ + "服务器防入侵.sut" + ], + "ProjectRunFunc": "_Dps_ServerIntrusionPrevention_Main_" +} \ No newline at end of file diff --git a/OfficialProject/服务器防入侵/服务器防入侵.sut b/OfficialProject/服务器防入侵/服务器防入侵.sut new file mode 100644 index 0000000..ab68246 Binary files /dev/null and b/OfficialProject/服务器防入侵/服务器防入侵.sut differ diff --git a/OfficialProject/装备镶嵌与时装镶嵌/Proj.ifo b/OfficialProject/装备镶嵌与时装镶嵌/Proj.ifo new file mode 100644 index 0000000..504397d --- /dev/null +++ b/OfficialProject/装备镶嵌与时装镶嵌/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "装备镶嵌与时装镶嵌", + "ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可\n如果你是0627的客户端版本还需要安装群内的 \"0627装备镶嵌.dll\" 插件", + "ProjectAuthor": "倾泪寒", + "ProjectVersion": 1.2, + "ProjectConfig": "装备镶嵌与时装镶嵌_Lenheart.json", + "ProjectFiles": [ + "装备镶嵌与时装镶嵌.nut" + ], + "ProjectRunFunc": "_Dps_Equ2AvaJewel_Main_" +} \ No newline at end of file diff --git a/OfficialProject/装备镶嵌与时装镶嵌/装备镶嵌与时装镶嵌.nut b/OfficialProject/装备镶嵌与时装镶嵌/装备镶嵌与时装镶嵌.nut new file mode 100644 index 0000000..a67715e --- /dev/null +++ b/OfficialProject/装备镶嵌与时装镶嵌/装备镶嵌与时装镶嵌.nut @@ -0,0 +1,590 @@ +class EquimentUseJewel { + + ExecUser = null; + + //建库建表 + function CreateMysqlTable() { + local CreateSql1 = "create database if not exists l_equ_jewel default charset utf8;" + local CreateSql2 = "CREATE TABLE l_equ_jewel.equipment ( equ_id int(11) AUTO_INCREMENT, jewel_data blob NOT NULL,andonglishanbai_flag int(11),date VARCHAR(255), PRIMARY KEY (equ_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8,AUTO_INCREMENT = 150;" + local SqlObj = MysqlPool.GetInstance().GetConnect(); + SqlObj.Exec_Sql(CreateSql1); + SqlObj.Exec_Sql(CreateSql2); + MysqlPool.GetInstance().PutConnect(SqlObj); + } + + function api_get_jewel_socket_data(id) { //获取徽章数据,存在返回徽章数据,不存在返回空字节数据 + local CheckSql = "SELECT jewel_data FROM l_equ_jewel.equipment where equ_id = " + id + ";"; + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + local Ret = SqlObj.Select(CheckSql, ["binary"]); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + //没结婚要返回false + if (Ret.len()< 1 || Ret[0][0] == null) { + return 0; + } else { + return Ret[0][0]; + } + } + + function api_exitjeweldata(id) { //0代表不存在,存在返回1 + local CheckSql = "SELECT andonglishanbai_flag FROM l_equ_jewel.equipment where equ_id = " + id + ";"; + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + local Ret = SqlObj.Select(CheckSql, ["int"]); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + //没结婚要返回false + if (Ret.len()< 1 || Ret[0][0] == null) { + return 0; + } else { + return Ret[0][0]; + } + } + + function save_equiment_socket(socket_data, id) { //0代表不存在,存在返回1 + local CheckSql = "UPDATE l_equ_jewel.equipment SET jewel_data = 0x" + socket_data + " WHERE equ_id = " + id + ";"; + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + local Ret = SqlObj.Select(CheckSql, ["int"]); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + //没结婚要返回false + if (Ret.len()< 1 || Ret[0][0] == null) { + return false; + } else { + return true; + } + } + + function CUser_SendCmdErrorPacket(SUser, id, id2) { + local Pack = Packet(); + Pack.Put_Header(1, id); + Pack.Put_Byte(0); + Pack.Put_Byte(id2); + Pack.Finalize(true); + SUser.Send(Pack); + Pack.Delete(); + } + + function api_PacketBuf_get_buf(packet_buf) { + return NativePointer(NativePointer(packet_buf).add(20).readPointer()).add(13); + } + + function add_equiment_socket(equipment_type) { //0代表开孔失败 成功返回标识 + /* + 武器10 + 称号11 + 上衣12 + 头肩13 + 下衣14 + 鞋子15 + 腰带16 + 项链17 + 手镯18 + 戒指19 + 辅助装备20 + 魔法石21 + */ + + /* + 红色:'010000000000010000000000000000000000000000000000000000000000' A + 黄色:'020000000000020000000000000000000000000000000000000000000000' B + 绿色:'040000000000040000000000000000000000000000000000000000000000' C + 蓝色:'080000000000080000000000000000000000000000000000000000000000' D + 白金:'100000000000100000000000000000000000000000000000000000000000' + */ + local DB_JewelsocketData = ""; + switch (equipment_type) { + case 10: //武器10 SS + DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000" + break; + case 11: //称号11 SS + DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000" + break; + case 12: //上衣12 C + DB_JewelsocketData = "040000000000040000000000000000000000000000000000000000000000" + break; + case 13: //头肩13 B + DB_JewelsocketData = "020000000000020000000000000000000000000000000000000000000000" + break; + case 14: //下衣14 C + DB_JewelsocketData = "040000000000040000000000000000000000000000000000000000000000" + break; + case 15: //鞋子15 D + DB_JewelsocketData = "080000000000080000000000000000000000000000000000000000000000" + break; + case 16: //腰带16 A + DB_JewelsocketData = "010000000000010000000000000000000000000000000000000000000000" + break; + case 17: //项链17 B + DB_JewelsocketData = "020000000000020000000000000000000000000000000000000000000000" + break; + case 18: //手镯18 D + DB_JewelsocketData = "080000000000080000000000000000000000000000000000000000000000" + break; + case 19: //戒指19 A + DB_JewelsocketData = "010000000000010000000000000000000000000000000000000000000000" + break; + case 20: //辅助装备20 S + DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000" + break; + case 21: //魔法石21 S + DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000" + break; + default: + DB_JewelsocketData = "000000000000000000000000000000000000000000000000000000000000" + break; + } + local date = time(); + local Ct = Sq_GetTimestampString(); + date = date.tostring() + Ct; + + local CheckSql = "INSERT INTO l_equ_jewel.equipment (andonglishanbai_flag,jewel_data,date) VALUES(1,0x" + DB_JewelsocketData + ",\'" + date + "\');"; + local CheckSql1 = "SELECT equ_id FROM l_equ_jewel.equipment where date = \'" + date + "\';"; + //从池子拿连接 + local SqlObj = MysqlPool.GetInstance().GetConnect(); + SqlObj.Select(CheckSql, ["int"]); + local Ret = SqlObj.Select(CheckSql1, ["int"]); + //把连接还池子 + MysqlPool.GetInstance().PutConnect(SqlObj); + if (Ret.len()< 1 || Ret[0][0] == null) { + return 0; + } else { + return Ret[0][0]; + } + return 0; + } + + function CStackableItem_getJewelTargetSocket(C_Object) { + return Sq_CallFunc(S_Ptr("0x0822CA28"), "int", ["pointer"], C_Object); + } + + function CUser_SendUpdateItemList_DB(SUser, Slot, DB_JewelSocketData) { + local Pack = Packet(); + Pack.Put_Header(0, 14); + Pack.Put_Byte(0); + Pack.Put_Short(1); + local InvenObj = SUser.GetInven(); + Sq_CallFunc(S_Ptr("0x084FC6BC"), "int", ["pointer", "int", "int", "pointer"], InvenObj.C_Object, 1, Slot, Pack.C_Object); + Pack.Put_BinaryEx(DB_JewelSocketData.C_Object, 30); + Pack.Finalize(true); + SUser.Send(Pack); + Pack.Delete(); + } + + function GetByte(value) { + local Blob = blob(); + Blob.writen(value, 'w'); + return Blob; + } + + function intToHex(num) { + if (num == 0) { + return "0"; + } + local hexDigits = "0123456789abcdef"; + local hexString = ""; + while (num > 0) { + local remainder = num % 16; + hexString = hexDigits[remainder] + hexString; + num = (num / 16).tointeger(); + } + return hexString; + } + + function lengthCutting(str, ystr, num, maxLength) { + // 如果字符串长度小于最大长度,在前面补0 + local lengthDiff = maxLength - str.len(); + if (lengthDiff > 0) { + local zeroPadding = ""; + for (local i = 0; i< lengthDiff; i++) { + zeroPadding += "0"; + } + str = zeroPadding + str; + } + local strArr = ""; + for (local i = 0; i< str.len(); i += num) { + local endIndex = i + num; + if (endIndex > str.len()) { + endIndex = str.len(); + } + strArr += str.slice(i, endIndex); + } + return ystr + strArr; + } + + + + + + function HackAddSocketToAvatarLogic(Flag) { + if (Flag) { + Sq_WriteByteArr(S_Ptr("821A449"), [0x90, 0x90]); + Sq_WriteByteArr(S_Ptr("0x821A44B"), array(36, 0x90)); + } else { + Sq_WriteByteArr(S_Ptr("821A449"), [0x74, 0x2B]); + } + } + + + + function FixFunction() { + //称号回包 + Cb_CTitleBook_putItemData_Leave_Func.EquimentUseJewel <- function(args) { + local JewelSocketData = api_get_jewel_socket_data(NativePointer(args[3]).add(25).readU32()); + local ret = args.pop(); + if (JewelSocketData && NativePointer(JewelSocketData).add(0).readU8() != 0) { + local Pack = Packet(args[1]); + Pack.Put_BinaryEx(JewelSocketData.C_Object, 30); + } + return null; + }.bindenv(this); + + //设计图继承 + Cb_CUsercopyItemOption_Enter_Func.EquimentUseJewel <- function(args) { + local jewelSocketID = NativePointer(args[2]).add(25).readU32(); + NativePointer(args[1]).add(25).writeU32(jewelSocketID); + return null; + }.bindenv(this); + + //装备开孔 + Cb_AddSocketToAvatar_Enter_Func.EquimentUseJewel <- function(args) { + local SUser = User(args[1]); + local PackCopyBuffer = Memory.alloc(10001); + Memory.copy(PackCopyBuffer, NativePointer(args[2]), 1000); + local Pack = Packet(PackCopyBuffer.C_Object); + local equ_slot = Pack.GetShort(); + local equitem_id = Pack.GetInt(); + local sta_slot = Pack.GetShort(); + local CurCharacInvenW = SUser.GetInven(); + local inven_item = CurCharacInvenW.GetSlot(1, equ_slot); + + if (equ_slot > 56) { //修改后:大于56则是时装装备 原:如果不是装备文件就调用原逻辑 + equ_slot = equ_slot - 57; + local C_PacketBuf = api_PacketBuf_get_buf(args[2]) //获取原始封包数据 + C_PacketBuf.add(0).writeShort(equ_slot) //修改掉装备位置信息 时装类镶嵌从57开始。 + + //执行原逻辑 + return null; + } + //如果已开启镶嵌槽则不执行 + local equ_id = NativePointer(inven_item.C_Object).add(25).readU32(); + if (api_exitjeweldata(equ_id)) { + CUser_SendCmdErrorPacket(SUser, 209, 19); + HackAddSocketToAvatarLogic(true); + return null; + } + + local item = PvfItem.GetPvfItemById(equitem_id); + local ItemType = Sq_CallFunc(S_Ptr("0x08514D26"), "int", ["pointer"], item.C_Object); + + if (ItemType == 10) { + SUser.SendNotiBox("装备为武器类型,不支持打孔!", 1) + CUser_SendCmdErrorPacket(SUser, 209, 0); + HackAddSocketToAvatarLogic(true); + return null; + } else if (ItemType == 11) { + SUser.SendNotiBox("装备为称号类型,不支持打孔!", 1) + CUser_SendCmdErrorPacket(SUser, 209, 0); + HackAddSocketToAvatarLogic(true); + return null; + } + + local id = add_equiment_socket(ItemType); + + Sq_Inven_RemoveItemFormCount(CurCharacInvenW.C_Object, 1, sta_slot, 1, 8, 1); //删除打孔道具 + NativePointer(inven_item.C_Object).add(25).writeU32(id) //写入槽位标识 + SUser.SendUpdateItemList(1, 0, equ_slot); + + local JewelSocketData = api_get_jewel_socket_data(id); + CUser_SendUpdateItemList_DB(SUser, equ_slot, JewelSocketData); //用于更新镶嵌后的装备显示,这里用的是带镶嵌数据的更新背包函数,并非CUser_SendUpdateItemList + + local Pack = Packet(); + Pack.Put_Header(1, 209); + Pack.Put_Byte(1); + Pack.Put_Short(equ_slot + 104); + Pack.Put_Short(sta_slot); + Pack.Finalize(true); + SUser.Send(Pack); + Pack.Delete(); + HackAddSocketToAvatarLogic(true); + return null; + }.bindenv(this); + + Cb_AddSocketToAvatar_Leave_Func.EquimentUseJewel <- function(args) { + HackAddSocketToAvatarLogic(false); + return null; + }.bindenv(this); + + //装备镶嵌和时装镶嵌 + Cb_Dispatcher_UseJewel_Enter_Func.EquimentUseJewel <- function(args) { + local SUser = User(args[1]); + local Pack = Packet(args[2]); + local PackIndex = NativePointer(args[2]).add(4).readInt(); + local State = SUser.GetState(); + if (State != 3) return null; + + local avartar_inven_slot = Pack.GetShort(); + local avartar_item_id = Pack.GetInt(); + local emblem_cnt = Pack.GetByte(); + + //下面是参照原时装镶嵌的思路写的。个别点标记出来。 + if (avartar_inven_slot > 104) { + local equipment_inven_slot = avartar_inven_slot - 104; //取出真实装备所在背包位置值 + local Inven = SUser.GetInven(); + local equipment = Inven.GetSlot(1, equipment_inven_slot); + //校验是否合法 + if (!equipment || equipment.IsEmpty || (equipment.GetIndex() != avartar_item_id) || SUser.CheckItemLock(1, equipment_inven_slot)) return; + + local id = NativePointer(equipment.C_Object).add(25).readU32(); + local JewelSocketData = api_get_jewel_socket_data(id); + if (!JewelSocketData) return; + + local emblems = {}; + if (emblem_cnt <= 3) { + for (local i = 0; i< emblem_cnt; i++) { + local emblem_inven_slot = Pack.GetShort(); + local emblem_item_id = Pack.GetInt(); + local equipment_socket_slot = Pack.GetByte(); + local emblem = Inven.GetSlot(1, emblem_inven_slot); + //校验徽章及插槽数据是否合法 + if (!emblem || emblem.IsEmpty || (emblem.GetIndex() != emblem_item_id) || (equipment_socket_slot >= 3)) return; + + //校验徽章是否满足时装插槽颜色要求 + //获取徽章pvf数据 + local citem = PvfItem.GetPvfItemById(emblem_item_id); + if (!citem) return; + + //校验徽章类型 + if (!citem.IsStackable() || citem.GetItemType() != 20) return; + + //获取徽章支持的插槽 + local emblem_socket_type = CStackableItem_getJewelTargetSocket(citem.C_Object); + //获取要镶嵌的时装插槽类型 + local avartar_socket_type = JewelSocketData.add(equipment_socket_slot * 6).readShort(); + + if (!(emblem_socket_type & avartar_socket_type)) { + + return; + } + + emblems[equipment_socket_slot] <- [emblem_inven_slot, emblem_item_id]; + } + } + + + foreach(equipment_socket_slot, emblemObject in emblems) { + //删除徽章 + local emblem_inven_slot = emblemObject[0]; + Sq_Inven_RemoveItemFormCount(Inven.C_Object, 1, emblem_inven_slot, 1, 8, 1); //删除打孔道具 + //设置时装插槽数据 + local emblem_item_id = emblemObject[1]; + JewelSocketData.add(2 + 6 * equipment_socket_slot).writeU32(emblem_item_id); + } + + local Buf = Sq_Point2Blob(JewelSocketData.C_Object, 30); + local Str = ""; + foreach(Value in Buf) { + Str += format("%02X", Value); + } + + save_equiment_socket(Str, id); + // if (!save_equiment_socket(DB_JewelSocketData, id)) { + // print("写入失败了"); + // return null; + // } + + CUser_SendUpdateItemList_DB(SUser, equipment_inven_slot, JewelSocketData); //用于更新镶嵌后的装备显示,这里用的是带镶嵌数据的更新背包函数,并非CUser_SendUpdateItemList + local Pack = Packet(); + Pack.Put_Header(1, 209); + Pack.Put_Byte(1); + Pack.Put_Short(equipment_inven_slot + 104); + Pack.Finalize(true); + SUser.Send(Pack); + Pack.Delete(); + + return; + } + + AvatarLogic(args, PackIndex); + + return null; + }.bindenv(this); + + Cb_Dispatcher_UseJewel_Leave_Func.EquimentUseJewel <- function(args) { + return -1; + }.bindenv(this); + + //额外数据包,发送装备镶嵌数据给本地处理 + Cb_InterfacePacketBuf_put_packet_Leave_Func.EquimentUseJewel <- function(args) { + local ret = args.pop(); + local Inven_Item = NativePointer(args[1]); + if (Inven_Item.add(1).readU8() == 1) { + local ItemObj = Item(args[1]); + local JewelSocketData = api_get_jewel_socket_data(NativePointer(ItemObj.C_Object).add(25).readU32()); + if (JewelSocketData && JewelSocketData.add(0).readU8() != 0) { + local Pack = Packet(args[0]); + Pack.Put_BinaryEx(JewelSocketData.C_Object, 30); + } + } + return null; + }.bindenv(this); + + L_HookEquimentUseJewel(); + } + + + + + function WongWork_CAvatarItemMgr_getJewelSocketData(a, b) { + return Sq_CallFunc(S_Ptr("0x82F98F8"), "pointer", ["pointer", "int"], a, b); + } + + function CStackableItem_getJewelTargetSocket(C_Object) { + return Sq_CallFunc(S_Ptr("0x0822CA28"), "int", ["pointer"], C_Object); + } + + function CInventory_delete_item(C_Object, Type, Slot, Count, Ps, Log) { + return Sq_CallFunc(S_Ptr("0x850400C"), "int", ["pointer", "int", "int", "int", "int", "int"], C_Object, Type, Slot, Count, Ps, Log); + } + + function api_set_JewelSocketData(jewelSocketData, slot, emblem_item_id) { + if (jewelSocketData) { + NativePointer(jewelSocketData).add(slot * 6 + 2).writeInt(emblem_item_id); + } + } + + function DB_UpdateAvatarJewelSlot_makeRequest(a, b, c) { + return Sq_CallFunc(S_Ptr("0x843081C"), "pointer", ["int", "int", "pointer"], a, b, c); + } + + //获取时装在数据库中的uid + function api_get_avartar_ui_id(avartar) { + return NativePointer(avartar).add(7).readInt(); + } + + + function AvatarLogic(args, PackIndex) { + //角色 + local SUser = User(args[1]); + //包数据 + local Pack = Packet(args[2]); + //还原包读取数据号位 + NativePointer(args[2]).add(4).writeInt(PackIndex); + + //校验角色状态是否允许镶嵌 + if (!SUser || SUser.GetState() != 3) { + return; + } + //时装所在的背包槽 + local Inven_Slot = Pack.GetShort(); + //时装item_id + local Item_Id = Pack.GetInt(); + //本次镶嵌徽章数量 + local Emblem_Count = Pack.GetByte(); + + //获取时装道具 + local InvemObj = SUser.GetInven(); + local AvatarObj = InvemObj.GetSlot(2, Inven_Slot); + + + //校验时装 数据是否合法 + if (!AvatarObj || AvatarObj.IsEmpty || (AvatarObj.GetIndex() != Item_Id) || SUser.CheckItemLock(2, Inven_Slot)) return; + + local Avartar_AddInfo = AvatarObj.GetAdd_Info(); + //获取时装管理器 + local Inven_AvartarMgr = InvemObj.GetAvatarItemMgr(); + + //获取时装插槽数据 + local Jewel_Socket_Data = WongWork_CAvatarItemMgr_getJewelSocketData(Inven_AvartarMgr, Avartar_AddInfo); + if (!Jewel_Socket_Data) return; + + //最多只支持3个插槽 + if (Emblem_Count <= 3) { + local emblems = {}; + + for (local i = 0; i< Emblem_Count; i++) { + //徽章所在的背包槽 + local emblem_inven_slot = Pack.GetShort(); + //徽章item_id + local emblem_item_id = Pack.GetInt(); + //该徽章镶嵌的时装插槽id + local avartar_socket_slot = Pack.GetByte(); + + //获取徽章道具 + local EmblemObje = InvemObj.GetSlot(1, emblem_inven_slot); + + //校验徽章及插槽数据是否合法 + if (!EmblemObje || EmblemObje.IsEmpty || (EmblemObje.GetIndex() != emblem_item_id) || (avartar_socket_slot >= 3)) return; + + //校验徽章是否满足时装插槽颜色要求 + //获取徽章pvf数据 + local citem = PvfItem.GetPvfItemById(emblem_item_id); + if (!citem) return; + + //校验徽章类型 + if (!citem.IsStackable() || citem.GetItemType() != 20) return; + + //获取徽章支持的插槽 + local emblem_socket_type = CStackableItem_getJewelTargetSocket(citem.C_Object); + + //获取要镶嵌的时装插槽类型 + local avartar_socket_type = NativePointer(Jewel_Socket_Data).add(avartar_socket_slot * 6).readShort(); + + if (!(emblem_socket_type & avartar_socket_type)) return; + + emblems[avartar_socket_slot] <- [emblem_inven_slot, emblem_item_id]; + } + + //开始镶嵌 + foreach(avartar_socket_slot, emblemObject in emblems) { + //删除徽章 + local emblem_inven_slot = emblemObject[0]; + CInventory_delete_item(InvemObj.C_Object, 1, emblem_inven_slot, 1, 8, 1); + //设置时装插槽数据 + local emblem_item_id = emblemObject[1]; + api_set_JewelSocketData(Jewel_Socket_Data, avartar_socket_slot, emblem_item_id); + } + + //时装插槽数据存档 + DB_UpdateAvatarJewelSlot_makeRequest(SUser.GetCID(), api_get_avartar_ui_id(AvatarObj.C_Object), Jewel_Socket_Data); + + //通知客户端时装数据已更新 + SUser.SendUpdateItemList(1, 1, Inven_Slot); + + //回包给客户端 + local Pack = Packet(); + Pack.Put_Header(1, 204); + Pack.Put_Int(1); + Pack.Finalize(true); + SUser.Send(Pack); + Pack.Delete(); + } + + return null; + } + + constructor() { + CreateMysqlTable(); + + FixFunction(); + } +} + +function _Dps_Equ2AvaJewel_Main_() { + local Config = GlobalConfig.Get("装备镶嵌与时装镶嵌_Lenheart.json"); + local PoolObj = MysqlPool.GetInstance(); + local Ip = Config["数据库IP 不是外置数据库不要更改"]; + local Port = Config["数据库端口 不懂不要更改"]; + local DbName = Config["数据库用户名 本地用户名不懂不要更改"]; + local Password = Config["数据库密码 本地密码不懂不要更改"]; + //设置数据库连接信息 + PoolObj.SetBaseConfiguration(Ip, Port, DbName, Password); + //连接池大小 + PoolObj.PoolSize = 10; + //初始化 + PoolObj.Init(); + //装备镶嵌修复 + getroottable()._EquimentUseJewel_Object <- EquimentUseJewel(); +} \ No newline at end of file diff --git a/OfficialProject/设置装备解锁时间/Proj.ifo b/OfficialProject/设置装备解锁时间/Proj.ifo new file mode 100644 index 0000000..fd1d53f --- /dev/null +++ b/OfficialProject/设置装备解锁时间/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "设置装备解锁时间", + "ProjectDescribe": "是指装备解锁需要等待的冷却时间。", + "ProjectAuthor": "倾泪寒", + "ProjectVersion": 1.0, + "ProjectConfig": "设置装备解锁时间_Lenheart.json", + "ProjectFiles": [ + "设置装备解锁时间.nut" + ], + "ProjectRunFunc": "_Dps_SetEquipmentUnlockTime_Main_" +} \ No newline at end of file diff --git a/OfficialProject/设置装备解锁时间/设置装备解锁时间.nut b/OfficialProject/设置装备解锁时间/设置装备解锁时间.nut new file mode 100644 index 0000000..8986ca7 --- /dev/null +++ b/OfficialProject/设置装备解锁时间/设置装备解锁时间.nut @@ -0,0 +1,5 @@ +function _Dps_SetEquipmentUnlockTime_Main_() +{ + local Config = GlobalConfig.Get("设置装备解锁时间_Lenheart.json"); + GameManager.SetItemLockTime(Config["设置装备解锁需要的冷却时间_单位秒"]); +} \ No newline at end of file diff --git a/OfficialProject/跨界石/Proj.ifo b/OfficialProject/跨界石/Proj.ifo new file mode 100644 index 0000000..546fcd0 --- /dev/null +++ b/OfficialProject/跨界石/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "跨界石", + "ProjectDescribe": "通过指定ID的道具,将装备背包第一格的装备跨界。\n配置中修改NoCrossIdArr可增加不可跨界的ID。", + "ProjectAuthor": "倾泪寒", + "ProjectVersion": 1.2, + "ProjectConfig": "跨界石_Lenheart.json", + "ProjectFiles": [ + "跨界石.nut" + ], + "ProjectRunFunc": "_Dps_CrossBorderStones_Main_" +} \ No newline at end of file diff --git a/OfficialProject/跨界石/跨界石.nut b/OfficialProject/跨界石/跨界石.nut new file mode 100644 index 0000000..9518c40 --- /dev/null +++ b/OfficialProject/跨界石/跨界石.nut @@ -0,0 +1,57 @@ +function _Dps_CrossBorderStones_Main_() { + local Cofig = GlobalConfig.Get("跨界石_Lenheart.json"); + Cb_Use_Item_Sp_Func[Cofig.CrossoverId.tointeger()] <- function(SUser, ItemId) { + //获取账号金库对象 + local CargoObj = SUser.GetAccountCargo(); + //获取账号金库中的一个空格子 + local EmptySlot = CargoObj.GetEmptySlot(); + + //如果没有空格子 + if (EmptySlot == -1) { + SUser.SendNotiPacketMessage(Cofig.CrossoverStr2, 8); + //不扣除道具 + SUser.GiveItem(ItemId, 1); + return; + } + + //获取角色背包 + local InvenObj = SUser.GetInven(); + //获取需要转移的装备 这里默认写的装备栏第一个格子 + local ItemObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9); + //获取装备ID + local EquipId = ItemObj.GetIndex(); + //获取装备名字 + local ItemName = PvfItem.GetNameById(EquipId); + //获取配置中不可跨界的ID数组 + local NoCrossId = Cofig.NoCrossIdArr; + //如果这个装备不可跨界 + if (NoCrossId.find(EquipId) != null) { + SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr5, ItemName), 7); + //不扣除道具 + SUser.GiveItem(ItemId, 1); + return; + } + //如果没找到这个格子的装备 + if (!ItemName) { + SUser.SendNotiPacketMessage(Cofig.CrossoverStr1, 8); + //不扣除道具 + SUser.GiveItem(ItemId, 1); + return; + } + //跨界 + local Flag = CargoObj.InsertItem(ItemObj, EmptySlot); + if (Flag == -1) { + SUser.SendNotiPacketMessage(Cofig.CrossoverStr3, 8); + //不扣除道具 + SUser.GiveItem(ItemId, 1); + } else { + //销毁背包中的道具 + ItemObj.Delete(); + //刷新玩家背包列表 + SUser.SendUpdateItemList(1, 0, 9); + //刷新账号金库列表 + CargoObj.SendItemList(); + SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr4, ItemName), 7); + } + } +} \ No newline at end of file diff --git a/OfficialProject/防脱机制裁/Proj.ifo b/OfficialProject/防脱机制裁/Proj.ifo new file mode 100644 index 0000000..81f7640 --- /dev/null +++ b/OfficialProject/防脱机制裁/Proj.ifo @@ -0,0 +1,11 @@ +{ + "ProjectName": "防脱机制裁", + "ProjectDescribe": "本项目只能够防止脱机外挂,配置可以更改", + "ProjectAuthor": "南瓜", + "ProjectVersion": 1.3, + "ProjectConfig": "防脱机制裁_Nangua.json", + "ProjectFiles": [ + "防脱机制裁.sut" + ], + "ProjectRunFunc": "_Dps_AntiOfflineSanctions_Main_" +} \ No newline at end of file diff --git a/OfficialProject/防脱机制裁/防脱机制裁.sut b/OfficialProject/防脱机制裁/防脱机制裁.sut new file mode 100644 index 0000000..6d7dfef Binary files /dev/null and b/OfficialProject/防脱机制裁/防脱机制裁.sut differ diff --git a/folder-alias.json b/folder-alias.json index 94ee500..16ecd74 100644 --- a/folder-alias.json +++ b/folder-alias.json @@ -157,5 +157,17 @@ }, "Dps_A/BaseClass/BigInt": { "description": "大数字类" + }, + "OfficialProject": { + "description": "官方项目" + }, + "OffcialConfig": { + "description": "官方配置" + }, + "Dps_A/BaseClass/ConfigClass": { + "description": "全局配置类" + }, + "Dps_A/BaseClass/OfficialProject": { + "description": "官方项目类" } } \ No newline at end of file diff --git a/lib/libAurora.so b/lib/libAurora.so old mode 100644 new mode 100755 index 0a10008..9c2c6cb Binary files a/lib/libAurora.so and b/lib/libAurora.so differ diff --git a/lib/libAurora.so.bak b/lib/libAurora.so.bak new file mode 100755 index 0000000..d15ed9e Binary files /dev/null and b/lib/libAurora.so.bak differ diff --git a/lib/und.so b/lib/und.so new file mode 100755 index 0000000..64c3922 Binary files /dev/null and b/lib/und.so differ diff --git a/script_info/downloaded_projects.json b/script_info/downloaded_projects.json new file mode 100644 index 0000000..1a77d22 --- /dev/null +++ b/script_info/downloaded_projects.json @@ -0,0 +1,86 @@ +[ + { + "Status": 0, + "FilePath": null, + "ProjectVersion": 1.4, + "ProjectName": "史诗药剂", + "ProjectAuthor": "倾泪寒 & 南瓜", + "Raw_Url": "http://103.36.223.176:5244/p/DP_S/Script/%E5%8F%B2%E8%AF%97%E8%8D%AF%E5%89%82/Proj.ifo?sign=-B9k-P4CX3Qm3d9hJpmaHhpFo14aFF1Rfh9d69M-f-8=:0", + "ProjectFiles": [ + "史诗药剂.nut" + ], + "ProjectConfig": "史诗药剂配置文件.json", + "ProjectDescribe": "通过指定ID的道具,使玩家获得爆率加成。", + "ProjectRunFunc": "_Dps_EpicPotion_Main_" + }, + { + "Status": 0, + "FilePath": null, + "ProjectVersion": 1.2, + "ProjectName": "跨界石", + "ProjectAuthor": "倾泪寒", + "Raw_Url": null, + "ProjectFiles": [ + "跨界石.nut" + ], + "ProjectConfig": "跨界石_Lenheart.json", + "ProjectDescribe": "通过指定ID的道具,将装备背包第一格的装备跨界。\n配置中修改NoCrossIdArr可增加不可跨界的ID。", + "ProjectRunFunc": "_Dps_CrossBorderStones_Main_" + }, + { + "Status": 0, + "FilePath": null, + "ProjectVersion": 1, + "ProjectName": "一键存入个人金库", + "ProjectAuthor": "倾泪寒 & 南瓜", + "Raw_Url": "http://103.36.223.176:5244/p/DP_S/Script/%E4%B8%80%E9%94%AE%E5%AD%98%E5%85%A5%E4%B8%AA%E4%BA%BA%E9%87%91%E5%BA%93/Proj.ifo?sign=m9ADj-5dEtouJaA36cHZWPhKTQMBZqGgt_V32OORoZk=:0", + "ProjectFiles": [ + "一键入库.nut" + ], + "ProjectConfig": "一键存入个人金库_Lenheart.json", + "ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可,在游戏中输入 //yjcc 即可一键存入个人金库,也可以在游戏中的快捷喊话中添加为快捷键 配置中可更改 yjcc 关键字", + "ProjectRunFunc": "_Dps_OneClickStorage_Main_" + }, + { + "Status": 0, + "FilePath": null, + "ProjectVersion": 1.2, + "ProjectName": "装备镶嵌与时装镶嵌", + "ProjectAuthor": "倾泪寒", + "Raw_Url": null, + "ProjectFiles": [ + "装备镶嵌与时装镶嵌.nut" + ], + "ProjectConfig": "装备镶嵌与时装镶嵌_Lenheart.json", + "ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可\n如果你是0627的客户端版本还需要安装群内的 \"0627装备镶嵌.dll\" 插件", + "ProjectRunFunc": "_Dps_Equ2AvaJewel_Main_" + }, + { + "Status": 0, + "FilePath": null, + "ProjectVersion": 1, + "ProjectName": "任务清除卷", + "ProjectAuthor": "南瓜", + "Raw_Url": "", + "ProjectFiles": [ + "任务清除卷.nut" + ], + "ProjectConfig": "任务相关配置_南瓜.json", + "ProjectDescribe": "清理各类型任务以及重置相关任务", + "ProjectRunFunc": "_Dps_QuestInfo_nangua_Main_" + }, + { + "Status": 0, + "FilePath": null, + "ProjectVersion": 1, + "ProjectName": "副本播报", + "ProjectAuthor": "南瓜", + "Raw_Url": "", + "ProjectFiles": [ + "副本播报.nut" + ], + "ProjectConfig": "副本播报配置_Nangua.json", + "ProjectDescribe": "通关及未通关时播报耗时时长", + "ProjectRunFunc": "_Dps_send_dungeon_msg_Main_" + } +] \ No newline at end of file diff --git a/script_info/史诗药剂_1.4.json b/script_info/史诗药剂_1.4.json new file mode 100644 index 0000000..bb48e55 --- /dev/null +++ b/script_info/史诗药剂_1.4.json @@ -0,0 +1,13 @@ +{ + "FilePath": null, + "ProjectVersion": 1.4, + "ProjectName": "史诗药剂", + "ProjectAuthor": "倾泪寒 & 南瓜", + "Raw_Url": "http://103.36.223.176:5244/p/DP_S/Script/%E5%8F%B2%E8%AF%97%E8%8D%AF%E5%89%82/Proj.ifo?sign=-B9k-P4CX3Qm3d9hJpmaHhpFo14aFF1Rfh9d69M-f-8=:0", + "ProjectFiles": [ + "史诗药剂.nut" + ], + "ProjectConfig": "史诗药剂配置文件.json", + "ProjectDescribe": "通过指定ID的道具,使玩家获得爆率加成。", + "ProjectRunFunc": "_Dps_EpicPotion_Main_" +} \ No newline at end of file diff --git a/version.json b/version.json new file mode 100755 index 0000000..9a6bd4a --- /dev/null +++ b/version.json @@ -0,0 +1,3 @@ +{ + "ProjectVersion": 3.42 +} \ No newline at end of file