447 lines
13 KiB
Plaintext
447 lines
13 KiB
Plaintext
/*
|
||
文件名:FatalismStone.nut
|
||
路径:Dps_A/ProjectClass/FatalismStone/FatalismStone.nut
|
||
创建日期:2025-06-22 12:54
|
||
文件用途:
|
||
*/
|
||
|
||
|
||
class FatalismStone_Stone {
|
||
//编号
|
||
Id = 0;
|
||
//类型
|
||
StoneType = 0;
|
||
//洗练度
|
||
CultivationDegree = 0;
|
||
|
||
|
||
|
||
//特殊 ! 石头的储存数据大小
|
||
Size = 8;
|
||
|
||
constructor(FatalismStoneID = 0) {
|
||
Id = FatalismStoneID;
|
||
CultivationDegree = MathClass.Rand(1, 100);
|
||
}
|
||
|
||
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(CultivationDegree, 'i'); //写入洗练值
|
||
|
||
return Blob2Hex(B);
|
||
}
|
||
|
||
function Deserialize(Data) {
|
||
local Buf = FatalismStone_Stone();
|
||
Buf.Id = Data.readn('i');
|
||
Buf.CultivationDegree = Data.readn('i');
|
||
if (Buf.Id == 0) return Buf;
|
||
Buf.StoneType = ProjectInitFuncMap.P_FatalismStone.GetStoneData(Buf.Id)["stone type"];
|
||
return Buf;
|
||
}
|
||
|
||
function SerializeTable(Obj) {
|
||
local T = {
|
||
id = Obj.Id,
|
||
cultivationDegree = Obj.CultivationDegree
|
||
};
|
||
return T;
|
||
}
|
||
}
|
||
|
||
class FatalismStone {
|
||
|
||
//总格子数
|
||
GridCount = 77;
|
||
//总穿戴数
|
||
WearCount = 6;
|
||
|
||
//属性数据位数
|
||
AttrCount = 2;
|
||
|
||
//魂石Lst
|
||
FatalismStoneLst = null;
|
||
|
||
constructor() {
|
||
local PoolObj = MysqlPool.GetInstance();
|
||
PoolObj.SetBaseConfiguration("127.0.0.1", 3306, "game", "uu5!^%jg");
|
||
//连接池大小
|
||
PoolObj.PoolSize = 10;
|
||
//初始化
|
||
PoolObj.Init();
|
||
|
||
//读取pvf的魂石相关数据
|
||
InitFatalismStoneData();
|
||
|
||
//注册客户端收包
|
||
RegisterClient();
|
||
//注册调试命令
|
||
RegisterDebugCmd();
|
||
|
||
|
||
|
||
SelectSql("CREATE TABLE `zyk`.`fatalismstone` ( `cid` int(250) NOT NULL, `data` varbinary(10240) NULL, `wearpack` varbinary(1024) NULL, PRIMARY KEY (`cid`));", []);
|
||
}
|
||
|
||
|
||
//通过数组生成魂石序列化数据
|
||
function GenerateSerializeData(StoneList) {
|
||
local Str = "0x";
|
||
foreach(Stone in StoneList) {
|
||
Str += Stone.Serialize();
|
||
}
|
||
return Str;
|
||
}
|
||
|
||
//通过数据反序列化魂石列表 数据 序列化个数
|
||
function GenerateDeserializeData(Data, Count) {
|
||
local BData = Sq_Point2Blob(Data.C_Object, FatalismStone_Stone.Size * Count);
|
||
local DataArr = [];
|
||
|
||
//一直读到最后
|
||
while (!BData.eos()) {
|
||
DataArr.push(FatalismStone_Stone.Deserialize(BData));
|
||
}
|
||
return DataArr;
|
||
}
|
||
|
||
//给指定玩家新增魂石
|
||
function AddFatalismStone(SUser, FatalismStoneID) {
|
||
local CID = SUser.GetCID();
|
||
local Ret = SelectSql("select data from zyk.fatalismstone where cid = " + CID, ["binary"]);
|
||
//获得玩家魂石数据
|
||
local DataArr = GenerateDeserializeData(Ret[0][0], GridCount * 3);
|
||
//获取魂石属性
|
||
local info = GetStoneData(FatalismStoneID);
|
||
//根据页数分割
|
||
local Offset = (info["stone type"] * GridCount);
|
||
|
||
local DataBuffer = DataArr.slice(Offset);
|
||
//找到第一个空格子
|
||
local Index = null;
|
||
foreach(Pos, Obj in DataBuffer) {
|
||
if (Obj.Id == 0) {
|
||
Index = Pos;
|
||
break;
|
||
}
|
||
}
|
||
if (Index == null) {
|
||
SUser.SendNotiPacketMessage("您的魂石背包已满!", 8);
|
||
return false;
|
||
}
|
||
//添加魂石
|
||
DataArr[Offset + Index] = FatalismStone_Stone(FatalismStoneID);
|
||
local backpackBinary = GenerateSerializeData(DataArr);
|
||
SelectSql("update zyk.fatalismstone set data = (" + backpackBinary + ") where cid = " + CID, ["int"]);
|
||
FlushPlayerFatalismStoneBackpack(SUser);
|
||
return true;
|
||
}
|
||
|
||
//给指定玩家刷新魂石背包
|
||
function FlushPlayerFatalismStoneBackpack(SUser) {
|
||
local Ret = SelectSql("select data,wearpack from zyk.fatalismstone where cid = " + SUser.GetCID(), ["binary", "binary"]);
|
||
//背包数量*背包类型数量全部使用默认的构造石头填充会是0
|
||
local BackPackArr = array(GridCount * 3, FatalismStone_Stone());
|
||
local WearArr = array(WearCount, FatalismStone_Stone());
|
||
//没有初始化背包的时候先初始化背包
|
||
if (Ret.len() == 0) {
|
||
local backpackBinary = GenerateSerializeData(BackPackArr);
|
||
local wearBinary = GenerateSerializeData(WearArr);
|
||
SelectSql("insert into zyk.fatalismstone(cid,data,wearpack) values(" + SUser.GetCID() + ",(" + backpackBinary + "),(" + wearBinary + "))", ["int"]);
|
||
} else {
|
||
BackPackArr = GenerateDeserializeData(Ret[0][0], GridCount * 3);
|
||
WearArr = GenerateDeserializeData(Ret[0][1], WearCount);
|
||
}
|
||
SUser.SendJso({
|
||
op = 21000002,
|
||
BackPackData = BackPackArr.map(FatalismStone_Stone.SerializeTable),
|
||
WearData = WearArr.map(FatalismStone_Stone.SerializeTable)
|
||
});
|
||
}
|
||
|
||
function RegisterClient() {
|
||
//查询魂石背包数据
|
||
ClientSocketPackFuncMap.rawset(21000001, function(SUser, Jso) {
|
||
FlushPlayerFatalismStoneBackpack(SUser);
|
||
}.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 Ret = SelectSql("select data,wearpack from zyk.fatalismstone where cid = " + SUser.GetCID(), ["binary", "binary"]);
|
||
local BackPackArr = GenerateDeserializeData(Ret[0][0], GridCount * 3);
|
||
local WearArr = GenerateDeserializeData(Ret[0][1], WearCount);
|
||
|
||
//如果有魂石要移动到穿戴栏 需要检测魂石的类型是否与穿戴栏符合
|
||
// if (OldType == -1 || NewType == -1) {
|
||
// if(OldType == -1){
|
||
// local OldStone = WearArr[OldIndex];
|
||
// if(OldStone.Id != 0){
|
||
// local Info = GetStoneData(OldStone.Id);
|
||
// if(Info["stone type"] != NewType){
|
||
// SUser.SendNotiPacketMessage("该魂石无法穿戴在当前位置", 8);
|
||
// return;
|
||
// }
|
||
// }
|
||
// }
|
||
// if(NewType == -1){
|
||
// local NewStone = BackPackArr[NewIndex];
|
||
// if(NewStone.Id != 0){
|
||
// local Info = GetStoneData(NewStone.Id);
|
||
// if(Info["stone type"] != OldType){
|
||
// SUser.SendNotiPacketMessage("该魂石无法穿戴在当前位置", 8);
|
||
// return;
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
//如果Type等于-1 说明是穿戴的魂石的槽位
|
||
local OldTemp, NewTemp;
|
||
if (OldType == -1) {
|
||
OldTemp = WearArr[OldIndex];
|
||
} else {
|
||
OldTemp = BackPackArr[OldType * GridCount + OldIndex];
|
||
}
|
||
if (NewType == -1) {
|
||
NewTemp = WearArr[NewIndex];
|
||
} else {
|
||
NewTemp = BackPackArr[NewType * GridCount + NewIndex];
|
||
}
|
||
|
||
|
||
// //比对两个魂石的槽位类型
|
||
// local ComparisonType;
|
||
// if (NewType == -1) {
|
||
// ComparisonType = NewIndex + 1;
|
||
// } else {
|
||
// ComparisonType = (NewType + 1);
|
||
// }
|
||
// print("旧类型: " + OldTemp.StoneType + "\n 新类型: " + ComparisonType);
|
||
// print("旧ID: " + OldTemp.Id + "\n 新ID: " + NewTemp.Id);
|
||
// if (OldTemp.StoneType != ComparisonType) {
|
||
// SUser.SendNotiPacketMessage("该魂石无法穿戴在当前位置", 8);
|
||
// return;
|
||
// }
|
||
|
||
//交换数据
|
||
if (OldType == -1) {
|
||
WearArr[OldIndex] = NewTemp;
|
||
} else {
|
||
BackPackArr[OldType * GridCount + OldIndex] = NewTemp;
|
||
}
|
||
if (NewType == -1) {
|
||
WearArr[NewIndex] = OldTemp;
|
||
} else {
|
||
BackPackArr[NewType * GridCount + NewIndex] = OldTemp;
|
||
}
|
||
|
||
|
||
//序列化数据
|
||
local backpackBinary = GenerateSerializeData(BackPackArr);
|
||
local wearBinary = GenerateSerializeData(WearArr);
|
||
|
||
|
||
//更新数据库
|
||
SelectSql("update zyk.fatalismstone set data = (" + backpackBinary + "),wearpack = (" + wearBinary + ") where cid = " + SUser.GetCID(), ["int"]);
|
||
|
||
//发送数据
|
||
SUser.SendJso({
|
||
op = 21000002,
|
||
BackPackData = BackPackArr.map(FatalismStone_Stone.SerializeTable),
|
||
WearData = WearArr.map(FatalismStone_Stone.SerializeTable)
|
||
});
|
||
}.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);
|
||
}, 100);
|
||
//如果满了就发邮件
|
||
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 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));
|
||
}
|
||
|
||
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;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
ProjectInitFuncMap.P_FatalismStone <- FatalismStone();
|
||
|
||
print("文件加载!"); |