保存标准
This commit is contained in:
447
_DPS_/_BuiltProject/宿命魂石/FatalismStone.nut
Normal file
447
_DPS_/_BuiltProject/宿命魂石/FatalismStone.nut
Normal file
@@ -0,0 +1,447 @@
|
||||
/*
|
||||
文件名: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("文件加载!");
|
||||
Reference in New Issue
Block a user