源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

650 lines
20 KiB

ItemUseModel = ItemUseModel or BaseClass(BaseModel)
ItemUseModel.IgnoreProduceType =
{
[274] = "GoodsShelvesDwon", --市场下架
[350] = "GoodsTransfer", -- 背包移动
}
function ItemUseModel:__init()
ItemUseModel.Instance = self
self.goods_dic = {} --获得的物品
self.hide_item_view = false
self.login_use_handle = false
self.is_delay_show = false
end
function ItemUseModel:getInstance()
if ItemUseModel.Instance == nil then
ItemUseModel.New()
end
return ItemUseModel.Instance
end
--清除缓存数据
function ItemUseModel:ClearData()
self.goods_dic = {} --获得的物品
self.fashion_add_goods = {} --时装类道具增加数组
self.hide_item_view = false
self.login_use_handle = false
end
--针对 15017 协议
function ItemUseModel:UpdateBagGoodsDic(vo, produce_type,add_wear_horse)
--某些产出类型,就不处理便捷弹窗
if self:IsIgnoreItemUseTip(produce_type) then return end
local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(vo.type_id)
local lv = RoleManager.Instance.mainRoleInfo.level
if not basic then
return
end
--装备,没有激活的时装,配置为可使用的物品,都弹使用框
local bag_goods_dic = GoodsModel:getInstance():GetBagGoodsDic()
local goodsVo = bag_goods_dic[vo.goods_id]
local copy_vo = goodsVo
if not copy_vo then
copy_vo = DeepCopy(vo)
GoodsModel:getInstance():SetBaseInfo(copy_vo)
end
if GoodsModel:getInstance():IsGoodsNeedShowUseTipOnGainGoods(basic,copy_vo, vo) then
if goodsVo then
local exist_num = goodsVo.goods_num
local last_num = vo.goods_num
local curr_vo = self.goods_dic[vo.goods_id]
if add_wear_horse then --放入仓库
if curr_vo then
curr_vo.goods_num = curr_vo.goods_num - last_num
if curr_vo.goods_num <= 0 then
self.goods_dic[vo.goods_id] = nil
end
end
elseif exist_num > last_num then --说明是减少
if curr_vo then
curr_vo.goods_num = curr_vo.goods_num - (exist_num - last_num)
if curr_vo.goods_num <= 0 then
self.goods_dic[vo.goods_id] = nil
end
end
elseif exist_num < last_num then --说明是增加
if curr_vo then
curr_vo.goods_num = curr_vo.goods_num + (last_num - exist_num)
else
self.goods_dic[vo.goods_id] = copy_vo
end
else
--道具变更,并且原来没出现在便捷使用里
if vo.goods_num > 0 and not self.goods_dic[vo.goods_id] then
self.goods_dic[vo.goods_id] = copy_vo
end
end
else
--道具使用完
if vo.goods_num == 0 then
self.goods_dic[vo.goods_id] = nil
--道具添加的时候
elseif vo.goods_num > 0 and not self.goods_dic[vo.goods_id] then
self.goods_dic[vo.goods_id] = copy_vo
end
end
if basic.type == GoodsModel.TYPE.EQUIP then
if vo.goods_num > 0 then
self.goods_dic[vo.goods_id] = copy_vo
else
--穿了某个装备的时候,判断下,便捷使用的其他装备,是否能够满足继续穿戴的情况
GlobalEventSystem:DelayFire(EventName.CHECK_ITEM_USE_EQUIP_CAN_SHOW)
end
end
else
if basic.type == GoodsModel.TYPE.EQUIP then
if vo.goods_num == 0 then
--穿了某个装备的时候,判断下,便捷使用的其他装备,是否能够满足继续穿戴的情况
GlobalEventSystem:DelayFire(EventName.CHECK_ITEM_USE_EQUIP_CAN_SHOW)
end
end
end
if basic.type == 17 and basic.subtype == 3 then --神格装备
-- if not DeityModel:getInstance():EquipFightCompare(vo.type_id) then
-- self.goods_dic[vo.goods_id] = nil
-- end
elseif basic.type == 36 and basic.subtype == 4 then
local vip_type = RoleManager.Instance.mainRoleInfo.vip_type
if vip_type and vip_type <= 1 then
self.goods_dic[vo.goods_id] = nil
end
end
end
--添加提示
function ItemUseModel:AddUseTip( vo )
local copy_vo = DeepCopy(vo)
GoodsModel:getInstance():SetBaseInfo(copy_vo)
self.goods_dic[vo.goods_id] = copy_vo
end
--强制添加提示
function ItemUseModel:AddForceUseTip( vo )
local copy_vo = DeepCopy(vo)
GoodsModel:getInstance():SetBaseInfo(copy_vo)
copy_vo.force = true
self.goods_dic[vo.goods_id] = copy_vo
end
--尝试去添加提示
function ItemUseModel:TryAddUseTip( vo )
local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(vo.type_id)
if not basic then
return
end
local bool = false
if basic.type == GoodsModel.TYPE.EQUIP then
-- if basic.career_id == 0 or basic.career_id == RoleManager.Instance.mainRoleInfo.career then
-- bool = true
-- end
bool = false
elseif basic.type == 17 and basic.subtype == 3 then
if DeityModel:getInstance():EquipFightCompare(basic.type_id) then
bool = true
end
end
local cfg = Config.ConfigItemUse.Reward[vo.type_id] or Config.ConfigItemUse.TypeUse[basic.type.."@"..basic.subtype]
if cfg then
local lv = RoleManager.Instance.mainRoleInfo.level
local career = RoleManager.Instance.mainRoleInfo.career
if (cfg.limit_lv == -1 or (cfg.limit_lv ~= -1 and lv >= cfg.limit_lv)) and (not cfg.career or (cfg.career and cfg.career == career)) then
bool = true
else
bool = false
end
end
if bool then
local copy_vo = DeepCopy(vo)
GoodsModel:getInstance():SetBaseInfo(copy_vo)
self.goods_dic[vo.goods_id] = copy_vo
end
end
--针对 15010协议
function ItemUseModel:HandleLoginUseTips(goods_list)
if not self.login_use_handle and goods_list then
print("ItemUseModel:HandleLoginUseTips()")
for i, vo in ipairs(goods_list) do
ItemUseModel:getInstance():TryAddUseTip(vo)
end
self.login_use_handle = true
end
end
--针对 15018 协议 当出售的时候
function ItemUseModel:UpdateBagGoodsDicWhenSell(vo)
local bag_goods_dic = GoodsModel:getInstance():GetBagGoodsDic()
local goodsVo = bag_goods_dic[vo.goods_id]
if goodsVo then
local exist_num = goodsVo.goods_num
local last_num = vo.goods_num
--说明是减少
local curr_vo = self.goods_dic[vo.goods_id]
if exist_num > last_num then
if curr_vo then
curr_vo.goods_num = curr_vo.goods_num - (exist_num - last_num)
if curr_vo.goods_num <= 0 then
self.goods_dic[vo.goods_id] = nil
end
end
end
end
end
function ItemUseModel:UpdateStarShadowBagGoods( vo )
local bag_goods_dic = GoodsModel:getInstance().starShadow_bag_list
local goodsVo = bag_goods_dic[vo.goods_id]
if goodsVo then
local exist_num = goodsVo.goods_num
local last_num = vo.goods_num
--说明是减少
local curr_vo = self.goods_dic[vo.goods_id]
if exist_num > last_num then
if curr_vo then
curr_vo.goods_num = curr_vo.goods_num - (exist_num - last_num)
if curr_vo.goods_num <= 0 then
self.goods_dic[vo.goods_id] = nil
end
end
end
end
end
--获取主界面道具使用界面Vo
function ItemUseModel:MatchPopCondition()
local scene_mgr = SceneManager.Instance
if scene_mgr:IsNoonQuizScene() then
return false
end
if GuideModel:getInstance():IsHideSmallUI() then
return false
end
if self.is_delay_show then
return false
end
return true
end
--获取主界面道具使用界面Vo
function ItemUseModel:GetItemShowVo()
if self.goods_dic then
for i,vo in pairs(self.goods_dic) do
if vo.force==true and (vo.expire_time == 0 or (vo.expire_time ~= 0 and vo.expire_time - TimeUtil:getServerTime() > 0))then --强制提示
return vo
else
if vo.type == GoodsModel.TYPE.EQUIP then --如果是装备,则判断是否有更好的 才显示
local is_can_wear = EquipModel:getInstance():EquipCanShowGoodsTip(vo)
if is_can_wear then
return vo, true
end
local is_auction = GoodsModel:getInstance():IsEquipCanAuctionButNoUse(vo)
if is_auction then
return vo
end
else
if vo.expire_time == 0 or (vo.expire_time ~= 0 and vo.expire_time - TimeUtil:getServerTime() > 0) then
return vo
end
end
end
end
end
return nil
end
function ItemUseModel:SetIgnore_Better( bool )
self.ignore_better = bool
if bool then
setTimeout(function()
self.ignore_better = false
end,3)
end
end
--根据物品类型获取数量
function ItemUseModel:GetTypeGoodsNum(typeId)
local id = tonumber(typeId)
local theNum = 0
if id < 1 then
return 0
end
for i,vo in pairs(self.goods_dic) do
if vo.type_id == typeId then
theNum = theNum + vo.goods_num
end
end
return theNum
end
--根据物品id获取数量
function ItemUseModel:GetGoodsNumById(goods_id)
return self.goods_dic[goods_id] and self.goods_dic[goods_id].goods_num or 0
end
--当当前物品被使用的时候 。查看剩下的相同type_id,有的话优先取这个Vo
function ItemUseModel:GetVoByTypeId(typeId)
if self.goods_dic then
for i,vo in pairs(self.goods_dic) do
if vo.type_id == typeId then
return vo
end
end
end
return nil
end
--当当前物品被使用的时候 。查看剩下的相同type_id,有的话优先取这个Vo
function ItemUseModel:ContainGoodsId(goods_id)
return self.goods_dic[goods_id]
end
--根据类型id清除Vo信息
function ItemUseModel:ClearTypeIdData(typeId)
if self.goods_dic then
for i,vo in pairs(self.goods_dic) do
if vo.type_id == typeId then
self.goods_dic[vo.goods_id] = nil
end
end
end
end
--根据物品唯一id清除Vo信息
function ItemUseModel:ClearIdData(goods_id)
if self.goods_dic then
print(">>>>>>>>>>> ClearIdData ", goods_id)
for i,vo in pairs(self.goods_dic) do
if vo.goods_id == goods_id then
self.goods_dic[vo.goods_id] = nil
end
end
-- PrintTable(self.goods_dic)
end
end
--删除评分更低的装备
function ItemUseModel:DelLowerEquip(goods_id)
if self.goods_dic then
local goods_vo = GoodsModel:getInstance():GetBagGoodsInfoById(goods_id)
if goods_vo then
for i,vo in pairs(self.goods_dic) do
if vo.type_id == goods_vo.type_id and vo.rating<=goods_vo.rating then
self.goods_dic[vo.goods_id] = nil
end
end
end
end
end
--是否小天使小恶魔
function ItemUseModel:IsEquipSpecialType(type_id)
local goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id)
if goods_basic then
return goods_basic.type == GoodsModel.TYPE.EQUIP and goods_basic.subtype == GoodsModel.SHOUHU_EQUIP_TYPE
end
return false
end
--是否佩戴了或者拥有小恶魔
function ItemUseModel:HasWearXiaoEMoOrHas( )
local vo = GoodsModel:getInstance().wear_equip_list[GoodsModel.SHOUHU_EQUIP_TYPE]
if not vo then --装备栏上没有装备小恶魔
local bool = self:CheckXiaoEMo(1011000003)
if bool then
return
end
local list = GoodsModel:getInstance():GetTypeGoods(1011000001)
if TableSize(list) ~= 0 then --背包里有小恶魔
table.sort(list,function (a,b)
return a.expire_time > b.expire_time
end)
for i,v in ipairs(list) do
if TimeUtil:getServerTime() < v.expire_time then
-- GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,v, 5)
-- BaseDungeonModel:getInstance():Fire(BaseDungeonModel.SHOW_UES_EXP_EVIL_BTN,true,v.goods_id)
return
end
end
--这里就是续费
-- GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,list[1], 5)
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.SHOW_UES_EXP_EVIL_BTN,true,list[1].goods_id)
end
else
--local vo = GoodsModel:getInstance().wear_equip_list[11]
-- if vo and (vo.type_id==1011000001 or vo.type_id==1011000005) and TimeUtil:getServerTime() > vo.expire_time then
-- GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,vo, 5)
-- end
if vo.type_id == 1011000003 or vo.type_id == 1011000001 or vo.type_id == 1011000005 then
if TimeUtil:getServerTime() > vo.expire_time then --物品过期了
if vo.type_id == 1011000003 then --如果身上大的过期,就看看背包里面有没有小的没有过期的
local bool = self:CheckXiaoEMo(1011000001)
if not bool then --如果没有,就提醒续费
-- GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,vo, 5)
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.SHOW_UES_EXP_EVIL_BTN,true,vo.goods_id)
end
elseif vo.type_id == 1011000001 then --如果身上是小的过期了,就看看背包里面有没有大的,没有就提醒续费
local bool = self:CheckXiaoEMo(1011000003)
if not bool then --如果没有,就提醒续费
-- GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,vo, 5)
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.SHOW_UES_EXP_EVIL_BTN,true,vo.goods_id)
end
elseif vo.type_id == 1011000005 then
local bool = self:CheckXiaoEMo(1011000003)
if not bool then --如果没有,就提醒续费
bool = self:CheckXiaoEMo(1011000001)
if not bool then --如果没有,就提醒续费
-- GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,vo, 5)
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.SHOW_UES_EXP_EVIL_BTN,true,vo.goods_id)
end
end
end
else --如果没有过期,并且身上是小的,就看看背包里有没有大的,如果是大的没有过期,就什么都不敢
if vo.type_id == 1011000001 or vo.type_id == 1011000003 or vo.type_id == 1011000005 then
self:CheckXiaoEMo(1011000003)
end
end
else
local bool = self:CheckXiaoEMo(1011000003)
if not bool then
self:CheckXiaoEMo(1011000001,true)
end
end
end
end
function ItemUseModel:CheckXiaoEMo(id,show_tip)
local list = GoodsModel:getInstance():GetTypeGoods(id)
if TableSize(list) ~= 0 then --背包里有小恶魔
table.sort(list,function (a,b)
return a.expire_time > b.expire_time
end)
for i,v in ipairs(list) do
if TimeUtil:getServerTime() < v.expire_time then
GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,v, 5)
return true
end
end
--这里就是续费
if show_tip then
GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,list[1], 5)
end
end
end
--是否穿戴了守护
function ItemUseModel:HasWearEvil( )
local evil_id = EquipModel:getInstance():GetFollowGuardId()
return evil_id ~= 0
end
--是否佩戴了未过期小恶魔
function ItemUseModel:HasWearXiaoEMo( )
local vo = GoodsModel:getInstance().wear_equip_list[11]
if vo and (vo.type_id==1011000001 or vo.type_id==1011000005 or vo.type_id==1011000003 ) and TimeUtil:getServerTime() < vo.expire_time then
return true
end
end
--是否佩戴了未过期小天使
function ItemUseModel:HasWearXiaoTianShi( )
local vo = GoodsModel:getInstance().wear_equip_list[11]
if vo and (vo.type_id==1011000002 or vo.type_id==1011000004 )and TimeUtil:getServerTime() < vo.expire_time then
return true
end
end
function ItemUseModel:HideItemUseView( )
self.hide_item_view = true
GlobalEventSystem:Fire(EventName.CLOSE_ITEM_USE_VIEW)
end
function ItemUseModel:GetHideState( )
return self.hide_item_view
end
function ItemUseModel:SetHideState(bool)
self.hide_item_view = bool
end
function ItemUseModel:ShowItemUseView( )
if not GoodsModel:getInstance():CheckCanFlyGood() then--检查飞道具图标的条件
return
end
local vo = ItemUseModel:getInstance():GetItemShowVo()
if vo then
self.hide_item_view = false
GlobalEventSystem:Fire(EventName.REOPEN_ITEM_USE_VIEW)
else
self.hide_item_view = false
end
end
-- 因为骑宠幻形激活道具填了use又无法再背包使用jump属性比较蛋疼,所以在这里特殊处理
function ItemUseModel:IsHorsePetSpecial(vo)
if vo == nil then return false end
if vo.type == 18 and vo.subtype == 4 then -- 宠物幻形激活道具
return PetModel:getInstance():IlluCanAvtivateByGoodsId(vo.type_id)
elseif vo.type == 16 and vo.subtype == 3 then -- 坐骑幻形激活道具
return HorseModel:getInstance():IlluCanAvtivateByGoodsId(vo.type_id)
end
return false
end
--未激活的时装弹出使用框
function ItemUseModel:IsUnActiveFashion(vo)
if vo then
if vo.type == 12 and vo.subtype >= 1 and vo.subtype <= 4 then
return FashionModel:getInstance():GetFashionByConsumable(vo.type_id)
end
end
return false
end
--未激活的幻形宝宝弹出使用框
function ItemUseModel:IsUnActiveBaby(vo)
return false
end
function ItemUseModel:SetDelayFlag(bool,time)
self.is_delay_show = bool
if self.is_delay_show then
setTimeout(function()
self.is_delay_show = false
self:ShowItemUseView()
end, time)
end
end
--是否显示使用提示界面(登录游戏时)
function ItemUseModel:InitBagGoodsDicOnStarGame( goods_list )
if self.is_first_init_goods_dic_on_start_game and self.is_first_init_goods_dic_on_start_game>=2 then return end
self.is_first_init_goods_dic_on_start_game = self.is_first_init_goods_dic_on_start_game or 0
self.is_first_init_goods_dic_on_start_game = self.is_first_init_goods_dic_on_start_game + 1
for i,v in ipairs(goods_list) do
local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(v.type_id)
local is_need_show_tip_view = GoodsModel:getInstance():IsGoodsNeedShowUseTipOnStartGame(basic,v)
if is_need_show_tip_view then
local copy_vo = DeepCopy(v)
GoodsModel:getInstance():SetBaseInfo(copy_vo)
self.goods_dic[v.goods_id] = copy_vo
end
end
end
--玩家整理道具触发便捷使用
function ItemUseModel:InitBagGoodsDicOnSort( goods_list )
self.goods_dic = {}
for i,v in ipairs(goods_list) do
if v.goods_num ~= 0 then
local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(v.type_id)
local is_need_show_tip_view = GoodsModel:getInstance():IsGoodsNeedShowUseTipOnGainGoods(basic,v,v)
if not is_need_show_tip_view then
is_need_show_tip_view = GoodsModel:getInstance():IsGoodsNeedShowUseTipOnStartGame(basic,v)
end
if is_need_show_tip_view then
local copy_vo = DeepCopy(v)
self.goods_dic[v.goods_id] = copy_vo
end
end
end
local vo = self:GetItemShowVo()
if vo then
GlobalEventSystem:Fire(EventName.OPEN_ITEM_USE_VIEW,vo)
end
end
--是否在便捷使用忽略列表
function ItemUseModel:IsIgnoreItemUseTip(produce_type)
produce_type = produce_type or 0
return ItemUseModel.IgnoreProduceType[produce_type]
end
--重新检测下,便捷使用列表中的其他装备还是否满足可以穿戴
function ItemUseModel:CheckItemUseListOtherEquipCanWear()
local remove_goods_id_list = {}
local is_reopen = false
for k,v in pairs(self.goods_dic) do
local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(v.type_id)
if basic and basic.type == GoodsModel.TYPE.EQUIP then
local is_need_show = GoodsModel.getInstance():IsEquipNeedShowUseTipGoods(v)
if not is_need_show then
table.insert(remove_goods_id_list, v.goods_id)
is_reopen = true
end
end
end
if is_reopen then
for k,v in pairs(remove_goods_id_list) do
self.goods_dic[v] = nil
end
GlobalEventSystem:Fire(EventName.REOPEN_ITEM_USE_VIEW)
end
end
--是否数时装和称号道具增加了
function ItemUseModel:IsAddFashionOrFashionchip(goods_vo)
local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(goods_vo.type_id)
if basic.type == GoodsModel.TYPE.FASHION or (basic.type == GoodsModel.TYPE.FASHIONCHIP and basic.subtype == 1) then
local bag_goods_dic = GoodsModel:getInstance():GetBagGoodsDic()
local bag_good_vo = bag_goods_dic[goods_vo.goods_id]
self.fashion_add_goods = self.fashion_add_goods or {}
--背包本来没有
if not bag_good_vo then
--道具增加
if goods_vo.goods_num > 0 then
local copy_new_vo = DeepCopy(goods_vo)
table.insert(self.fashion_add_goods, copy_new_vo)
end
else
--道具变更,并且增加
if goods_vo.goods_num > bag_good_vo.goods_num then
local copy_new_vo = DeepCopy(goods_vo)
table.insert(self.fashion_add_goods, copy_new_vo)
end
end
end
end
--检测一些特殊类型的道具的便捷使用
function ItemUseModel:CheckReShowGood()
if self.fashion_add_goods and #self.fashion_add_goods > 0 then
for i,vo in ipairs(self.fashion_add_goods) do
self:UpdateBagGoodsDic(vo, nil,nil)
end
GoodsModel.getInstance():DelayFire(GoodsModel.CHANGE_BAGLIST)
end
self.fashion_add_goods = {}
end