DP-S_Script/_DPS_/_BuiltProject/黄金哥布林袖珍罐/黄金哥布林袖珍罐.nut

127 lines
4.5 KiB
Plaintext

/*
文件名:哥布林袖珍罐.nut
路径:_DPS_/_BuiltProject/哥布林袖珍罐/哥布林袖珍罐.nut
创建日期:2026-02-06 09:37
文件用途:哥布林袖珍罐
*/
class GoblinSmallBox {
//记录玩家缓存
playerCache = null;
//数据
data = null;
constructor() {
playerCache = {};
data = {};
//读取PVF数据
InitPvf();
//注册道具使用回调
RegistUseItemCallBack();
ClientSocketPackFuncMap.rawset(21014003, function(SUser, Jso) {
local CID = SUser.GetCID();
if (playerCache.rawin(CID)) {
local ItemArr = playerCache.rawget(CID);
local ItemId = ItemArr[0].ItemId;
local ItemCount = ItemArr[0].ItemCount;
SUser.GiveItem(ItemId, ItemCount);
ItemArr.remove(0);
if (ItemArr.len() == 0) {
playerCache.rawdelete(CID);
}
}
}.bindenv(this));
}
function InitPvf() {
Script();
ScriptData.GetFileData("etc/rindro/goldgoblin/goldgoblin.lst", function(_n, DataA) {
while (!DataA.Eof()) {
local Id = DataA.Get();
local Path = DataA.Get();
local Info = ScriptData.GetFileData("etc/" + Path, function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[production]") {
DataTable.production <- [Data.Get(), Data.Get()];
} else if (Fragment == "[trigger]") {
DataTable.trigger <- Data.Get();
} else if (Fragment == "[item]") {
DataTable.item <- [];
DataTable.item_total_probability <- 0;
while (true) {
local Ret = Data.Get();
if (Ret == "[/item]") {
break;
}
local ItemInfo = {};
ItemInfo.ItemId <- Ret;
ItemInfo.ItemCount <- Data.Get();
ItemInfo.Probability <- Data.Get();
DataTable.item_total_probability += ItemInfo.Probability;
ItemInfo.IsNoti <- Data.Get();
ItemInfo.Grade <- GetItemGrade(ItemInfo.ItemId);
DataTable.item.push(ItemInfo);
}
}
}
}.bindenv(this));
data.rawset(Id, Info);
}
}.bindenv(this));
}
function RegistUseItemCallBack() {
foreach(id, info in data) {
if ("trigger" in info) {
Cb_Use_Item_Sp_Func[info.trigger] <- function(SUser, Item_id) {
local Count = MathClass.Rand(data[id].production[0], data[id].production[1]);
local ItemArr = [];
for (local i = 0; i< Count; i++) {
local RandNum = MathClass.Rand(0, data[id].item_total_probability);
local ItemInfo = null;
for (local j = 0; j< data[id].item.len(); j++) {
if (RandNum< data[id].item[j].Probability) {
ItemInfo = clone(data[id].item[j]);
break;
}
RandNum -= data[id].item[j].Probability;
}
ItemInfo.rawdelete("Probability");
if (ItemInfo != null) {
ItemArr.push(ItemInfo);
}
}
playerCache[SUser.GetCID()] <- ItemArr;
SUser.SendJso({
op = 21014002,
RewardPackage = ItemArr,
BoxId = info.trigger,
})
}.bindenv(this);
}
}
}
function GetItemGrade(ItemId) {
local Equ = PvfItem.GetPvfItemById(ItemId);
local Rarity = Equ.GetRarity();
return Rarity;
}
}
Timer.SetTimeOut(function() {
getroottable()._GoblinSmallBox_ <- GoblinSmallBox();
print("哥布林袖珍罐 - 已加载");
}, 1);