--[[
|
|
@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
|