DP-S_Script/_DPS_/_BuiltProject/换装系统/换装系统.nut

211 lines
7.8 KiB
Plaintext

/*
文件名:换装系统.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);