DP-S-Script/Dps_A/ProjectClass/Exchange/Exchange.nut

328 lines
13 KiB
Plaintext

/*
文件名:Exchange.nut
路径:Dps_A/ProjectClass/Exchange/Exchange.nut
创建日期:2025-07-21 19:05
文件用途:
*/
class Exchange {
MysqlObject = null;
Commission = 0;
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"));
SelectSql("CREATE TABLE `zyk`.`exchange` ( `uuid` int NOT NULL AUTO_INCREMENT, `type` int NULL, `itemid` int NULL, `itemcount` int NULL, `itemdata` varchar(512) NULL, `price` int NULL, `uid` int NULL , `cid` int NULL , `name` varchar(128) NULL, PRIMARY KEY (`uuid`));", []);
local Ct = ScriptData.GetFileData("etc/rindro/exchange/exchange.etc", function(DataTable, Data) {
DataTable.Attribute <- {};
while (!Data.Eof()) {
local Str = Data.Get();
if (Str == "[commission]") {
Commission = Data.Get().tofloat() * 0.01;
}
}
}.bindenv(this));
//上架商品
ClientSocketPackFuncMap.rawset(21001001, function(SUser, Jso) {
//获取玩家背包
local InvenObj = SUser.GetInven();
if (!InvenObj) {
return;
}
//获取道具
local ItemObj = InvenObj.GetSlot(1, Jso.pos + 9 + (Jso.type * 48));
if (!ItemObj) return;
//获取道具类型
ItemObj.Attribute.seek(1);
local ItemType = ItemObj.Attribute.readn('c');
//副职业材料是10 这里给转成5
if (ItemType == 10) ItemType = 5;
//获取道具Id
local ItemId = ItemObj.GetIndex();
//获取数量
local ItemCount = ItemObj.GetAdd_Info();
//如果是装备 数量恒定为1
if (ItemType == 1) ItemCount = 1;
//获取道具数据
local ItemData = "0x00";
//获取价格
local Price = Jso.value;
//获取上架者cid
local Uid = SUser.GetUID();
local Cid = SUser.GetCID();
local Name = SUser.GetCharacName();
local InfoTable = {
ItemType = ItemType,
ItemId = ItemId,
ItemCount = ItemCount,
ItemData = ItemData,
Price = Price,
Uid = Uid,
Cid = Cid,
Name = Name
}
if (ItemType == 1) {
EquipLogic(SUser, Jso.pos + 9, InfoTable, ItemObj);
return;
}
//插入数据库
local Sql = format("INSERT INTO `zyk`.`exchange` (`type`, `itemid`, `itemcount`, `itemdata`, `price`, `uid` ,`cid`,`name`) VALUES (%d, %d, %d, \'%s\', %d, %d, %d, \'%s\');", InfoTable.ItemType, InfoTable.ItemId, InfoTable.ItemCount, InfoTable.ItemData, InfoTable.Price, InfoTable.Uid, InfoTable.Cid, InfoTable.Name);
local Ret = SelectSql(Sql, []);
//删除道具
ItemObj.Delete();
//发送刷新背包消息
SUser.SendUpdateItemList(1, 1, Jso.pos + 9 + (Jso.type * 48));
SUser.SendItemSpace(0);
}.bindenv(this));
//查询上架商品
ClientSocketPackFuncMap.rawset(21001003, function(SUser, Jso) {
local Offset = Jso.offset;
local Sql = format("SELECT * FROM `zyk`.`exchange` WHERE `type` = %d LIMIT 7 OFFSET %d;", Jso.type, Offset);
local Ret = SelectSql(Sql, ["int", "int", "int", "int", "binary", "int", "int", "int", "string"]);
local CountSql = format("SELECT COUNT(*) AS total FROM `zyk`.`exchange` WHERE `type` = %d;", Jso.type);
local CountRet = SelectSql(CountSql, ["int"]);
local TotalCount = 0;
if (CountRet.len() > 0) TotalCount = CountRet[0][0];
local Pack = {};
Pack.op <- 21001004;
Pack.info <- [];
Pack.total <- TotalCount;
foreach(info in Ret) {
local T = {
uid = info[0],
itemId = info[2],
count = info[3],
price = info[5],
name = info[8]
}
Pack.info.push(T);
}
SUser.SendJso(Pack);
}.bindenv(this));
//购买商品
ClientSocketPackFuncMap.rawset(21001005, function(SUser, Jso) {
local uuid = Jso.uuid;
local Sql = format("SELECT * FROM `zyk`.`exchange` WHERE `uuid` = %d;", uuid);
local Ret = SelectSql(Sql, ["int", "int", "int", "int", "string", "int", "int", "int", "string"]);
if (Ret.len() == 0) return;
local ItemObj = null;
local ItemType = Ret[0][1];
local ItemId = Ret[0][2];
local ItemCount = Ret[0][3];
local ItemPrice = Ret[0][5];
local ItemData = Ret[0][4];
local uid = Ret[0][6];
local cid = Ret[0][7];
local SelfCid = SUser.GetCID();
if (SelfCid == cid) return;
local UserPoint = SUser.GetCera();
if (UserPoint< ItemPrice) return;
//扣除点券
SUser.RechargeCera(-ItemPrice);
//如果是装备
if (ItemType == 1) {
local ItemDataJso = Json.Decode(ItemData);
SendItemExMail(SUser.GetUID(), SUser.GetCID(), [ItemDataJso], "交易所小助手", "您在交易所购买的商品已发货,请查收!");
} else {
//发送道具
local SendInfo = SUser.GiveItem(ItemId, 1);
SUser.SendItemSpace(0);
}
//给上架者加钱
local RealItemPrice = (ItemPrice * (1.0 - Commission.tofloat()).tofloat()).tointeger();
User.SendItemMail(uid, cid, [{
// item = 2022110573,
item = 3037,
num = RealItemPrice
}], "交易所小助手", "恭喜您在交易所成功出售商品,获得点券奖励");
//删除数据库中的记录
Sql = format("DELETE FROM `zyk`.`exchange` WHERE `uuid` = %d;", uuid);
SelectSql(Sql, []);
}.bindenv(this));
Cb_Use_Item_Sp_Func[2022110573] <- function(SUser, ItemId) {
local Cid = SUser.GetCID();
local InvenObj = SUser.GetInven();
if (InvenObj) {
local SlotIdx = InvenObj.GetSlotById(ItemId);
local ItemObj = InvenObj.GetSlot(1, SlotIdx);
local ItemCount = ItemObj.GetAdd_Info();
ItemObj.Delete();
SUser.SendItemSpace(0);
SUser.RechargeCera(ItemCount);
SUser.SendNotiPacketMessage("获得交易所点卷收益: " + ItemCount + "点卷", 8);
}
}
}
function EquipLogic(SUser, slot, InfoTable, ItemObj) {
Sq_CallFunc(S_Ptr("0x0864FE52"), "int", ["pointer"], SUser.C_Object);
Timer.SetTimeOut(function() {
local SqlObj = MysqlPool.GetInstance().GetConnect();
local Ret = SqlObj.Select("SELECT inventory FROM taiwan_cain_2nd.inventory WHERE charac_no = " + SUser.GetCID() + ";", ["binary"]);
//把连接还池子
MysqlPool.GetInstance().PutConnect(SqlObj);
if (Ret.len()< 1 || Ret[0][0] == null) {
return false;
} else {
local LengthPointer = Memory.alloc(4);
LengthPointer.writeInt(18238);
local ReadPointer = Memory.alloc(18238);
local Flag = Sq_CallFunc(S_Ptr("0x086B2102"), "bool", ["pointer", "pointer", "pointer", "int"], ReadPointer.C_Object, LengthPointer.C_Object, Ret[0][0].C_Object, Ret[0][0].Size);
local RealP = ReadPointer.add(2 + slot * 61);
//装备编号
local ItemId = RealP.readInt();
// print("装备编号: " + ItemId);
//强化等级
local EnhancementLevel = RealP.add(4).readS8();
// print("强化等级: " + EnhancementLevel);
//红字类型
local AmplifyType = RealP.add(15).readS8();
// print("红字类型: " + AmplifyType);
//红字属性值
local AmplifyValue = RealP.add(16).readS8();
// print("红字属性值: " + AmplifyValue);
//锻造等级
local ForgingGrade = RealP.add(49).readS8();
// print("锻造等级: " + ForgingGrade);
//附魔卡片
local CardId = RealP.add(11).readShort();
// print("附魔卡片: " + CardId);
//品级
local Grade = RealP.add(5).readInt();
// print("品级: " + Grade);
//耐久度
local Durability = RealP.add(9).readS8();
// print("耐久度: " + Durability)
//魔法封印
local MagicSealP = "0x";
for (local i = 0; i< 14; i++) {
MagicSealP += format("%02x", RealP.add(35 + i).readU8());
}
// print(MagicSealP);
local SendT = {
ItemId = ItemId,
Grade = Grade,
Durability = Durability,
EnhancementLevel = EnhancementLevel,
AmplifyType = AmplifyType,
AmplifyValue = AmplifyValue,
MagicSealP = MagicSealP,
CardId = CardId,
}
local Json = Json.Encode(SendT);
InfoTable.ItemData = Json;
//插入数据库
local Sql = format("INSERT INTO `zyk`.`exchange` (`type`, `itemid`, `itemcount`, `itemdata`, `price`, `uid` ,`cid`,`name`) VALUES (%d, %d, %d, \'%s\', %d, %d, %d, \'%s\');", InfoTable.ItemType, InfoTable.ItemId, InfoTable.ItemCount, InfoTable.ItemData, InfoTable.Price, InfoTable.Uid, InfoTable.Cid, InfoTable.Name);
local Ret = SelectSql(Sql, []);
//删除道具
ItemObj.Delete();
//发送刷新背包消息
SUser.SendUpdateItemList(1, 1, slot);
SUser.SendItemSpace(0);
}
}.bindenv(this), 1)
}
function SendItemExMail(UID, CID, ItemList, title, content) {
local SUser = World.GetUserByUid(UID);
local sql = "select letter_id from taiwan_cain_2nd.postal order by letter_id DESC";
local column_type_list = ["int"];
local SqlObj = MysqlPool.GetInstance().GetConnect();
local result = SqlObj.Select(sql, column_type_list);
local sl = 1;
if (result.len() > 0) {
sl = result[0][0] + 1;
}
local time = date();
local timeStr = time["year"] + "-" + (time["month"] + 1) + "-" + time["day"] + " " + time["hour"] + ":" + time["min"] + ":" + time["sec"];
foreach(value in ItemList) {
//时间 发送者名字 接收者id 装备ID 品级 耐久度 强化等级 红字类型 红字属性值 魔法封印属性 letterid
local sql1 = format("insert into taiwan_cain_2nd.postal (occ_time,send_charac_name,receive_charac_no,item_id,add_info,endurance,upgrade,amplify_option,amplify_value,random_option,letter_id,extend_info) values ('%s','%s',%d,%d,%d,%d,%d,%d,%d,%s,%d,%d)", timeStr, title, CID, value.ItemId, value.Grade, value.Durability, value.EnhancementLevel, value.AmplifyType, value.AmplifyValue, value.MagicSealP, sl, value.CardId)
SqlObj.Select(sql1, []);
}
local sql2 = "insert into taiwan_cain_2nd.letter (letter_id,charac_no,send_charac_name,letter_text,reg_date,stat) values ('" + sl + "'," + CID + ",'" + title + "','" + content + "','" + timeStr + "','1')";
SqlObj.Select(sql2, []);
MysqlPool.GetInstance().PutConnect(SqlObj);
// if (SUser) {
// local Pack = Packet();
// Pack.Put_Header(0, 9);
// local MailBox = Sq_CallFunc(S_Ptr("0x0823020C"), "int", ["pointer"], SUser.C_Object);
// Sq_CallFunc(S_Ptr("0x0823455A"), "int", ["int"], MailBox);
// local Not_Count = Sq_CallFunc(S_Ptr("0x084ED330"), "int", ["int"], MailBox);
// Pack.Put_Short(Not_Count);
// Pack.Finalize(true);
// SUser.Send(Pack);
// Pack.Delete();
// }
}
//执行数据库命令
function SelectSql(Sql, Type) {
local Ret = MysqlObject.Select(Sql, Type);
return Ret;
}
}
ProjectInitFuncMap.P_Exchange <- Exchange();