--0元购 local UIFreeBuy = UIViewClass() --礼包状态 local PackageState = { NotBuy = 0, --可购买 CanGetReturn = 1,--可领取返还 HasBuy = 2,--已购买 Locked = 3,--未到购买时间,仅展示预告 } --礼包展示类型 local PackageShowType = { Picture = "Picture", Weapon = "Weapon", Hero = "Hero", Treasure = "Treasure", Horse = "Horse", } local EventSystem = require('Event/EventSystem') --region ****************************** 生命周期方法 ******************************** function UIFreeBuy:OnOpened(context) self:RegistSystemEvent(EventID.UI_FreeBuy_RefreshUI, self.InitData) self:RegistSystemEvent(CTL.RedPoint.RedPointKey.FreeBuy_HasReward, self.RefreshRedPoint) self:InitData() end function UIFreeBuy:OnBackButtonPressed() self:OnButtonClicked(self.btn_Close) end function UIFreeBuy:OnButtonClicked(comp) if comp == self.btn_Close then self:CloseView() elseif comp == self.btn_Buy then --购买 if MDL.FreeBuy.IsLockedPackage(self.curActivityID,self.curHotPackageID) then CTL.Tips.AddTipsMsg(Const_IDS.IDS_FreeBuy_NotOpenTips) --提示未开放购买 else self:OnClickBuy() end elseif comp == self.btn_Get then --领取返还 self:OnClickGet() elseif comp == self.cell_Item.item.event_Click then --返还道具点击 UTL.ItemTips.ShowCommonTipsById(self.returnRewardID) end end function UIFreeBuy:OnCellInit(scrollRect, index, cellTable, data) if scrollRect == self.loop_Tabs then local actID, pkgId = data.data.ActivityID, data.data.HotPackageID --仅展示预告的逻辑 local isLocked = MDL.FreeBuy.IsLockedPackage(actID,pkgId) UIUtils.SetActive(cellTable.txt_TabUnselected,not isLocked) --未选中的框根据解锁有两套文本样式 UIUtils.SetActive(cellTable.txt_TabUnselectedLock, isLocked) UIUtils.SetActive(cellTable.img_Lock, isLocked) --选中的框只有一套文本样式,只显示锁的显隐 --标题 UIUtils.SetLabel(cellTable.txt_TabUnselectedLock, data.data.HotPackageName) UIUtils.SetLabel(cellTable.txt_TabUnselected, data.data.HotPackageName) UIUtils.SetLabel(cellTable.txt_TabSelected, data.data.HotPackageName) --红点 if isLocked then --预告的活动没有新字和红点逻辑 UIUtils.SetActive(cellTable.img_New, false) cellTable.cell:SetRedPoint(false) else --开放的活动 local isFirstShow = MDL.FreeBuy.GetFirstShowRP(actID, pkgId) if isFirstShow then --显示新字,覆盖红点逻辑 UIUtils.SetActive(cellTable.img_New, true) UIUtils.SetLocalizationImage(cellTable.img_New, "zr_msz_new.png") cellTable.cell:SetRedPoint(false) else --之前的红点逻辑 UIUtils.SetActive(cellTable.img_New, false) local isShowPackageRedPoint = MDL.FreeBuy.IsCanGetReturnPackage(actID, pkgId) cellTable.cell:SetRedPoint(isShowPackageRedPoint) end end elseif scrollRect == self.loop_Rewards then --礼包奖励 UTL.Item.SetItemCell(cellTable.item, data.RewardID, data.RewardNum) end end function UIFreeBuy:OnCellClicked(scrollRect, index, cellTable, target, data) if scrollRect == self.loop_Tabs then if index ~= self.currentSelectIndex then self:RefreshRedPoint() self.currentSelectIndex = index end self:ShowPackageDetail(data.data) elseif scrollRect == self.loop_Rewards then if cellTable.item.event_Click == target then UTL.ItemTips.ShowCommonTipsById(data.RewardID) end end end --endregion ****************************** 生命周期方法 ******************************** --region ****************************** 自定义方法 ******************************** function UIFreeBuy:InitData() self:ShowPackageTabs() if self.currentSelectIndex and self.currentSelectIndex < self.loop_Tabs.Count then self.loop_Tabs:SelectIndex(self.currentSelectIndex, true) else self.loop_Tabs:SelectIndex(0, true) end end function UIFreeBuy:RefreshRedPoint() for i = 0, self.loop_Tabs.Count -1 do self.loop_Tabs:UpdateIndex(i) end end --购买礼包 function UIFreeBuy:OnClickBuy() local packageState =self:GetPackageState(self.curActivityID,self.curHotPackageID) local info = MDL.FreeBuy.GetDataByActivityIDAndPackageID(self.curActivityID,self.curHotPackageID) if info then local data = info.data if packageState == PackageState.NotBuy then --未购买 if not CTL.FreeBuy.IsItemBuyGift(data.GiftID) then --直购 local giftRewardData = MDL.OperationActivity.CommonGiftReward:GetDataByID(data.GiftID) local iapIndex = CTL.FreeBuy.GetIapIndex(giftRewardData.IapID) MDL.Currency.GetOrderIDReq(iapIndex, MDL.Currency.PayType.DirectGift, data.HotPackageID,self.curActivityID,MDL.OperationActivity.ActivityType.FreeBuy) else --道具购买 local costNum,costType = CTL.FreeBuy.GetPackageItemCost(data) --道具足够 发请求 if UTL.Item.GetItemStockCount(costType) >= costNum then MDL.FreeBuy.FreePurchaseByItemsReq(data.ActivityID,data.HotPackageID) else --道具不足提示 CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS["IDS_Store_Deficit"]), UTL.Item.GetItemDataSpliceByType(costType).Name) end end else logging.error(LTAG.ERROR,"当前packageState状态错误",packageState) end end end --领取返还 function UIFreeBuy:OnClickGet() MDL.FreeBuy.ClaimPurchaseReturnReq(self.curActivityID,self.curHotPackageID) self.currentSelectIndex = nil --领取完应该会少一个礼包,默认选中第一个就行 end --显示礼包Tab function UIFreeBuy:ShowPackageTabs() local allPackageData = MDL.FreeBuy.GetPackageData() self.loop_Tabs:ClearCells() for i,v in pairs(allPackageData) do self.loop_Tabs:AddData(v, 0) end local lockedPackageData = MDL.FreeBuy.GetLockedPackageData() for i,v in pairs(lockedPackageData) do self.loop_Tabs:AddData(v, 0) end --没有礼包时关闭活动 if not CTL.FreeBuy.IsHasPackage() then CTL.FreeBuy.EndAndCloseActivity() end end --显示礼包详情 function UIFreeBuy:ShowPackageDetail(data) --缓存当前礼包ID self.curActivityID = data.ActivityID self.curHotPackageID = data.HotPackageID --礼包标题 local giftRewardData = MDL.OperationActivity.CommonGiftReward:GetDataByID(data.GiftID) UIUtils.SetLabel(self.txt_Title02,giftRewardData.Name) --礼包奖励显示 --子项数量小时,不拖拽 local rewardTable = giftRewardData.Reward_Table self.loop_Rewards:ClearCells() for i,v in ipairs(rewardTable) do self.loop_Rewards:AddData(v, 0) end --返还奖励显示 local costNum, costItemId local giftData = MDL.OperationActivity.CommonGiftReward:GetDataByID(data.GiftID) if not string.isNilOrEmpty(giftData.IapID) then costNum, costItemId = MDL.FreeBuy.GetIapGiftFreeReturnInfo(data.GiftID) else costNum, costItemId = CTL.FreeBuy.GetPackageItemCost(data) end UTL.Item.SetItemCell(self.cell_Item.item, costItemId, costNum) self.returnRewardID = costItemId --礼包模型/图片展示 self:ShowModelOrPic(data) --不同状态的差异信息 local packageState = self:GetPackageState(data.ActivityID,data.HotPackageID) self.UIState_Btn:SetState(packageState) local setFirstShow = true if packageState == PackageState.NotBuy then --未购买 --购买花费显示,充值积分显示。比较长,预告部分越是一样的逻辑,就抽个方法出来不copy了 self:SetCostAndScoreView(data) --返还天数显示 UIUtils.SetActive(self.txt_Return,true) local returnDay = CTL.FreeBuy.GetReturnDayAfterBuy(data.ActivityID,data.HotPackageID) UIUtils.SetLabel(self.txt_Return,string.FormatByIdsId(Const_IDS.IDS_FreeBuy_PayBack_Tips,returnDay)) --抢购剩余时间显示 UIUtils.SetActive(self.group_Time,true) UIUtils.SetLabelText(self.lab_Time,Const_IDS.IDS_FreeBuy_Timeleft) local buyRemainTime = CTL.FreeBuy.GetBuyRemainTime(data.ActivityID,data.HotPackageID) self.cdTimeBuy:SetCustomString(UIUtils.GetLocalizedTxt(Const_IDS.IDS_FreeBuy_TimeInfo),1,1) self.cdTimeBuy:ResetAndBeginTimer(false,buyRemainTime,0) --返还剩余时间显示 UIUtils.SetActive(self.txt_ReturnRemainTime,false) self.btn_Buy:SetGray(false) --购买按钮亮起 elseif packageState == PackageState.HasBuy then --已购买 --返还天数显示 UIUtils.SetActive(self.txt_Return,false) --抢购剩余时间显示 UIUtils.SetActive(self.group_Time,false) --返还剩余时间显示 UIUtils.SetActive(self.txt_ReturnRemainTime,true) local returnRemainTime = CTL.FreeBuy.GetReturnRemainTime(data.ActivityID,data.HotPackageID) self.cdTimeReturn:SetCustomString(UIUtils.GetLocalizedTxt(Const_IDS.IDS_FreeBuy_TimeInfo),1,1) self.cdTimeReturn:ResetAndBeginTimer(false,returnRemainTime,0) elseif packageState == PackageState.CanGetReturn then -- 可领取 --返还天数显示 UIUtils.SetActive(self.txt_Return,false) --抢购剩余时间显示 UIUtils.SetActive(self.group_Time,false) --返还剩余时间显示 UIUtils.SetActive(self.txt_ReturnRemainTime,false) elseif packageState == PackageState.Locked then -- 仅展示预告的礼包 --购买花费显示,充值积分显示 self:SetCostAndScoreView(data) --返还天数显示 UIUtils.SetActive(self.txt_Return,false) --购买预告时间显示 UIUtils.SetActive(self.group_Time,true) UIUtils.SetLabelText(self.lab_Time,Const_IDS.IDS_FreeBuy_StartTime) local toBuyTime = CTL.FreeBuy.GetToBuyTime(data.ActivityID,data.HotPackageID) self.cdTimeBuy:SetCustomString(UIUtils.GetLocalizedTxt(Const_IDS.IDS_FreeBuy_TimeInfo),1,1) self.cdTimeBuy:ResetAndBeginTimer(false,toBuyTime,0) --返还剩余时间显示 UIUtils.SetActive(self.txt_ReturnRemainTime,false) self.btn_Buy:SetGray(true,true) --购买按钮置灰 setFirstShow = false --预告的不干预红点逻辑 end --这期活动详情看过了,下次就取消“新”的显示 if setFirstShow and MDL.FreeBuy.SetFirstShow(data.ActivityID, data.HotPackageID) then self.firstShowChanged = true --缓存首先状态的变化,退出UI的时候刷主城红点 end end function UIFreeBuy:SetCostAndScoreView(data) self.state_Cost:SetState(0) local giftRewardData = MDL.OperationActivity.CommonGiftReward:GetDataByID(data.GiftID) --购买花费显示 if CTL.FreeBuy.IsItemBuyGift(data.GiftID) then --道具购买 local costNum,costType = CTL.FreeBuy.GetPackageItemCost(data) UIUtils.SetActive(self.img_CostIcon,true) UTL.Item.SetCurrencyImageIcon(self.img_CostIcon, costType) --道具不足时,会显示红色 if UTL.Item.GetItemStockCount(costType) >= costNum then UIUtils.SetLabel(self.txt_Cost,tostring(costNum)) --购买花费 else --道具不足 UIUtils.SetLabel(self.txt_Cost,UTL.Color.FormatTextByColor(UTL.Color.Red, tostring(costNum))) --购买花费 self.state_Cost:SetState(1) --变色时需要禁用渐变 end else UIUtils.SetActive(self.img_CostIcon,false) UIUtils.SetLabel(self.txt_Cost,MDL.Currency.GetFullyIAPPriceByIapID(giftRewardData.IapID)) end --充值积分显示 if not CTL.FreeBuy.IsItemBuyGift(data.GiftID) then --直购 local buyScore = CTL.FreeBuy.GetBuyScore(giftRewardData.IapID) UIUtils.SetLabel(self.txt_Score,string.FormatByIdsId(Const_IDS.IDS_TotalTopUp_Score_Tips_Giftbag,tostring(buyScore)) ) UIUtils.SetActive(self.txt_Score,true) else --道具购买 UIUtils.SetActive(self.txt_Score,false) end end function UIFreeBuy:OnClosed() if self.firstShowChanged then EventSystem.Dispatch(EventID.UI_FreeBuy_RefreshRedPoint) --首秀红点数据变化,需要刷一下主城入口的红点 end end --获取礼包状态 function UIFreeBuy:GetPackageState(activityID,hotPackageID) if MDL.FreeBuy.IsPackageNotEnd(activityID,hotPackageID) then if MDL.FreeBuy.IsHasBuyPackage(activityID,hotPackageID) then --已购买 if MDL.FreeBuy.IsHasReturnPackage(activityID,hotPackageID) then --已返还的 logging.error(LTAG.ERROR,"这个礼包已返还,不应该显示",hotPackageID,activityID) else if MDL.FreeBuy.IsCanGetReturnPackage(activityID,hotPackageID) then --可领取的 return PackageState.CanGetReturn else --购买了还不可领取 return PackageState.HasBuy end end else --没有购买 return PackageState.NotBuy end elseif MDL.FreeBuy.IsLockedPackage(activityID,hotPackageID) then return PackageState.Locked else logging.error(LTAG.ERROR,"这个礼包已结束,也不是预告礼包,不应该显示",hotPackageID,activityID) end return PackageState.NotBuy end --显示模型或图片 function UIFreeBuy:ShowModelOrPic(data) if data.HotPackageShowType == PackageShowType.Picture then UIUtils.SetActive(self.img_Show,true) UIUtils.SetActive(self.renderModel,false) UIUtils.SetImageByAssetBundle(self.img_Show,data.HotPackageModelOrPic) self.img_Show:SetNativeSize() self.effect_Icon:PlayUIEffect() else UIUtils.SetActive(self.img_Show,false) self.effect_Icon:StopUIEffect() UIUtils.SetActive(self.renderModel,true) self.renderModel:DisposeAll() if data.HotPackageShowType == PackageShowType.Hero then self:ShowHero(data) elseif data.HotPackageShowType == PackageShowType.Weapon then self:ShowWeapon(data) elseif data.HotPackageShowType == PackageShowType.Treasure then self:ShowTreasure(data) elseif data.HotPackageShowType == PackageShowType.Horse then self:ShowHorse(data) end end end function UIFreeBuy:ShowWeapon(data) local weaponId = tonumber(data.HotPackageModelOrPic) local weaponWearAppearanceID = tonumber(data.HotPackageMWSkinID) local modelParam = data.RenderModelID if weaponWearAppearanceID == 0 or weaponWearAppearanceID == nil then self.renderModel:ShowWeapon(UTL.UIRender.LoadWeaponWihoutAppearance(weaponId, modelParam)) else self.renderModel:ShowWeapon(UTL.UIRender.LoadShowWeaponDataWithAppearance(weaponWearAppearanceID, modelParam)) end end function UIFreeBuy:ShowHero(data) local heroId = tonumber(data.HotPackageModelOrPic) local heroApperanceId = tonumber(data.HotPackageHeroSkinID) local weaponAppearanceID = tonumber(data.HotPackageMWSkinID) local configId = data.RenderModelID if heroApperanceId == 0 or heroApperanceId == nil then local modelPath, equipTable, modelScale, lightPath, heroEffectPath = UTL.UIRender.LoadShowHero(heroId, false, nil, false) self.renderModel:ShowHeroModel(configId, modelPath, equipTable, modelScale, lightPath, nil, heroEffectPath) else self.renderModel:ShowHeroModel(configId, CTL.MultilevelRecharge.GetHeroPreviewShowData(heroId, heroApperanceId, weaponAppearanceID)) end end function UIFreeBuy:ShowTreasure(data) local treasureId = tonumber(data.HotPackageModelOrPic) local configParamId = data.RenderModelID local treasureData = DataSheetManager.TreasureData:GetDataByTreasureID(treasureId) self.renderModel:ShowTreasure( treasureData.TreasureMode, configParamId, treasureData.TreasurePreviewModelLight, treasureData.TreasureAnim, treasureData.TreasureShowEffect ) end function UIFreeBuy:ShowHorse(data) local horseId = tonumber(data.HotPackageModelOrPic) local modelParam = data.RenderModelID local config = DataSheetManager.HorseData:GetDataByHorseID(horseId) local horseModeData = DataSheetManager.HorseModelData:GetDataByHorseModelID(config.HorseModelID) self.renderModel:ShowHorse( horseModeData.HorseModel, modelParam, config.HorsePreviewModelLight, config.ActivationModelRot, config.ModelAnim, horseModeData.HorseShowEffect ) end --endregion ****************************** 自定义方法 ******************************** return UIFreeBuy