/* 文件名:换装系统.nut 路径:_DPS_/_BuiltProject/换装系统/换装系统.nut 创建日期:2026-03-02 04:16 文件用途: */ class OutfitSystem { MysqlObject = null; ItemSlot = [ [0, 13], //护肩 [0, 14], //下装 [0, 15], //鞋子 [0, 12], //上衣 [0, 16], //腰带 [0, 10], //武器 [0, 18], //手镯 [0, 20], //辅助装备 [-1, -1], //耳环 [0, 11], //称号 [0, 17], //项链 [0, 19], //戒指 [0, 21], //魔法石 [-1, -1], //武器装扮 [1, 9], //光环 [1, 1], //头部 [1, 6], //胸部 [1, 7], //腰部 [1, 0], //帽子 [1, 3], //上衣 [1, 4], //下装 [1, 2], //脸部 [1, 8], //皮肤 [1, 5], //鞋 [2, 22] //宠物 ]; constructor() { 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 = 'OutfitSystem';" local Ret = MysqlObject.Select(check_table_sql, ["int"]); if (Ret.len() == 0 || Ret[0][0] == 0) { local sql = "CREATE TABLE OutfitSystem (cid VARCHAR(128) NOT NULL COMMENT '角色CID', info VARCHAR(512) NOT NULL COMMENT '信息字符串', PRIMARY KEY (cid)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '角色换装信息表';"; MysqlObject.Exec_Sql(sql); } //记录装备 ClientSocketPackFuncMap.rawset(21015001, function(SUser, Jso) { local Slot = Jso.Slot; local EquipInfo = Json.Encode(Jso.EquipInfo); local SetKey = format("%d_%d", SUser.GetCID(), Slot); MysqlObject.Exec_Sql(format("INSERT INTO OutfitSystem (cid, info) VALUES ('%s', '%s') ON DUPLICATE KEY UPDATE info = '%s';", SetKey, EquipInfo, EquipInfo)); }.bindenv(this)); //清空装备 ClientSocketPackFuncMap.rawset(21015005, function(SUser, Jso) { local Slot = Jso.Slot; local SetKey = format("%d_%d", SUser.GetCID(), Slot); MysqlObject.Exec_Sql(format("DELETE FROM OutfitSystem WHERE cid = '%s';", SetKey)); }.bindenv(this)); //查询配置 ClientSocketPackFuncMap.rawset(21015003, function(SUser, Jso) { local Slot = Jso.Slot; local SetKey = format("%d_%d", SUser.GetCID(), Slot); local Ret = MysqlObject.Select(format("SELECT info FROM OutfitSystem WHERE cid = '%s';", SetKey), ["string"]); if (Ret.len() == 0) { SUser.SendJso({ op = 21015004, Slot = Slot, EquipInfo = null }); } else { SUser.SendJso({ op = 21015004, Slot = Slot, EquipInfo = Json.Decode(Ret[0][0]) }); } }.bindenv(this)); //换装请求 Gm_InputFunc_Handle["HZ"] <- function(SUser, CmdString) { local count = -1; local pos = 0; local handler = []; do { local start = pos; pos = CmdString.find(" ", pos + 1); if (pos != null) { handler.append(CmdString.slice(start + 1, pos)); } else handler.append(CmdString.slice(start + 1)); count = count + 1 } while (pos != null) //得到空格数量 if (count != 1) return; local Slot = handler[1].tointeger() - 1; local SetKey = format("%d_%d", SUser.GetCID(), Slot); local Ret = MysqlObject.Select(format("SELECT info FROM OutfitSystem WHERE cid = '%s';", SetKey), ["string"]); if (Ret.len() != 0) { local EquipInfoList = Json.Decode(Ret[0][0]); local ChangeFlag = true; foreach(_Index, EquipInfo in EquipInfoList) { local EquipIndex = EquipInfo[0]; //没有装备 if (EquipIndex == 0) continue; //耳环和武器装扮 if (ItemSlot[_Index][0] == -1) continue; //寻找符合的装备 local Flag = ChanageEquip(SUser, ItemSlot[_Index], EquipInfo); if(!Flag) ChangeFlag = false; } Sq_CallFunc(S_Ptr("0x0867ba5c"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 0, 2, 0); Sq_CallFunc(S_Ptr("0x0867ba5c"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 1, 2, 1); Sq_CallFunc(S_Ptr("0x0867ba5c"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 7, 2, 7); SUser.SendItemSpace(7); SUser.SendItemSpace(1); SUser.SendItemSpace(0); if(ChangeFlag) { SUser.SendNotiPacketMessage("换装成功!", 8); } } else { } }.bindenv(this); } function ChanageEquip(SUser, SlotInfo, EquipInfo) { local InvenObj = SUser.GetInven(); local EquipIndex = EquipInfo[0]; local Upgrade = EquipInfo[1]; local Amplification = EquipInfo[2]; local Forging = EquipInfo[3]; local Enchanting = EquipInfo[4]; local StartIndex = 0; local EndIndex = 0; local FindType = 0; //装备 if (SlotInfo[0] == 0) { StartIndex = 3; EndIndex = 56; FindType = 1; } //时装 else if (SlotInfo[0] == 1) { StartIndex = 0; EndIndex = 104; FindType = 2; } //宠物 else if (SlotInfo[0] == 2) { StartIndex = 0; EndIndex = 104; FindType = 3; } for (local i = StartIndex; i< EndIndex; i++) { local Inven_Item = InvenObj.GetSlot(FindType, i); if (Inven_Item) { local Index = Inven_Item.GetIndex(); if (Index == EquipIndex) { //对比属性 local EquipUpgrade = Inven_Item.GetUpgrade(); local EquipAmplification = Inven_Item.GetAmplification(); local EquipForging = Inven_Item.GetForging(); local EquipEnchanting = Inven_Item.GetEnchanting(); // if (EquipUpgrade == Upgrade && EquipAmplification == Amplification && EquipForging == Forging && EquipEnchanting == Enchanting) { //对比成功 if (SlotInfo[0] == 2) { Sq_CallFunc(S_Ptr("0x08500688"), "int", ["pointer", "int", "int", "int", "int"], InvenObj.C_Object, 3, i, 0, 22); return true; } else { //装备和时装 Sq_CallFunc(S_Ptr("0x0865EED2"), "int", ["pointer", "int", "short", "int"], SUser.C_Object, SlotInfo[0], i, SlotInfo[1]); return true; } // } } } } } } Timer.SetTimeOut(function() { getroottable()._OutfitSystem_ <- OutfitSystem(); print("换装系统 - 已加载"); /* 对于宠物的更换 走的不是装备的变更逻辑 //move item Sq_CallFunc(S_Ptr("0x08500688"), "int", ["pointer", "int", "int", "int", "int"], InvenObj.C_Object, 3, 0, 0, 22); //刷新宠物 Sq_CallFunc(S_Ptr("0x0867ba5c"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 1, 2, 1); //刷新宠物背包 SUser.SendItemSpace(7); */ }, 1);