2023-07-14 19:35:33 +00:00
|
|
|
|
XItemManagerCreator = function()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
---@class XItemManager
|
2023-07-14 19:35:33 +00:00
|
|
|
|
local XItemManager = {}
|
|
|
|
|
|
|
|
|
|
local tableInsert = table.insert
|
|
|
|
|
local tableRemove = table.remove
|
|
|
|
|
local tableSort = table.sort
|
|
|
|
|
local mathCeil = math.ceil
|
|
|
|
|
local mathMin = math.min
|
|
|
|
|
|
|
|
|
|
local Items = {} -- 所有道具数据
|
|
|
|
|
local RecItemIds = {} -- 恢复类道具
|
|
|
|
|
local SuppliesItems = {} -- 补给类道具
|
|
|
|
|
local BuyAssetTemplates = {} -- 购买资源配置表
|
|
|
|
|
local BuyAssetDailyLimit = {} -- 购买资源每日限制
|
|
|
|
|
local ItemTemplates = {}
|
|
|
|
|
local ItemFirstGetCheckTable = {}
|
|
|
|
|
local RedEnvelopeInfos = {} -- 红包道具使用记录
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local ItemCollectionIds = {} -- 已解锁收藏道具Id
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
local BuyAssetCoinBase = 0
|
|
|
|
|
local BuyAssetCoinMul = 0
|
|
|
|
|
-- local BuyAssetCoinCritProb = 0
|
|
|
|
|
-- local BuyAssetCoinCritMul = 0
|
|
|
|
|
-- item 参数下表
|
|
|
|
|
-- local PARAM_ACTIONPOINT_INTERVAL = 1
|
|
|
|
|
-- local PARAM_ACTIONPOINT_NUM = 2
|
|
|
|
|
local RecTimer
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
XItemManager.ItemId = {
|
|
|
|
|
Coin = 1,
|
|
|
|
|
PaidGem = 2,
|
|
|
|
|
FreeGem = 3,
|
|
|
|
|
ActionPoint = 4,
|
|
|
|
|
HongKa = 5,
|
|
|
|
|
TeamExp = 7,
|
|
|
|
|
AndroidHongKa = 8,
|
|
|
|
|
IosHongKa = 10,
|
|
|
|
|
SkillPoint = 12,
|
|
|
|
|
DailyActiveness = 13,
|
|
|
|
|
WeeklyActiveness = 14,
|
|
|
|
|
HostelElectric = 15,
|
|
|
|
|
HostelMat = 16,
|
|
|
|
|
OnlineBossTicket = 17,
|
|
|
|
|
BountyTaskExp = 18,
|
|
|
|
|
DormCoin = 30,
|
|
|
|
|
FurnitureCoin = 31,
|
|
|
|
|
DormEnterIcon = 36,
|
|
|
|
|
BaseEquipCoin = 300,
|
|
|
|
|
InfestorActionPoint = 50,
|
|
|
|
|
InfestorMoney = 51,
|
|
|
|
|
PokemonLevelUpItem = 56,
|
|
|
|
|
PokemonStarUpItem = 57,
|
|
|
|
|
PokemonLowStarUpItem = 58,
|
|
|
|
|
PassportExp = 60,
|
2024-09-01 20:49:41 +00:00
|
|
|
|
DormQuestCoin = 103, -- 宿舍委托道具Id
|
|
|
|
|
SEllaFragment = 559, -- 逆元碎片-万华
|
2023-07-14 19:35:33 +00:00
|
|
|
|
TRPGTalen = 61000,
|
|
|
|
|
TRPGMoney = 61001,
|
|
|
|
|
TRPGEXP = 61002,
|
|
|
|
|
TRPGEndurance = 61003,
|
|
|
|
|
UniversalWord = 62309,
|
|
|
|
|
EquipRecycleItemId = CS.XGame.Config:GetInt("EquipRecycleItemId"),
|
|
|
|
|
MoeWarRespondItemId = 62511, --萌战应援票
|
|
|
|
|
MoeWarPreparationItemId = 62505, --萌战筹备度
|
|
|
|
|
MoeWarCommunicateItemId = 62506, --萌战礼物
|
|
|
|
|
MoeWarCommemorativeItemId = 62510, --萌战2.0,纪念代币
|
2024-09-01 20:49:41 +00:00
|
|
|
|
PokerGuessingItemId = 97012, --翻牌比大小活动物品
|
2023-07-14 19:35:33 +00:00
|
|
|
|
SuperTowerBagItemId = 62801, --超级爬塔背包扩容道具Id
|
|
|
|
|
AreaWarActionPoint = 62901, --全服决战-行动点
|
|
|
|
|
AreaWarCoin = 62902, --全服决战-货币
|
|
|
|
|
AreaWarPurifyExp = 62903, --全服决战-净化之火
|
|
|
|
|
RpgMakerGameHintCoin = 63300, --推箱子游戏-提示货币
|
|
|
|
|
DoubleTower = 60850,--动作塔防代币
|
2024-09-01 20:49:41 +00:00
|
|
|
|
GuildWarCoin = 96190,-- 工会战货币
|
|
|
|
|
RiftCoin = 63400, --大秘境活动代币,用于活动商店兑换
|
|
|
|
|
RiftGold = 63401, --大秘境金币,用于队伍增幅和插件商店兑换
|
|
|
|
|
RiftLoadLimit = 63405, -- 大秘境提升负载上限道具
|
|
|
|
|
RiftAttributeLimit = 63406, -- 大秘境提升属性点上限道具
|
|
|
|
|
ColorTableCoin = 96124, -- 调色板战争代币
|
|
|
|
|
DlcHunt = 97002,
|
|
|
|
|
DlcHuntCoin1 = 96125,
|
|
|
|
|
DlcHuntCoin2 = 96128,
|
|
|
|
|
Maverick2Unit = 60841, -- 异构阵线2.0金币,用于心智天赋
|
|
|
|
|
Maverick2Coin = 60842, -- 异构阵线2.0代币,用于活动商店兑换
|
|
|
|
|
PlanetRunningStageCoin = 63411,-- 行星天赋关卡货币
|
|
|
|
|
PlanetRunningTalent = 63412, -- 行星天赋天赋货币
|
|
|
|
|
PlanetRunningShopActivity = 63413, -- 行星天赋商店兑换
|
|
|
|
|
CerberusGameCoin1 = 97007, -- 三头犬玩法货币1
|
|
|
|
|
CerberusGameCoin2 = 97008,-- 三头犬玩法货币2
|
|
|
|
|
TransfiniteScore = 105,-- 超限连战积分
|
2023-07-14 19:35:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
--时效性道具初始时间计算方式
|
|
|
|
|
XItemManager.TimelinessType = {
|
|
|
|
|
Invalid = 0,
|
|
|
|
|
FromConfig = 1, --通过配置
|
|
|
|
|
AfterGet = 2, --获取后
|
|
|
|
|
Batch = 3, --按时间分批次
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
--礼包类型
|
|
|
|
|
XItemManager.GiftItemUseType = {
|
|
|
|
|
Reward = 1,
|
|
|
|
|
Drop = 2,
|
|
|
|
|
OptionalReward = 3,
|
|
|
|
|
RedEnvelope = 4,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
--特殊补给道具
|
|
|
|
|
XItemManager.SuppliesItemType = {
|
|
|
|
|
Battery = 90000,
|
|
|
|
|
CoinPackage = 91000
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
XItemManager.SubType_1 = {
|
|
|
|
|
Reward = 1,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
XItemManager.SUBTYPE_EXP = 2
|
|
|
|
|
|
|
|
|
|
XItemManager.PageRecordCache = XItemConfigs.PageType.Equip -- 仓库默认选择标签
|
|
|
|
|
|
|
|
|
|
local METHOD_NAME = {
|
|
|
|
|
Sell = "ItemSellRequest",
|
|
|
|
|
Use = "ItemUseRequest",
|
|
|
|
|
BuyAsset = "ItemBuyAssetRequest",
|
|
|
|
|
MultiplyUse = "ItemUseMultipleRequest",
|
2024-09-01 20:49:41 +00:00
|
|
|
|
GetAndroidOrIosMoneyCardRequest = "GetAndroidOrIosMoneyCardRequest",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
---需要显示回复提示的道具的列表
|
|
|
|
|
local NeedTipsItemList={
|
|
|
|
|
[62901]=true --特制血清
|
2023-07-14 19:35:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local BAG_ITEM_SORT_FUNC = function(a, b)
|
|
|
|
|
local aItemId = a.Data.Id
|
|
|
|
|
local bItemId = b.Data.Id
|
|
|
|
|
|
|
|
|
|
--优先级排序
|
|
|
|
|
local aPriority = XItemManager.GetItemPriority(aItemId)
|
|
|
|
|
local bPriority = XItemManager.GetItemPriority(bItemId)
|
|
|
|
|
if aPriority ~= bPriority then
|
|
|
|
|
return aPriority > bPriority
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--溢出排序
|
|
|
|
|
local aIsCanConvert = XItemManager.IsCanConvert(aItemId)
|
|
|
|
|
local bIsCanConvert = XItemManager.IsCanConvert(bItemId)
|
|
|
|
|
if aIsCanConvert ~= bIsCanConvert then
|
|
|
|
|
return aIsCanConvert
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--可使用排序
|
|
|
|
|
local aIsUseable = XItemManager.IsUseable(aItemId)
|
|
|
|
|
local bIsUseable = XItemManager.IsUseable(bItemId)
|
|
|
|
|
if aIsUseable ~= bIsUseable then
|
|
|
|
|
return aIsUseable
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--时效性排序
|
|
|
|
|
local aIsTimeLimit = XItemManager.IsTimeLimit(aItemId)
|
|
|
|
|
local bIsTimeLimit = XItemManager.IsTimeLimit(bItemId)
|
|
|
|
|
if aIsTimeLimit ~= bIsTimeLimit then
|
|
|
|
|
return aIsTimeLimit
|
|
|
|
|
elseif aIsTimeLimit then
|
|
|
|
|
--剩余时间排序
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
local aleftTime = a.RecycleBatch and a.RecycleBatch.RecycleTime - nowTime or XDataCenter.ItemManager.GetRecycleLeftTime(aItemId)
|
|
|
|
|
local bleftTime = b.RecycleBatch and b.RecycleBatch.RecycleTime - nowTime or XDataCenter.ItemManager.GetRecycleLeftTime(bItemId)
|
|
|
|
|
if aleftTime ~= bleftTime then
|
|
|
|
|
return aleftTime < bleftTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--品质排序
|
|
|
|
|
local aQuality = XItemManager.GetItemQuality(aItemId)
|
|
|
|
|
local bQuality = XItemManager.GetItemQuality(bItemId)
|
|
|
|
|
if aQuality ~= bQuality then
|
|
|
|
|
return aQuality > bQuality
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--Id排序
|
|
|
|
|
if aItemId ~= bItemId then
|
|
|
|
|
return aItemId < bItemId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--数量排序
|
|
|
|
|
if a.Count ~= b.Count then
|
|
|
|
|
return a.Count > b.Count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local CONSUMABLES_ITEM_SORT_FUNC = function(a, b)
|
|
|
|
|
local aItemId = a.Data.Id
|
|
|
|
|
local bItemId = b.Data.Id
|
|
|
|
|
|
|
|
|
|
--溢出排序
|
|
|
|
|
local aIsCanConvert = XItemManager.IsCanConvert(aItemId)
|
|
|
|
|
local bIsCanConvert = XItemManager.IsCanConvert(bItemId)
|
|
|
|
|
if aIsCanConvert ~= bIsCanConvert then
|
|
|
|
|
return aIsCanConvert
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--可使用排序
|
|
|
|
|
local aIsUseable = XItemManager.IsUseable(aItemId)
|
|
|
|
|
local bIsUseable = XItemManager.IsUseable(bItemId)
|
|
|
|
|
if aIsUseable ~= bIsUseable then
|
|
|
|
|
return aIsUseable
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--时效性排序
|
|
|
|
|
local aIsTimeLimit = XItemManager.IsTimeLimit(aItemId)
|
|
|
|
|
local bIsTimeLimit = XItemManager.IsTimeLimit(bItemId)
|
|
|
|
|
if aIsTimeLimit ~= bIsTimeLimit then
|
|
|
|
|
return aIsTimeLimit
|
|
|
|
|
elseif aIsTimeLimit then
|
|
|
|
|
--剩余时间排序
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
local aleftTime = a.RecycleBatch and a.RecycleBatch.RecycleTime - nowTime or XDataCenter.ItemManager.GetRecycleLeftTime(aItemId)
|
|
|
|
|
local bleftTime = b.RecycleBatch and b.RecycleBatch.RecycleTime - nowTime or XDataCenter.ItemManager.GetRecycleLeftTime(bItemId)
|
|
|
|
|
if aleftTime ~= bleftTime then
|
|
|
|
|
return aleftTime < bleftTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--优先级排序
|
|
|
|
|
local aPriority = XItemManager.GetItemPriority(aItemId)
|
|
|
|
|
local bPriority = XItemManager.GetItemPriority(bItemId)
|
|
|
|
|
if aPriority ~= bPriority then
|
|
|
|
|
return aPriority > bPriority
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--品质排序
|
|
|
|
|
local aQuality = XItemManager.GetItemQuality(aItemId)
|
|
|
|
|
local bQuality = XItemManager.GetItemQuality(bItemId)
|
|
|
|
|
if aQuality ~= bQuality then
|
|
|
|
|
return aQuality > bQuality
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--Id排序
|
|
|
|
|
if aItemId ~= bItemId then
|
|
|
|
|
return aItemId < bItemId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--数量排序
|
|
|
|
|
if a.Count ~= b.Count then
|
|
|
|
|
return a.Count > b.Count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local EXP_ITEM_SORT_CMP = function(a, b)
|
|
|
|
|
if a.Template.Id ~= b.Template.Id then
|
|
|
|
|
if a.Template.Id == XDataCenter.ItemManager.ItemId.EquipRecycleItemId then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
if b.Template.Id == XDataCenter.ItemManager.ItemId.EquipRecycleItemId then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if a.Template.Quality ~= b.Template.Quality then
|
|
|
|
|
return a.Template.Quality < b.Template.Quality
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if a.Template.GetExp() ~= b.Template.GetExp() then
|
|
|
|
|
return a.Template.GetExp() < b.Template.GetExp()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if a.Template.Priority ~= b.Template.Priority then
|
|
|
|
|
return a.Template.Priority > b.Template.Priority
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if a.Count ~= b.Count then
|
|
|
|
|
return a.Count > b.Count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
local GetCookieKey = function(key)
|
|
|
|
|
return string.format("ItemManager_UID:%s_%s", XPlayer.Id, key)
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
function XItemManager.Init()
|
|
|
|
|
ItemTemplates = XItemConfigs.GetItemTemplates()
|
|
|
|
|
BuyAssetDailyLimit = XItemConfigs.GetBuyAssetDailyLimit()
|
|
|
|
|
BuyAssetTemplates = XItemConfigs.GetBuyAssetTemplates()
|
|
|
|
|
BuyAssetCoinBase = CS.XGame.Config:GetInt("BuyAssetCoinBase")
|
|
|
|
|
BuyAssetCoinMul = CS.XGame.Config:GetInt("BuyAssetCoinMul")
|
|
|
|
|
-- BuyAssetCoinCritProb = CS.XGame.Config:GetInt("BuyAssetCoinCritProb")
|
|
|
|
|
-- BuyAssetCoinCritMul = CS.XGame.Config:GetInt("BuyAssetCoinCritMul")
|
|
|
|
|
|
|
|
|
|
XItemManager.PageRecordCache = XItemConfigs.PageType.Equip
|
|
|
|
|
|
|
|
|
|
XEventManager.AddEventListener(XEventId.EVENT_USER_LOGOUT, function()
|
|
|
|
|
if RecTimer then
|
|
|
|
|
XScheduleManager.UnSchedule(RecTimer)
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
XItemManager.InitAllItems()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.InitAllItems()
|
|
|
|
|
Items = {}
|
|
|
|
|
for id, template in pairs(ItemTemplates) do
|
|
|
|
|
local item
|
|
|
|
|
if template.RecType == XResetManager.ResetType.NoNeed then
|
|
|
|
|
item = XItem.New(nil, template)
|
|
|
|
|
else
|
|
|
|
|
item = XRecItem.New(nil, template)
|
|
|
|
|
tableInsert(RecItemIds, id)
|
|
|
|
|
end
|
|
|
|
|
-- 存储补给包相关数据(电池、螺母包)
|
|
|
|
|
if template.SubTypeParams[1] == XItemManager.SubType_1.Reward then
|
|
|
|
|
local subType3 = template.SubTypeParams[3]
|
|
|
|
|
if subType3 == XItemManager.SuppliesItemType.Battery then
|
|
|
|
|
SuppliesItems[XItemManager.SuppliesItemType.Battery] = SuppliesItems[XItemManager.SuppliesItemType.Battery] or {}
|
|
|
|
|
tableInsert(SuppliesItems[XItemManager.SuppliesItemType.Battery], item.Id)
|
|
|
|
|
elseif subType3 == XItemManager.SuppliesItemType.CoinPackage then
|
|
|
|
|
SuppliesItems[XItemManager.SuppliesItemType.CoinPackage] = SuppliesItems[XItemManager.SuppliesItemType.CoinPackage] or {}
|
|
|
|
|
tableInsert(SuppliesItems[XItemManager.SuppliesItemType.CoinPackage], item.Id)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
Items[item.Id] = item
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.AddItemListener()
|
|
|
|
|
RecTimer = XScheduleManager.ScheduleForever(function()
|
|
|
|
|
for _, id in pairs(RecItemIds) do
|
|
|
|
|
Items[id]:CheckCount()
|
|
|
|
|
end
|
|
|
|
|
end, XScheduleManager.SECOND, 0)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.InitItemData(items)
|
|
|
|
|
for _, itemData in pairs(items) do
|
|
|
|
|
if Items[itemData.Id] then
|
|
|
|
|
Items[itemData.Id]:RefreshItem(itemData)
|
|
|
|
|
ItemFirstGetCheckTable[itemData.Id] = true
|
|
|
|
|
else
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.InitItemData", "Item", " Share/Item/Item.tab", "Id", tostring(itemData.Id))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XItemManager.AddItemListener()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.InitItemRecycle(list)
|
|
|
|
|
-- 回收道具时限表
|
|
|
|
|
if not list then return end
|
|
|
|
|
for id, itemRecycleList in pairs(list) do
|
|
|
|
|
Items[id].ItemRecycleList = itemRecycleList
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.InitBatchItemRecycle(data)
|
|
|
|
|
if not data or not next(data) then return end
|
|
|
|
|
XItemManager.NotifyBatchItemRecycle(data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 获取数据
|
|
|
|
|
function XItemManager.GetItemTemplate(id)
|
|
|
|
|
local tab = ItemTemplates[id]
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemTemplate", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
end
|
|
|
|
|
return tab
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemQuality(id)
|
|
|
|
|
local tab = ItemTemplates[id]
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemQuality", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
return tab.Quality
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemType(id)
|
|
|
|
|
local tab = ItemTemplates[id]
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemType", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
return tab.ItemType
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemPriority(id)
|
|
|
|
|
local tab = ItemTemplates[id]
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemPriority", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
return tab.Priority
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemBigIcon(id)
|
|
|
|
|
local tab = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemBigIcon", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return tab.BigIcon
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemIcon(id)
|
|
|
|
|
local tab = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemIcon", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return tab.Icon
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemDescription(id)
|
|
|
|
|
local tab = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemDescription", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return tab.Description
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemWorldDesc(id)
|
|
|
|
|
local tab = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemWorldDesc", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return tab.WorldDesc
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemSkipIdParams(id)
|
|
|
|
|
local tab = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if tab == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetItemSkipIdParams", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return tab.SkipIdParams
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetBuyAssetTemplate(targetId, times, notTipError)
|
|
|
|
|
local template = BuyAssetTemplates[targetId]
|
|
|
|
|
|
|
|
|
|
if template == nil then
|
|
|
|
|
if not notTipError then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.GetBuyAssetTemplate", "template", "Share/Item/BuyAsset.tab", "targetId", tostring(targetId))
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local config = template[1]
|
|
|
|
|
for i = 1, #template do
|
|
|
|
|
if template[i].Times > times then
|
|
|
|
|
return config
|
|
|
|
|
end
|
|
|
|
|
config = template[i]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return config
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetAllBuyAssetTemplate()
|
|
|
|
|
return BuyAssetTemplates
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetBuyAssetTemplateById(id)
|
|
|
|
|
if not BuyAssetTemplates then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return BuyAssetTemplates[id]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetRedEnvelopeCertainNpcItemCount(activityId, npcId, itemId)
|
|
|
|
|
local count = 0
|
|
|
|
|
|
|
|
|
|
local redEnvelope = RedEnvelopeInfos[activityId]
|
|
|
|
|
if not redEnvelope then
|
|
|
|
|
return count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local reward = redEnvelope[npcId]
|
|
|
|
|
count = reward and reward[itemId] or count
|
|
|
|
|
|
|
|
|
|
return count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItem(id)
|
|
|
|
|
if (id == XItemManager.ItemId.FreeGem or id == XItemManager.ItemId.PaidGem) then
|
|
|
|
|
local freeGem = Items[XItemManager.ItemId.FreeGem]
|
|
|
|
|
local paidGem = Items[XItemManager.ItemId.PaidGem]
|
|
|
|
|
|
|
|
|
|
local mergeGem = XItem.New(nil, freeGem.Template)
|
|
|
|
|
mergeGem.Count = mergeGem.Count + freeGem.Count + paidGem.Count
|
|
|
|
|
|
|
|
|
|
return mergeGem
|
2024-09-01 20:49:41 +00:00
|
|
|
|
elseif id == XGuildConfig.GoodsCoinId then
|
|
|
|
|
local item = Items[id]
|
|
|
|
|
item.Count = XDataCenter.GuildManager.GetShopCoin()
|
|
|
|
|
return item
|
2023-07-14 19:35:33 +00:00
|
|
|
|
else
|
|
|
|
|
return Items[id]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCount(id)
|
|
|
|
|
if (id == XItemManager.ItemId.FreeGem or id == XItemManager.ItemId.PaidGem) then
|
|
|
|
|
return Items[XItemManager.ItemId.FreeGem]:GetCount() +
|
|
|
|
|
Items[XItemManager.ItemId.PaidGem]:GetCount()
|
|
|
|
|
elseif id == XGuildConfig.GuildContributeCoin then
|
|
|
|
|
return XDataCenter.GuildManager.GetGuildContributeLeft() or 0
|
|
|
|
|
elseif id == XItemManager.ItemId.TRPGEXP then
|
|
|
|
|
return XDataCenter.TRPGManager.GetExploreCurExp()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
elseif id == XGuildConfig.GoodsCoinId then
|
|
|
|
|
return XDataCenter.GuildManager.GetShopCoin()
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
return Items[id] and Items[id]:GetCount() or 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetFreeGemCount()
|
|
|
|
|
return Items[XItemManager.ItemId.FreeGem]:GetCount()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetPaidGemCount()
|
|
|
|
|
return Items[XItemManager.ItemId.PaidGem]:GetCount()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetMaxCount(id)
|
|
|
|
|
return Items[id] and Items[id]:GetMaxCount() or 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemsByType(itemType)
|
|
|
|
|
local list = {}
|
|
|
|
|
|
|
|
|
|
for _, item in pairs(Items) do
|
|
|
|
|
if item.Template.ItemType == itemType and item:GetCount() > 0 then
|
|
|
|
|
tableInsert(list, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemsByTypeAndSuitId(itemType, suitId)
|
|
|
|
|
local list = {}
|
|
|
|
|
|
|
|
|
|
for _, item in pairs(Items) do
|
|
|
|
|
local isSuit = suitId == nil
|
|
|
|
|
local cfg = XItemManager.GetItemTemplate(item.Id)
|
|
|
|
|
if not isSuit then
|
|
|
|
|
isSuit = suitId == XItemConfigs.SuitAllType.All or suitId == XItemConfigs.SuitAllType.DefaultAll or suitId == cfg.SuitId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if cfg.ItemType == itemType and item:GetCount() > 0 and isSuit then
|
|
|
|
|
tableInsert(list, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCardExpItems()
|
|
|
|
|
local list = XItemManager.GetItemsByType(XItemConfigs.ItemType.CardExp)
|
|
|
|
|
tableSort(list, function(a, b)
|
|
|
|
|
return a.Template.Exp < b.Template.Exp
|
|
|
|
|
end)
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetEquipExpItems(equipClassify)
|
|
|
|
|
local result = {}
|
|
|
|
|
|
|
|
|
|
for _, item in pairs(Items) do
|
|
|
|
|
if (item.Template.ItemType == XItemConfigs.ItemType.EquipExp
|
|
|
|
|
or item.Template.ItemType == XItemConfigs.ItemType.EquipExpNotInBag)
|
|
|
|
|
and item.Template.Classify == equipClassify
|
|
|
|
|
and item:GetCount() > 0
|
|
|
|
|
then
|
|
|
|
|
tableInsert(result, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
tableSort(result, EXP_ITEM_SORT_CMP)
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetPartnerExpItems()
|
|
|
|
|
local list = XItemManager.GetItemsByType(XItemConfigs.ItemType.PartnerExp)
|
|
|
|
|
tableSort(list, function(a, b)
|
|
|
|
|
return a.Template.Exp < b.Template.Exp
|
|
|
|
|
end)
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCharExp(id, subType)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.GetExp(subType)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemsAddEquipExp(id, count)
|
|
|
|
|
count = count or 1
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.GetExp() * count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemsAddEquipCost(id, count)
|
|
|
|
|
count = count or 1
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.GetCost() * count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetTeamExp(id)
|
|
|
|
|
local PARAM_EXP = 1
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.SubTypeParams[PARAM_EXP]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetBuyAssetInfo(targetId)
|
|
|
|
|
if not targetId then
|
|
|
|
|
return
|
|
|
|
|
XLog.Error("XItemManager.GetBuyAssetInfo函数参数错误, 参数targetId不能为空")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 获取购买次数
|
|
|
|
|
local times = 0
|
|
|
|
|
if Items[targetId] then
|
|
|
|
|
times = Items[targetId].BuyTimes or 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 检查是否达到每日上限,读表
|
|
|
|
|
local dayLimit = BuyAssetDailyLimit[targetId]
|
|
|
|
|
local template
|
|
|
|
|
if dayLimit and dayLimit > 0 and times >= dayLimit then
|
|
|
|
|
template = XItemManager.GetBuyAssetTemplate(targetId, dayLimit)
|
|
|
|
|
else
|
|
|
|
|
template = XItemManager.GetBuyAssetTemplate(targetId, times + 1)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local targetCount = template.GainCount
|
|
|
|
|
|
|
|
|
|
-- 计算消耗量
|
|
|
|
|
if targetId == XItemManager.ItemId.Coin then
|
|
|
|
|
targetCount = (BuyAssetCoinBase + XPlayer.Level * BuyAssetCoinMul) * targetCount
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 返回
|
|
|
|
|
return {
|
|
|
|
|
LeftTimes = dayLimit > 0 and dayLimit - times or nil,
|
|
|
|
|
TargetId = targetId,
|
|
|
|
|
TargetCount = targetCount,
|
|
|
|
|
ConsumeId = template.ConsumeId,
|
|
|
|
|
ConsumeCount = template.ConsumeCount,
|
|
|
|
|
DiscountShows = template.DiscountShows
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemsByTypes(types, useConsumableSort)
|
|
|
|
|
local result = {}
|
|
|
|
|
for i = 1, #types do
|
|
|
|
|
local items = XItemManager.GetItemsByType(types[i])
|
|
|
|
|
for i2 = 1, #items do
|
|
|
|
|
tableInsert(result, items[i2])
|
|
|
|
|
end
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
local bagItems = XDataCenter.ItemManager.ConvertToGridData(result)
|
|
|
|
|
local sortFunc = useConsumableSort and CONSUMABLES_ITEM_SORT_FUNC or BAG_ITEM_SORT_FUNC
|
|
|
|
|
tableSort(bagItems, sortFunc)
|
|
|
|
|
return bagItems
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCanSellItemsByTypes(types, useConsumableSort)
|
|
|
|
|
local result = {}
|
|
|
|
|
for i = 1, #types do
|
|
|
|
|
local items = XItemManager.GetItemsByType(types[i])
|
|
|
|
|
for i2 = 1, #items do
|
|
|
|
|
if XItemManager.IsCanSell(items[i2].Id) then
|
|
|
|
|
tableInsert(result, items[i2])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local bagItems = XDataCenter.ItemManager.ConvertToGridData(result)
|
|
|
|
|
local sortFunc = useConsumableSort and CONSUMABLES_ITEM_SORT_FUNC or BAG_ITEM_SORT_FUNC
|
|
|
|
|
tableSort(bagItems, sortFunc)
|
|
|
|
|
return bagItems
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCanConvertItemsByTypes(types)
|
|
|
|
|
local result = {}
|
|
|
|
|
for i = 1, #types do
|
|
|
|
|
local items = XItemManager.GetItemsByType(types[i])
|
|
|
|
|
for i2 = 1, #items do
|
|
|
|
|
if XItemManager.IsCanConvert(items[i2].Id) then
|
|
|
|
|
tableInsert(result, items[i2])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local bagItems = XDataCenter.ItemManager.ConvertToGridData(result)
|
|
|
|
|
tableSort(bagItems, BAG_ITEM_SORT_FUNC)
|
|
|
|
|
return bagItems
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--获得出售道具获得的奖励信息
|
|
|
|
|
function XItemManager.GetSellReward(id, count)
|
|
|
|
|
local reward = {}
|
|
|
|
|
|
|
|
|
|
if not id then return reward end
|
|
|
|
|
count = count or 1
|
|
|
|
|
|
|
|
|
|
local tab = XItemManager.GetItemTemplate(id)
|
|
|
|
|
local templateId = tab.SellForId
|
|
|
|
|
if templateId > 0 then
|
|
|
|
|
reward.TemplateId = templateId
|
|
|
|
|
reward.Count = tab.SellForCount * count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return reward
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--根据物品列表(key => itemId, value => itemCount)获取奖励信息
|
|
|
|
|
function XItemManager.GetSellRewards(idList)
|
|
|
|
|
local rewards = {}
|
|
|
|
|
local templateIds = {}
|
|
|
|
|
if not idList then return rewards end
|
|
|
|
|
for id, count in pairs(idList) do
|
|
|
|
|
local tab = XItemManager.GetItemTemplate(id)
|
|
|
|
|
local templateId = tab.SellForId
|
|
|
|
|
if templateId > 0 then
|
|
|
|
|
if templateIds[templateId] then
|
|
|
|
|
templateIds[templateId] = templateIds[templateId] + tab.SellForCount * count
|
|
|
|
|
else
|
|
|
|
|
templateIds[templateId] = tab.SellForCount * count
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
for templateId, count in pairs(templateIds) do
|
|
|
|
|
tableInsert(rewards, {
|
|
|
|
|
TemplateId = templateId,
|
|
|
|
|
Count = count
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
return rewards
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetSelectGiftRewardId(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.RewardId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemName(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if not template then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
return template.Name
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 战斗复活ui调用
|
|
|
|
|
function XItemManager.GetCostItemText(id)
|
|
|
|
|
return CS.XTextManager.GetText("RebootCostText", XItemManager.GetItemName(id)) --"消耗{0}"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 战斗复活ui调用
|
|
|
|
|
function XItemManager.CanRebootBuyItem(id)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
return (id ~= XItemManager.ItemId.Coin and id ~= XItemManager.ItemId.FreeGem and id ~= XItemManager.ItemId.PaidGem and id ~= XBiancaTheatreConfigs.TheatreActionPoint and
|
|
|
|
|
id ~= XEnumConst.THEATRE3.Theatre3InnerCoin)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetItemSuit(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if not template then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
return template.Suit
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
--已解锁收藏道具
|
|
|
|
|
function XItemManager.GetUnlockItemCollectIds()
|
|
|
|
|
local tmp = {}
|
|
|
|
|
tmp = appendArray(tmp, XItemConfigs.GetDefaultCollectList())
|
|
|
|
|
tmp = appendArray(tmp, ItemCollectionIds)
|
|
|
|
|
return tmp
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 检测有获得新的道具
|
|
|
|
|
function XItemManager.CheckHasNewColletId()
|
|
|
|
|
for k, id in pairs(XItemManager.GetUnlockItemCollectIds()) do
|
|
|
|
|
if XItemManager.CheckHasNewItemCollect(id) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckCollectItemUnlock(templateId)
|
|
|
|
|
local list = XItemManager.GetUnlockItemCollectIds()
|
|
|
|
|
for _, id in pairs(list or {}) do
|
|
|
|
|
if id == templateId then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--首次进入道具收藏界面
|
|
|
|
|
function XItemManager.IsFirstOpenItemCollectView()
|
|
|
|
|
local key = GetCookieKey("FirstOpenItemCollectView")
|
|
|
|
|
local data = XSaveTool.GetData(key) or false
|
|
|
|
|
return not data
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--标记首次进入
|
|
|
|
|
function XItemManager.MarkFirstOpenItemCollectView()
|
|
|
|
|
local key = GetCookieKey("FirstOpenItemCollectView")
|
|
|
|
|
local data = XSaveTool.GetData(key) or false
|
|
|
|
|
if data then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XSaveTool.SaveData(key, true)
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ITEM_COLLECT_STATE_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--检查是否有新解锁收藏道具, itemId可选参数,不填则检查全部
|
|
|
|
|
function XItemManager.CheckHasNewItemCollect(itemId)
|
|
|
|
|
local check = function(id)
|
|
|
|
|
local template = XItemConfigs.GetItemCollectTemplate(id)
|
|
|
|
|
if template.Type == XItemConfigs.ItemCollectionType.DefaultCollect then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
local key = GetCookieKey("NewItemCollect_" .. id)
|
|
|
|
|
local data = XSaveTool.GetData(key) or false
|
|
|
|
|
return not data
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local result = false
|
|
|
|
|
if XTool.IsNumberValid(itemId) then
|
|
|
|
|
result = check(itemId)
|
|
|
|
|
else
|
|
|
|
|
for _, id in ipairs(ItemCollectionIds) do
|
|
|
|
|
result = check(id)
|
|
|
|
|
if result then
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--标记已读
|
|
|
|
|
function XItemManager.MarkNewItemCollect(itemId)
|
|
|
|
|
local key = GetCookieKey("NewItemCollect_" .. itemId)
|
|
|
|
|
local data = XSaveTool.GetData(key) or false
|
|
|
|
|
if data then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
XSaveTool.SaveData(key, true)
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ITEM_COLLECT_STATE_CHANGE)
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
function XItemManager.GetDailyActiveness()
|
|
|
|
|
return XItemManager.GetItem(XItemManager.ItemId.DailyActiveness)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetWeeklyActiveness()
|
|
|
|
|
return XItemManager.GetItem(XItemManager.ItemId.WeeklyActiveness)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckItemTemplateExist(id)
|
|
|
|
|
return id and ItemTemplates[id] and true or false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.IsCanSell(id)
|
|
|
|
|
if XItemManager.IsTimeLimitBatch(id) then return false end --时效批次性道具不可出售
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.SellForId > 0 and template.SellForCount > 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.IsUseable(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.ItemType == XItemConfigs.ItemType.Gift
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.IsWeaponFashion(id)
|
|
|
|
|
if not XItemManager.CheckItemTemplateExist(id) then return false end
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.ItemType == XItemConfigs.ItemType.WeaponFashion
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.IsWeaponFashionTimeLimit(id)
|
|
|
|
|
if not XItemManager.IsWeaponFashion(id) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local weaponFashionId = XItemManager.GetWeaponFashionId(id)
|
|
|
|
|
if XDataCenter.WeaponFashionManager.CheckFashionTimeLimit(weaponFashionId) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local addTime = XItemManager.GetWeaponFashionAddTime(id)
|
|
|
|
|
if addTime and addTime > 0 then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetWeaponFashionId(id)
|
|
|
|
|
if not XItemManager.IsWeaponFashion(id) then return end
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.SubTypeParams[1]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetWeaponFashionAddTime(id)
|
|
|
|
|
if not XItemManager.IsWeaponFashion(id) then return end
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.SubTypeParams[2]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
--- 储存仓库页签选择
|
|
|
|
|
function XItemManager.SetPageRecordCache(page)
|
|
|
|
|
XItemManager.PageRecordCache = page
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 是否溢出(碎片是否可转化)
|
|
|
|
|
function XItemManager.IsCanConvert(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if template.ItemType ~= XItemConfigs.ItemType.Fragment then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--角色已经满级
|
|
|
|
|
local characterId = XCharacterConfigs.GetCharcterIdByFragmentItemId(id)
|
|
|
|
|
local charcter = XDataCenter.CharacterManager.GetCharacter(characterId)
|
|
|
|
|
return charcter and XDataCenter.CharacterManager.IsMaxQuality(charcter)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 背包材料
|
|
|
|
|
function XItemManager.IsBagMaterial(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
local itemType = template.ItemType
|
|
|
|
|
for _, materialType in pairs(XItemConfigs.Materials) do
|
|
|
|
|
if itemType == materialType then return true end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 时效性道具
|
|
|
|
|
function XItemManager.IsTimeLimit(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.TimelinessType > XItemManager.TimelinessType.Invalid
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 时效分批次性道具
|
|
|
|
|
function XItemManager.IsTimeLimitBatch(id)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.TimelinessType == XItemManager.TimelinessType.Batch
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 可选礼包
|
|
|
|
|
function XItemManager.IsSelectGift(id)
|
|
|
|
|
if not XItemManager.IsUseable(id) then return false end
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.GiftType == XItemManager.GiftItemUseType.OptionalReward
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 红包
|
|
|
|
|
function XItemManager.IsRedEnvelope(id)
|
|
|
|
|
if not XItemManager.IsUseable(id) then return false end
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
return template.GiftType == XItemManager.GiftItemUseType.RedEnvelope
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 检查数据
|
|
|
|
|
function XItemManager.CheckItemCount(item, count)
|
|
|
|
|
return item and item:GetCount() >= count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckItemCountById(id, count)
|
|
|
|
|
local item = XItemManager.GetItem(id)
|
|
|
|
|
return XItemManager.CheckItemCount(item, count)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckItemsCount(items)
|
|
|
|
|
for _, item in pairs(items) do
|
|
|
|
|
if not XItemManager.CheckItemCountById(item.Id, item.Count) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckItemsCountByTimes(items, times)
|
|
|
|
|
for _, item in pairs(items) do
|
|
|
|
|
if not XItemManager.CheckItemCountById(item.Id, item.Count * times) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckItemType(item, type)
|
|
|
|
|
return item.Template.ItemType == type
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 修改数据
|
|
|
|
|
function XItemManager.CreateItem(itemData)
|
|
|
|
|
local template = XItemManager.GetItemTemplate(itemData.Id)
|
|
|
|
|
if template == nil then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.CreateItem", "ItemTemplate", " Share/Item/Item.tab", "id", tostring(itemData.Id))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local item
|
|
|
|
|
if template.RecType == XResetManager.ResetType.NoNeed then
|
|
|
|
|
item = XItem.New(itemData, template)
|
|
|
|
|
else
|
|
|
|
|
item = XRecItem.New(itemData, template)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Items[item.Id] = item
|
|
|
|
|
return item
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.SetItemCount(id, count, validTime)
|
|
|
|
|
local item = Items[id]
|
|
|
|
|
if not item then
|
|
|
|
|
item = XItemManager.CreateItem(id, count, validTime, 0)
|
|
|
|
|
end
|
|
|
|
|
item:SetCount(count)
|
|
|
|
|
return item
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.SetItemCountDelta(id, delta, validTime)
|
|
|
|
|
local item = Items[id]
|
|
|
|
|
if item then
|
|
|
|
|
XItemManager.SetItemCount(id, item.Count + delta, validTime)
|
|
|
|
|
else
|
|
|
|
|
XItemManager.SetItemCount(id, delta, validTime)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 回收相关
|
|
|
|
|
function XItemManager.GetRecycleLeftTime(id)
|
|
|
|
|
local leftTime = 0
|
|
|
|
|
|
|
|
|
|
local item = XItemManager.GetItem(id)
|
|
|
|
|
if not item then return leftTime end
|
|
|
|
|
|
|
|
|
|
local startTime
|
|
|
|
|
if item.Template.TimelinessType == XItemManager.TimelinessType.FromConfig then
|
|
|
|
|
startTime = XTime.ParseToTimestamp(item.Template.StartTime)
|
|
|
|
|
elseif item.Template.TimelinessType == XItemManager.TimelinessType.AfterGet then
|
|
|
|
|
startTime = item.CreateTime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if startTime then
|
|
|
|
|
local endTime = startTime + item.Template.Duration
|
|
|
|
|
leftTime = endTime - XTime.GetServerNowTimestamp()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return leftTime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 此接口只检测回收类型 XItemManager.TimelinessType.FromConfig/XItemManager.TimelinessType.AfterGet
|
|
|
|
|
-- XItemManager.TimelinessType.Batch类型回收时间列表需手动检查
|
|
|
|
|
function XItemManager.IsTimeOver(id)
|
|
|
|
|
if XItemManager.IsTimeLimit(id) then
|
|
|
|
|
local leftTime = XItemManager.GetRecycleLeftTime(id)
|
|
|
|
|
if leftTime and leftTime <= 0 then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 服务端交互
|
|
|
|
|
function XItemManager.PackItemList(items)
|
|
|
|
|
local rpcData = {}
|
|
|
|
|
for id, count in pairs(items) do
|
|
|
|
|
local data = {}
|
|
|
|
|
data.Id = id
|
|
|
|
|
data.Count = count
|
|
|
|
|
tableInsert(rpcData, data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return rpcData
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.Use(id, recycleTime, count, callback, rewardIds)
|
|
|
|
|
local req = { Id = id, RecycleTime = recycleTime, Count = count, SelectRewardIds = rewardIds }
|
|
|
|
|
|
|
|
|
|
XNetwork.Call(METHOD_NAME.Use, req, function(res)
|
|
|
|
|
if res.Code ~= XCode.Success then
|
|
|
|
|
XUiManager.TipCode(res.Code)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if callback then
|
|
|
|
|
callback(res.RewardGoodsList)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if XItemManager.IsTimeLimit(id) then
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_TIMELIMIT_ITEM_USE, id)
|
|
|
|
|
end
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ITEM_USE, id)
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.Sell(datas, callback)
|
|
|
|
|
XMessagePack.MarkAsTable(datas)
|
|
|
|
|
local req = { SellItems = datas }
|
|
|
|
|
XNetwork.Call(METHOD_NAME.Sell, req, function(res)
|
|
|
|
|
if res.Code ~= XCode.Success then
|
|
|
|
|
XUiManager.TipCode(res.Code)
|
|
|
|
|
return
|
|
|
|
|
else
|
|
|
|
|
if callback then
|
|
|
|
|
callback(res.ObtainItems)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.BuyAsset(targetId, callback, failCallback, times, consumeId)
|
|
|
|
|
local req = { ItemId = targetId, ConsumeId = consumeId, Times = times }
|
|
|
|
|
XNetwork.Call(METHOD_NAME.BuyAsset, req, function(res)
|
|
|
|
|
if res.Code ~= XCode.Success then
|
|
|
|
|
XUiManager.TipCode(res.Code)
|
|
|
|
|
if failCallback then
|
|
|
|
|
failCallback()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- if res.IsCrit then
|
|
|
|
|
-- end
|
|
|
|
|
if callback then
|
|
|
|
|
callback(targetId, res.Count, res.IsCrit)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ITEM_BUYASSET, targetId)
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.MultiplyUse(useList, callback)
|
|
|
|
|
local req = { UseList = useList }
|
|
|
|
|
|
|
|
|
|
XNetwork.Call(METHOD_NAME.MultiplyUse, req, function(res)
|
|
|
|
|
if res.Code ~= XCode.Success then
|
|
|
|
|
XUiManager.TipCode(res.Code)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if callback then
|
|
|
|
|
callback(res.RewardGoodsList)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ITEM_MULTIPLY_USE)
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 角色需要的基础属性
|
|
|
|
|
function XItemManager.GetCoinsNum()
|
|
|
|
|
return Items[XItemManager.ItemId.Coin]:GetCount()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetTotalGemsNum()
|
|
|
|
|
return Items[XItemManager.ItemId.FreeGem]:GetCount() + Items[XItemManager.ItemId.PaidGem]:GetCount()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetActionPointsNum()
|
|
|
|
|
return Items[XItemManager.ItemId.ActionPoint]:GetCount()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetMaxActionPoints()
|
|
|
|
|
return XPlayerManager.GetMaxActionPoint(XPlayer.GetLevelOrHonorLevel(), XPlayer.IsHonorLevelOpen())
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetActionPointsRefreshResidueSecond()
|
|
|
|
|
return Items[XItemManager.ItemId.ActionPoint]:GetRefreshResidueSecond()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetSkillPointNum()
|
|
|
|
|
return Items[XItemManager.ItemId.SkillPoint]:GetCount()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetBatterys()
|
|
|
|
|
local tmp = {}
|
|
|
|
|
for _, v in pairs(SuppliesItems[XItemManager.SuppliesItemType.Battery]) do
|
|
|
|
|
if Items[v] then
|
|
|
|
|
tableInsert(tmp, Items[v])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return XItemManager.ConvertToGridData(tmp)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCoinPackages()
|
|
|
|
|
local result = {}
|
|
|
|
|
for _, v in pairs(SuppliesItems[XItemManager.SuppliesItemType.CoinPackage]) do
|
|
|
|
|
if Items[v] then
|
|
|
|
|
tableInsert(result, Items[v])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return XItemManager.ConvertToGridData(result)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCurBatterys()
|
|
|
|
|
local CurBatterys = {}
|
|
|
|
|
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
for _, v in pairs(XItemManager.GetBatterys()) do
|
|
|
|
|
local item = v.Data
|
|
|
|
|
if item:GetCount() > 0 then
|
|
|
|
|
local recycleBatch = v.RecycleBatch
|
|
|
|
|
if recycleBatch then
|
|
|
|
|
if recycleBatch.RecycleTime > nowTime then
|
|
|
|
|
tableInsert(CurBatterys, v)
|
|
|
|
|
end
|
|
|
|
|
elseif not XItemManager.IsTimeOver(item.Id) then
|
|
|
|
|
tableInsert(CurBatterys, v)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
tableSort(CurBatterys, function(a, b)
|
|
|
|
|
local aTemplate = a.Data.Template
|
|
|
|
|
local bTemplate = b.Data.Template
|
|
|
|
|
|
|
|
|
|
if aTemplate.TimelinessType == bTemplate.TimelinessType then
|
|
|
|
|
if a.RecycleBatch and b.RecycleBatch then
|
|
|
|
|
if a.RecycleBatch.RecycleTime == b.RecycleBatch.RecycleTime then
|
|
|
|
|
return aTemplate.Priority > bTemplate.Priority
|
|
|
|
|
else
|
|
|
|
|
return a.RecycleBatch.RecycleTime < b.RecycleBatch.RecycleTime
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return aTemplate.Priority > bTemplate.Priority
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return aTemplate.TimelinessType > bTemplate.TimelinessType
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
return CurBatterys
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCurrentCoinPackages()
|
|
|
|
|
local result = {}
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
for _, value in ipairs(XItemManager.GetCoinPackages()) do
|
|
|
|
|
local item = value.Data
|
|
|
|
|
if item:GetCount() > 0 then
|
|
|
|
|
-- RecycleBatch这个数据是服务器返回的,来源于InitItemRecycle
|
|
|
|
|
local recycleBatch = value.RecycleBatch
|
|
|
|
|
if recycleBatch then
|
|
|
|
|
if recycleBatch.RecycleTime > nowTime then
|
|
|
|
|
tableInsert(result, value)
|
|
|
|
|
end
|
|
|
|
|
elseif not XItemManager.IsTimeOver(item.Id) then
|
|
|
|
|
tableInsert(result, value)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
tableSort(result, function(a, b)
|
|
|
|
|
local aItemConfig = a.Data.Template
|
|
|
|
|
local bItemConfig = b.Data.Template
|
|
|
|
|
if aItemConfig.Priority == bItemConfig.Priority then
|
|
|
|
|
return aItemConfig.Id > bItemConfig.Id
|
|
|
|
|
else
|
|
|
|
|
return aItemConfig.Priority > bItemConfig.Priority
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
return result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetBatteryMinLeftTime()
|
|
|
|
|
local minLeftTime = 0
|
|
|
|
|
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
local batterys = XItemManager.GetBatterys()
|
|
|
|
|
for _, v in pairs(batterys) do
|
|
|
|
|
local itemId = v.Data.Id
|
|
|
|
|
if XItemManager.IsTimeLimit(itemId) then
|
|
|
|
|
local recycleBatch = v.RecycleBatch
|
|
|
|
|
if recycleBatch then
|
|
|
|
|
if recycleBatch.RecycleCount > 0 then
|
|
|
|
|
local leftTime = recycleBatch.RecycleTime - nowTime
|
|
|
|
|
leftTime = leftTime > 0 and leftTime or 0
|
|
|
|
|
if minLeftTime == 0 or minLeftTime > leftTime then
|
|
|
|
|
minLeftTime = leftTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if v.Data:GetCount() > 0 and not XItemManager.IsTimeOver(itemId) then
|
|
|
|
|
local leftTime = XItemManager.GetRecycleLeftTime(itemId)
|
|
|
|
|
if leftTime then
|
|
|
|
|
if minLeftTime == 0 or minLeftTime > leftTime then
|
|
|
|
|
minLeftTime = leftTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return minLeftTime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetTimeLimitItemsMinLeftTime()
|
|
|
|
|
local minLeftTime = 0
|
|
|
|
|
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
for _, v in pairs(Items) do
|
|
|
|
|
local itemId = v.Id
|
|
|
|
|
if XItemManager.IsTimeLimit(itemId) and v:GetCount() > 0 and XItemManager.IsBagMaterial(itemId) then
|
|
|
|
|
local itemRecycleList = v.ItemRecycleList
|
|
|
|
|
if itemRecycleList then
|
|
|
|
|
for _, recycleBatch in pairs(itemRecycleList) do
|
|
|
|
|
if recycleBatch.RecycleCount > 0 then
|
|
|
|
|
local leftTime = recycleBatch.RecycleTime - nowTime
|
|
|
|
|
leftTime = leftTime > 0 and leftTime or 0
|
|
|
|
|
if minLeftTime == 0 or minLeftTime > leftTime then
|
|
|
|
|
minLeftTime = leftTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if not XItemManager.IsTimeOver(itemId) then
|
|
|
|
|
local leftTime = XItemManager.GetRecycleLeftTime(itemId)
|
|
|
|
|
if leftTime then
|
|
|
|
|
if minLeftTime == 0 or minLeftTime > leftTime then
|
|
|
|
|
minLeftTime = leftTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return minLeftTime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetBagItemListMinLeftTime(bagDatas)
|
|
|
|
|
local minLeftTime = 0
|
|
|
|
|
|
|
|
|
|
local nowTime = XTime.GetServerNowTimestamp()
|
|
|
|
|
for _, gridData in pairs(bagDatas) do
|
|
|
|
|
local itemId = gridData.Data.Id
|
|
|
|
|
if XItemManager.IsTimeLimit(itemId) and gridData.Count > 0 then
|
|
|
|
|
local leftTime = gridData.RecycleBatch and gridData.RecycleBatch.RecycleTime - nowTime or XDataCenter.ItemManager.GetRecycleLeftTime(itemId)
|
|
|
|
|
leftTime = leftTime > 0 and leftTime or 0
|
|
|
|
|
if minLeftTime == 0 or minLeftTime > leftTime then
|
|
|
|
|
minLeftTime = leftTime
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return minLeftTime
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckBatteryIsHave()
|
|
|
|
|
for _, v in pairs(XItemManager.GetBatterys()) do
|
|
|
|
|
if v.Data:GetCount() > 0 then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckCoinPackageIsHave()
|
|
|
|
|
for _, v in pairs(XItemManager.GetCoinPackages()) do
|
|
|
|
|
if v.Data:GetCount() > 0 then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.CheckBatteryIsHaveByIdAndRecycleTime(id, recycleTime)
|
|
|
|
|
for _, v in pairs(XItemManager.GetBatterys()) do
|
|
|
|
|
if v.Data:GetCount() > 0 and v.Data.Id == id then
|
|
|
|
|
if (not recycleTime or v.RecycleBatch.RecycleTime == recycleTime) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.DoNotEnoughBuyAsset(useItemId, useItemCount, buyCount, callBack, errorTxt)
|
|
|
|
|
local ownItemCount = XDataCenter.ItemManager.GetCount(useItemId)
|
|
|
|
|
local lackItemCount = useItemCount * buyCount - ownItemCount
|
|
|
|
|
if lackItemCount > 0 then
|
|
|
|
|
local template = XDataCenter.ItemManager.GetBuyAssetTemplate(useItemId, 0, true)
|
|
|
|
|
if template ~= nil then
|
|
|
|
|
if BuyAssetTemplates[useItemId] and #BuyAssetTemplates[useItemId] > 1 then
|
|
|
|
|
XItemManager.SelectBuyAssetType(useItemId, callBack, nil, 1, true)
|
|
|
|
|
else
|
|
|
|
|
lackItemCount = mathCeil(lackItemCount / template.GainCount)
|
|
|
|
|
XItemManager.SelectBuyAssetType(useItemId, callBack, nil, lackItemCount, true)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
XUiManager.TipError(CS.XTextManager.GetText(errorTxt))
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
function XItemManager.SelectBuyAssetType(useItemId, callBack, challengeCountData, buyAmount, isAutoClose)
|
|
|
|
|
if useItemId == XDataCenter.ItemManager.ItemId.ActionPoint and
|
|
|
|
|
XDataCenter.ItemManager.CheckBatteryIsHave() then
|
|
|
|
|
XLuaUiManager.Open("UiUsePackage", useItemId, callBack, challengeCountData, buyAmount)
|
|
|
|
|
elseif useItemId == XDataCenter.ItemManager.ItemId.Coin
|
|
|
|
|
and XDataCenter.ItemManager.CheckCoinPackageIsHave() then
|
|
|
|
|
XLuaUiManager.Open("UiUseCoinPackage")
|
|
|
|
|
else
|
|
|
|
|
XLuaUiManager.Open("UiBuyAsset", useItemId, callBack, challengeCountData, buyAmount, isAutoClose)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
function XItemManager.NotifyItemDataList(data)
|
|
|
|
|
local list = data.ItemDataList
|
|
|
|
|
if not list then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
for _, tmpData in pairs(list) do
|
|
|
|
|
local id = tmpData.Id
|
|
|
|
|
|
|
|
|
|
if not Items[id] then
|
|
|
|
|
Items[id] = XItemManager.CreateItem(tmpData)
|
|
|
|
|
else
|
|
|
|
|
Items[id]:RefreshItem(tmpData)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not ItemFirstGetCheckTable[id] then
|
|
|
|
|
ItemFirstGetCheckTable[id] = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 回收道具时限表
|
|
|
|
|
XItemManager.InitItemRecycle(data.ItemRecycleDict)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetMaxCount(id)
|
|
|
|
|
if id == XItemManager.ItemId.ActionPoint then
|
|
|
|
|
return XItemManager.GetMaxActionPoints()
|
|
|
|
|
else
|
|
|
|
|
local template = XItemManager.GetItemTemplate(id)
|
|
|
|
|
if template then
|
|
|
|
|
if template.MaxCount <= 0 then
|
|
|
|
|
return XMath.IntMax() -- int.MaxValue,和服务端相同
|
|
|
|
|
else
|
|
|
|
|
return template.MaxCount
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return -1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.ConvertToGridData(originDatas)
|
|
|
|
|
local bagDatas = {}
|
|
|
|
|
for i = 1, #originDatas do
|
|
|
|
|
local data = originDatas[i]
|
|
|
|
|
if data.Count > 0 then
|
|
|
|
|
-- 按限时道具到期时间拆分(优先)
|
|
|
|
|
if XItemManager.IsTimeLimitBatch(data.Id) then
|
|
|
|
|
local list = data.ItemRecycleList
|
|
|
|
|
if list then
|
|
|
|
|
for index, info in ipairs(list) do
|
|
|
|
|
if info.RecycleCount > 0 then
|
|
|
|
|
local gridData = {}
|
|
|
|
|
gridData.Data = data
|
|
|
|
|
gridData.GridIndex = index
|
|
|
|
|
gridData.RecycleBatch = info
|
|
|
|
|
gridData.Count = info.RecycleCount
|
|
|
|
|
tableInsert(bagDatas, gridData)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- 按最大堆叠数拆分
|
|
|
|
|
elseif data.Template.GridCount <= 0 then
|
|
|
|
|
local gridData = {}
|
|
|
|
|
gridData.Data = data
|
|
|
|
|
gridData.GridIndex = 1
|
|
|
|
|
gridData.Count = data.Count
|
|
|
|
|
tableInsert(bagDatas, gridData)
|
|
|
|
|
else
|
|
|
|
|
local gridCount = data.Template.GridCount
|
|
|
|
|
local gridNum = mathCeil(data.Count / gridCount)
|
|
|
|
|
for j = 1, gridNum do
|
|
|
|
|
local gridData = {}
|
|
|
|
|
gridData.Data = data
|
|
|
|
|
gridData.GridIndex = j
|
|
|
|
|
gridData.Count = mathMin(data.Count - (j - 1) * gridCount, gridCount)
|
|
|
|
|
tableInsert(bagDatas, gridData)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return bagDatas
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
---判断道具是否需要显示回复提示,以后若有其他判断途径则改该方法内部逻辑即可
|
|
|
|
|
function XItemManager.CheckItemNeedTips(id)
|
|
|
|
|
return NeedTipsItemList[id] and true or false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
-------------------------道具事件相关-------------------------
|
|
|
|
|
--==============================--
|
|
|
|
|
--desc: 道具数量变化监听
|
|
|
|
|
--@ids: 道具id或者道具id列表
|
|
|
|
|
--@func: 事件回调
|
|
|
|
|
--@ui: ui节点
|
|
|
|
|
--@obj: UI对象,可为空
|
|
|
|
|
--==============================--
|
|
|
|
|
function XItemManager.AddCountUpdateListener(ids, func, ui, obj)
|
|
|
|
|
if type(ids) == "number" then
|
|
|
|
|
if ids == XItemManager.ItemId.FreeGem or ids == XItemManager.ItemId.PaidGem then
|
|
|
|
|
ids = { XItemManager.ItemId.FreeGem, XItemManager.ItemId.PaidGem }
|
|
|
|
|
else
|
|
|
|
|
ids = { ids }
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, id in pairs(ids) do
|
|
|
|
|
if not Items[id] then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.AddCountUpdateListener", "Items", "Share/Item/Item.tab", "Id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not ui then
|
|
|
|
|
XLog.Error("XItemManager.AddCountUpdateListener函数参数错误: 参数ui不能为空")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, id in pairs(ids) do
|
|
|
|
|
XEventManager.BindEvent(ui, XEventId.EVENT_ITEM_COUNT_UPDATE_PREFIX .. id, func, obj)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XItemManager.RemoveCountUpdateListener(ui)
|
|
|
|
|
XEventManager.UnBindEvent(ui)
|
|
|
|
|
end
|
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
--==============================--
|
|
|
|
|
--desc: 购买次数变化监听
|
|
|
|
|
--@ids: 道具id或者道具id列表
|
|
|
|
|
--@func: 事件回调
|
|
|
|
|
--@ui: ui节点
|
|
|
|
|
--@obj: UI对象,可为空
|
|
|
|
|
--==============================--
|
|
|
|
|
function XItemManager.AddBuyTimesUpdateListener(ids, func, ui, obj)
|
|
|
|
|
if type(ids) == "number" then
|
|
|
|
|
if ids == XItemManager.ItemId.FreeGem or ids == XItemManager.ItemId.PaidGem then
|
|
|
|
|
ids = { XItemManager.ItemId.FreeGem, XItemManager.ItemId.PaidGem }
|
|
|
|
|
else
|
|
|
|
|
ids = { ids }
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, id in pairs(ids) do
|
|
|
|
|
if not Items[id] then
|
|
|
|
|
XLog.ErrorTableDataNotFound("XItemManager.AddBuyTimesUpdateListener", "Items", "Share/Item/Item.tab", "Id", tostring(id))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not ui then
|
|
|
|
|
XLog.Error("XItemManager.AddBuyTimesUpdateListener函数参数错误: 参数ui不能为空")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for _, id in pairs(ids) do
|
|
|
|
|
XEventManager.BindEvent(ui, XEventId.EVENT_ITEM_BUYTIEMS_UPDATE_PREFIX .. id, func, obj)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.GetCookieKeyStr()
|
|
|
|
|
return string.format("RecycleItemList_%s", XPlayer.Id)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.IsFastTrading(id)
|
|
|
|
|
local fastTrading = XItemConfigs.GetFastTrading(id)
|
|
|
|
|
if not fastTrading or fastTrading == XItemConfigs.FastTrading.NotFastTrading then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.JudjeCanFastTrading(uiName)
|
|
|
|
|
local FastTradingUiList = XItemConfigs.GetUiBuyAsset()
|
|
|
|
|
for _, v in pairs(FastTradingUiList) do
|
|
|
|
|
if v.UiName == uiName then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.NotifyItemRecycle(data)
|
|
|
|
|
if not next(data.RecycleIds) then return end
|
|
|
|
|
|
|
|
|
|
for _, id in pairs(data.RecycleIds) do
|
|
|
|
|
Items[id] = nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ITEM_RECYCLE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.NotifyBatchItemRecycle(data)
|
|
|
|
|
if not next(data.ItemRecycleList) then return end
|
|
|
|
|
|
|
|
|
|
for _, recycleInfo in pairs(data.ItemRecycleList) do
|
|
|
|
|
local id = recycleInfo.Id
|
|
|
|
|
|
|
|
|
|
local item = Items[id]
|
|
|
|
|
local itemRecycleList = item and item.ItemRecycleList
|
|
|
|
|
if itemRecycleList then
|
|
|
|
|
for k, v in pairs(itemRecycleList) do
|
|
|
|
|
if v.RecycleTime == recycleInfo.RecycleTime then
|
|
|
|
|
tableRemove(itemRecycleList, k)
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not next(itemRecycleList) then
|
|
|
|
|
Items[id] = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ITEM_RECYCLE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.NotifyAllRedEnvelope(data)
|
|
|
|
|
if not next(data.Envelopes) then return end
|
|
|
|
|
|
|
|
|
|
RedEnvelopeInfos = {}
|
|
|
|
|
for _, envelope in pairs(data.Envelopes) do
|
|
|
|
|
local activityId = envelope.ActivityId
|
|
|
|
|
RedEnvelopeInfos[activityId] = RedEnvelopeInfos[activityId] or {}
|
|
|
|
|
|
|
|
|
|
local npcId = envelope.NpcId
|
|
|
|
|
RedEnvelopeInfos[activityId][npcId] = RedEnvelopeInfos[activityId][npcId] or {}
|
|
|
|
|
|
|
|
|
|
local rewards = envelope.Rewards
|
|
|
|
|
for _, reward in pairs(rewards) do
|
|
|
|
|
local itemId = reward.ItemId
|
|
|
|
|
local itemCount = reward.ItemCount
|
|
|
|
|
local oldCount = RedEnvelopeInfos[activityId][npcId][itemId] or 0
|
|
|
|
|
RedEnvelopeInfos[activityId][npcId][itemId] = oldCount + itemCount
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.NotifyRedEnvelopeUse(data)
|
|
|
|
|
local envelopeId = data.EnvelopeId
|
|
|
|
|
if not envelopeId or not XItemManager.IsRedEnvelope(envelopeId) then return end
|
|
|
|
|
|
|
|
|
|
local envelopes = data.Envelopes
|
|
|
|
|
if not next(envelopes) then return end
|
|
|
|
|
|
|
|
|
|
for _, envelope in pairs(envelopes) do
|
|
|
|
|
local activityId = envelope.ActivityId
|
|
|
|
|
RedEnvelopeInfos[activityId] = RedEnvelopeInfos[activityId] or {}
|
|
|
|
|
|
|
|
|
|
local npcId = envelope.NpcId
|
|
|
|
|
RedEnvelopeInfos[activityId][npcId] = RedEnvelopeInfos[activityId][npcId] or {}
|
|
|
|
|
|
|
|
|
|
local itemId = envelope.ItemId
|
|
|
|
|
local itemCount = envelope.ItemCount
|
|
|
|
|
local oldCount = RedEnvelopeInfos[activityId][npcId][itemId] or 0
|
|
|
|
|
RedEnvelopeInfos[activityId][npcId][itemId] = oldCount + itemCount
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XLuaUiManager.Open("UiRedEnvelope", envelopeId, envelopes)
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
--- 道具收藏盒,登录下发
|
|
|
|
|
---@param data Server.XItemCollectionDataDb
|
|
|
|
|
--------------------------
|
|
|
|
|
function XItemManager.NotifyLoginItemCollectionData(data)
|
|
|
|
|
if not data then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
ItemCollectionIds = {}
|
|
|
|
|
local dataList = data.ItemCollectionData and data.ItemCollectionData.TemplateIds or {}
|
|
|
|
|
ItemCollectionIds = dataList
|
|
|
|
|
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ITEM_COLLECT_STATE_CHANGE)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XItemManager.NotifyAddItemCollectionData(data)
|
|
|
|
|
if not data then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local templateId = data.TemplateId
|
|
|
|
|
local exist = false
|
|
|
|
|
for _, id in ipairs(ItemCollectionIds) do
|
|
|
|
|
if id == templateId then
|
|
|
|
|
exist = true
|
|
|
|
|
XLog.Error("道具盒子重复添加道具,道具Id = " .. templateId)
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not exist then
|
|
|
|
|
tableInsert(ItemCollectionIds, templateId)
|
|
|
|
|
end
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_ITEM_COLLECT_STATE_CHANGE)
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
-------------------------道具事件相关-------------------------
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
-------------------------PC虹卡相关-------------------------
|
|
|
|
|
function XItemManager.GetPcOtherPlatformMoneyCardCount(cb)
|
|
|
|
|
if not XDataCenter.UiPcManager.IsPc() then
|
|
|
|
|
cb(0)
|
|
|
|
|
XLog.Debug("非PC平台不请求")
|
|
|
|
|
end
|
|
|
|
|
-- 国服PC端需要获取另一平台(移动端)虹卡数据, 海外PC端如果有自己的虹卡, 则不需要获取, 可以通过调用XDataCenter.UiPcManager.IsOverSea()以判断
|
|
|
|
|
XNetwork.Call(METHOD_NAME.GetAndroidOrIosMoneyCardRequest, nil, function(response)
|
|
|
|
|
if not response or response.Code ~= 0 then
|
|
|
|
|
XLog.Error("获取另一平台虹卡数量失败")
|
|
|
|
|
if cb then
|
|
|
|
|
cb(0)
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
if cb then
|
|
|
|
|
cb(response.MoneyCard, response.Count)
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
XItemManager.Init()
|
|
|
|
|
return XItemManager
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyItemDataList = function(data)
|
|
|
|
|
XDataCenter.ItemManager.NotifyItemDataList(data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyItemRecycle = function(data)
|
|
|
|
|
XDataCenter.ItemManager.NotifyItemRecycle(data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyBatchItemRecycle = function(data)
|
|
|
|
|
XDataCenter.ItemManager.NotifyBatchItemRecycle(data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyAllRedEnvelope = function(data)
|
|
|
|
|
XDataCenter.ItemManager.NotifyAllRedEnvelope(data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyRedEnvelopeUse = function(data)
|
|
|
|
|
XDataCenter.ItemManager.NotifyRedEnvelopeUse(data)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyLoginItemCollectionData = function(data)
|
|
|
|
|
XDataCenter.ItemManager.NotifyLoginItemCollectionData(data)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XRpc.NotifyAddItemCollectionData = function(data)
|
|
|
|
|
XDataCenter.ItemManager.NotifyAddItemCollectionData(data)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|