--[[ @description: 可选道具槽 --]] OptionalItemSlot = OptionalItemSlot or BaseClass(AwardItem) local OptionalItemSlot = OptionalItemSlot OptionalItemSlot.STATE = { LOCK = 0, NONE = 1, ADDED = 2, } local STATE_HANDLER = { [OptionalItemSlot.STATE.LOCK] = { SetItemState = function(self) self:OnlyShowBg(true) self.show_tips = false self.icon.gameObject:SetActive(true) self:SetRedDot(false) lua_resM:setImageSprite(self, self.iconImage, "common_asset","ui_lock") self.getIcon:SetActive(false) self:CancelSelect() end, ClickHandler = function (self, x, y) end, }, [OptionalItemSlot.STATE.NONE] = { SetItemState = function(self) self:OnlyShowBg(true) self.show_tips = true if self.show_add_effect then self:AddUIEffect("ui_tongyong_baoshikongtexiao", self.effect, self.layer_name, nil, Vector3(1, 1, 1), true,-1, nil,nil, nil, nil) else self.getIcon:SetActive(true) end self:CheckRedDot() self:CancelSelect() if self.default_goods_icon then self:SetGoodsIcon(self.default_goods_icon) self.icon.gameObject:SetActive(true) end end, ClickHandler = function (self, x, y) UIToolTipMgr:getInstance():AppendOptionalItemTips(x, y, self.goods_type, self:GetOptionalGoods(), function(goods_vo) self:OnSelectCallback(goods_vo) end, self.item_type, self.cur_grade) end, }, [OptionalItemSlot.STATE.ADDED] = { SetItemState = function(self) self.icon.gameObject:SetActive(true) self.getIcon:SetActive(false) self:SetData(self.select_goods_vo.type_id) self:SetRedDot(false) if self.show_num then local num = GoodsModel:getInstance():GetTypeGoodsNum(self.select_goods_vo.type_id) self:SetNumText(num) self.numTextT.gameObject:SetActive(true) elseif self.custom_num_str then self.numText.text = self.custom_num_str self.numTextT.gameObject:SetActive(true) end -- self:SetItemBgVisible(self.show_bg) end, ClickHandler = function (self, x, y) local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(self.select_goods_vo.type_id) local vo = GoodsModel:getInstance():GetBagGoodsInfoById(self.select_goods_vo.goods_id) if not vo and basic.type == 20 and basic.subtype == 1 then vo = GoodsModel:getInstance().wing_equip elseif not vo and self.goods_type == 52 then vo = GoodsModel:getInstance():GetSoulBeadInfoById(self.select_goods_vo.goods_id) end if vo then if basic and basic.type == GoodsModel.TYPE.EQUIP then UIToolTipMgr:getInstance():AppendEquipShowTips(self.select_goods_vo, x, y, EquipShowTips.COMPOSE_OFF,function () self:OnTakeOffCallback() end) elseif basic and basic.type == 20 then if basic.subtype == 4 then UIToolTipMgr:getInstance():AppendOptionalItemTips(x, y, self.goods_type, self:GetOptionalGoods(), function(goods_vo) self:OnSelectCallback(goods_vo) end, self.item_type) else UIToolTipMgr:getInstance():AppendWingTips(self.select_goods_vo.type_id, x, y, WingInfoTips.OFF_AND_REPLACE, function() self:OnTakeOffCallback() end, function() UIToolTipMgr:getInstance():AppendOptionalItemTips(x, y, self.goods_type, self:GetOptionalGoods(), function(goods_vo) self:OnSelectCallback(goods_vo) end, self.item_type) end ) end else UIToolTipMgr:getInstance():AppendOptionalItemTips(x, y, self.goods_type, self:GetOptionalGoods(), function(goods_vo) self:OnSelectCallback(goods_vo) end, self.item_type) end else UIToolTipMgr:getInstance():AppendOptionalItemTips(x, y, self.goods_type, self:GetOptionalGoods(), function(goods_vo) self:OnSelectCallback(goods_vo) end, self.item_type, self.cur_grade) end end, }, } OptionalItemSlot.Goods_Cache = {} function OptionalItemSlot:Load_callback() AwardItem.Load_callback(self) if self.need_refresh then self.state_hander.SetItemState(self) end end function OptionalItemSlot:__delete() self:CancelSelect() end function OptionalItemSlot:Initialization(goods_type, type_id_list, callback_fun, item_type, show_bg, show_num, selected_goods_vo, show_add_effect, show_redDot) self.callback_fun = callback_fun self.goods_type = goods_type self.item_type = item_type self.show_num = show_num self.cur_state = nil self.state_hander = nil self.show_bg = true --show_bg == nil and false or show_bg self.show_add_effect = show_add_effect self.show_redDot = show_redDot self.type_id_list = type_id_list if selected_goods_vo then self:ResetState(OptionalItemSlot.STATE.ADDED, selected_goods_vo) elseif not type_id_list then self:SetState(OptionalItemSlot.STATE.LOCK) else self:SetState(OptionalItemSlot.STATE.NONE) end end function OptionalItemSlot:SetOptionalType(type_id_list, default_select) self:CancelSelect() if not type_id_list then self:SetState(OptionalItemSlot.STATE.LOCK) else self.type_id_list = type_id_list self:SetState(OptionalItemSlot.STATE.NONE) end if default_select then self:AutoFillGoods() end end function OptionalItemSlot:SetCurGrade( grade ) self.cur_grade = grade end function OptionalItemSlot:ResetState(state, goods_vo) state = state or OptionalItemSlot.STATE.NONE self:CancelSelect() if goods_vo and state == OptionalItemSlot.STATE.ADDED then OptionalItemSlot.Goods_Cache[goods_vo.goods_id] = goods_vo self.select_goods_vo = goods_vo end self:SetState(state, true) end function OptionalItemSlot:AutoFillGoods() if self.cur_state == OptionalItemSlot.STATE.NONE then local list = self:GetOptionalGoods() local first = _G.next(list) if first then self:OnSelectCallback(list[first]) end end end function OptionalItemSlot:SetDefaultIcon(goods_icon) self.default_goods_icon = goods_icon if self.is_loaded then self:SetGoodsIcon(self.default_goods_icon) self.icon.gameObject:SetActive(true) end end ------------------------------------------------------------ -- 内部函数 function OptionalItemSlot:SetState(state, force) if self.cur_state == state and not force then return end self.cur_state = state self.state_hander = STATE_HANDLER[state] if self.is_loaded then self.state_hander.SetItemState(self) else self.need_refresh = true end end function OptionalItemSlot:GetOptionalGoods() local list = {} for _, v in pairs(self.type_id_list) do local base = GoodsModel:getInstance():GetGoodsBasicByTypeId(tonumber(v)) if base == nil then return end local goods_list = {} if self.goods_type == 52 then --魂珠背包 goods_list = GoodsModel:getInstance():GetSoulBeadTypeGoods(tonumber(v)) else goods_list = GoodsModel:getInstance():GetTypeGoods(tonumber(v)) end for i, v in ipairs(goods_list) do list[v.goods_id] = v end end for _, v in pairs(OptionalItemSlot.Goods_Cache) do if list[v.goods_id] then list[v.goods_id] = nil end end local sort_list = {} for k, v in pairs(list) do sort_list[#sort_list + 1] = v end local function sort_fun(vo1, vo2) return self:GetItemFightValue(vo1) > self:GetItemFightValue(vo2) end table.sort(sort_list, sort_fun ) return sort_list, #sort_list end function OptionalItemSlot:GetItemFightValue(goods_vo) local type_id = tonumber(goods_vo.type_id) local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id) if basic.type == 20 and Config.Twing[type_id] then return Config.Twing[type_id].power else return goods_vo.combat_power end end -- 点击事件重载 function OptionalItemSlot:ClickCallFun(target, x, y) print("OptionalItemSlot:ClickCallFun()1") if not self.state_hander then return end print("OptionalItemSlot:ClickCallFun()2") self.state_hander.ClickHandler(self, x, y) end function OptionalItemSlot:OnSelectCallback(goods_vo) if self.callback_fun then self.callback_fun(true, goods_vo, self.item_type) end self:CancelSelect() OptionalItemSlot.Goods_Cache[goods_vo.goods_id] = goods_vo self.select_goods_vo = goods_vo self:SetState(OptionalItemSlot.STATE.ADDED, true) end function OptionalItemSlot:OnTakeOffCallback() if self.callback_fun then self.callback_fun(false, self.select_goods_vo, self.item_type) end self:SetState(OptionalItemSlot.STATE.NONE) end function OptionalItemSlot:CancelSelect() if self.select_goods_vo then OptionalItemSlot.Goods_Cache[self.select_goods_vo.goods_id] = nil self.select_goods_vo = nil end end function OptionalItemSlot:RefreshSlotNum() if self.show_num and self.select_goods_vo then local num = GoodsModel:getInstance():GetTypeGoodsNum(self.select_goods_vo.type_id) if num and num > 0 then self:SetNumText(num) return true else self:SetOptionalType(self.type_id_list) end end return false end function OptionalItemSlot:CheckRedDot() if not self.show_redDot then return end local _, count = self:GetOptionalGoods() if count > 0 then self:SetRedDot(true) else self:SetRedDot(false) end end