forked from endernon/PGRData
1791 lines
No EOL
61 KiB
Lua
1791 lines
No EOL
61 KiB
Lua
XItemManagerCreator = function()
|
||
---@class XItemManager
|
||
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 = {} -- 红包道具使用记录
|
||
local ItemCollectionIds = {} -- 已解锁收藏道具Id
|
||
|
||
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
|
||
|
||
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,
|
||
DormQuestCoin = 103, -- 宿舍委托道具Id
|
||
SEllaFragment = 559, -- 逆元碎片-万华
|
||
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,纪念代币
|
||
PokerGuessingItemId = 97012, --翻牌比大小活动物品
|
||
SuperTowerBagItemId = 62801, --超级爬塔背包扩容道具Id
|
||
AreaWarActionPoint = 62901, --全服决战-行动点
|
||
AreaWarCoin = 62902, --全服决战-货币
|
||
AreaWarPurifyExp = 62903, --全服决战-净化之火
|
||
RpgMakerGameHintCoin = 63300, --推箱子游戏-提示货币
|
||
DoubleTower = 60850,--动作塔防代币
|
||
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,-- 超限连战积分
|
||
}
|
||
|
||
--时效性道具初始时间计算方式
|
||
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",
|
||
GetAndroidOrIosMoneyCardRequest = "GetAndroidOrIosMoneyCardRequest",
|
||
}
|
||
|
||
---需要显示回复提示的道具的列表
|
||
local NeedTipsItemList={
|
||
[62901]=true --特制血清
|
||
}
|
||
|
||
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
|
||
|
||
local GetCookieKey = function(key)
|
||
return string.format("ItemManager_UID:%s_%s", XPlayer.Id, key)
|
||
end
|
||
|
||
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
|
||
elseif id == XGuildConfig.GoodsCoinId then
|
||
local item = Items[id]
|
||
item.Count = XDataCenter.GuildManager.GetShopCoin()
|
||
return item
|
||
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()
|
||
elseif id == XGuildConfig.GoodsCoinId then
|
||
return XDataCenter.GuildManager.GetShopCoin()
|
||
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
|
||
|
||
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)
|
||
return (id ~= XItemManager.ItemId.Coin and id ~= XItemManager.ItemId.FreeGem and id ~= XItemManager.ItemId.PaidGem and id ~= XBiancaTheatreConfigs.TheatreActionPoint and
|
||
id ~= XEnumConst.THEATRE3.Theatre3InnerCoin)
|
||
end
|
||
|
||
function XItemManager.GetItemSuit(id)
|
||
local template = XItemManager.GetItemTemplate(id)
|
||
if not template then
|
||
return nil
|
||
end
|
||
return template.Suit
|
||
end
|
||
|
||
--已解锁收藏道具
|
||
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
|
||
|
||
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
|
||
|
||
---判断道具是否需要显示回复提示,以后若有其他判断途径则改该方法内部逻辑即可
|
||
function XItemManager.CheckItemNeedTips(id)
|
||
return NeedTipsItemList[id] and true or false
|
||
end
|
||
-------------------------道具事件相关-------------------------
|
||
--==============================--
|
||
--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
|
||
|
||
function XItemManager.RemoveCountUpdateListener(ui)
|
||
XEventManager.UnBindEvent(ui)
|
||
end
|
||
|
||
--==============================--
|
||
--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
|
||
|
||
--- 道具收藏盒,登录下发
|
||
---@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
|
||
-------------------------道具事件相关-------------------------
|
||
|
||
-------------------------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
|
||
|
||
|
||
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)
|
||
end
|
||
|
||
XRpc.NotifyLoginItemCollectionData = function(data)
|
||
XDataCenter.ItemManager.NotifyLoginItemCollectionData(data)
|
||
end
|
||
|
||
XRpc.NotifyAddItemCollectionData = function(data)
|
||
XDataCenter.ItemManager.NotifyAddItemCollectionData(data)
|
||
end |