diff --git a/MyProject/DPS登录器.nut b/MyProject/DPS登录器.nut index d7b5e1b..00090e3 100644 --- a/MyProject/DPS登录器.nut +++ b/MyProject/DPS登录器.nut @@ -15,6 +15,7 @@ class _DPS_Login_Gateway_ { try { local HS = HttpServer("0.0.0.0", "41817"); HS.Listen(function(SocketObject, Header, Msg) { + print("HS.Listen") getroottable()._DPS_Login_Gateway_Object_._HttpServer_Event_DPS_(SocketObject, Header, Msg); }); } catch (exception) { @@ -134,6 +135,7 @@ class _DPS_Login_Gateway_ { } function _HttpServer_Event_DPS_(SocketObject, Header, Msg) { + print("_HttpServer_Event_DPS_") if (PackHandleMap.rawin(Header.path)) { local Jso = null; try { @@ -142,6 +144,7 @@ class _DPS_Login_Gateway_ { } if (!Jso) return; + print(Jso); PackHandleMap[Header.path](SocketObject, Header, Jso); } else { diff --git a/MyProject/灵魂救赎武器.nut b/MyProject/灵魂救赎武器.nut new file mode 100644 index 0000000..f5d9263 --- /dev/null +++ b/MyProject/灵魂救赎武器.nut @@ -0,0 +1,396 @@ +/* +文件名:灵魂救赎武器.nut +路径:_DPS_/_BuiltProject/灵魂救赎武器/灵魂救赎武器.nut +创建日期:2026-01-20 19:24 +文件用途: +*/ + +class SoulSalvationC { + + + MysqlObject = null; + + //灵魂救赎武器标识 (阶段1) + Equipment1List = null; + //1阶段所需灵魂数量 + Stage1SoulCount = 1000; + //1阶段进阶所需材料 + Equipment1Upgrade = null; + //灵魂救赎武器标识 (阶段2) + Equipment2List = null; + //2阶段所需灵魂数量 + Stage2SoulCount = 100; + //灵魂救赎武器标识 (阶段3) + Equipment3List = null; + + //数据 + data = null; + + constructor() { + Equipment1List = {}; + Equipment1Upgrade = {}; + Equipment2List = {}; + Equipment3List = {}; + data = {}; + + //创建数据库 + MysqlObject = Mysql(Str_Ptr("127.0.0.1"), 3306, Str_Ptr("taiwan_cain"), Str_Ptr("game"), Str_Ptr("uu5!^%jg")); + MysqlObject.Exec_Sql(format("SET NAMES %s", "latin1")); + + local check_table_sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'soulsalvation';" + local Ret = MysqlObject.Select(check_table_sql, ["int"]); + if (Ret.len() == 0 || Ret[0][0] == 0) { + local sql = "CREATE TABLE soulsalvation (`uid` INT(11) NOT NULL COMMENT '主键ID',`soul_id` INT(11) NOT NULL DEFAULT 0 COMMENT '灵魂ID', `soul_count` INT(11) NOT NULL DEFAULT 0 COMMENT '数值字段(默认值0)',PRIMARY KEY (`uid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='soulsalvation表';"; + MysqlObject.Exec_Sql(sql); + } + + //读取PVF + InitPvf(); + + //注册客户端收包 + RegisterClient(); + + //读取数据库数据到缓存 + InitMysqlData(); + + } + + function RegisterClient() { + //测试用客户端主动查询灵魂数 + ClientSocketPackFuncMap.rawset(21011001, function(SUser, Jso) { + local SendInfo = GetUserData(SUser); + SUser.SendJso({ + op = 21011002, + Info = SendInfo + }) + }.bindenv(this)); + + Cb_CParty_OnKillMonster_Leave_Func.rawset("SoulSalvationC", function(args) { + local SUser = User(args[1]); + //获取佩戴的武器 + local Weapon = GetUserWeapon(SUser); + local WeaponIndex = Weapon.GetIndex(); + //可积累灵魂数量 + if (Equipment1List.rawin(WeaponIndex) || Equipment2List.rawin(WeaponIndex)) { + local uuid = Weapon.GetUuid(); + //有数据则+1 无数据则新增 + if (data.rawin(uuid)) { + if (data[uuid].soul_count< Stage1SoulCount) + data[uuid].soul_count += 1; + } else { + data[uuid] <- { + soul_count = 1, + soul_id = 0 + }; + } + SUser.SendJso({ + op = 21011004, + uuid = uuid, + info = data[uuid] + }) + } + }.bindenv(this)); + + //上线时 获取自己的灵魂武器信息 + Cb_reach_game_world_Func.rawset("SoulSalvationC", function(SUser) { + local SendInfo = GetUserData(SUser); + SUser.SendJso({ + op = 21011002, + Info = SendInfo + }) + }.bindenv(this)); + + //查看他人信息的时候 获取灵魂武器信息 + Cb_GetUserInfo_Leave_Func.rawset("SoulSalvationC", function(args) { + local SUser = User(args[1]) + local CheckWorldId = NativePointer(args[2]).add(13).readShort(); + local CheckUser = World.GetUserBySession(CheckWorldId); + if (CheckUser) { + local SendInfo = GetUserData(CheckUser); + SUser.SendJso({ + op = 21011006, + Info = SendInfo + }) + } + }.bindenv(this)); + + //每5分钟固化一次数据到数据库 + Timer.RemoveCronTask("SoulSalvationC"); + Timer.SetCronTask(function() { + local DataList = []; + foreach(uuid, value in data) { + local str = format("(%d,%d,%d),", uuid, value.soul_id, value.soul_count); + DataList.push(str); + } + local sql = "REPLACE INTO soulsalvation (uid, soul_id, soul_count) VALUES"; + foreach(value in DataList) { + sql += value; + } + //去除最后一个, + sql = sql.slice(0, -1); + sql += ";"; + MysqlObject.Exec_Sql(sql); + // }.bindenv(this), { + // Cron = "0 */5 * * * *", + // Name = "SoulSalvationC" + // }); + }.bindenv(this), { + Cron = "*/5 * * * * *", + Name = "SoulSalvationC" + }); + + + ClientSocketPackFuncMap.rawset(21011007, function(SUser, Jso) { + //获取背包 + local InvenObj = SUser.GetInven(); + //装备ID + local Id = Jso.item.ItemId; + //判断是否为灵魂武器一阶段 + if (!Equipment1List.rawin(Id)) { + SUser.SendJso({ + op = 21011008, + error = 1 + }); + return; + } + + // //判断灵魂数量是否已经达到要求 + // local SlotItem = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9 + Jso.item.Pos); + // local uuid = SlotItem.GetUuid(); + // local SoulCount = 0; + // if(data.rawin(uuid)){ + // SoulCount = data[uuid].soul_count; + // } + // if(SoulCount < Stage1SoulCount){ + // SUser.SendJso({ + // op = 21011008, + // error = 2 + // }); + // return; + // } + + + local MgArr = []; + foreach(Index, Count in Equipment1Upgrade) { + //查询自己有多少个道具 + MgArr.push({ + Item = Index, + RealCount = InvenObj.GetCountById(Index), + NeedCount = Count.tointeger() + }); + } + SUser.SendJso({ + op = 21011008, + MgInfo = MgArr + }); + + }.bindenv(this)); + + + ClientSocketPackFuncMap.rawset(21011009, function(SUser, Jso) { + //获取背包 + local InvenObj = SUser.GetInven(); + //装备ID + local Id = Jso.item.ItemId; + //判断是否为灵魂武器一阶段 + if (!Equipment1List.rawin(Id)) { + SUser.SendJso({ + op = 21011008, + error = 1 + }); + return; + } + //要给予的装备ID + local giveid = Id + 1; + + //获取对应槽位的装备 + local SlotItem = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9 + Jso.item.Pos); + local uuid = SlotItem.GetUuid(); + if (SlotItem.GetIndex() != Id) { + SUser.SendNotiBox(" 升级失败 升级时请不要操作背包", 1); + return; + } else { + local MgArr = []; + foreach(Index, Count in Equipment1Upgrade) { + //查询自己有多少个道具 + MgArr.push({ + Id = Index, + Count = Count.tointeger() + }); + } + + local Flag = InvenObj.CheckArrItemCount(MgArr); + if (!Flag) { + print("扣除失败"); + SUser.SendNotiBox(" 升级失败 升级时请不要操作背包", 1); + return; + } else { + local SlogInfo = SUser.GiveItem(giveid, 1); + if (!SlogInfo) { + SUser.SendNotiBox(" 升级失败 请确定背包有空余空间", 1); + return; + } + local giveItemObj = InvenObj.GetSlot(1, SlogInfo[1]) + //扣除道具 + InvenObj.DeleteArrItemCount(MgArr); + + local forging = SlotItem.GetForging(); //锻造 + local upgrade = SlotItem.GetUpgrade(); //强化 + local amplification = SlotItem.GetAmplification(); //增幅 + local enchanting = SlotItem.GetEnchanting(); //附魔 + if (forging > 0) { + giveItemObj.SetForging(forging); + } + if (upgrade > 0) { + giveItemObj.SetUpgrade(upgrade); + } + if (amplification != 0) { + giveItemObj.SetAmplification(amplification); + } + giveItemObj.SetEnchanting(enchanting); + giveItemObj.SetAdd_Info(SlotItem.GetAdd_Info()); //品级 + giveItemObj.Flush(); + + //销毁背包中的道具 + SlotItem.Delete(); + //刷新玩家背包列表 + SUser.SendUpdateItemList(1, 0, 9 + Jso.item.Pos); + SUser.SendUpdateItemList(1, 0, SlogInfo[1]); + + //刷新 + SUser.SendNotiBox(" 升级成功", 1); + SUser.SendJso({ + op = 21011010 + }); + + //从缓存中移除这个uuid + data.rawdelete(uuid); + local Sql = "DELETE FROM soulsalvation WHERE uid = " + uuid + ";"; + MysqlObject.Exec_Sql(Sql); + } + } + }.bindenv(this)); + }; + + //获取角色的武器 + function GetUserWeapon(SUser) { + local InvenObj = SUser.GetInven(); + if (!InvenObj) return null; + return InvenObj.GetSlot(Inven.INVENTORY_TYPE_BODY, 10); + } + + //获取角色的灵魂武器信息 + function GetUserData(SUser) { + //获取背包对象 + local InvenObj = SUser.GetInven(); + if (!InvenObj) return {}; + local UUIDList = []; + //遍历身上 + for (local i = 0; i< 26; i++) { + local Inven_Item = InvenObj.GetSlot(Inven.INVENTORY_TYPE_BODY, i); + if (Inven_Item) { + local Index = Inven_Item.GetIndex(); + if (Equipment1List.rawin(Index) || Equipment2List.rawin(Index)) { + local uuid = Inven_Item.GetUuid(); + UUIDList.push(uuid); + } + } + } + //遍历物品栏 + for (local i = 0; i< 70; i++) { + local Inven_Item = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, i); + if (Inven_Item) { + local Index = Inven_Item.GetIndex(); + if (Equipment1List.rawin(Index) || Equipment2List.rawin(Index)) { + local uuid = Inven_Item.GetUuid(); + UUIDList.push(uuid); + } + } + } + local SendInfo = {}; + foreach(uuid in UUIDList) { + if (data.rawin(uuid)) { + SendInfo.rawset(uuid, data[uuid]); + } else { + data[uuid] <- { + soul_count = 0, + soul_id = 0 + }; + } + } + return SendInfo; + } + + function InitPvf() { + Script(); + ScriptData.GetFileData("etc/rindro/expandequipment/soulsalvation.etc", function(DataTable, Data) { + while (!Data.Eof()) { + local Fragment = Data.Get(); + if (Fragment == "[EQUIPMENT1]") { + Equipment1List = {}; + while (true) { + local Fbuf = Data.Get(); + if (Fbuf == "[/EQUIPMENT1]") { + break; + } + Equipment1List.rawset(Fbuf, true); + } + } else if (Fragment == "[EQUIPMENT2]") { + Equipment2List = {}; + while (true) { + local Fbuf = Data.Get(); + if (Fbuf == "[/EQUIPMENT2]") { + break; + } + Equipment2List.rawset(Fbuf, true); + } + } else if (Fragment == "[EQUIPMENT3]") { + Equipment3List = {}; + while (true) { + local Fbuf = Data.Get(); + if (Fbuf == "[/EQUIPMENT3]") { + break; + } + Equipment3List.rawset(Fbuf, true); + } + } else if (Fragment == "[STAGE1 VALUE]") { + Stage1SoulCount = Data.Get(); + } else if (Fragment == "[STAGE2 VALUE]") { + Stage2SoulCount = Data.Get(); + } else if (Fragment == "[STAGE1 NEED ITEM]") { + Equipment1Upgrade = {}; + while (true) { + local Fbuf = Data.Get(); + if (Fbuf == "[/STAGE1 NEED ITEM]") { + break; + } + Equipment1Upgrade.rawset(Fbuf, Data.Get()); + } + } + } + }.bindenv(this)); + } + + function InitMysqlData() { + local Sql = "SELECT * FROM soulsalvation" + local Ret = MysqlObject.Select(Sql, ["int", "int", "int"]); + foreach(Row in Ret) { + local uuid = Row[0]; + local soul_id = Row[1]; + local soul_count = Row[2]; + data.rawset(uuid, { + soul_id = soul_id, + soul_count = soul_count + }) + } + } +} + + + + +Timer.SetTimeOut(function() { + + getroottable()._SoulSalvation_ <- SoulSalvationC(); + print("双端插件·灵魂救赎武器 - 已加载"); +}, 1); \ No newline at end of file diff --git a/_DPS_/FileConfig.json b/_DPS_/FileConfig.json index 3f42074..6034a7f 100644 --- a/_DPS_/FileConfig.json +++ b/_DPS_/FileConfig.json @@ -83,6 +83,11 @@ "毁梦定制战力系统/毁梦定制战力系统.nut" ] }, + "毁梦定制装备继承": { + "Script": [ + "毁梦定制装备继承/毁梦定制装备继承.nut" + ] + }, "卢克": { "Script": [ "卢克/LukeClass.nut" @@ -122,6 +127,16 @@ "Script": [ "异界装备升级/异界装备升级.nut" ] + }, + "黄金哥布林袖珍罐": { + "Script": [ + "黄金哥布林袖珍罐/黄金哥布林袖珍罐.nut" + ] + }, + "誉名录": { + "Script": [ + "誉名录/誉名录.nut" + ] } } } \ No newline at end of file diff --git a/_DPS_/_Core/New_Hook.nut b/_DPS_/_Core/New_Hook.nut index 6233d73..b45efa5 100644 --- a/_DPS_/_Core/New_Hook.nut +++ b/_DPS_/_Core/New_Hook.nut @@ -745,6 +745,11 @@ Cb_CInventory_delete_item_Enter <- {}; Cb_CInventory_delete_item_Leave <- {}; _Hook_Register_Currency_Func_("0x0850400C", ["pointer", "int", "int", "int", "int", "int", "int"], Cb_CInventory_delete_item_Enter, Cb_CInventory_delete_item_Leave); +// 物品删除 CInventory::delete_item +Cb_Area_insert_user_Enter <- {}; +Cb_Area_insert_user_Leave <- {}; +_Hook_Register_Currency_Func_("0x086C25A6", ["pointer", "pointer", "void"], Cb_Area_insert_user_Enter, Cb_Area_insert_user_Leave); + function _Hook_Register_Currency_DelayHook_() { //五国时的热点函数 //获取Item Rarity