PsionicWashView = PsionicWashView or BaseClass(BaseItem) local PsionicWashView = PsionicWashView local SortAttrList = SortAttrList function PsionicWashView:__init(parent_wnd,prefab_asset,layer_name) self.base_file = "psionic" self.layout_file = "PsionicWashView" self.parent_wnd = parent_wnd self.layer_name = layer_name self.model = PsionicModel:getInstance() self.goods_model = GoodsModel:getInstance() self.wash_cfg = nil self:Load() end function PsionicWashView:Load_callback() local nodes = { "bg:raw", -- awardItem容器 "equip_con", "cost_item_con", -- 按钮 "break_btn:obj:img", "break_btn/break_btn_lb:tmp", "break_btn/break_red:obj", "wash_btn:obj:img", "wash_btn/wash_btn_lb:tmp", "wash_btn/wash_red:obj", -- 属性容器 "attr_scroll", "attr_scroll/Viewport/attr_con", -- 战斗力节点 "power_con", "power_con/power_lb1:tmp", "power_con/power_cur:txt", -- 消费节点描述 "cost_item_name:tmp", "cost_item_num:tmp", -- 洗练装备描述 "equip_lv:tmp", "equip_break_tip:tmp", "equip_lv_tip:tmp", } self:GetChildren(nodes) lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("ps_main_wash_bg")) self.equip_item = PsionicArmorItem.New(self.equip_con) self.equip_item:SetAnchoredPosition(0, 0) self.equip_item:SetVisible(false) self.cost_item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.cost_item_con) self.cost_item:SetAnchoredPosition(0, 0) self.cost_item:SetItemSize(62, 62) self.cost_item:SetVisible(false) self:AddEvents() if self.need_refreshData then self:UpdateView() end end function PsionicWashView:AddEvents( ) local function click_event(target) if target == self.break_btn_obj then self:OnBreakBtnClick() elseif target == self.wash_btn_obj then self:OnWashBtnClick() end end AddClickEvent(self.break_btn_obj, click_event) AddClickEvent(self.wash_btn_obj, click_event) local function update_wash_data(pos, reports) -- 洗练或突破成功时刷新 if not pos or self.goods_vo and self.goods_vo.subtype == pos then self:UpdateWashInfo() -- 加载槽位洗练信息 -- self:UpdateWashCostItem() self:UpdateEquipWashAttr() -- 加载装备洗练属性信息 -- self:UpdateWashAndBreakRed() -- 更新红点 end end self:BindEvent(self.model, PsionicConst.UPDATE_SLOT_WASH_DATA, update_wash_data) local function update_wash_btn_red(tab_id) if tab_id and tab_id == PsionicConst.TabId.PWash then self:UpdateWashCostItem() self:UpdateWashAndBreakRed() -- 更新红点 end end self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_wash_btn_red) end -- 需传入当前装备vo function PsionicWashView:SetData( goods_vo ) self.goods_vo = goods_vo if self.is_loaded then self.need_refreshData = false self:UpdateView() else self.need_refreshData = true end end function PsionicWashView:UpdateView( ) if self.goods_vo then -- 如今洗练属性跟槽位绑定,不跟装备 self.slot_data = self.model:GetPsionicSlotData(self.goods_vo.subtype) self:UpdateBasicInfo() -- 加载装备基础信息 self:UpdateWashInfo() -- 加载槽位洗练信息 self:UpdateWashCostItem() -- 加载槽位洗练花费 self:UpdateEquipWashAttr() -- 加载装备洗练属性信息 end self:UpdateWashAndBreakRed() end -- 加载装备基础信息 function PsionicWashView:UpdateBasicInfo( ) -- 展示当前装备 self.equip_item:SetData(self.goods_vo, PsionicConst.ArmorItemFlag.Show) self.equip_item:SetVisible(true) end -- 加载槽位洗练信息 function PsionicWashView:UpdateWashInfo( ) if self.slot_data then -- 洗练配置 self.wash_cfg = self.model:GetPsionicWashCfg(self.goods_vo.subtype, self.slot_data.grade) local stage_max_lv, max_stage = self.model:GetPsionicSlotStageMaxLevel(self.slot_data.grade) self.equip_lv_tmp.text = string.format("等级:%s/%s", ColorUtil.GREEN_DARK, self.slot_data.lv, stage_max_lv) if max_stage > self.slot_data.grade then -- 还没有到达最终阶段 local lv_data = Config.Nucleonlv[self.slot_data.lv] local slot_can_break = stage_max_lv <= self.slot_data.lv and self.slot_data.exp >= lv_data.exp -- 当前槽位已达到阶段满级满经验 -- 达到突破条件 if slot_can_break then local next_max_lv = self.model:GetPsionicSlotStageMaxLevel(self.slot_data.grade + 1) -- 获取下一阶段的最高等级 self.equip_lv_tip_tmp.text = string.format("突破后 等级上限拓展至%s", ColorUtil.GREEN_DARK, next_max_lv) else self.equip_lv_tip_tmp.text = string.format("圣物升级到满级后 可突破", ColorUtil.GREEN_DARK) end -- 设置突破所需属性条件 self.equip_break_tip_tmp.text = string.format("至少 1条属性洗练满值 可突破", ColorUtil.GREEN_DARK) else self.equip_lv_tip_tmp.text = "当前开放等级已达上限" self.equip_break_tip_tmp.text = "当前突破阶段已达上限" end end end function PsionicWashView:UpdateWashCostItem( ) if self.slot_data then -- 设置洗练花费 local cost_data = self.wash_cfg.cost[1] local typeId, lock = self.goods_model:GetMappingTypeId(cost_data[1], cost_data[2]) self.cost_item:SetData(typeId, 0, nil, nil, lock) self.cost_item:SetVisible(true) local has_num = self.goods_model:GetTypeGoodsNum(typeId) self.cost_item_name_tmp.text = self.goods_model:getGoodsName(typeId, true, true) self.cost_item_num_tmp.text = string.format("需求数量:%s/%s", cost_data[3] <= has_num and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, has_num, cost_data[3]) end end function PsionicWashView:UpdateEquipWashAttr( ) -- 协议属性 local attr_list, attr_id_list = {}, {} for k, v in pairs(self.slot_data.attrs) do attr_list[#attr_list+1] = {[1] = v.attr_id, [2] = v.attr_value} attr_id_list[v.attr_id] = v.attr_value end -- 创建属性节点 self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator) local info = { data_list = self.wash_cfg.maxs, -- 使用满级属性列表的数据作为节点数据 scroll_view = self.attr_scroll, item_con = self.attr_con, item_class = PsionicWashAttrItem, item_height = 50, start_x = -2, start_y = -3, create_frequency = 0.01, alignment = UnityEngine.TextAnchor.UpperLeft, on_update_item = function(item, i, v) local attr_id = v[1] local cur_val = attr_id_list[attr_id] or 0 item:SetData(self.goods_vo.subtype, v, cur_val) end, } self.attr_item_creator:UpdateItems(info) -- 更新战斗力 self.power_cur_txt.text = GetFighting(attr_list) local total_len = self.power_lb1_tmp.preferredWidth + self.power_cur_txt.preferredWidth local offset_x = (self.power_con.sizeDelta.x - total_len) / 2 SetAnchoredPositionX(self.power_lb1, offset_x) SetAnchoredPositionX(self.power_cur, offset_x + self.power_lb1_tmp.preferredWidth + 5) end -- 突破按钮 function PsionicWashView:OnBreakBtnClick( ) if self.goods_vo then self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13906, self.goods_vo.subtype) -- self.model:Fire(PsionicConst.OPEN_MAIN_VIEW, true, PsionicConst.TabId.PAdvance) -- 切换到升级突破界面 end end -- 洗练按钮 function PsionicWashView:OnWashBtnClick( ) if self.goods_vo and self.wash_cfg then --先判断宠物生活技能 如果有免费次数 直接发协议 local wash_red = self.goods_vo and self.model:GetPsionicWashSlotRed(self.goods_vo.subtype) or false local left_free_wash_times = self.model:GetPsionicFreeWashTimes() if left_free_wash_times > 0 and wash_red then--如果是词条满了那红点必是false,那么免费洗练也不用判断 self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13909, self.goods_vo.subtype) -- 发送洗练协议 return end local cost_data = self.wash_cfg.cost[1] local typeId, lock = self.goods_model:GetMappingTypeId(cost_data[1], cost_data[2]) local has_num = self.goods_model:GetTypeGoodsNum(typeId) if has_num > 0 then self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13909, self.goods_vo.subtype) -- 发送洗练协议 else UIToolTipMgr:getInstance():AppendGoodsTips(typeId, x, y, nil, nil, nil, nil, true) end end end -- 更新洗练和突破的红点 function PsionicWashView:UpdateWashAndBreakRed( ) local break_red = self.goods_vo and self.model:GetPsionicWashSlotBreakRed(self.goods_vo.subtype) or false self.break_red_obj:SetActive(break_red) SetImageGray(self.break_btn_img, not break_red) SetTMPSharedMaterial(self.break_btn_lb_tmp, break_red and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) local wash_red = self.goods_vo and self.model:GetPsionicWashSlotRed(self.goods_vo.subtype) or false self.wash_red_obj:SetActive(wash_red) SetImageGray(self.wash_btn_img, not wash_red) SetTMPSharedMaterial(self.wash_btn_lb_tmp, wash_red and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) --宠物生活技能多加一次免费洗练 local left_free_wash_times = self.model:GetPsionicFreeWashTimes() if left_free_wash_times > 0 and wash_red then--如果是词条满了那红点必是false,那么免费洗练也不用判断 self.wash_btn_lb_tmp.text = "免费洗练" else self.wash_btn_lb_tmp.text = "洗练" end end function PsionicWashView:__delete( ) if self.equip_item then self.equip_item:DeleteMe() self.equip_item = nil end if self.cost_item then UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.cost_item) end self.cost_item = nil end