--[[@------------------------------------------------------------------ @description:云购界面 @author:wyb ----------------------------------------------------------------------]] CloudShoppingView = CloudShoppingView or BaseClass(BaseView) function CloudShoppingView:__init() self.base_file = "cloudShopping" self.layout_file = "CloudShoppingView" self.layer_name = "UI" -- self.use_local_view = true self.use_background = true self.close_mode = CloseMode.CloseDestroy self.destroy_imm = true self.append_to_ctl_queue = true self.model = CustomActivityModel:getInstance() self.item_list = {} self.event_list = {} self.first_open_view = false self.base_type = CustomActivityModel.CustomActBaseType.CLOUD_SHOPPING self.load_callback = function () self:LoadSuccess() self:InitEvent() end self.open_callback = function () if self.sub_type then self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33112, self.sub_type) end end self.close_callback = function () self:Remove() end end function CloudShoppingView:Open(sub_type, open_type) self.sub_type = sub_type self.open_type = open_type BaseView.Open(self) end function CloudShoppingView:Remove() self:CancelLeftTimer() for _, v in pairs(self.event_list) do self.model:UnBind(v) v = nil end for _, v in pairs(self.item_list) do v:DeleteMe() v = nil end self.item_list = {} self.first_open_view = false self:CancelTimer() end function CloudShoppingView:LoadSuccess() self.bg2, self.iconOne, self.iconTen = GetChildImages(self.transform, { "bg2", "rightCon/poolCon/btnOne/icon", "rightCon/poolCon/btnTen/icon" }) -- lua_resM:setOutsideImageSprite(self, self.bg2, GameResPath.GetJpgImage("cloud_shopping_bg.jpg"), false) self.txtProgress, self.txtPrice, self.txtTime, self.txtBuy, self.txtLimit, self.txtOne, self.txtTen, self.txtName = GetChildTexts(self.transform, { "leftCon/txtProgress", "leftCon/priceCon/txtPrice", "rightCon/timeCon/txtTime", "rightCon/poolCon/txtBuy", "rightCon/poolCon/txtLimit", "rightCon/poolCon/btnOne/text", "rightCon/poolCon/btnTen/text", "leftCon/nameCon/txtName", }) self.imgGoods, self.effect = GetChildTransforms(self.transform, { "leftCon/imgGoods", "leftCon/effect", }) self.timeCon, self.imgOver, self.btnHelp, self.btnReward, self.btnOne, self.btnTen, self.probBtn, self.btnGL, self.clickGo = GetChildGameObjects(self.transform, { "rightCon/timeCon", "rightCon/imgOver", "rightCon/btnHelp", "rightCon/btnReward", "rightCon/poolCon/btnOne", "rightCon/poolCon/btnTen", "Window/probBtn", "rightCon/btnGL", "clickGo" }) self.box_list = {} for i = 1, 14 do self.box_list[i] = self:GetChild("rightCon/poolCon/BoxCon/Box" .. i) end self:AddUIEffect("effect_xunbao_001_3", self.effect, self.layer_name, nil, 0.7, true) end function CloudShoppingView:InitEvent() local onClickHandler = function (target, x, y) if not self.goods_basic then return end local onGotoBag = function () local ok_callback = function () GlobalEventSystem:Fire(EventName.OPEN_BAG_VIEW) end Alert.show("您的背包已满,无法购买,是否前往整理背包!", Alert.Type.Two, ok_callback, nil, "确定", "取消") end local empty = GoodsModel:getInstance():GetEmptyGrid() local goodsNum = GoodsModel:getInstance():GetTypeGoodsNum(self.type_id) if self.btnOne == target then if empty <= 0 then onGotoBag() return end if goodsNum >= self.cost then self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 1, 0) else if TreasureHuntModel:getInstance().not_show["cloud_shopping"] then self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 1, 1) else self:TipsFunc(self.cost, 1) end end elseif self.btnTen == target then if empty < 10 then onGotoBag() return end if goodsNum >= (self.cost * 10) then self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 10, 0) else if TreasureHuntModel:getInstance().not_show["cloud_shopping"] then self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 10, 1) else self:TipsFunc(self.cost * 10, 10) end end elseif self.btnReward == target then self.model:Fire(CustomActivityModel.OPEN_CLOUD_REWARD_VIEW, self.sub_type) elseif self.btnHelp == target then if not self.open_type then return end if self.open_type == CustomActivityModel.CloudShoppingType.BenFu then UIToolTipMgr:getInstance():AppendSimpleTips(Config.ConfigActStatic.CloudShoppingDescBenFu, x, y) elseif self.open_type == CustomActivityModel.CloudShoppingType.KuaFu then UIToolTipMgr:getInstance():AppendSimpleTips(Config.ConfigActStatic.CloudShoppingDescKuaFu, x, y) end elseif self.probBtn == target then elseif self.clickGo == target then self:ClickBigRewardFunc(x, y) elseif target == self.btnGL then self.model:Fire(CustomActivityModel.OPEN_CLOUD_SHOP_ODDS_VIEW) end end AddClickEvent(self.btnOne, onClickHandler) AddClickEvent(self.btnTen, onClickHandler) AddClickEvent(self.btnReward, onClickHandler) AddClickEvent(self.btnHelp, onClickHandler) AddClickEvent(self.probBtn, onClickHandler) AddClickEvent(self.btnGL, onClickHandler) AddClickEvent(self.clickGo, onClickHandler) local onUpdate = function () self:SetData() if self.first_open_view == false then -- self:UpdateItems() self.first_open_view = true end end self.event_list[1] = self.model:Bind(CustomActivityModel.UPDATE_CLOUD_SHOPPING_VIEW, onUpdate) local onUpateItem = function () --购买成功之后的处理 self:UpdateItems() end self.event_list[2] = self.model:Bind(CustomActivityModel.UPDATE_CLOUD_BUY_LIST, onUpateItem) end function CloudShoppingView:TipsFunc(costNum, buyNum) local goodsNum = GoodsModel:getInstance():GetTypeGoodsNum(self.type_id) local goodsPrice, _ = GoodsModel:getInstance():GetGoodsPrice(self.goods_basic.type_id) local str_color = WordManager.GetGoodsColor(self.goods_basic.color) local need_price = (costNum - goodsNum) * goodsPrice local content = string.format("当前材料%s不足\n", str_color, Trim(self.goods_basic.goods_name)) local per_str = "是否使用"..need_price local cur_str = "立即补充" .. (costNum - goodsNum) .. "个" local jin = RoleManager.Instance.mainRoleInfo:GetRealJin() local function ok_callback() if jin >= need_price then self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, buyNum, 1) else Message.show("您的彩钻不足") end end TreasureHuntModel:getInstance():Fire(TreasureHuntModel.OPEN_HINT_VIEW, "cloud_shopping", content, ok_callback, per_str, cur_str) end function CloudShoppingView:SetData() self.act_data = self.model:getActList(self.base_type) self.data = self.model:GetCloudShoppingInfo() if not self.act_data or not self.data then return end self:SetLeftTime() self:CreateItems() end function CloudShoppingView:SetLeftTime() local time = self.data.next_reward_time - TimeUtil:getServerTime() local function timer_func() self:CancelLeftTimer() local timeStr = TimeUtil:timeConvert9(time) self.txtTime.text = time > 0 and timeStr or "" if time <= 0 then self:CancelLeftTimer() end if time - 3600 > 0 then --大于1小时的 local duration = 60 local first_time = time % 60 --先计算秒数的 if first_time ~= 0 then duration = first_time end local function delayFunc( ) time = time - duration timer_func() end self.left_time_id = GlobalTimerQuest:AddPeriodQuest(delayFunc, duration) else local function delayFunc( ) time = time - 1 timer_func() end self.left_time_id = GlobalTimerQuest:AddPeriodQuest(delayFunc, 1) end end timer_func() self.imgOver:SetActive(time <= 0) self.timeCon:SetActive(time > 0) end function CloudShoppingView:CancelLeftTimer() if self.left_time_id then GlobalTimerQuest:CancelQuest(self.left_time_id) self.left_time_id = nil end end function CloudShoppingView:CreateItems() local cfg = Config.Cloudbuy[self.data.big_reward_id] if cfg then local boxList = ErlangParser:GetInstance():Parse(cfg.happy_awards) if TableSize(boxList) > 0 then local onSortFunc = function (a, b) return tonumber(a[2]) < tonumber(b[2]) end table.sort(boxList, onSortFunc) local item = nil for i, v in ipairs(boxList) do if self.box_list[i] then local reward_id = tonumber(v[2]) item = self.item_list[reward_id] if item == nil then item = CloudShoppingItem.New(self.box_list[i]) self.item_list[reward_id] = item end item:SetData(reward_id) end end end local total_count = tonumber(cfg.total_count) local buyNumStr = "" .. self.data.all_buy_num .. "" self.txtProgress.text = string.format("开奖进度:%s/%d", buyNumStr, total_count) self.txtPrice.text = cfg.worth buyNumStr = "" .. self.data.self_buy_num .. "" local leftStr = total_count - self.data.all_buy_num > 0 and "" .. (total_count - self.data.all_buy_num) .. "" or "0" self.txtBuy.text = string.format("您已购买%s份(剩余%s份)", buyNumStr, leftStr) local unlimited_time, award_time = self:GetActCondition() if unlimited_time and award_time then local cur_hour = os.date("%H", TimeUtil:getServerTime()) cur_hour = tonumber(cur_hour) local str = "" local buy_time_str = self.data.less_buy_num > 0 and self.data.less_buy_num or "0" if cur_hour < unlimited_time or cur_hour > award_time then str = string.format("(还可购买%s份,开奖前%d小时不限制)", buy_time_str, award_time - unlimited_time) else str = string.format("(还可购买%s份)", buy_time_str) end self.txtLimit.text = str end self:SetGiftName(cfg) self:SetGiftModel(cfg) self:SetCost(cfg.cost) end end function CloudShoppingView:SetGiftName(cfg) local reward = ErlangParser:GetInstance():Parse(cfg.rewards) if TableSize(reward) > 0 then local type_id = 0 if cfg.reward_type == 2 then --按职业区分 local career = RoleManager.Instance:GetMainRoleVo().career for _,v in pairs(reward) do if career == tonumber(v[1]) then type_id = tonumber(v[2][1][2]) break end end else type_id = tonumber(reward[1][2]) end local goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id) if goods_basic then local goodsName = ""..Trim(goods_basic.goods_name) .. "" local numStr = "(" .. cfg.award_count .. "份)" self.txtName.text = goodsName .. numStr local call_back = function(param, x, y) self:ClickBigRewardFunc(x, y) end AddUnderLineAndClick(self, self.txtName.transform, call_back, false, true) end end end function CloudShoppingView:ClickBigRewardFunc(x, y) local cfg = Config.Cloudbuy[self.data.big_reward_id] if not cfg then return end local reward = ErlangParser:GetInstance():Parse(cfg.rewards) if TableSize(reward) > 0 then local type_id = 0 if cfg.reward_type == 2 then --按职业区分 local career = RoleManager.Instance:GetMainRoleVo().career for _,v in pairs(reward) do if career == tonumber(v[1]) then type_id = tonumber(v[2][1][2]) break end end else type_id = tonumber(reward[1][2]) end local goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id) if goods_basic then if goods_basic.type == GoodsModel.TYPE.EQUIP then local target_config = Config.Equipattr[type_id] if target_config then local dynamic = {} dynamic.type_id = type_id dynamic.rating = target_config.base_rating dynamic.equip_extra_attr = {} dynamic.equip_type = goods_basic.equip_type local target_pro = ErlangParser:GetInstance():Parse(target_config.recommend_attr) for i, v in ipairs(target_pro) do local attr = {} attr.color = tonumber(v[2][1]) attr.attr_id = tonumber(v[2][2]) if #v[2] == 5 then attr.type_id = 1 attr.plus_interval = tonumber(v[2][4]) attr.plus_unit = tonumber(v[2][5]) else attr.type_id = 2 attr.attr_val = tonumber(v[2][3]) end table.insert(dynamic.equip_extra_attr, attr) end UIToolTipMgr:getInstance():AppendEquipShowTips(dynamic, x, y, EquipShowTips.EQUIP_RECOMMAND_TARGET) end else UIToolTipMgr:getInstance():AppendGoodsTips(type_id, x, y) end end end end function CloudShoppingView:SetGiftModel(cfg) local resouce_id_list = ErlangParser:GetInstance():Parse(cfg.resouce_id) local res_id = 0 local career = RoleManager.Instance.mainRoleInfo.career for _,v in pairs(resouce_id_list) do if tonumber(v[1]) == career then res_id = tonumber(v[2]) break end end local scale = tonumber(cfg.resouce_size) if scale and scale > 0 then scale = scale else scale = nil end local posList = ErlangParser:GetInstance():Parse(cfg.resouce_height) local x, y = 0, 0 if TableSize(posList) > 0 then x = tonumber(posList[1][1]) y = tonumber(posList[1][2]) end local data = { clothe_res_id = res_id, type = SceneBaseType.Role, layer_name = self.layer_name, action_name_list = {"show", "idle"}, can_rotate = true, layout_file = self.layout_file -- position = Vector3(x, y, 0), } lua_resM:SetRoleModel(self, self.imgGoods, data) --lua_resM:SetRoleModel(self,self.imgGoods,nil,nil,res_id,nil,nil,SceneBaseType.Role,self.layer_name,nil,{"show","idle"},false,scale,Vector3(x, y, 0)) self.imgGoods:GetComponent("RawImage").raycastTarget = true end function CloudShoppingView:SetCost(costList) local cost_list = ErlangParser:GetInstance():Parse(costList) if TableSize(cost_list) > 0 then self.cost_type = tonumber(cost_list[1][1]) self.cost = tonumber(cost_list[1][3]) self.type_id = tonumber(cost_list[1][2]) self.txtOne.text = self.cost self.txtTen.text = self.cost * 10 self.goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(self.type_id) if self.goods_basic then lua_resM:setOutsideImageSprite(self, self.iconOne, GameResPath.GetGoodsIcon(self.goods_basic.goods_icon)) lua_resM:setOutsideImageSprite(self, self.iconTen, GameResPath.GetGoodsIcon(self.goods_basic.goods_icon)) end end end function CloudShoppingView:UpdateItems() local buy_list = self.model:GetCloudBuyList() for _, item in pairs(self.item_list) do item:ResetItem() end self:CancelTimer() local last_item = nil local len = TableSize(buy_list) if len > 0 then local index = 1 local sub_index = 1 function go_next() local data = buy_list[index] self:CancelTimer() if data then sub_index = sub_index % 14 if sub_index == 0 then sub_index = 14 end local function show_anim() local item = self.item_list[sub_index] if item then local find = false if not item.stop_change then local bool, num = self:ShowItemLightBg(buy_list, sub_index) if bool then item:ShowLightBg(bool, num) find = true else item:ShowLightBg(true, 0, true) end end if last_item then if not last_item.stop_change then last_item:ShowLightBg(false, 0, true) end end last_item = item if find then go_next() return end end sub_index = sub_index + 1 end self.timer_id_1 = GlobalTimerQuest:AddPeriodQuest(show_anim, 0.1, -1) show_anim() end index = index + 1 end go_next() end end function CloudShoppingView:ShowItemLightBg(buy_list, reward_id) local bool = false local num = 0 for _, v in pairs(buy_list) do if v.reward_id == reward_id then bool = true num = v.reward_num break end end return bool, num end --获得活动条件 function CloudShoppingView:GetActCondition() local act_data = self.model:getActList(self.base_type) --不限购时间和开奖时间 local unlimited_time, award_time if act_data and act_data.condition_list then local condList = act_data.condition_list if TableSize(condList) > 0 then for _, v in ipairs(condList) do if Trim(v[1]) == "unlimited_time" then unlimited_time = tonumber(v[2][1]) end if Trim(v[1]) == "award_time" then award_time = tonumber(v[2][1]) end end end end return unlimited_time, award_time end function CloudShoppingView:CancelTimer() if self.timer_id_1 then GlobalTimerQuest:CancelQuest(self.timer_id_1) self.timer_id_1 = nil end if self.timer_id_2 then GlobalTimerQuest:CancelQuest(self.timer_id_2) self.timer_id_2 = nil end end