111
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
创建日期:2024-05-01 16:24
|
||||
文件用途:服务端核心类
|
||||
*/
|
||||
Dps_Self_Ip <- "192.168.200.110";
|
||||
function removeBackslashes(str) {
|
||||
local result = "";
|
||||
local index = 0;
|
||||
@@ -91,6 +92,12 @@ class ServerControl {
|
||||
}.bindenv(this));
|
||||
|
||||
|
||||
//获得本服务器的IP
|
||||
GatewaySocketPackFuncMap.rawset(10002, function(Jso) {
|
||||
print(Jso);
|
||||
Dps_Self_Ip = Jso.myip;
|
||||
}.bindenv(this));
|
||||
|
||||
|
||||
//给查询指定uid cid列表的玩家信息
|
||||
GatewaySocketPackFuncMap.rawset(2023101902, function(Jso) {
|
||||
@@ -359,8 +366,17 @@ class ServerControl {
|
||||
local ItemId = Jso.itemid;
|
||||
local num = 0;
|
||||
if (SUser) {
|
||||
|
||||
|
||||
local InvenObj = SUser.GetInven();
|
||||
//获取背包对象
|
||||
local InvenObj = SUser.GetInven();
|
||||
if(ItemId == 0){
|
||||
|
||||
num = InvenObj.GetMoney();
|
||||
|
||||
|
||||
}else{
|
||||
|
||||
local SlotIdx = InvenObj.GetSlotById(ItemId);
|
||||
|
||||
local SlotItem = InvenObj.GetSlot(1, SlotIdx);
|
||||
@@ -375,7 +391,6 @@ class ServerControl {
|
||||
return;
|
||||
}
|
||||
|
||||
print(num);
|
||||
for (local i = 0; i< 120; i++) {
|
||||
local ItemObj = InvenObj.GetSlot(3, i);
|
||||
if (ItemObj != null && ItemObj.GetIndex() == ItemId) {
|
||||
@@ -387,7 +402,7 @@ class ServerControl {
|
||||
num++;
|
||||
}
|
||||
};
|
||||
print(num);
|
||||
}
|
||||
}
|
||||
|
||||
Jso.Count <- num;
|
||||
@@ -741,9 +756,7 @@ class ServerControl {
|
||||
//给注册玩家通关副本
|
||||
GatewaySocketPackFuncMap.rawset(2023110704, function(Jso) {
|
||||
local RealOp = Jso.realop;
|
||||
print("注册副本了");
|
||||
Cb_ClearDungeon_Enter_Func[RealOp] <- function(arg) {
|
||||
print("通关副本了");
|
||||
local PartyObj = Party(arg[0]);
|
||||
if (PartyObj) {
|
||||
local Bfobj = PartyObj.GetBattleField();
|
||||
@@ -839,6 +852,7 @@ class ServerControl {
|
||||
}
|
||||
Socket.SendGateway(T);
|
||||
}
|
||||
|
||||
//玩家上线
|
||||
Cb_reach_game_world_Func["Rindro_player_reach_game_world"] <- function(SUser) {
|
||||
local T = {
|
||||
@@ -1013,7 +1027,6 @@ class ServerControl {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Cb_GetUserInfo_Leave_Func.ServerControl <- function(args) {
|
||||
if (args.pop() >= 0) {
|
||||
local SUser = User(args[1]);
|
||||
|
||||
328
Dps_A/ProjectClass/Exchange/Exchange.nut
Normal file
328
Dps_A/ProjectClass/Exchange/Exchange.nut
Normal file
@@ -0,0 +1,328 @@
|
||||
/*
|
||||
文件名: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();
|
||||
604
Dps_A/ProjectClass/FatalismStone/FatalismStone.nut
Normal file
604
Dps_A/ProjectClass/FatalismStone/FatalismStone.nut
Normal file
@@ -0,0 +1,604 @@
|
||||
/*
|
||||
文件名:FatalismStone.nut
|
||||
路径:Dps_A/ProjectClass/FatalismStone/FatalismStone.nut
|
||||
创建日期:2025-06-22 12:54
|
||||
文件用途:
|
||||
*/
|
||||
|
||||
|
||||
class FatalismStone_Stone {
|
||||
//编号
|
||||
Id = null;
|
||||
//唯一ID
|
||||
Uuid = null;
|
||||
//类型
|
||||
StoneType = null;
|
||||
//洗练度
|
||||
CultivationDegree = null;
|
||||
|
||||
|
||||
constructor() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//反序列化构造
|
||||
function Deserialize(StoneId, StoneUuid) {
|
||||
this.Id = StoneId;
|
||||
this.Uuid = StoneUuid;
|
||||
this.StoneType = ProjectInitFuncMap.P_FatalismStone.GetStoneData(this.Id)["stone type"];
|
||||
}
|
||||
|
||||
function Blob2Hex(buf) {
|
||||
local str = "";
|
||||
for (local i = 0; i< buf.len(); i++) {
|
||||
str += format("%02X", buf[i]);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function Serialize() {
|
||||
local B = blob(0);
|
||||
B.writen(Id, 'i'); //写入ID
|
||||
B.writen(Uuid, 'i'); //写入Uuid
|
||||
return Blob2Hex(B);
|
||||
}
|
||||
}
|
||||
|
||||
//魂石背包类
|
||||
class FatalismStone_BackPack {
|
||||
|
||||
//背包总格子数
|
||||
GridCount = 77;
|
||||
//穿戴总格子数
|
||||
WearCount = 6;
|
||||
StoneArr = null;
|
||||
|
||||
constructor() {
|
||||
StoneArr = [];
|
||||
}
|
||||
|
||||
//通过数据构造背包 反序列化
|
||||
function Deserialize(N_Data) {
|
||||
local BackpackData = N_Data[0][0];
|
||||
local WearData = N_Data[0][1];
|
||||
|
||||
//转换背包数据
|
||||
local BackPackArr = [];
|
||||
for (local i = 0; i<(GridCount * 3); i++) {
|
||||
local StoneId = BackpackData.add(i * 8).readInt();
|
||||
local StoneUuid = BackpackData.add(i * 8 + 4).readInt();
|
||||
if (StoneId != 0 && StoneUuid != 0) {
|
||||
local StoneObj = FatalismStone_Stone();
|
||||
StoneObj.Deserialize(StoneId, StoneUuid)
|
||||
BackPackArr.push(StoneObj);
|
||||
} else {
|
||||
BackPackArr.push(null);
|
||||
}
|
||||
}
|
||||
//转化穿戴数据
|
||||
local WearArr = [];
|
||||
for (local i = 0; i< WearCount; i++) {
|
||||
local StoneId = WearData.add(i * 8).readInt();
|
||||
local StoneUuid = WearData.add(i * 8 + 4).readInt();
|
||||
if (StoneId != 0 && StoneUuid != 0) {
|
||||
local StoneObj = FatalismStone_Stone();
|
||||
StoneObj.Deserialize(StoneId, StoneUuid)
|
||||
WearArr.push(StoneObj);
|
||||
} else {
|
||||
WearArr.push(null);
|
||||
}
|
||||
}
|
||||
|
||||
//两段数据放入总数据
|
||||
StoneArr.extend(BackPackArr);
|
||||
StoneArr.extend(WearArr);
|
||||
}
|
||||
|
||||
//序列化
|
||||
function Serialize() {
|
||||
//背包数据
|
||||
local BackpackArr = StoneArr.slice(0, GridCount * 3);
|
||||
local BackpackHex = "0x";
|
||||
foreach(Pos, StoneObject in BackpackArr) {
|
||||
if (StoneObject) BackpackHex += StoneObject.Serialize();
|
||||
else BackpackHex += "0000000000000000";
|
||||
}
|
||||
//穿戴数据
|
||||
local WearArr = StoneArr.slice(GridCount * 3, GridCount * 3 + WearCount);
|
||||
local WearHex = "0x";
|
||||
foreach(Pos, StoneObject in WearArr) {
|
||||
if (StoneObject) WearHex += StoneObject.Serialize();
|
||||
else WearHex += "0000000000000000";
|
||||
}
|
||||
//返回
|
||||
return {
|
||||
inventory = BackpackHex,
|
||||
wear = WearHex
|
||||
};
|
||||
}
|
||||
|
||||
//获取魂石的列表 3为身上穿戴的
|
||||
function GetList(Page) {
|
||||
local SliceLength = GridCount;
|
||||
if (Page == 3) SliceLength = WearCount;
|
||||
return StoneArr.slice(Page * 77, Page * 77 + SliceLength);
|
||||
}
|
||||
}
|
||||
|
||||
class FatalismStone {
|
||||
|
||||
//总格子数
|
||||
GridCount = 77;
|
||||
//总穿戴数
|
||||
WearCount = 6;
|
||||
|
||||
//属性数据位数
|
||||
AttrCount = 2;
|
||||
|
||||
//魂石Lst
|
||||
FatalismStoneLst = null;
|
||||
//魂石配置
|
||||
FatalismStoneConfig = null;
|
||||
|
||||
constructor() {
|
||||
Script();
|
||||
local PoolObj = MysqlPool.GetInstance();
|
||||
PoolObj.SetBaseConfiguration("127.0.0.1", 3306, "game", "uu5!^%jg");
|
||||
//连接池大小
|
||||
PoolObj.PoolSize = 10;
|
||||
//初始化
|
||||
PoolObj.Init();
|
||||
|
||||
//读取pvf的魂石相关数据
|
||||
InitFatalismStoneData();
|
||||
|
||||
//创建新架构表
|
||||
SelectSql("CREATE TABLE `zyk`.`f_user_info` ( `cid` int(250) NOT NULL, `inventory` varbinary(1848) NULL, `wear` varbinary(48) NULL, PRIMARY KEY (`cid`));", []);
|
||||
SelectSql("CREATE TABLE `zyk`.`f_stone_map` ( `uuid` int(250) NOT NULL AUTO_INCREMENT, `cultivation` float NULL DEFAULT NULL, PRIMARY KEY (`uuid`) USING BTREE);", []);
|
||||
// UpdateNewMysqlData();
|
||||
|
||||
|
||||
|
||||
//注册客户端收包
|
||||
RegisterClient();
|
||||
//注册调试命令
|
||||
RegisterDebugCmd();
|
||||
}
|
||||
|
||||
|
||||
//查询单个魂石的属性
|
||||
function GetStoneAttr(Uuid) {
|
||||
local Ret = SelectSql("select cultivation from zyk.f_stone_map where uuid = " + Uuid, ["float"]);
|
||||
if (Ret.len() == 0) {
|
||||
return null;
|
||||
} else {
|
||||
return Ret[0];
|
||||
}
|
||||
}
|
||||
|
||||
//查询多个魂石的属性
|
||||
function GetStoneAttrArr(UuidArr) {
|
||||
local SqlStr = "select uuid,cultivation from zyk.f_stone_map where uuid in (";
|
||||
for (local i = 0; i< UuidArr.len(); i++) {
|
||||
SqlStr += UuidArr[i];
|
||||
if (i != UuidArr.len() - 1) {
|
||||
SqlStr += ",";
|
||||
}
|
||||
}
|
||||
SqlStr += ")";
|
||||
local Ret = SelectSql(SqlStr, ["int", "float"]);
|
||||
if (Ret.len() == 0) {
|
||||
return null;
|
||||
} else {
|
||||
return Ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function RegisterClient() {
|
||||
|
||||
//查询魂石背包数据
|
||||
ClientSocketPackFuncMap.rawset(21000001, function(SUser, Jso) {
|
||||
local Ret = GetInvenData(SUser);
|
||||
//没查到东西说明没有背包 第一次创建背包
|
||||
if (Ret.len() == 0) {
|
||||
local SqlStr = format("INSERT INTO zyk.f_user_info (cid, inventory, wear) VALUES (%d,REPEAT(0x00, 1848),REPEAT(0x00, 48))", SUser.GetCID());
|
||||
SelectSql(SqlStr, []);
|
||||
}
|
||||
//有数据的读取
|
||||
else {
|
||||
local BackPackData = Ret[0][0];
|
||||
local WearData = Ret[0][1];
|
||||
local PackSize = 4 + 4 + BackPackData.Size + 4 + WearData.Size;
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(1, 131);
|
||||
Pack.Put_Byte(1);
|
||||
Pack.Put_Int(PackSize);
|
||||
Pack.Put_Int(21000002);
|
||||
Pack.Put_Int(BackPackData.Size);
|
||||
Pack.Put_BinaryEx(BackPackData.C_Object, BackPackData.Size);
|
||||
Pack.Put_Int(WearData.Size);
|
||||
Pack.Put_BinaryEx(WearData.C_Object, WearData.Size);
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
|
||||
//查询身上穿戴的魂石属性
|
||||
local BackPack = FatalismStone_BackPack();
|
||||
BackPack.Deserialize(Ret);
|
||||
local WearArr = BackPack.GetList(3);
|
||||
local UuidArr = [];
|
||||
for (local i = 0; i< WearArr.len(); i++) {
|
||||
if (WearArr[i] != null) {
|
||||
UuidArr.push(WearArr[i].Uuid);
|
||||
}
|
||||
}
|
||||
if (UuidArr.len() > 0) {
|
||||
local Attr = GetStoneAttrArr(UuidArr);
|
||||
if (Attr) {
|
||||
local PackSize = 4 + 4 + (Attr.len() * 4 * Attr[0].len());
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(1, 131);
|
||||
Pack.Put_Byte(1);
|
||||
Pack.Put_Int(PackSize);
|
||||
Pack.Put_Int(21000014);
|
||||
Pack.Put_Int(Attr.len());
|
||||
for (local i = 0; i< Attr.len(); i++) {
|
||||
for (local z = 0; z< Attr[i].len(); z++) {
|
||||
Pack.Put_Int(Attr[i][z]);
|
||||
}
|
||||
}
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
}.bindenv(this));
|
||||
|
||||
//查询魂石唯一属性
|
||||
ClientSocketPackFuncMap.rawset(21000011, function(SUser, Jso) {
|
||||
local Uuid = Jso.uuid;
|
||||
SendFatalismStoneData(SUser, Uuid);
|
||||
}.bindenv(this));
|
||||
|
||||
//交换魂石位置
|
||||
ClientSocketPackFuncMap.rawset(21000003, function(SUser, Jso) {
|
||||
local OldType = Jso.oldtype;
|
||||
local OldIndex = Jso.oldpos;
|
||||
|
||||
local NewType = Jso.newtype;
|
||||
local NewIndex = Jso.newpos;
|
||||
|
||||
local BackPack = GetInven(SUser);
|
||||
if (!BackPack) return;
|
||||
|
||||
//直接去交换位置
|
||||
local Buffer = BackPack.StoneArr[OldType * 77 + OldIndex];
|
||||
BackPack.StoneArr[OldType * 77 + OldIndex] = BackPack.StoneArr[NewType * 77 + NewIndex];
|
||||
BackPack.StoneArr[NewType * 77 + NewIndex] = Buffer;
|
||||
|
||||
SaveInven(BackPack, SUser);
|
||||
}.bindenv(this));
|
||||
|
||||
//魂石洗练
|
||||
ClientSocketPackFuncMap.rawset(21000005, function(SUser, Jso) {
|
||||
local Uuid = Jso.uuid;
|
||||
local rarity = Jso.rarity;
|
||||
//获取背包对象
|
||||
local InvenObj = SUser.GetInven();
|
||||
local Flag = InvenObj.DeleteItemCount(FatalismStoneConfig["wash_item"], FatalismStoneConfig["wash_cost"][rarity]);
|
||||
//扣除不成功
|
||||
if (!Flag) {
|
||||
SUser.SendNotiPacketMessage("精炼魂石所需的材料不足!", 8);
|
||||
return;
|
||||
}
|
||||
|
||||
local Rand = MathClass.Rand(1, 105);
|
||||
if (Rand > 100) Rand = 100;
|
||||
|
||||
//将新的精炼值写入数据库
|
||||
local Sql = "update zyk.f_stone_map set cultivation = " + Rand + " where uuid = " + Uuid;
|
||||
SelectSql(Sql, []);
|
||||
SendFatalismStoneData(SUser, Uuid)
|
||||
}.bindenv(this));
|
||||
|
||||
Cb_User_Insert_Item_Leave_Func["宿命魂石"] <- function(args) {
|
||||
local SUser = User(NativePointer(args[0]).readPointer());
|
||||
local InvenObj = SUser.GetInven();
|
||||
local idx = args.pop();
|
||||
if (idx > 0) {
|
||||
local inven_item = InvenObj.GetSlot(1, idx);
|
||||
local item_id = inven_item.GetIndex();
|
||||
if (item_id >= 200625000 && item_id< 200626000) {
|
||||
local Ret = AddFatalismStone(SUser, item_id - 200625000);
|
||||
//删除原道具
|
||||
Timer.SetTimeOut(function() {
|
||||
inven_item.Delete();
|
||||
SUser.SendUpdateItemList(1, 0, idx);
|
||||
}, 1000);
|
||||
//如果满了就发邮件
|
||||
if (!Ret) {
|
||||
local T = {};
|
||||
T.rawset(item_id, 1);
|
||||
SUser.SendMail(T, {
|
||||
Title = "系统",
|
||||
Text = "由于你的魂石包裹已满, 请留出足够的空间来接收道具."
|
||||
});
|
||||
}
|
||||
SUser.SendItemSpace(0);
|
||||
}
|
||||
}
|
||||
}.bindenv(this);
|
||||
}
|
||||
|
||||
|
||||
function RegisterDebugCmd() {
|
||||
Gm_InputFunc_Handle["给魂石"] <- 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) {
|
||||
AddFatalismStone(SUser, handler[1].tointeger());
|
||||
}
|
||||
}.bindenv(this);
|
||||
}
|
||||
|
||||
//获取玩家背包数据
|
||||
function GetInvenData(SUser) {
|
||||
local Ret = SelectSql("select inventory,wear from zyk.f_user_info where cid = " + SUser.GetCID(), ["binary", "binary"]);
|
||||
if (!Ret || Ret.len() == 0) return null;
|
||||
else return Ret;
|
||||
}
|
||||
|
||||
//获取玩家背包
|
||||
function GetInven(SUser) {
|
||||
local Ret = GetInvenData(SUser);
|
||||
if (Ret) {
|
||||
local BackPack = FatalismStone_BackPack();
|
||||
BackPack.Deserialize(Ret);
|
||||
return BackPack;
|
||||
} else return null;
|
||||
}
|
||||
|
||||
//固化背包数据到数据库
|
||||
function SaveInven(Inven, SUser) {
|
||||
//获取背包整体信息并储存
|
||||
local Hex = Inven.Serialize();
|
||||
//更新数据库
|
||||
local Sql = "update zyk.f_user_info set inventory = " + Hex.inventory + ",wear = " + Hex.wear + " where cid = " + SUser.GetCID();
|
||||
SelectSql(Sql, []);
|
||||
}
|
||||
|
||||
//发送uuid的魂石数据给客户端
|
||||
function SendFatalismStoneData(SUser, Uuid) {
|
||||
local Attr = GetStoneAttr(Uuid);
|
||||
if (!Attr) {
|
||||
SUser.SendNotiPacketMessage("魂石属性异常,请联系管理员!", 8);
|
||||
} else {
|
||||
local Cultivation = Attr[0];
|
||||
local PackSize = 4 + 4 + 4;
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(1, 131);
|
||||
Pack.Put_Byte(1);
|
||||
Pack.Put_Int(PackSize);
|
||||
Pack.Put_Int(21000012);
|
||||
Pack.Put_Int(Uuid);
|
||||
Pack.Put_Int(Cultivation);
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
}
|
||||
}
|
||||
|
||||
//给指定玩家新增魂石
|
||||
function AddFatalismStone(SUser, FatalismStoneID) {
|
||||
local CID = SUser.GetCID();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
function InitFatalismStoneData() {
|
||||
// Script();
|
||||
FatalismStoneLst = {};
|
||||
ScriptData.GetFileData("fatalismstone/fatalismstone.lst", function(DataTable, Data) {
|
||||
while (!Data.Eof()) {
|
||||
local Id = Data.Get();
|
||||
local Path = Data.Get();
|
||||
FatalismStoneLst.rawset(Id, Path);
|
||||
}
|
||||
}.bindenv(this));
|
||||
|
||||
FatalismStoneConfig = ScriptData.GetFileData("fatalismstone/fatalismstone.etc", function(DataTable, Data) {
|
||||
while (!Data.Eof()) {
|
||||
local Str = Data.Get();
|
||||
if (Str == "[wash item]") {
|
||||
DataTable.wash_item <- Data.Get();
|
||||
} else if (Str == "[wash cost]") {
|
||||
DataTable.wash_cost <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()];
|
||||
}
|
||||
}
|
||||
}.bindenv(this));
|
||||
}
|
||||
|
||||
function GetStoneData(Index) {
|
||||
if (FatalismStoneLst.rawin(Index)) {
|
||||
//还是路径就读取数据
|
||||
if (typeof FatalismStoneLst[Index] == "string") {
|
||||
FatalismStoneLst[Index] = ScriptData.GetFileData("fatalismstone/" + FatalismStoneLst[Index], function(DataTable, Data) {
|
||||
DataTable.Attribute <- {};
|
||||
while (!Data.Eof()) {
|
||||
local Key = Data.Get();
|
||||
if (Key == "[rarity]" || Key == "[stone type]" || Key == "[move wav]" || Key == "[front effect]" || Key == "[back effect]") {
|
||||
DataTable[Key.slice(1, -1)] <- Data.Get();
|
||||
} else if (Key == "[icon]") {
|
||||
DataTable.icon <- {
|
||||
img = Data.Get(),
|
||||
index = Data.Get()
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return FatalismStoneLst[Index];
|
||||
} else error("没有ID为: " + Index + " 的魂石数据!");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//执行数据库命令
|
||||
function SelectSql(Sql, Type) {
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
local Ret = SqlObj.Select(Sql, Type);
|
||||
//把连接还池子
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//UpdateNewMysqlData
|
||||
function UpdateNewMysqlData() {
|
||||
|
||||
local Ret = SelectSql("select * from zyk.fatalismstone", ["int", "binary", "binary"]);
|
||||
|
||||
foreach(Index, Info in Ret) {
|
||||
local cid = Info[0];
|
||||
local inventory = Info[1];
|
||||
local wear = Info[2];
|
||||
|
||||
//处理背包里的魂石
|
||||
local NewBlob = blob();
|
||||
for (local i = 0; i< 462; i += 2) {
|
||||
local item_id = inventory.add(i * 4).readInt();
|
||||
local cultivation = inventory.add(i * 4 + 4).readInt();
|
||||
if (item_id > 0) {
|
||||
//在新表中建立这件装备的uuid
|
||||
local Sql = "insert into zyk.f_stone_map (cultivation) values (" + cultivation + ")";
|
||||
SelectSql(Sql, []);
|
||||
//查询最后新增条目的uuid
|
||||
Sql = "select LAST_INSERT_ID() as uuid";
|
||||
local uuid = SelectSql(Sql, ["int"])[0][0];
|
||||
|
||||
NewBlob.writen(item_id, 'i');
|
||||
NewBlob.writen(uuid, 'i');
|
||||
} else {
|
||||
NewBlob.writen(0, 'i');
|
||||
NewBlob.writen(0, 'i');
|
||||
}
|
||||
}
|
||||
local inventoryBinary = "0x" + Blob2Hex(NewBlob);
|
||||
|
||||
//处理身上穿戴的魂石
|
||||
NewBlob.resize(0);
|
||||
for (local i = 0; i< 12; i += 2) {
|
||||
local item_id = wear.add(i * 4).readInt();
|
||||
print(item_id);
|
||||
|
||||
local cultivation = wear.add(i * 4 + 4).readInt();
|
||||
if (item_id > 0) {
|
||||
//在新表中建立这件装备的uuid
|
||||
local Sql = "insert into zyk.f_stone_map (cultivation) values (" + cultivation + ")";
|
||||
SelectSql(Sql, []);
|
||||
//查询最后新增条目的uuid
|
||||
Sql = "select LAST_INSERT_ID() as uuid";
|
||||
local uuid = SelectSql(Sql, ["int"])[0][0];
|
||||
|
||||
NewBlob.writen(item_id, 'i');
|
||||
NewBlob.writen(uuid, 'i');
|
||||
} else {
|
||||
NewBlob.writen(0, 'i');
|
||||
NewBlob.writen(0, 'i');
|
||||
}
|
||||
}
|
||||
local wearBinary = "0x" + Blob2Hex(NewBlob);
|
||||
|
||||
local Sql = "insert into zyk.f_user_info (cid,inventory, wear) values (" + cid + "," + inventoryBinary + "," + wearBinary + ")";
|
||||
SelectSql(Sql, []);
|
||||
}
|
||||
}
|
||||
|
||||
function Blob2Hex(buf) {
|
||||
local str = "";
|
||||
for (local i = 0; i< buf.len(); i++) {
|
||||
str += format("%02X", buf[i]);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
ProjectInitFuncMap.P_FatalismStone <- FatalismStone();
|
||||
@@ -9,7 +9,7 @@ function _Hook_Enter_Currency_Func_(args, TableObj) {
|
||||
local Ret = null;
|
||||
foreach(Func in TableObj) {
|
||||
local Buf = Func(args);
|
||||
if (Buf != null) Ret = Buf;
|
||||
if (Buf) Ret = Buf;
|
||||
}
|
||||
return Ret;
|
||||
}
|
||||
@@ -18,7 +18,7 @@ function _Hook_Leave_Currency_Func_(args, TableObj) {
|
||||
local Ret = null;
|
||||
foreach(Func in TableObj) {
|
||||
local Buf = Func(args);
|
||||
if (Buf != null) Ret = Buf;
|
||||
if (Buf) Ret = Buf;
|
||||
}
|
||||
return Ret;
|
||||
}
|
||||
@@ -81,7 +81,7 @@ _Hook_Register_Currency_Func_("0x866A3FE", ["pointer", "int", "int", "int", "int
|
||||
//货币收益
|
||||
Cb_Gain_Money_Enter_Func <- {};
|
||||
Cb_Gain_Money_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x84FF29C", ["int", "int", "char", "int", "int"], Cb_Gain_Money_Enter_Func, Cb_Gain_Money_Leave_Func);
|
||||
_Hook_Register_Currency_Func_("0x84FF29C", ["pointer", "int", "char", "int", "int"], Cb_Gain_Money_Enter_Func, Cb_Gain_Money_Leave_Func);
|
||||
|
||||
//GetItem检查错误
|
||||
Cb_GetItem_Check_Error_Enter_Func <- {};
|
||||
@@ -457,21 +457,29 @@ Cb_User_TOD_UserState_getLastClearTime_Enter_Func <- {};
|
||||
Cb_User_TOD_UserState_getLastClearTime_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x864387E", ["pointer"], Cb_User_TOD_UserState_getLastClearTime_Enter_Func, Cb_User_TOD_UserState_getLastClearTime_Leave_Func);
|
||||
|
||||
//时装填充 提供者: ZZ
|
||||
Cb_AradUseAvatarRecharge_Enter_Func <- {};
|
||||
Cb_AradUseAvatarRecharge_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x0819FA56", ["pointer", "pointer", "pointer"], Cb_AradUseAvatarRecharge_Enter_Func, Cb_AradUseAvatarRecharge_Leave_Func);
|
||||
|
||||
//物品随机品级 提供者: 凌众
|
||||
Cb_CItem_IsRoutingItem_Enter_Func <- {};
|
||||
Cb_CItem_IsRoutingItem_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x08150f18", ["pointer", "int"], Cb_CItem_IsRoutingItem_Enter_Func, Cb_CItem_IsRoutingItem_Leave_Func);
|
||||
|
||||
//调整箱使用
|
||||
//调整箱使用 提供者: 凌众
|
||||
Cb_ModItemattr_Enter_Func <- {};
|
||||
Cb_ModItemattr_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x8200B08", ["pointer", "pointer", "pointer", "int"], Cb_ModItemattr_Enter_Func, Cb_ModItemattr_Leave_Func);
|
||||
|
||||
|
||||
//个人金库整理
|
||||
Cb_CCargo_sort_Enter_Func <- {};
|
||||
Cb_CCargo_sort_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x850BD0C", ["pointer", "pointer"], Cb_CCargo_sort_Enter_Func, Cb_CCargo_sort_Leave_Func);
|
||||
|
||||
|
||||
|
||||
// 玩家断开链接时 提供者:南瓜
|
||||
Cb_CUser_LogoutToPCRoom_Enter_Func <- {};
|
||||
Cb_CUser_LogoutToPCRoom_Leave_Func <- {};
|
||||
@@ -485,9 +493,101 @@ _Hook_Register_Currency_Func_("0x081BE46A", ["pointer", "pointer", "pointer", "i
|
||||
// 服务器被Kill时(不含炸频道等)
|
||||
Cb_Server_ClossByKill_Enter_Func <- {};
|
||||
Cb_Server_ClossByKill_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x082FD90E", ["pointer", "int"], Cb_Server_ClossByKill_Enter_Func, Cb_Server_ClossByKill_Leave_Func);
|
||||
_Hook_Register_Currency_Func_("0x082FE1FE", ["pointer", "int"], Cb_Server_ClossByKill_Enter_Func, Cb_Server_ClossByKill_Leave_Func);
|
||||
|
||||
|
||||
// 收到玩家聊天信息
|
||||
Cb_SendMess_Enter_Func <- {};
|
||||
Cb_SendMess_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x081F3540", ["pointer", "pointer","pointer","int"], Cb_SendMess_Enter_Func, Cb_SendMess_Leave_Func);
|
||||
_Hook_Register_Currency_Func_("0x081F3540", ["pointer", "pointer", "pointer", "int"], Cb_SendMess_Enter_Func, Cb_SendMess_Leave_Func);
|
||||
|
||||
|
||||
// 副本数据 不公开
|
||||
Cb_CParty_ClearMapHitCount_Enter_Func <- {};
|
||||
Cb_CParty_ClearMapHitCount_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x085BF850", ["pointer", "pointer"], Cb_CParty_ClearMapHitCount_Enter_Func, Cb_CParty_ClearMapHitCount_Leave_Func);
|
||||
|
||||
|
||||
// 附魔
|
||||
Cb_ExpertOnEnchantByBead_Enter_Func <- {};
|
||||
Cb_ExpertOnEnchantByBead_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x0849ED1A", ["pointer", "pointer", "int", "int", "int", "int", "int"], Cb_ExpertOnEnchantByBead_Enter_Func, Cb_ExpertOnEnchantByBead_Leave_Func);
|
||||
|
||||
// 数据库连接信息
|
||||
Cb_MySQL_Open_Enter_Func <- {};
|
||||
Cb_MySQL_Open_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x083F4024", ["pointer", "pointer", "int", "pointer", "pointer", "pointer", "int"], Cb_MySQL_Open_Enter_Func, Cb_MySQL_Open_Leave_Func);
|
||||
|
||||
|
||||
//地下城开始
|
||||
Cb_CParty_DungeonStart_Enter_Func <- {};
|
||||
Cb_CParty_DungeonStart_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x085A0954", ["pointer", "pointer", "char", "int", "int"], Cb_CParty_DungeonStart_Enter_Func, Cb_CParty_DungeonStart_Leave_Func);
|
||||
|
||||
//击杀怪物
|
||||
Cb_CParty_OnKillMonster_Enter_Func <- {};
|
||||
Cb_CParty_OnKillMonster_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x085B5A4C", ["pointer", "pointer", "int", "int", "int", "int"], Cb_CParty_OnKillMonster_Enter_Func, Cb_CParty_OnKillMonster_Leave_Func);
|
||||
|
||||
//设置通关奖励
|
||||
Cb_CParty_SetPlayResult_Enter_Func <- {};
|
||||
Cb_CParty_SetPlayResult_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x085B2412", ["pointer", "pointer", "int"], Cb_CParty_SetPlayResult_Enter_Func, Cb_CParty_SetPlayResult_Leave_Func);
|
||||
|
||||
// 进入副本接口时
|
||||
Cb_StartGame_check_error_Enter_Func <- {};
|
||||
Cb_StartGame_check_error_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x081C9F6C", ["pointer", "pointer", "pointer", "pointer", "int"], Cb_StartGame_check_error_Enter_Func, Cb_StartGame_check_error_Leave_Func);
|
||||
|
||||
// 强化装备时
|
||||
Cb_WongWork_CItemUpgrade_Enter_Func <- {};
|
||||
Cb_WongWork_CItemUpgrade_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x0854755A", ["pointer", "pointer", "pointer", "pointer", "int"], Cb_WongWork_CItemUpgrade_Enter_Func, Cb_WongWork_CItemUpgrade_Leave_Func);
|
||||
// 锻造装备时
|
||||
Cb_WongWork_CItemUpgrade_Separate_Enter_Func <- {};
|
||||
Cb_WongWork_CItemUpgrade_Separate_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x0811E468", ["pointer", "pointer", "pointer", "pointer", "int"], Cb_WongWork_CItemUpgrade_Separate_Enter_Func, Cb_WongWork_CItemUpgrade_Separate_Leave_Func);
|
||||
// 随机值
|
||||
Cb_CMTRand_randInt_Enter_Func <- {};
|
||||
Cb_CMTRand_randInt_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x080CBABE", ["pointer", "int", "int"], Cb_CMTRand_randInt_Enter_Func, Cb_CMTRand_randInt_Leave_Func);
|
||||
|
||||
// 发送绝望之塔APC
|
||||
Cb_TowerOfDespairMgr_SendAPCInfo_Enter_Func <- {};
|
||||
Cb_TowerOfDespairMgr_SendAPCInfo_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x08644338", ["pointer", "pointer", "pointer", "void"], Cb_TowerOfDespairMgr_SendAPCInfo_Enter_Func, Cb_TowerOfDespairMgr_SendAPCInfo_Leave_Func);
|
||||
|
||||
// 发送多物品邮件请求
|
||||
Cb_ReqDBSendNewSystemMultiMail_Enter_Func <- {};
|
||||
Cb_ReqDBSendNewSystemMultiMail_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x08556B68", ["pointer", "pointer", "int", "int", "int", "pointer", "int", "int", "int", "int", "int"], Cb_ReqDBSendNewSystemMultiMail_Enter_Func, Cb_ReqDBSendNewSystemMultiMail_Leave_Func);
|
||||
|
||||
// 深渊爆率
|
||||
Cb_WongWork_CMonsterDrop_Hell_Enter_Func <- {};
|
||||
Cb_WongWork_CMonsterDrop_Hell_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x08535726", ["pointer", "pointer", "pointer", "pointer"], Cb_WongWork_CMonsterDrop_Hell_Enter_Func, Cb_WongWork_CMonsterDrop_Hell_Leave_Func);
|
||||
|
||||
//检查装备是否上锁
|
||||
Cb_CheckItemLock_Enter_Func <- {};
|
||||
Cb_CheckItemLock_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x08646942", ["pointer", "int", "int", "bool"], Cb_CheckItemLock_Enter_Func, Cb_CheckItemLock_Leave_Func);
|
||||
|
||||
//reform_ui_group_no
|
||||
Cb_reform_ui_group_no_Enter_Func <- {};
|
||||
Cb_reform_ui_group_no_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x083507E8", ["pointer", "pointer", "bool", "int", "int"], Cb_reform_ui_group_no_Enter_Func, Cb_reform_ui_group_no_Leave_Func);
|
||||
|
||||
//get_skillslot_group
|
||||
Cb_get_skillslot_group_Enter_Func <- {};
|
||||
Cb_get_skillslot_group_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x086049FC", ["pointer", "int", "int"], Cb_get_skillslot_group_Enter_Func, Cb_get_skillslot_group_Leave_Func);
|
||||
|
||||
//get_skillslot_no
|
||||
Cb_get_skillslot_no_Enter_Func <- {};
|
||||
Cb_get_skillslot_no_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x08604A86", ["pointer", "int", "int", "int", "char", "int"], Cb_get_skillslot_no_Enter_Func, Cb_get_skillslot_no_Leave_Func);
|
||||
|
||||
//get_skillslot_no2
|
||||
Cb_get_skillslot_no2_Enter_Func <- {};
|
||||
Cb_get_skillslot_no2_Leave_Func <- {};
|
||||
_Hook_Register_Currency_Func_("0x08607DBA", ["pointer", "pointer", "int", "int", "bool", "int"], Cb_get_skillslot_no2_Enter_Func, Cb_get_skillslot_no2_Leave_Func);
|
||||
231
Dps_A/ProjectClass/NpcTransaction/NpcTransaction.nut
Normal file
231
Dps_A/ProjectClass/NpcTransaction/NpcTransaction.nut
Normal file
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
文件名:NpcTransaction.nut
|
||||
路径:Dps_A/ProjectClass/NpcTransaction/NpcTransaction.nut
|
||||
创建日期:2025-10-23 14:37
|
||||
文件用途:
|
||||
*/
|
||||
return;
|
||||
class NpcTransaction {
|
||||
|
||||
//装备价值
|
||||
EquValue = null;
|
||||
//品级装备组
|
||||
EquGroup = null;
|
||||
//金币易物浮动比例
|
||||
GoldFloat = 0.5;
|
||||
//最低交换品级
|
||||
MinRarity = 0;
|
||||
//交易消耗物品
|
||||
TradeItem = null;
|
||||
|
||||
//装备易物浮动等级
|
||||
EquFloatMin = 5;
|
||||
EquFloatMax = 5;
|
||||
|
||||
//事件概率
|
||||
EventRate = null;
|
||||
|
||||
//用户状态表
|
||||
UserState = null;
|
||||
|
||||
|
||||
|
||||
constructor() {
|
||||
//注册客户端收包
|
||||
RegisterClient();
|
||||
EquValue = {};
|
||||
UserState = {};
|
||||
EquGroup = [{}, {}, {}, {}, {}, {}, {}, {}];
|
||||
|
||||
//读取PVF
|
||||
InitPvf();
|
||||
}
|
||||
|
||||
|
||||
function RegisterClient() {
|
||||
|
||||
ClientSocketPackFuncMap.rawset(21005001, function(SUser, Jso) {
|
||||
local lastTime = GetTransactionInfo(SUser, Jso);
|
||||
if (lastTime && Sq_GetTimestampString().slice(-9).tointeger() - lastTime.time< 3600000) {
|
||||
local T = {
|
||||
op = 21005002,
|
||||
flag = 3
|
||||
}
|
||||
SUser.SendJso(T);
|
||||
return;
|
||||
}
|
||||
local InvenObj = SUser.GetInven();
|
||||
local Equ = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9 + Jso.pos);
|
||||
if (Equ) {
|
||||
local EquId = Equ.GetIndex();
|
||||
if (EquId) {
|
||||
local equ = PvfItem.GetPvfItemById(EquId);
|
||||
local Rarity = equ.GetRarity();
|
||||
local Level = equ.GetUsableLevel();
|
||||
//判断是否解封装
|
||||
local CanTrade = GetTrade(InvenObj, Jso.pos);
|
||||
if ((Rarity == 2 || Rarity == 3) && CanTrade == 1) {
|
||||
local T = {
|
||||
op = 21005006,
|
||||
}
|
||||
SUser.SendJso(T);
|
||||
SUser.SendNotiPacketMessage("该装备属于封装装备,并已解封,无法进行交易!", 0);
|
||||
} else {
|
||||
//判断是进行什么交易逻辑
|
||||
local Random = MathClass.Rand(600, 1000);
|
||||
//嘲讽
|
||||
if (Random <= EventRate[0]) {
|
||||
local T = {
|
||||
op = 21005002,
|
||||
flag = 0
|
||||
}
|
||||
SUser.SendJso(T);
|
||||
|
||||
local Cid = SUser.GetCID();
|
||||
if (!UserState.rawin(Cid)) UserState[Cid] <- {};
|
||||
UserState[Cid].rawset(Jso.npc, {
|
||||
time = Sq_GetTimestampString().slice(-9).tointeger()
|
||||
});
|
||||
}
|
||||
//金币易物
|
||||
else if (Random <= EventRate[1]) {
|
||||
local thGoldFloat = MathClass.Rand(-EquValue[EquId].tofloat() * GoldFloat, EquValue[EquId].tofloat() * GoldFloat);
|
||||
local Glod = EquValue[EquId].tofloat() + thGoldFloat;
|
||||
local T = {
|
||||
op = 21005002,
|
||||
flag = 1,
|
||||
glod = Glod
|
||||
}
|
||||
SUser.SendJso(T);
|
||||
|
||||
local Cid = SUser.GetCID();
|
||||
if (!UserState.rawin(Cid)) UserState[Cid] <- {};
|
||||
UserState[Cid].rawset(Jso.npc, {
|
||||
glod = Glod,
|
||||
pos = Jso.pos,
|
||||
oldid = EquId
|
||||
time = Sq_GetTimestampString().slice(-9).tointeger()
|
||||
});
|
||||
}
|
||||
//装备易物
|
||||
else if (Random <= EventRate[2]) {
|
||||
local setarr = [];
|
||||
local findtable = EquGroup[Rarity];
|
||||
foreach(index, level in findtable) {
|
||||
if (level >= Level - EquFloatMin && level <= Level + EquFloatMax) {
|
||||
setarr.append(index);
|
||||
}
|
||||
}
|
||||
|
||||
local SendId = setarr[MathClass.Rand(0, setarr.len() - 1)];
|
||||
local T = {
|
||||
op = 21005002,
|
||||
flag = 2,
|
||||
equ = SendId
|
||||
}
|
||||
SUser.SendJso(T);
|
||||
|
||||
local Cid = SUser.GetCID();
|
||||
if (!UserState.rawin(Cid)) UserState[Cid] <- {};
|
||||
UserState[Cid].rawset(Jso.npc, {
|
||||
equ = SendId,
|
||||
pos = Jso.pos,
|
||||
oldid = EquId
|
||||
time = Sq_GetTimestampString().slice(-9).tointeger()
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}.bindenv(this));
|
||||
|
||||
|
||||
ClientSocketPackFuncMap.rawset(21005003, function(SUser, Jso) {
|
||||
//获取交易结构体
|
||||
local Info = GetTransactionInfo(SUser, Jso);
|
||||
if (!Info) return;
|
||||
//获取旧装备ID
|
||||
local oldid = Info.oldid;
|
||||
//获取旧装备格子
|
||||
local pos = Info.pos;
|
||||
//检测扣除
|
||||
local InvenObj = SUser.GetInven();
|
||||
local Equ = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9 + Info.pos);
|
||||
if (Equ.GetIndex() != oldid) {
|
||||
SUser.SendNotiBox("交易时请不要移动背包中装备的位置!", 1);
|
||||
return;
|
||||
}
|
||||
Equ.Delete();
|
||||
|
||||
if (Info.rawin("equ")) {
|
||||
SUser.GiveItem(Info.equ, 1);
|
||||
SUser.SendNotiBox("与NPC交易获得装备 [" + PvfItem.GetNameById(Info.equ) + "]", 1);
|
||||
} else if (Info.rawin("glod")) {
|
||||
SUser.RechargeMoney(Info.glod);
|
||||
SUser.SendNotiBox("与NPC交易获得金币: " + Info.glod, 1);
|
||||
}
|
||||
SUser.SendItemSpace(0);
|
||||
}.bindenv(this));
|
||||
}
|
||||
|
||||
function GetTransactionInfo(SUser, Jso) {
|
||||
try {
|
||||
local Info = UserState[SUser.GetCID()][Jso.npc];
|
||||
return Info;
|
||||
} catch (exception) {}
|
||||
return null;
|
||||
}
|
||||
|
||||
function InitPvf() {
|
||||
Script();
|
||||
ScriptData.GetFileData("etc/rindro/npctransaction/npctransaction.etc", function(DataTable, Data) {
|
||||
while (!Data.Eof()) {
|
||||
local Fragment = Data.Get();
|
||||
if (Fragment == "[value]") {
|
||||
while (true) {
|
||||
local Fbuf = Data.Get();
|
||||
if (Fbuf == "[/value]") {
|
||||
break;
|
||||
}
|
||||
local Value = Data.Get();
|
||||
EquValue.rawset(Fbuf, Value);
|
||||
//读取装备品级
|
||||
local equ = PvfItem.GetPvfItemById(Fbuf);
|
||||
local Rarity = equ.GetRarity();
|
||||
local Level = equ.GetUsableLevel();
|
||||
EquGroup[Rarity].rawset(Fbuf, Level);
|
||||
}
|
||||
} else if (Fragment == "[random]") {
|
||||
GoldFloat = Data.Get().tofloat() / 100.0;
|
||||
} else if (Fragment == "[allow rarity]") {
|
||||
MinRarity = Data.Get();
|
||||
} else if (Fragment == "[exchange cost item]") {
|
||||
TradeItem = {
|
||||
item = Data.Get(),
|
||||
count = Data.Get()
|
||||
}
|
||||
} else if (Fragment == "[equipment random level lower]") {
|
||||
EquFloatMin = Data.Get();
|
||||
} else if (Fragment == "[equipment random level upper]") {
|
||||
EquFloatMax = Data.Get();
|
||||
} else if (Fragment == "[event rate]") {
|
||||
local o1 = Data.Get();
|
||||
local o2 = Data.Get();
|
||||
local o3 = Data.Get();
|
||||
|
||||
EventRate = [o1, o1 + o2, o1 + o2 + o3];
|
||||
}
|
||||
}
|
||||
}.bindenv(this));
|
||||
}
|
||||
|
||||
function GetTrade(InvenObj, pos) {
|
||||
local ptr = Memory.alloc(10240);
|
||||
Sq_CallFunc(S_Ptr("0x084FB918"), "int", ["pointer", "pointer", "int", "int"], ptr.C_Object, InvenObj.C_Object, 1, pos);
|
||||
return ptr.readS8();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
ProjectInitFuncMap.P_NpcTransaction <- NpcTransaction();
|
||||
103
Dps_A/ProjectClass/TH_CombatRank/TH_CombatRank.nut
Normal file
103
Dps_A/ProjectClass/TH_CombatRank/TH_CombatRank.nut
Normal file
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
文件名:TH_CombatRank.nut
|
||||
路径:Dps_A/ProjectClass/TH_CombatRank/TH_CombatRank.nut
|
||||
创建日期:2025-07-02 23:22
|
||||
文件用途:
|
||||
*/
|
||||
|
||||
|
||||
class TH_CombatRank {
|
||||
|
||||
MysqlObject = null;
|
||||
|
||||
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"));
|
||||
|
||||
|
||||
//注册客户端收包
|
||||
RegisterClient();
|
||||
//注册调试命令
|
||||
// RegisterDebugCmd();
|
||||
|
||||
|
||||
//建表命令
|
||||
MysqlObject.Select("CREATE TABLE `zyk`.`th_combatrank` ( `cid` int NOT NULL, `equip` varbinary(512) NULL COMMENT '装备数组', `basecombat` int NULL COMMENT '基础战力', `fstonecombat` int NULL COMMENT '魂石战力', PRIMARY KEY (`cid`));", []);
|
||||
}
|
||||
|
||||
function RegisterClient() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
function RegisterDebugCmd() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
ProjectInitFuncMap.P_TH_CombatRank <- TH_CombatRank();
|
||||
Reference in New Issue
Block a user