源战役客户端
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.
 
 
 
 
 

457 lines
18 KiB

TreasureMapModel = TreasureMapModel or BaseClass(BaseVo, true)
local TreasureMapModel = TreasureMapModel
function TreasureMapModel:__init()
TreasureMapModel.Instance = self
self:Reset()
end
function TreasureMapModel:Reset()
self.tm_red_cache = {} -- 红点缓存
self.current_treasure_data = nil -- 当前的藏宝图信息
self.tm_normal_times = 0 -- 今日普通藏宝图使用次数
self.adv_tm_times_data = nil -- 高级藏宝图月度次数信息
self.tm_shop_data = nil -- 藏宝图限时商城商品内容
self.tm_shop_rest_data = nil -- 藏宝图限时商城剩余数量数据
self.tm_storage_shop_data = {} -- 藏宝图限时商城收纳数据
self.tm_shop_free_cfg = {} -- 藏宝图限时商城动态配置(免费商品)
self.tm_kv_cfg = nil -- 藏宝图键值动态配置
self.tm_mt_reward_cfg = nil -- 藏宝图月度次数奖励配置
self.tm_shop_cfg = {} -- 藏宝图限时商城动态配置
self.tm_reward_preview_cfg = {} -- 藏宝图奖励展示配置
self._tm_can_fly_goods = true -- 是否可以有道具飘入表现
self._check_tm_tips = false -- 是否检查藏宝图快捷使用tips,需要检查时该值为藏宝图类型
end
function TreasureMapModel:getInstance()
if self.Instance == nil then
self.Instance = TreasureMapModel.New()
end
return self.Instance
end
-- 配置部分
function TreasureMapModel:GetTreasureMapKvCfg(key)
if not key then return nil end
if not self.tm_kv_cfg then
self.tm_kv_cfg = {}
local temp_key = nil
for k, v in pairs(Config.Treasuremapkv) do
temp_key = Trim(v.key)
self.tm_kv_cfg[temp_key] = v
end
end
return self.tm_kv_cfg[key]
end
-- 获取藏宝图月度次数奖励配置
function TreasureMapModel:GetTreasureMapMonthTimesRewardCfg( )
if not self.tm_mt_reward_cfg then
local cfg = self:GetTreasureMapKvCfg("advanced_map_times_reward")
self.tm_mt_reward_cfg = stringtotable(cfg.value)
end
return self.tm_mt_reward_cfg
end
-- 获取藏宝图奖励展示配置
function TreasureMapModel:GetTreasureMapRewardPreviewData(type)
if not type then return {} end
if not self.tm_reward_preview_cfg[type] then
self.tm_reward_preview_cfg[type] = {}
local reward = nil
for k, v in pairs(Config.Treasuremaprewards) do
if v.type == type then
reward = {
reward_id = v.type,
show_weight = v.show_weight,
get_weight = v.get_weight,
rewards = stringtotable(v.rewards)[1]
}
table.insert(self.tm_reward_preview_cfg[type], reward)
end
end
-- 根据展示权值和获取权值排序
local sort_func = function ( a, b )
-- if a.show_weight == b.show_weight then
if a.get_weight == b.get_weight then
return a.reward_id < b.reward_id
else
return a.get_weight < b.get_weight
end
-- else
-- return a.show_weight > b.show_weight
-- end
end
table.sort(self.tm_reward_preview_cfg[type], sort_func)
end
return self.tm_reward_preview_cfg[type]
end
-- 藏宝图协议部分
-- 使用藏宝图返回 42401 find_way:是否开始寻路
function TreasureMapModel:SetCurrentTreasureData(vo, find_way)
if vo then
if vo.scene ~= 0 then
self.current_treasure_data = vo
if find_way then
self:TreasureMapFindWay()
end
end
else
self.current_treasure_data = nil
end
end
function TreasureMapModel:GetCurrentTreasureData( )
return self.current_treasure_data
end
-- 藏宝图寻路
function TreasureMapModel:TreasureMapFindWay( )
if self.current_treasure_data and self.current_treasure_data.scene ~= 0 then
local function tm_call_back()
if self.current_treasure_data and self.current_treasure_data.scene ~= 0 then
-- 处理藏宝图事件表现
if self.current_treasure_data.event == TreasureMapConst.EventType.Roll then -- 转盘直接开始
self:DealTreasureMapEvents(self.current_treasure_data.event)
else -- 其他情况走采集表现再发协议
GlobalEventSystem:Fire(EventName.OPEN_TREASUREMAP_COLLECT_VIEW, true, self.current_treasure_data.event)
end
end
end
local findVo = FindVo.New()
findVo.type = FindVo.POINT
findVo.x = self.current_treasure_data.x / SceneObj.LogicRealRatio.x
findVo.y = self.current_treasure_data.y / SceneObj.LogicRealRatio.y
findVo.sceneId = self.current_treasure_data.scene
findVo.call_back = tm_call_back
if SceneManager:getInstance():GetSceneId() ~= findVo.sceneId then -- 场景不同,先切场景
GlobalEventSystem:Fire(SceneEventType.REQUEST_CHANGE_SCENE, findVo.sceneId, nil, SceneTransType.GateAny, findVo.x, findVo.y)
self.tm_need_refind_way = true
else
self.tm_need_refind_way = false
GlobalEventSystem:Fire(EventName.FIND, findVo)
end
end
end
-- 缓存藏宝图每日普通寻宝次数 42403
function TreasureMapModel:SetNormalTreasureMapTimes(daily_count)
self.tm_normal_times = daily_count
end
function TreasureMapModel:GetNormalTreasureMapTimes()
return self.tm_normal_times
end
-- 是否可以批量使用普通藏宝图
function TreasureMapModel:CanBatchUseNormalTreasureMap( )
local limit_num = self:GetTreasureMapKvCfg("common_map_times").value
-- 没达到今日最少使用个数要求就不可以批量使用
if limit_num > self.tm_normal_times then return false end
local max_num = self:GetTreasureMapKvCfg("map_times_max").value
-- 今天已经用了这么多张藏宝图了也不可以批量使用
if max_num <= self.tm_normal_times then return false end
return true
end
-- 高级藏宝图月度次数信息 42405
function TreasureMapModel:SetAdvTreasureMapMonthTimesData(vo)
if vo then
self.adv_tm_times_data = {}
self.adv_tm_times_data.times = vo.times
self:UpdateAdvTreasureMapMonthTimesData(vo)
end
end
-- 更新高级藏宝图月度次数信息 42406
function TreasureMapModel:UpdateAdvTreasureMapMonthTimesData(vo)
if vo and self.adv_tm_times_data then
self.adv_tm_times_data.receive_list = {}
for k, v in pairs(vo.receive_list) do
self.adv_tm_times_data.receive_list[v.re_times] = true
end
end
end
function TreasureMapModel:GetAdvTreasureMapMonthTimesData()
return self.adv_tm_times_data
end
-- 获取藏宝图限时商城信息 42409
function TreasureMapModel:SetTreasureMapShopData(vo)
if vo then
self.tm_shop_data = {}
-- 免费商品
if not self.tm_shop_free_cfg[vo.free_reward] then
local cfg = DeepCopy(Config.Treasureeventrewards[vo.free_reward])
if cfg then
cfg.rewards = stringtotable(cfg.rewards)
self.tm_shop_free_cfg[vo.free_reward] = cfg
end
end
self.tm_shop_data.free_reward = self.tm_shop_free_cfg[vo.free_reward]
-- 限时商品
if not self.tm_shop_cfg[vo.limit_reward] then
local cfg = DeepCopy(Config.Treasuremapdoor[vo.limit_reward])
if cfg then
cfg.rewards = stringtotable(cfg.rewards)
self.tm_shop_cfg[vo.limit_reward] = cfg
end
end
self.tm_shop_data.limit_reward = self.tm_shop_cfg[vo.limit_reward]
else
self.tm_shop_data = nil
end
end
function TreasureMapModel:GetTreasureMapShopData( )
return self.tm_shop_data
end
-- 购买限时道具,用于设置剩余可购买数量 42410
function TreasureMapModel:SetTreasureMapShopRestNumData(vo)
if vo then
self.tm_shop_rest_data = self.tm_shop_rest_data or {}
self.tm_shop_rest_data[vo.index] = vo.rest_num
else
self.tm_shop_rest_data = nil
end
end
function TreasureMapModel:GetTreasureMapShopRestNumData(index)
return self.tm_shop_rest_data and self.tm_shop_rest_data[index] or nil
end
-- 更新藏宝图相关道具的数量
function TreasureMapModel:UpdateTreasureMapGoodsNum( )
TaskModel:getInstance():Fire(TaskEvent.UPDATE_TREASUREMAP_GOODS_NUM)
end
-- 藏宝图限时商城(即商店活动中没有购买的道具会以限时商城的形式出现) 42414
function TreasureMapModel:SetTreasureMapStorageShopData(vo)
self.tm_storage_shop_data = {}
for k, v in pairs(vo.goods_list) do
self.tm_storage_shop_data[#self.tm_storage_shop_data + 1] = v
end
local sort_func = function ( a, b )
if a.expire_time ~= b.expire_time then
return a.expire_time < b.expire_time
elseif a.reward_id ~= b.reward_id then
return a.reward_id < b.reward_id
else
return a.index < b.index
end
end
table.sort(self.tm_storage_shop_data, sort_func)
end
-- clear_invalid 获取数据的时候清除掉过期道具和已经买完的商品
function TreasureMapModel:GetTreasureMapStorageShopData(clear_invalid)
if clear_invalid then
local cur_time = TimeUtil:getServerTime()
local tb = {}
for k, v in ipairs(self.tm_storage_shop_data) do
if v.expire_time > cur_time and v.rest_num > 0 then
tb[#tb+1] = v
end
end
self.tm_storage_shop_data = tb
end
return self.tm_storage_shop_data
end
-- 更新限时收纳商店数据 42415
function TreasureMapModel:UpdateTreasureMapStorageShopData(vo)
if not vo then return end
for k, v in pairs(self.tm_storage_shop_data) do
if v.expire_time == vo.expire_time and
v.reward_id == vo.reward_id and
v.index == vo.index then
v.rest_num = vo.rest_num
break
end
end
end
-- 红点相关
function TreasureMapModel:CheckTreasureMapRed(red_type)
local bool = false
if red_type == TreasureMapConst.RedType.MonthReward then -- 高级藏宝图月度奖励红点
bool = self:CheckAdvMonthTimesRed()
elseif red_type == TreasureMapConst.RedType.Shop then -- 限时商店的免费商品需要有红点
bool = self:CheckTreasureShopRed()
end
self.tm_red_cache[red_type] = bool
-- 更新红点
self:Fire(TreasureMapConst.UPDATE_TREASUREMAP_RED, red_type, bool)
end
-- 获取藏宝图红点
function TreasureMapModel:GetTreasureMapRed(red_type)
if red_type then
return self.tm_red_cache[red_type] or false
else
for k, v in pairs(self.tm_red_cache) do
if v then
return true
end
end
return false
end
end
-- 检查月度奖励红点
function TreasureMapModel:CheckAdvMonthTimesRed( )
-- 更新遗宝进度
local momth_times_data = self:GetAdvTreasureMapMonthTimesData()
local month_times_reward_cfg = self:GetTreasureMapMonthTimesRewardCfg()
local times = 0
if momth_times_data and month_times_reward_cfg then
times = momth_times_data.times
for k, v in ipairs(month_times_reward_cfg) do
-- 满足了本次的领取条件但未领取
if v[1] <= times and not momth_times_data.receive_list[v[1]] then
return true
end
end
end
return false
end
-- 检查限时商店红点
function TreasureMapModel:CheckTreasureShopRed( )
return false
end
-- 检查是否进行道具飞入表现
function TreasureMapModel:GetGoodsCanFly( )
return self._tm_can_fly_goods
end
-- 藏宝图购买道具统一接口
function TreasureMapModel:BuyTreasureMapItemFunc(type)
local goods_id = TreasureMapConst.GoodId[type] -- 藏宝图道具id
local price_cfg = Config.Goodsprice[goods_id]
local jin = RoleManager.Instance.mainRoleInfo.jin
local jinLock = RoleManager.Instance.mainRoleInfo.jinLock
local function recharge_call_back( ... )--充值
local args = {...}
local use_lockjin = args[1]
-- 关闭道具tips
UIToolTipMgr:getInstance():CloseGoodsTips()
local qc_data = {
price = price_cfg.price - (use_lockjin and jinLock or 0),
qc_type = 0,
}
GlobalEventSystem:Fire(EventName.OPEN_RECHARGE_TIP_VIEW, true, qc_data)
end
--不足话先走这里的逻辑
if price_cfg.price_type == 1 then--彩钻
if jin < price_cfg.price then--彩钻不足
recharge_call_back()
return
end
elseif price_cfg.price_type == 2 then--红钻
if jinLock < price_cfg.price then--红钻不足用彩钻补齐
local ok = function ( )
if jinLock + jin < price_cfg.price then
recharge_call_back(true)
else
buy_tip_data.ok_callback()
end
end
local jin_type_img = WordManager:GetMoneyFaceStr(1)
local jinLock_type_img = WordManager:GetMoneyFaceStr(2)
local jin_type_name = GoodsModel:getInstance():getGoodsName(100000, false)
local jinLock_type_name = GoodsModel:getInstance():getGoodsName(100001, false)
local str = string.format("您的<color=#ff203a>%s不足</color>,是否使用<color=#feb940> %s%s </color>补全?",
jinLock_type_name, jin_type_img, price_cfg.price - jinLock)
if VipModel:getInstance():HasBoughtAllInvestmentTypes() then -- 已经购买了全部的投资类型,则不提示前往投资
Alert.show(str, Alert.Type.Two, ok, nil, "彩钻补全", "取消")
else
Alert.show(str, Alert.Type.Two, ok, invest_call_back, "彩钻补全", "前往投资")
end
return
end
end
-- 条件全部满足的情况,就打开购买界面
ShopModel:getInstance():Fire(ShopModel.OPEN_SHOP_BUY_TIP_VIEW, goods_id, 1)
end
-- 藏宝图任务点击事件
function TreasureMapModel:QuickUseTreasureMapGoodsByType(type)
if not type then return end
local goods_id = TreasureMapConst.GoodId[type] -- 藏宝图道具id
if goods_id then
local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_id)
if goods_num > 0 then
self:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42401, type)
else
self:BuyTreasureMapItemFunc(type)
end
end
end
function TreasureMapModel:OnTreasureMapTaskClick(type)
-- print("Saber:TreasureMapModel [164] type: ",type)
if not type then return end
-- 有缓存的情况,判断类型是否相同
if self.current_treasure_data then
if self.current_treasure_data.type ~= type then -- 类型不同,发协议
self:QuickUseTreasureMapGoodsByType(type)
else
-- 对已有的数据进行寻路表现
self:TreasureMapFindWay()
end
else -- 没缓存的情况就需要发协议请求信息
self:QuickUseTreasureMapGoodsByType(type)
end
end
-- 根据藏宝图不同的事件处理表现
function TreasureMapModel:DealTreasureMapEvents(event)
event = event or (self.current_treasure_data and self.current_treasure_data.event)
-- print("Saber:TreasureMapModel [291] event: ",event)
if not event then return end
if event == TreasureMapConst.EventType.Quiz then -- 答题
self:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42407)
elseif event == TreasureMapConst.EventType.Shop then -- 限时商城
self:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42409)
elseif event == TreasureMapConst.EventType.Boss then -- Boss
self:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42411)
elseif event == TreasureMapConst.EventType.Normal then -- 开宝箱
-- 直接通过协议获取结果
self:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42402, TreasureMapConst.Normal, event)
elseif event == TreasureMapConst.EventType.Roll then -- 转盘
-- 直接通过协议获取结果
self:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42402, TreasureMapConst.Advance, event)
end
end
-- 根据42402返回的数据,获取奖励展示列表 (高级藏宝图用)
function TreasureMapModel:GetRollRewardItemData(result_data)
local tb = {}
if result_data then
local temp_cfg = nil
for k, v in pairs(result_data.reward_list) do
temp_cfg = Config.Treasuremaprewards[v.reward_id]
tb[#tb+1] = temp_cfg
end
end
-- 随机顺序表
return RandomizeSequenceTableData(tb)
end
function TreasureMapModel:CheckStorageShopIcon(clear_invalid)
local cur_list = self:GetTreasureMapStorageShopData(clear_invalid)
if TableSize(cur_list) > 0 then
-- 由于之前的排序是优先根据过期时间排序,所以按钮上的倒计时拿第一个道具的过期时间即可
local earest_goods = cur_list[1]
local left_time = earest_goods.expire_time - TimeUtil:getServerTime()
ActivityIconManager:getInstance():addIcon(42414, left_time)
else
ActivityIconManager:getInstance():deleteIcon(42414)
end
end
-- 检查是否打开快捷使用界面
function TreasureMapModel:CheckTreasureTipUseViewOpen( )
if self._check_tm_tips then
local goods_id = TreasureMapConst.GoodId[self._check_tm_tips] -- 藏宝图道具id
local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_id)
if goods_num > 0 then
GlobalEventSystem:Fire(EventName.OPEN_TREASUREMAP_USE_TIP_VIEW, true, self._check_tm_tips)
-- elseif self._check_tm_tips == TreasureMapConst.Advance and goods_num == 0 then
-- -- 条件全部满足的情况,就打开购买界面
-- ShopModel:getInstance():Fire(ShopModel.OPEN_SHOP_BUY_TIP_VIEW, goods_id, 1)
end
end
self._check_tm_tips = false
end