327 lines
13 KiB
Plaintext
327 lines
13 KiB
Plaintext
|
|
/*
|
||
|
|
文件名:Exchange.nut
|
||
|
|
路径:Dps_A/ProjectClass/Exchange/Exchange.nut
|
||
|
|
创建日期:2025-07-21 19:05
|
||
|
|
文件用途:
|
||
|
|
*/
|
||
|
|
|
||
|
|
class Exchange {
|
||
|
|
|
||
|
|
MysqlObject = null;
|
||
|
|
Commission = 0;
|
||
|
|
|
||
|
|
constructor() {
|
||
|
|
Script();
|
||
|
|
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,
|
||
|
|
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), 100)
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
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();
|