local pairs = pairs local table = table local tableInsert = table.insert local tableSort = table.sort local MinCount = 0 local MaxCount = 999 XShopManager = XShopManager or {} local CSUnityEnginePlayerPrefs = CS.UnityEngine.PlayerPrefs local SYNC_SHOP_SECOND = 5 -- local ShopBaseInfosTemplates = {} -- Tap显示信息(普通+活动) local LastSyncShopTimes = {} -- 商店刷新时间 local ActivityLastSyncShopTime = {} -- 活动商店刷新时间 -- local LastSyncBaseInfoTime = 0 -- 商店基础信息同步时间 local ShopBaseInfoDict = {} -- 商店基础信息 local ShopDict = {} -- 商店详细信息 local ShopGroup = {} local GiftRewardId = nil --海外修改,存储当前购买的涂装礼包ID local ScreenGoodsList = {} local ScreenTagList = {} local ScreenAll = CS.XTextManager.GetText("ScreenAll") local ScreenOther = CS.XTextManager.GetText("ScreenOther") local COOKIE_DAILYSHOPNEWSUIT_KEY = "DailyShopNewSuit" local METHOD_NAME = { GetShopInfoList = "GetFixedShopListRequest", GetShopInfo = "GetShopInfoRequest", RefreshShop = "RefreshShopRequest", GetShopBaseInfo = "GetShopBaseInfoRequest", Buy = "BuyRequest", } XShopManager.ShopType = { Common = 1, -- 普通商店 Activity = 2, -- 活动商店 Points = 3, -- 活动商店 Dorm = 101, Boss = 102, Arena = 103, Guild = 301, FubenDaily = 401, WorldBoss = 501, --世界Boss SameColorGame = 601, -- 三消游戏 PickFlip = 602, -- 涂装抽卡 Theatre = 603, --肉鸽玩法 AccumulateConsume = 701, --累消活动 } XShopManager.ShopTags = { Not = 0, --无 HotSale = 1, --热销 Recommend = 2, --推荐 TimeLimit = 3, --限时 DisCount = 4, --打折 New = 5, --上新 } XShopManager.SecondTagType = { Top = 0, --顶部 Mid = 1, --中间 Btm = 2, --底部 All = 3, --唯一 } XShopManager.ScreenType = { SuitPos = 1, --意识位置 SuitName = 2, --意识套装 WeaponType = 3, --武器种类 FashionType = 4, --涂装所属 ItemType = 5, --道具种类 AwakeItemType = 6, --超频道具种类 ActivitySuitName = 8, --活动套装商店 } --活动商店 XShopManager.ActivityShopType = { BriefShop = 1, --活动界面商店 NieRShop = 2, --尼尔活动商店 MoeWarShop = 3, --萌战活动商店 AreaWar = 4, --全服决战商店 } function XShopManager.ClearBaseInfoData() ShopBaseInfoDict = {} end function XShopManager.GetShopBaseInfoByType(type) local list = {} for _, info in pairs(ShopBaseInfoDict) do if info.Type == type then tableInsert(list, info) end end tableSort(list, function(a, b) if a.SecondType == b.SecondType then return a.Priority > b.Priority else return a.SecondType < b.SecondType end end) return list end function XShopManager.GetShopBaseInfoByTypeAndTag(type) local tmp = {} local list = {} local tagList = {} local shopGroup = XShopManager.GetShopGroup() for _, info in pairs(ShopBaseInfoDict) do if info.Type == type and not XShopManager.GetShopIsHide(info.Id) then tableInsert(tmp, info) end end tableSort(tmp, function(a, b) if a.SecondType == b.SecondType then return a.Priority > b.Priority else return a.SecondType < b.SecondType end end) for _, v in pairs(tmp) do local tagData = {} if v.SecondType > 0 then if shopGroup[v.SecondType] then if not tagList[v.SecondType] then for i, d in pairs(v) do tagData[i] = d end tagData.Id = 0 tagData.SecondType = 0 tagData.Name = shopGroup[v.SecondType].TagName tagData.IsHasSnd = true tableInsert(list, tagData) tagList[v.SecondType] = v.SecondType end else v.SecondType = 0 v.IsHasSnd = false end else v.IsHasSnd = false end tableInsert(list, v) end for k, v in pairs(list) do if v.SecondType > 0 then if list[k - 1].SecondType == 0 then v.SecondTagType = XShopManager.SecondTagType.Top else v.SecondTagType = XShopManager.SecondTagType.Mid end if list[k + 1] then if list[k + 1].SecondType == 0 then if v.SecondTagType == XShopManager.SecondTagType.Mid then v.SecondTagType = XShopManager.SecondTagType.Btm else v.SecondTagType = XShopManager.SecondTagType.All end end else if v.SecondTagType == XShopManager.SecondTagType.Mid then v.SecondTagType = XShopManager.SecondTagType.Btm else v.SecondTagType = XShopManager.SecondTagType.All end end end end return list end function XShopManager.GetShopType(shopId) local info = ShopBaseInfoDict[shopId] if not info then XLog.Error("XShopManager.GetShopType error: can not found info, id is " .. shopId) return end return info.Type end function XShopManager.GetShopShowIdList(shopId) local info = ShopDict[shopId] if not info then XLog.Error("XShopManager.GetShopShowIdList error: can not found info, id is " .. shopId) return end local list = {} if info.ShowIds and #info.ShowIds > 0 then list = info.ShowIds end return list end function XShopManager.GetShopName(shopId) local info = ShopDict[shopId] if not info then XLog.Error("XShopManager.GetShopName error: can not found info, id is " .. shopId) return end return info.Name end function XShopManager.GetShopConditionIdList(shopId) local info = ShopDict[shopId] if not info then XLog.Error("XShopManager.GetShopConditionIdList error: can not found info, id is " .. shopId) return end local list = {} if info.ConditionIds and #info.ConditionIds > 0 then list = info.ConditionIds end return list end function XShopManager.GetShopScreenGroupIDList(shopId) local info = ShopDict[shopId] if not info then XLog.Error("XShopManager.GetShopScreenGroupIDList error: can not found info, id is " .. shopId) return end local list = {} if info.ScreenGroupList and #info.ScreenGroupList > 0 and info.ScreenGroupList[1] ~= 0 then list = info.ScreenGroupList end return list end function XShopManager.GetManualRefreshCost(shopId) local shop = ShopDict[shopId] if not shop then XLog.Error("XShopManager.GetManualRefreshCost error: can not found shop, id is " .. shopId) return end local costInfo = {} if shop.RefreshCostId and shop.RefreshCostId > 0 then costInfo.RefreshCostId = shop.RefreshCostId costInfo.RefreshCostCount = shop.RefreshCostCount end if shop.ManualResetTimesLimit and shop.ManualResetTimesLimit ~= 0 then costInfo.ManualRefreshTimes = shop.ManualRefreshTimes costInfo.ManualResetTimesLimit = shop.ManualResetTimesLimit end return costInfo end function XShopManager.GetShopBuyInfo(shopId) local shop = ShopDict[shopId] if not shop then XLog.Error("XShopManager.GetShopBuyInfo error: can not found shop, id is " .. shopId) return end return { TotalBuyTimes = shop.TotalBuyTimes, BuyTimesLimit = shop.BuyTimesLimit } end function XShopManager.GetShopLeftBuyTimes(shopId) local shop = ShopDict[shopId] if not shop then XLog.Error("XShopManager.GetShopBuyInfo error: can not found shop, id is " .. shopId) return end local buyTimesLimit = shop.BuyTimesLimit if not buyTimesLimit or buyTimesLimit <= 0 then return end local totalBuyTimes = shop.TotalBuyTimes and shop.TotalBuyTimes or 0 return buyTimesLimit - totalBuyTimes end function XShopManager.GetShopTimeInfo(shopId) local shop = ShopDict[shopId] if not shop then XLog.Error("XShopManager.GetShopTimeInfo error: can not found shop, id is " .. shopId) return end local info = {} local now = XTime.GetServerNowTimestamp() if shop.RefreshTime and shop.RefreshTime > 0 then info.RefreshLeftTime = shop.RefreshTime > now and shop.RefreshTime - now or 0 end if shop.ClosedTime and shop.ClosedTime > 0 then info.ClosedLeftTime = shop.ClosedTime > now and shop.ClosedTime - now or 0 end return info end function XShopManager.GetLeftTime(endTime) return endTime > 0 and endTime - XTime.GetServerNowTimestamp() or endTime end function XShopManager.IsShopExist(shopId) return ShopBaseInfoDict[shopId] ~= nil end function XShopManager.GetShopGoodsList(shopId) local shop = ShopDict[shopId] if not shop then XLog.Error("XShopManager.GetShopGoodsList error: can not found shop, id is " .. shopId) return {} end local list = {} for _, goods in pairs(shop.GoodsList) do local IsLock = false for _, v in pairs(goods.ConditionIds) do local ret = XConditionManager.CheckCondition(v) if not ret then IsLock = true break end end if not (IsLock and goods.IsHideWhenConditionLimit) then tableInsert(list, goods) end end --排序优先级 tableSort(list, function(a, b) -- 是否卖光 if a.BuyTimesLimit > 0 or b.BuyTimesLimit > 0 then -- 如果商品有次数限制,并且达到次数限制,则判断为售罄 local isSellOutA = a.BuyTimesLimit == a.TotalBuyTimes and a.BuyTimesLimit > 0 local isSellOutB = b.BuyTimesLimit == b.TotalBuyTimes and b.BuyTimesLimit > 0 if isSellOutA ~= isSellOutB then return isSellOutB end end --是否条件受限 local IsLockA = false local IsLockB = false for _, v in pairs(a.ConditionIds) do local ret = XConditionManager.CheckCondition(v) if not ret then IsLockA = true break end end for _, v in pairs(b.ConditionIds) do local ret = XConditionManager.CheckCondition(v) if not ret then IsLockB = true break end end if IsLockA ~= IsLockB then return IsLockB end -- 是否限时 if a.SelloutTime ~= b.SelloutTime then if a.SelloutTime > 0 and b.SelloutTime > 0 then return a.SelloutTime < b.SelloutTime elseif a.SelloutTime > 0 and b.SelloutTime <= 0 then return XShopManager.GetLeftTime(a.SelloutTime) > 0 elseif a.SelloutTime <= 0 and b.SelloutTime > 0 then return XShopManager.GetLeftTime(b.SelloutTime) < 0 end end if a.Tags ~= b.Tags and a.Tags ~= 0 and b.Tags ~= 0 then return a.Tags < b.Tags end if a.Priority ~= b.Priority then return a.Priority > b.Priority end end) return list end function XShopManager.GetDefaultShopId() local list = XShopManager.GetShopBaseInfoByTypeAndTag(XShopManager.ShopType.Common) return list[1].Id end local function AddBuyTimes(shopId, goodsId, count) local shop = ShopDict[shopId] if not shop then XLog.Error("XShopManager AddBuyTimes Error: can not found shop, shopId is " .. shopId) return end shop.TotalBuyTimes = shop.TotalBuyTimes + count for _, goods in pairs(shop.GoodsList) do if goods.Id == goodsId then goods.TotalBuyTimes = goods.TotalBuyTimes + count break end end end function XShopManager.AddBuyTime(shopId, goodsId, count) AddBuyTimes(shopId, goodsId, count) --触发界面消息 XEventManager.DispatchEvent(XEventId.EVENT_SHOP_BUYUSERIYUAN, shopId) end local function SetShop(shop) ShopDict[shop.Id] = shop LastSyncShopTimes[shop.Id] = XTime.GetServerNowTimestamp() end local function SetShopBaseInfoList(shopBaseInfoList) -- LastSyncBaseInfoTime = XTime.GetServerNowTimestamp() for _, info in pairs(shopBaseInfoList) do ShopBaseInfoDict[info.Id] = info end end function XShopManager.GetShopInfo(shopId, cb, pleaseDoNotTip) local now = XTime.GetServerNowTimestamp() local syscTime = LastSyncShopTimes[shopId] if syscTime and now - syscTime < SYNC_SHOP_SECOND then if cb then cb() return end end XNetwork.Call(METHOD_NAME.GetShopInfo, { Id = shopId }, function(res) if res.Code ~= XCode.Success then if not pleaseDoNotTip then XUiManager.TipCode(res.Code) end return end SetShop(res.ClientShop) XShopManager.SetScreenData(res.ClientShop.Id) if cb then cb() end end) end function XShopManager.GetShopInfoList(shopIdList, cb, shopType) shopType = shopType or XShopManager.ActivityShopType.BriefShop local now = XTime.GetServerNowTimestamp() local syscTime = ActivityLastSyncShopTime[shopType] or 0 if syscTime and now - syscTime < SYNC_SHOP_SECOND then if cb then cb() return end end XNetwork.Call(METHOD_NAME.GetShopInfoList, { IdList = shopIdList }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end ActivityLastSyncShopTime[shopType] = XTime.GetServerNowTimestamp() for _, v in pairs(res.ClientShopList) do SetShop(v) XShopManager.SetScreenData(v.Id) end if cb then cb() end end) end local function CheckResfreshShopLimit(shopId) local shop = ShopDict[shopId] if not shop then XUiManager.TipCode(XCode.ShopManagerShopNotExist) return false end if shop.BuyTimesLimit and shop.BuyTimesLimit > 0 then if shop.TotalBuyTimes >= shop.BuyTimesLimit then XUiManager.TipCode(XCode.ShopManagerShopNotBuyTimes) return false end end if shop.ManualResetTimesLimit and shop.ManualResetTimesLimit >= 0 then if shop.ManualRefreshTimes >= shop.ManualResetTimesLimit then XUiManager.TipError(CS.XTextManager.GetText("DifferentRefreshTimes")) return false end end if shop.RefreshCostId and shop.RefreshCostId > 0 then if shop.RefreshCostCount > XDataCenter.ItemManager.GetItem(shop.RefreshCostId):GetCount() then XUiManager.TipError(CS.XTextManager.GetText("RefreshShopItemNotEnough")) return false end end return true end function XShopManager.RefreshShopGoods(shopId, cb) if not CheckResfreshShopLimit(shopId) then return end XNetwork.Call(METHOD_NAME.RefreshShop, { Id = shopId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end SetShop(res.ClientShop) if cb then cb() end end) end function XShopManager.GetBaseInfo(cb) XNetwork.Call(METHOD_NAME.GetShopBaseInfo, nil, function(res) SetShopBaseInfoList(res.ShopBaseInfoList) if cb then cb() end end) end function XShopManager.BuyShop(shopId, goodsId, count, cb, err_cb) local req = { ShopId = shopId, GoodsId = goodsId, Count = count } XNetwork.Call(METHOD_NAME.Buy, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) if err_cb then err_cb() end return end AddBuyTimes(shopId, goodsId, count) cb() end) end function XShopManager.GetShopGroup() ShopGroup = XShopConfigs.GetShopGroupTemplate() return ShopGroup end function XShopManager.GetShopTypeDatas() local typeData = XShopConfigs.GetShopTypeNameTemplate() return typeData end function XShopManager.GetShopTypeDataById(id) local typeData = XShopConfigs.GetShopTypeNameTemplate() return typeData[id] end function XShopManager.GetShopScreenGroupDataById(id) local screenData = XShopConfigs.GetShopScreenGroupTemplate() return screenData[id] end function XShopManager.GetShopScreenGroupNameById(id) local screenData = XShopConfigs.GetShopScreenGroupTemplate() if not screenData[id] then return "" end return screenData[id].GroupName end function XShopManager.GetShopScreenGroupIconById(id) local screenData = XShopConfigs.GetShopScreenGroupTemplate() if (not id) or (not screenData[id]) then return nil end return screenData[id].GroupIcon end function XShopManager.GetScreenGoodsListByTag(shopId, group, tag) local goodsList = ScreenGoodsList[shopId][group] if not goodsList then return XShopManager.GetShopGoodsList(shopId) end if not goodsList[tag] then return XShopManager.GetShopGoodsList(shopId) end return goodsList[tag] end function XShopManager.GetScreenTagListById(shopId, groupId) return ScreenTagList[shopId][groupId] end function XShopManager.SetScreenData(id) local GoodsList = XShopManager.GetShopGoodsList(id) local ScreenGroupIDList = XShopManager.GetShopScreenGroupIDList(id) ScreenGoodsList[id] = {} ScreenTagList[id] = {} if ScreenGroupIDList then for _, screenGroupId in pairs(ScreenGroupIDList) do local screenGroup = ScreenGoodsList[id][screenGroupId] if not screenGroup then ScreenGoodsList[id][screenGroupId] = {} end local tagGroup = ScreenTagList[id][screenGroupId] if not tagGroup then ScreenTagList[id][screenGroupId] = {} end for _, goods in pairs(GoodsList or {}) do if screenGroupId == XShopManager.ScreenType.SuitPos then XShopManager.DoScreen(id, XArrangeConfigs.Types.Wafer, screenGroupId, goods, function() return { XDataCenter.EquipManager.GetEquipSiteByTemplateId(goods.RewardGoods.TemplateId) } end ) elseif screenGroupId == XShopManager.ScreenType.SuitName or screenGroupId == XShopManager.ScreenType.ActivitySuitName then XShopManager.DoScreen(id, XArrangeConfigs.Types.Wafer, screenGroupId, goods, function() return { XDataCenter.EquipManager.GetSuitIdByTemplateId(goods.RewardGoods.TemplateId) } end ) elseif screenGroupId == XShopManager.ScreenType.WeaponType then XShopManager.DoScreen(id, XArrangeConfigs.Types.Weapon, screenGroupId, goods, function() return { XDataCenter.EquipManager.GetEquipTypeByTemplateId(goods.RewardGoods.TemplateId) } end ) elseif screenGroupId == XShopManager.ScreenType.FashionType then XShopManager.DoScreen(id, XArrangeConfigs.Types.Fashion, screenGroupId, goods, function() return { XDataCenter.FashionManager.GetCharacterId(goods.RewardGoods.TemplateId) } end ) elseif screenGroupId == XShopManager.ScreenType.ItemType then XShopManager.DoScreen(id, XArrangeConfigs.Types.Item, screenGroupId, goods, function() return { XDataCenter.ItemManager.GetItemType(goods.RewardGoods.TemplateId) } end ) elseif screenGroupId == XShopManager.ScreenType.AwakeItemType then XShopManager.DoScreen(id, XArrangeConfigs.Types.Item, screenGroupId, goods, function() return XDataCenter.EquipManager.GetAwakeItemApplicationScope(goods.RewardGoods.TemplateId) end ) end end end end if ScreenTagList[id] then for index, screenTag in pairs(ScreenTagList[id]) do local list = {} for _, v in pairs(screenTag) do table.insert(list, v) end tableSort(list, function(a, b) return a.Key < b.Key end) ScreenTagList[id][index] = list end end end function XShopManager.DoScreen(id, goodstype, screenGroupId, goods, getkeyList) local tmpScreenData = XShopManager.GetShopScreenGroupDataById(screenGroupId) local screenGroup = ScreenGoodsList[id][screenGroupId] local tagGroup = ScreenTagList[id][screenGroupId] if XArrangeConfigs.GetType(goods.RewardGoods.TemplateId) == goodstype then local IsIn = false local keyList = getkeyList() if keyList and tmpScreenData and tmpScreenData.ScreenID then for _, key in pairs(keyList) do for index, screenID in pairs(tmpScreenData.ScreenID) do if key ~= screenID then goto continue end local screenName = tmpScreenData.ScreenName[index] local goodsList = screenGroup[screenName] if not goodsList then goodsList = {} screenGroup[screenName] = goodsList end table.insert(goodsList, goods) local tag = tagGroup[screenName] if not tag then tag = {} tag.Text = screenName tag.Key = index tagGroup[screenName] = tag end IsIn = true break :: continue :: end end end if not IsIn then local otherGoodsList = screenGroup[ScreenOther] if not otherGoodsList then otherGoodsList = {} screenGroup[ScreenOther] = otherGoodsList end table.insert(otherGoodsList, goods) local otherTag = tagGroup[ScreenOther] if not otherTag then otherTag = {} otherTag.Text = ScreenOther otherTag.Key = MaxCount tagGroup[ScreenOther] = otherTag end end else local otherGoodsList = screenGroup[ScreenOther] if not otherGoodsList then otherGoodsList = {} screenGroup[ScreenOther] = otherGoodsList end table.insert(otherGoodsList, goods) local otherTag = tagGroup[ScreenOther] if not otherTag then otherTag = {} otherTag.Text = ScreenOther otherTag.Key = MaxCount tagGroup[ScreenOther] = otherTag end end local allGoodsList = screenGroup[ScreenAll] if not allGoodsList then allGoodsList = {} screenGroup[ScreenAll] = allGoodsList end table.insert(allGoodsList, goods) local allTag = tagGroup[ScreenAll] if not allTag then allTag = {} allTag.Text = ScreenAll allTag.Key = MinCount tagGroup[ScreenAll] = allTag end end function XShopManager.CheckDailyShopSuitIsNew(suitId, suitShopItemList) for _, v in ipairs(suitShopItemList) do if v.Tags == XShopManager.ShopTags.New then local key = COOKIE_DAILYSHOPNEWSUIT_KEY .. suitId return not XShopManager.ReadCookie(key) end end return false end function XShopManager.SetDailyShopSuitNotNew(suitId) local key = COOKIE_DAILYSHOPNEWSUIT_KEY .. suitId CSUnityEnginePlayerPrefs.SetInt(XShopManager.GetCookieKeyStr(key), 1) CSUnityEnginePlayerPrefs.Save() end function XShopManager.CheckDailyShopHasNewSuit(shopItemList) if not shopItemList then return false end for _, data in ipairs(shopItemList) do if data.Tags == XShopManager.ShopTags.New then local suitId = XDataCenter.EquipManager.GetSuitIdByTemplateId(data.RewardGoods.TemplateId) local key = COOKIE_DAILYSHOPNEWSUIT_KEY .. suitId if not XShopManager.ReadCookie(key) then return true end end end return false end function XShopManager.SetGiftFashionID(id) GiftRewardId = id end function XShopManager.GetGiftFashionID() return GiftRewardId end function XShopManager.GetCookieKeyStr(key) local str = string.format("%s%s%s", "SHOP_COOKIE", XPlayer.Id, key) return str end function XShopManager.ReadCookie(key) return CSUnityEnginePlayerPrefs.HasKey(XShopManager.GetCookieKeyStr(key)) end function XShopManager.GetShopIsHide(shopId) if not XUiManager.IsHideFunc then return false end return XShopConfigs.CheckShopIdIsHide(shopId) end XShopManager.ShopBuyCallbackMap = {} function XShopManager.SetBuyCallback(shopId, cb) if XShopManager.ShopBuyCallbackMap[shopId] then local callbackEntity = XShopManager.ShopBuyCallbackMap[shopId] callbackEntity.Count = callbackEntity.Count + 1 else local callbackEntity = { Callback = cb, Count = 1, } XShopManager.ShopBuyCallbackMap[shopId] = callbackEntity end end function XShopManager.InvokeShopBuyCallback(shopId) if shopId and shopId ~= 0 then if XShopManager.ShopBuyCallbackMap[shopId] then local callbackEntity = XShopManager.ShopBuyCallbackMap[shopId] if callbackEntity.Callback then callbackEntity.Callback() end callbackEntity.Count = callbackEntity.Count - 1 if callbackEntity.Count <= 0 then XShopManager.ShopBuyCallbackMap[shopId] = nil end end end end --商店使用日元购买完成之后服务端主动推 XRpc.BuyResponse = function(data) XShopManager.AddBuyTime(data.ShopId, data.GoodsId, data.Count) XDataCenter.PayManager.ClearCurrentPayId(data.GoodsId) XShopManager.InvokeShopBuyCallback(data.ShopId) end