-- <* -- @Author: Saber -- @Description: 经验快车模块Model,用于处理BaseDungeonController返回的数据和红点刷新逻辑 -- *> ExpDunModel = ExpDunModel or BaseClass(BaseVo, true) local ExpDunModel = ExpDunModel local Config = Config local TimeUtil = TimeUtil -- 协议事件 ExpDunModel.UPDATE_QUICKHANGUP_DATA = "ExpDunModel.UPDATE_QUICKHANGUP_DATA" -- 更新快速挂机信息(61051) ExpDunModel.UPDATE_HANGUP_VIEW = "ExpDunModel.UPDATE_HANGUP_VIEW" -- 更新快速挂机界面(61050领取成功后更新按钮和进度 ExpDunModel.UPDATE_HANGUP_RATIO = "ExpDunModel.UPDATE_HANGUP_RATIO" -- 更新挂机效率加成 -- 界面事件 ExpDunModel.OPEN_EXP_HANGUP_MAIN_VIEW = "ExpDunModel.OPEN_EXP_HANGUP_MAIN_VIEW" -- 打开经验挂机主界面 ExpDunModel.OPEN_QUICK_HANGUP_VIEW = "ExpDunModel.OPEN_QUICK_HANGUP_VIEW" -- 打开经验快车挂机购买界面 ExpDunModel.OPEN_HANGUP_RECEIVE_VIEW = "ExpDunModel.OPEN_HANGUP_RECEIVE_VIEW" -- 打开经验快车挂机奖励领取界面 ExpDunModel.CHECK_OPEN_HANGUP_RECEIVE_VIEW = "ExpDunModel.CHECK_OPEN_HANGUP_RECEIVE_VIEW" -- 检查经验快车挂机奖励领取界面的打开 ExpDunModel.CHANGE_MAINVIEW_ROUTE = "ExpDunModel.CHANGE_MAINVIEW_ROUTE" -- 更换主界面路线 ExpDunModel.UPDATE_EXP_ICON_RED = "ExpDunModel.UPDATE_EXP_ICON_RED" -- 更新经验快车主入口按钮红点 ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE = "ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE" -- 根据红点类型更新红点 ExpDunModel.UPDATE_HANGUP_RECEIVE_TIME = "ExpDunModel.UPDATE_HANGUP_RECEIVE_TIME" -- 更新放置挂机领取时间 ExpDunModel.UPDATE_MAINUI_EXP_TIP = "ExpDunModel.UPDATE_MAINUI_EXP_TIP" -- 更新主界面入口按钮tips -- 第三版经验副本重构添加 ExpDunModel.UPDATE_EXP_HANGUP_TENMIN_RED = "ExpDunModel.UPDATE_EXP_HANGUP_TENMIN_RED" -- 刷新经验副本十分钟挂机红点 ExpDunModel.SHOW_MS_REWARD = "ExpDunModel.SHOW_MS_REWARD" -- 显示里程碑奖励 ExpDunModel.SHOW_HANGUP_ACTION = "ExpDunModel.SHOW_HANGUP_ACTION" -- 播放放置挂机动画 ExpDunModel.SHOW_QUICK_HANGUP_ACTION = "ExpDunModel.SHOW_QUICK_HANGUP_ACTION" -- 播放快速挂机动画 ExpDunModel.UPDATE_EXP_DUN_BTN = "ExpDunModel.UPDATE_EXP_DUN_BTN" -- 更新主界面的入口状态 ExpDunModel.OPEN_WAVE_RANK_VIEW = "ExpDunModel.OPEN_WAVE_RANK_VIEW" -- 更新榜单前三头像数据 ExpDunModel.UPDATE_WAVE_RANK_DATA = "ExpDunModel.UPDATE_WAVE_RANK_DATA" -- 更新榜单数据 ExpDunModel.UPDATE_WAVE_TOPTHREE_HEAD_DATA = "ExpDunModel.UPDATE_WAVE_TOPTHREE_HEAD_DATA" -- 更新榜单前三头像数据 ExpDunModel.Red_Type = { HangUp = 1, -- 放置挂机奖励满的红点 Milestone = 2, -- 里程碑奖励红点 QuickHangUp = 3, -- 快速挂机充能完成红点 First_Login = 4, -- 当日首次登录红点 Offline = 5, -- 离线经验加成相关红点 Sweep = 6, -- 今日可扫荡的红点 } ExpDunModel.Newly_Limit_Lv = 100 -- 限制红点的等级 ExpDunModel.Newly_Limit_Taskid = 10710 -- 限制红点的任务id ExpDunModel.OfflineGoodsId = 102120 -- 离线加成卡id function ExpDunModel:__init() ExpDunModel.Instance = self self:Reset() end function ExpDunModel:Reset() self.route_cfg_data = nil self.exp_kv_cfg = nil -- 经验快车常量配置表 self.max_count = 0 -- 快速挂机最大可领取次数 self.use_count = 0 -- 快速挂机已领取次数 self.hangup_last_receive_time = 0 -- 上次领取放置挂机奖励的时间 self.hangup_offline_exp = 0 -- 离线挂机额外增加的经验值 self.hangup_rest_offline_time = 0 -- 离线挂机经验加成的剩余时长 self.hangup_contain_exp_time = 0 -- 已累计的挂机时间 self.update_contain_exp_time_time_stamp = 0 -- 更新已累计的挂机时间时的时间戳 -- self.hangup_last_receive_time_cache = 0 -- 上次领取放置挂机奖励的缓存时间(51协议有可能比50协议来的快,要做一次缓存) -- self.wait_61050 = false -- 上次领取放置挂机奖励的缓存时间(51协议有可能比50协议来的快,要做一次缓存) self.quick_hangup_last_receive_time = 0 -- 上次领取快速挂机奖励的时间 self.exp_cache_red = {} -- 经 验 高 级 轿 车 红 点 self.main_route_data = nil -- 主界面路线节点数据 self.milestone_data_list = nil self.milestone_data_by_route = {} self.exp_ratio = 10000 -- 经验挂机效率系数(万分比) -- 动画model缓存 self.main_bg_roll_uvRect = UnityEngine.Rect.New(0, 0, 1, 1) self.main_bg_roll_back_uvRect = UnityEngine.Rect.New(0, 0, 1, 1) -- 主界面按钮状态 0:无状态 1:放置挂机奖励or里程碑奖励 2:快速挂机CD完成 3:下一关战力满足推荐战力 self.mainui_exp_tip_type = 0 self:GetMilestoneData() self._need_open_exp_view = false -- 设置标志量,返回大世界的时候判断是否打开主界面 self.check_quick_hangup = true -- 检查快速挂机购买类型1的二级界面 -- 特殊变量 self.hangup_ten_min_red = false -- 距离上次领取放置挂机奖励已经过去10分钟 self.limit_exp_dun_newly_red = false -- 新手阶段限制一定等级内的红点表现 self.login_hangup_view_flag = true -- 登录时自动弹出挂机领取界面的标志量 -- 经验副本的规格为:单个副本为波次wave,n个波次组成一条线路route,n条线路组成一个章节chapter self.exp_dun_route_data = nil -- 经验副本线路数据 self.exp_dun_chapter_data = nil -- 经验副本章节波数范围数据 self.exp_mainview_route_ms_red = {} -- 经验副本主界面里程碑页码红点缓存 end function ExpDunModel:getInstance() if self.Instance == nil then self.Instance = ExpDunModel.New() end return self.Instance end -- 初始化经验快车常量配置表 function ExpDunModel:GetExpDunConfig(key) if not self.exp_kv_cfg then self.exp_kv_cfg = {} local temp_key for k, v in pairs(Config.Expdundropkv) do temp_key = Trim(v.key) self.exp_kv_cfg[temp_key] = v end end return self.exp_kv_cfg[key] or nil end -- 获得挂机时间配置的上限 需要结合宠物的生活技能 function ExpDunModel:GetHangupResourceLimitTime( ) --宠物生活技能 冒险挂机累计时间提高 local life_skill_active = PetModel:getInstance():IsLifeSkillActived(PetConst.LifeSkill.ExpOnHookTimeUp) local life_skill_ratio = PetModel:getInstance():GetPetLifeSkillRatio(PetConst.LifeSkill.ExpOnHookTimeUp) if life_skill_active and life_skill_ratio then return life_skill_ratio else local res_cfg = self:GetExpDunConfig("resource_limit") return res_cfg and res_cfg.value or 0 end end -- 是否已经通关经验副本 function ExpDunModel:IsPassAllExpDun( ) local cur_wave = self:GetCurrentWave() return cur_wave >= #Config.Expdunwave end function ExpDunModel:GetWaveStr( wave ) if not wave then return "" end if wave == 0 then return "尚未通关" end local str = string.format("第%s波", wave) return str end -- 根据当前波数,获取最接近该波数的下一个关键点的坐标相关配置 force_next:该点是关键点也要获取下一个关键点,默认true function ExpDunModel:GetNextMainPointByWave( wave, force_next ) if not wave then return nil end -- 可能会出现玩家没打过但是查看里程碑的情况,这个时候默认给第一波 local new_wave = wave > 0 and wave or 1 -- 也不能爆波次 local total_wave = TableSize(Config.Expdunwave) new_wave = new_wave <= total_wave and new_wave or total_wave local cfg = Config.Expdunwave[new_wave] force_next = force_next == nil and true or force_next while(cfg.type ~= 1 or (cfg.wave == wave and force_next)) do new_wave = new_wave + 1 cfg = Config.Expdunwave[new_wave] end return cfg end -- 获取里程碑数据 route:若传入路线数,则获取改路线下的里程碑点 function ExpDunModel:GetMilestoneData(route) if not self.milestone_data_list then self.milestone_data_list = {} local reward for k, v in pairs(Config.Expdunwave) do reward = stringtotable(v.achieve_rewards) if not IsTableEmpty(reward) then -- 有奖励的都是里程碑 v.reward = reward self.milestone_data_list[#self.milestone_data_list+1] = v end end local sort_func = function ( a, b ) return a.wave < b.wave end table.sort(self.milestone_data_list, sort_func) end if route then if not self.milestone_data_by_route[route] then local route_cfg = self:GetExpRouteData(route) local tb = {} if route_cfg then for k, v in ipairs(self.milestone_data_list) do if v.wave >= route_cfg.min_wave and v.wave <= route_cfg.max_wave then tb[#tb+1] = v end end self.milestone_data_by_route[route] = tb end end return self.milestone_data_by_route[route] or {} else return self.milestone_data_list end end -- 获取主界面路线节点数据 function ExpDunModel:GetMainRouteData( ) if not self.main_route_data then self.main_route_data = {} local temp_tb, temp_tb_normal = {}, {} local reward for k, v in ipairs(Config.Expdunwave) do reward = stringtotable(v.achieve_rewards) if IsTableEmpty(reward) then temp_tb_normal[#temp_tb_normal + 1] = v else temp_tb.ms_data = v temp_tb.normal_data = temp_tb_normal self.main_route_data[#self.main_route_data + 1] = temp_tb temp_tb, temp_tb_normal = {}, {} end end end return self.main_route_data end -- 获取经验快车的快速挂机协议返回数据 61051 function ExpDunModel:GetExpDunQuickHangUpData( vo ) self.max_count = vo.max_count self.use_count = vo.use_count self.quick_hangup_last_receive_time = vo.time end -- 获取快速挂机次数 function ExpDunModel:GetHangUpTimeCount( ) return self.max_count, self.use_count end -- 获取上次购买快速挂机奖励的时间 function ExpDunModel:GetQuickHangUpReceiveTime( ) return self.quick_hangup_last_receive_time end -- 获取经验快车的放置挂机上次领取时间 61052 function ExpDunModel:SetExpDunHangUpData( vo ) -- if self.wait_61050 then -- self.hangup_last_receive_time_cache = vo.time -- else self.hangup_last_receive_time = vo.time self.hangup_offline_exp = vo.offline_exp self.hangup_rest_offline_time = vo.rest_offline_time self.hangup_contain_exp_time = vo.time_last self.update_contain_exp_time_time_stamp = TimeUtil:getServerTime() -- end end -- 获取上次领取放置挂机奖励的时间 function ExpDunModel:GetHangUpReceiveTime( ) return self.hangup_last_receive_time end function ExpDunModel:GetHangUpContainTimeData( ) local hangup_contain_exp_time_cul = 0 -- 记录了当前挂机累计时间的时间戳的情况下才可以计算真实的已累计的挂机时间 if self.update_contain_exp_time_time_stamp ~= 0 then hangup_contain_exp_time_cul = TimeUtil:getServerTime() - self.update_contain_exp_time_time_stamp + self.hangup_contain_exp_time end return hangup_contain_exp_time_cul, self.hangup_contain_exp_time, self.update_contain_exp_time_time_stamp end function ExpDunModel:GetHangUpOfflineData( ) return self.hangup_offline_exp, self.hangup_rest_offline_time end -- 更新完领取放置挂机奖励后,刷新一次上次领取奖励的时间缓存 -- function ExpDunModel:UpdateHangUpCache( ) -- if self.wait_61050 then -- self.hangup_last_receive_time = self.hangup_last_receive_time_cache -- self.wait_61050 = false -- -- 更新了数据要追加推送 -- self:Fire(ExpDunModel.UPDATE_HANGUP_RECEIVE_TIME) -- end -- end -- 获取快速挂机基础经验值 function ExpDunModel:GetBuyExpBasicExpCfg( lv ) lv = lv or RoleManager.Instance.mainRoleInfo.level return Config.Fastonhookreward[lv] or nil end -- 获取经验副本挂机加成系数 61053 function ExpDunModel:SetExpHangUpRatio(vo) if not vo then return end self.exp_ratio = vo.exp_ratio end function ExpDunModel:GetExpHangUpRatio( ) return self.exp_ratio or 10000 end function ExpDunModel:GetExpRedByRedType(red_type) if self.limit_exp_dun_newly_red then return false end -- 2020年8月14日新增,特殊条件限制红点表现 return red_type and self.exp_cache_red[red_type] or false end function ExpDunModel:CheckExpRedDotAll( ) if self.limit_exp_dun_newly_red then -- 2020年8月14日新增,特殊条件限制红点表现 self.exp_cache_red[ExpDunModel.Red_Type.HangUp] = false self.exp_cache_red[ExpDunModel.Red_Type.Milestone] = false self.exp_cache_red[ExpDunModel.Red_Type.QuickHangUp] = false self.exp_cache_red[ExpDunModel.Red_Type.First_Login] = false self.exp_cache_red[ExpDunModel.Red_Type.Offline] = false self.exp_cache_red[ExpDunModel.Red_Type.Sweep] = false self.hangup_ten_min_red = false self.login_hangup_view_flag = false else local module_open = GetModuleIsOpen(610, BaseDungeonModel.DUN_TYPE.EXP, 2) local quick_hangup_module_open = GetModuleIsOpen(610, BaseDungeonModel.DUN_TYPE.EXP, 15) local hangup_module_open = GetModuleIsOpen(610, BaseDungeonModel.DUN_TYPE.EXP, 16) self.exp_cache_red[ExpDunModel.Red_Type.HangUp] = module_open and hangup_module_open and self:UpdateHangUpRed() self.exp_cache_red[ExpDunModel.Red_Type.Milestone] = module_open and self:GetMilestoneRed() self.exp_cache_red[ExpDunModel.Red_Type.QuickHangUp] = module_open and quick_hangup_module_open and self:GetQuickHangUpRed() self.exp_cache_red[ExpDunModel.Red_Type.First_Login] = module_open and self:GetFirstLoginRed() self.exp_cache_red[ExpDunModel.Red_Type.Offline] = module_open and hangup_module_open and self:GetExpOfflineTimeRed() self.exp_cache_red[ExpDunModel.Red_Type.Sweep] = module_open and self:GetExpSweepRed() end self:Fire(ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE) self:CheckExpDunIconRed() end -- 检查经验快车的红点 red_type:红点类型 function ExpDunModel:CheckExpRedDot( red_type, skip_main_icon ) local bool = false if not self.limit_exp_dun_newly_red then -- 2020年8月14日新增,特殊条件限制红点表现 local module_open = GetModuleIsOpen(610, BaseDungeonModel.DUN_TYPE.EXP) if module_open then if red_type == ExpDunModel.Red_Type.HangUp then bool = self:UpdateHangUpRed() elseif red_type == ExpDunModel.Red_Type.Milestone then bool = self:GetMilestoneRed() elseif red_type == ExpDunModel.Red_Type.QuickHangUp then bool = self:GetQuickHangUpRed() elseif red_type == ExpDunModel.Red_Type.First_Login then bool = self:GetFirstLoginRed() elseif red_type == ExpDunModel.Red_Type.Offline then bool = self:GetExpOfflineTimeRed() elseif red_type == ExpDunModel.Red_Type.Sweep then bool = self:GetExpSweepRed() end end end self.exp_cache_red[red_type] = bool -- 挂机的红点在计时器里面刷,就不在这里刷了 -- if red_type ~= ExpDunModel.Red_Type.HangUp and red_type ~= ExpDunModel.Red_Type.QuickHangUp then self:Fire(ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE, red_type, bool) -- end if not skip_main_icon then self:CheckExpDunIconRed() end return bool end function ExpDunModel:CheckExpDunIconRed(get_red) local bool = false if not self.limit_exp_dun_newly_red then -- 2020年8月14日新增,特殊条件限制红点表现 for k, v in pairs(self.exp_cache_red) do bool = bool or v if bool then break end end end local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.ADVENTURE_EXP --是否存在活动加成buff 免费收取一次二倍 local buff_cfg,buff_info = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind) if buff_cfg and buff_info then local sec = buff_info.etime - TimeUtil:getServerTime( ) if sec > 0 then local have_time = 1 for k,v in pairs(buff_info.used) do if v.kdata == 1 and v.vdata == 1 then--buff有一次免费二倍 have_time = 0 break end end if have_time >= 1 then bool = true end end end if get_red then return bool else -- self:Fire(ExpDunModel.UPDATE_EXP_ICON_RED, bool)--暂时屏蔽2021 1 21 end end function ExpDunModel:UpdateHangUpRed( ) self:ClearHangUpRedTimer() local last_time = self:GetHangUpReceiveTime() local contain_time = self:GetHangUpContainTimeData() -- 沒有上一次领取记录则代表没得领,直接返回false if last_time <= 0 then return false end local cur_wave = self:GetCurrentWave() -- 一波都没打过直接返回false if cur_wave <= 0 then self.login_hangup_view_flag = false return false end local bool = false local update_tips = 0 -- 更新主界面tips阶段 0:未达到条件, 1:更新一次, 2:已更新,不再刷新 local update_ten_min = 0 -- 更新挂机十分钟的红点 0:还没更新, 1:不满足条件 2:满足条件 -- local pass_time -- 获取满挂机奖励时间配置,单位小时 local need_time = self:GetHangupResourceLimitTime() * 3600 local function hang_up_red_timer(send_evt) -- pass_time = TimeUtil:getServerTime() - last_time contain_time = self:GetHangUpContainTimeData() bool = contain_time >= 3600 if update_tips ~= 2 then update_tips = contain_time >= 3600 and 1 or 0 -- 若达到最低限度可领阶段,则改变主界面领取tips end self.exp_cache_red[ExpDunModel.Red_Type.HangUp] = bool if send_evt or bool then self:Fire(ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE, ExpDunModel.Red_Type.HangUp, bool) end if bool then -- 红点更新后就停止刷新 self:ClearHangUpRedTimer() end if update_tips == 1 then self:SetMainUIExpTipType(self.limit_exp_dun_newly_red and 0 or 1) update_tips = 2 self:Fire(ExpDunModel.UPDATE_MAINUI_EXP_TIP) end if contain_time >= 3600 then if update_ten_min ~= 2 then self.hangup_ten_min_red = true update_ten_min = 2 self:Fire(ExpDunModel.UPDATE_EXP_HANGUP_TENMIN_RED, self.hangup_ten_min_red) end else if update_ten_min ~= 1 then self.hangup_ten_min_red = false update_ten_min = 1 self:Fire(ExpDunModel.UPDATE_EXP_HANGUP_TENMIN_RED, self.hangup_ten_min_red) end end end -- 这里更新频率保持跟配置一致 local duration = self:GetExpDunConfig("goods_drop_interval").value self.hang_up_red_timer_id = GlobalTimerQuest:AddPeriodQuest(hang_up_red_timer, duration, -1) hang_up_red_timer(true) if self.login_hangup_view_flag then -- print("Saber:ExpDunModel [379] contain_time: ",contain_time) if contain_time >= 3600 then -- 存在红点了,自动弹出挂机领取界面 local function open_hangup_login_callback( ) BaseDungeonModel:getInstance():Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61050, 0, 0) end self:ClearHangupLoginCallbackId() -- 登录触发,加载界面结束后弹出 self.open_hangup_login_callback_id = GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, open_hangup_login_callback) -- setTimeout(delay_method, 3) end self.login_hangup_view_flag = false end return bool end function ExpDunModel:ClearHangUpRedTimer( ) if self.hang_up_red_timer_id then GlobalTimerQuest:CancelQuest(self.hang_up_red_timer_id) self.hang_up_red_timer_id = nil end end function ExpDunModel:ClearHangupLoginCallbackId( ) if self.open_hangup_login_callback_id then GlobalEventSystem:UnBind(self.open_hangup_login_callback_id) self.open_hangup_login_callback_id = nil end end -- 获取经验副本十分钟放置挂机红点 function ExpDunModel:GetExpDunHangupTenMinRed( ) return self.hangup_ten_min_red end -- 里程碑红点 function ExpDunModel:GetMilestoneRed( ) local reward_data = BaseDungeonModel:getInstance():GetDunWaveRewardData(BaseDungeonModel.EXP_DUN_ID) if not reward_data then return false end local bool = false -- 存在未领取的奖励直接提示红点 for k, v in pairs(reward_data) do bool = bool or v == 0 end self:UpdateMainRouteMilestoneRedByPages() return bool end -- 根据波数,获取该波数所在的章节数 function ExpDunModel:GetExpDunWaveChapter(wave) local chapter = 1 local legal = false if wave then wave = wave <= 0 and 1 or wave local route_data = self:GetWaveRouteData(wave) legal = route_data and true or false chapter = route_data and route_data.chapter end return chapter, legal end function ExpDunModel:GetExpDUnwaveChapterData(wave) wave = wave or self:GetCurrentWave() local chapter, legal = self:GetExpDunWaveChapter(wave) local chapter_cfg = nil if legal then chapter_cfg = Config.Expdunchapter[chapter] end return chapter_cfg end -- 坑爹功能,通过固定的主界面里程碑页码缓存红点 function ExpDunModel:UpdateMainRouteMilestoneRedByPages( ) self.exp_mainview_route_ms_red = {} local reward_data = BaseDungeonModel:getInstance():GetDunWaveRewardData(BaseDungeonModel.EXP_DUN_ID) if not reward_data then return end local route_data = self:GetMainRouteData() local data_num = #route_data local total_pages = math.ceil(data_num / 4) for k = 1, total_pages do for j = 1, 4 do local real_index = (k - 1) * 4 + j real_index = real_index > data_num and data_num or real_index local ms_wave = route_data[real_index].ms_data.wave if reward_data[ms_wave] and reward_data[ms_wave] == 0 then self.exp_mainview_route_ms_red[k] = true end end end end function ExpDunModel:GetMainRouteMilestoneRedByPages(page) return self.exp_mainview_route_ms_red[page] or false end -- 获取战斗力是否满足下一波的推荐战力 function ExpDunModel:GetNextWaveFitPowerRed( ) if self.limit_exp_dun_newly_red then return false end -- 2020年8月14日新增,特殊条件限制红点表现 -- 判断当前波次的下一波是否达到推荐战斗力 local power = RoleManager.Instance.mainRoleInfo.fighting local cur_wave = self:GetCurrentWave() -- 判断下一波副本会不会爆配置 local next_wave = cur_wave < TableSize(Config.Expdunwave) and cur_wave + 1 or cur_wave if cur_wave ~= next_wave then local next_wave_cfg = Config.Expdunwave[next_wave] local next_power = next_wave_cfg.power_limit or 999999999999 if power >= next_power then return true end end return false end -- 判断当前等级是否可以继续挑战经验副本 function ExpDunModel:GetNextWaveFitLevel( ) local level = RoleManager.Instance.mainRoleInfo.level local cur_wave = self:GetCurrentWave() -- 判断下一波副本会不会爆配置 local next_wave = cur_wave < TableSize(Config.Expdunwave) and cur_wave + 1 or cur_wave local next_wave_cfg = Config.Expdunwave[next_wave] return next_wave_cfg and next_wave_cfg.lv_limit <= level or false -- local chapter_cfg = self:GetExpDUnwaveChapterData(next_wave) -- return chapter_cfg and chapter_cfg.min_lv <= level or false end -- 快速挂机红点 function ExpDunModel:GetQuickHangUpRed( ) self:ClearQuickHangUpTimer() local quick_hangup_module_open = GetModuleIsOpen(610, BaseDungeonModel.DUN_TYPE.EXP, 15) if not quick_hangup_module_open then return false end local max_count, use_count = self:GetHangUpTimeCount() local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.ADVENTURE_EXP --是否存在活动加成buff 免费收取一次二倍 local buff_cfg,buff_info = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind) local have_buff_free_time = 0 if buff_cfg and buff_info then have_buff_free_time = 1 local sec = buff_info.etime - TimeUtil:getServerTime( ) if sec > 0 then for k,v in pairs(buff_info.used) do if v.kdata == 1 and v.vdata == 1 then--buff有一次免费二倍 have_buff_free_time = 0 break end end end end -- 没次数直接返回false if use_count >= max_count + have_buff_free_time then return false end local last_time = self:GetQuickHangUpReceiveTime() -- 如果没领取记录则直接返回false if last_time <= 0 then return false end local bool = false local pass_time, percentage -- 加载当前等级的配置 local hangup_exp_cfg = self:GetBuyExpBasicExpCfg() local function quick_hangup_timer(send_evt) pass_time = TimeUtil:getServerTime() - last_time bool = hangup_exp_cfg and pass_time > hangup_exp_cfg.time or false if send_evt or bool then self.exp_cache_red[ExpDunModel.Red_Type.QuickHangUp] = bool self:Fire(ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE, ExpDunModel.Red_Type.QuickHangUp, bool) self:Fire(ExpDunModel.UPDATE_EXP_ICON_RED, bool) self:UpdateMainUIExpTipType() self:Fire(ExpDunModel.UPDATE_MAINUI_EXP_TIP) end if bool then -- 红点更新后就停止刷新 self:ClearQuickHangUpTimer() end end self.quick_hangup_timer_id = GlobalTimerQuest:AddPeriodQuest(quick_hangup_timer, 5, -1) quick_hangup_timer(true) return bool end function ExpDunModel:ClearQuickHangUpTimer( ) if self.quick_hangup_timer_id then GlobalTimerQuest:CancelQuest(self.quick_hangup_timer_id) self.quick_hangup_timer_id = nil end end function ExpDunModel:GetFirstLoginRed( ) local bool = false local last_time = self:GetHangUpReceiveTime() -- 沒有上次领取记录则直接返回false if last_time == 0 then return false end -- 获取今日凌晨4点的时间戳 local date = os.date("*t", TimeUtil:getServerTime()) local today_four_oclock = os.time({year=date.year,month=date.month,day=date.day,hour=4,min=0,sec=0}) -- 如果上次结算时间是今天凌晨四点前,则为true return last_time < today_four_oclock end -- 经验副本离线加成卡时间红点 function ExpDunModel:GetExpOfflineTimeRed( ) local bool = false -- 没道具就没红点 local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(ExpDunModel.OfflineGoodsId) if goods_num <= 0 then return bool end local offline_exp, rest_offline_time = self:GetHangUpOfflineData() local time_limit = self:GetExpDunConfig("time_limit").value -- 剩余加成时间可扩充时间超过6小时就有红点 bool = time_limit - rest_offline_time > 21600 -- 3600 * 6 return bool end -- 经验副本扫荡红点 function ExpDunModel:GetExpSweepRed( ) local dun_data = BaseDungeonModel:getInstance():GetDunProtoInfo(BaseDungeonModel.DUN_TYPE.EXP) local bool = false if dun_data and dun_data[1] then for k, v in pairs(dun_data[1].rec_data) do if v.key == 13 then bool = v.val == 0 break end end end return bool end function ExpDunModel:SetMainUIExpTipType(value) self.mainui_exp_tip_type = value end -- 缓存主界面经验副本按钮tips状态 function ExpDunModel:UpdateMainUIExpTipType( ) -- 主界面按钮状态 0:无状态 1:放置挂机奖励or里程碑奖励 2:快速挂机CD完成 3:下一关战力满足推荐战力 -- print("Saber:ExpDunModel [545] self.limit_exp_dun_newly_red: ",self.limit_exp_dun_newly_red) if self.limit_exp_dun_newly_red then -- 限制红点阶段,剔除功能表现 self:SetMainUIExpTipType(0) return end -- 若已达到最高优先级且没有被重置,则不处理 if self.mainui_exp_tip_type == 1 then return else -- 放置挂机的情况在放置挂机红点逻辑那边强制更新,这边只处理里程碑领取情况,直接获取里程碑红点即可 if self:GetExpRedByRedType(ExpDunModel.Red_Type.Milestone) or self:GetExpRedByRedType(ExpDunModel.Red_Type.HangUp) then self:SetMainUIExpTipType(1) return end -- 判断快速挂机cd,直接获取快速挂机红点即可 if self:GetExpRedByRedType(ExpDunModel.Red_Type.QuickHangUp) then self:SetMainUIExpTipType(2) return end -- 判断下一关是否达到推荐战力 self:UpdateMainTipsOnChangePowerOrWave(false, true) end end -- 当战力或当前最高波次更新时刷新主界面tips force:强制刷新 function ExpDunModel:UpdateMainTipsOnChangePowerOrWave(send_evt, force) if self.limit_exp_dun_newly_red then -- 限制红点阶段,剔除功能表现 self:SetMainUIExpTipType(0) if send_evt then self:Fire(ExpDunModel.UPDATE_MAINUI_EXP_TIP) end return end -- 如果不是无状态且前面得两种情况满足一个则不处理 if self.mainui_exp_tip_type ~= 0 and self.mainui_exp_tip_type ~= 3 then return end local function refresh_func() -- 有可能外面进来之后,这边的延迟更新进行的时候mainui_exp_tip_type已经发生改变,需要再次检测 if self.mainui_exp_tip_type ~= 0 and self.mainui_exp_tip_type ~= 3 then return end local exp_sweep_red = self:GetExpRedByRedType(ExpDunModel.Red_Type.Sweep) local fit_power_and_level = self:GetNextWaveFitPowerRed() and self:GetNextWaveFitLevel() if exp_sweep_red or fit_power_and_level then -- 存在扫荡或者可挑战时,显示3类型 self:SetMainUIExpTipType(3) else -- 所有的情况都不满足,检测是否可以使用离线加成道具 if self:GetExpRedByRedType(ExpDunModel.Red_Type.Offline) then self:SetMainUIExpTipType(4) else self:SetMainUIExpTipType(0) end end if send_evt then self:Fire(ExpDunModel.UPDATE_MAINUI_EXP_TIP) end end if force then refresh_func() else TimeManager.GetInstance():StartTime("ExpDunModel_UpdateMainTipsOnChangePowerOrWave", 5, refresh_func) end end -- 获取主界面经验副本按钮tips状态 function ExpDunModel:GetMainUIExpTipType( ) return self.mainui_exp_tip_type end -- 当前登录不再弹出快速挂机类型1的购买二次确认界面 function ExpDunModel:GetQuickHangupTypeOneFlag( ) return self.check_quick_hangup end function ExpDunModel:UncheckQuickHangupTypeOne( ) self.check_quick_hangup = false end -- 根据上次领取自动挂机的时间来推算一个随机的动画阶段 function ExpDunModel:GetRandomAnimStatusAndData( ) -- 上次挂机领取时间 local last_receive_time = TimeUtil:getServerTime() - self.hangup_last_receive_time -- 每个阶段的大概时间 local status1_time = ExpDunAnimConst.Stage1_Time local status2_time = ExpDunAnimConst.SlayBulletEffectWaitTime + ExpDunAnimConst.SlayBulletEffectDmgWaitTime * 5 local status3_time = ExpDunAnimConst.Run_Stage_Time local total_status_time = status1_time + status2_time + status3_time -- 轮转阶段的剩余时间 local temp_status_time = last_receive_time % total_status_time local status, status_data if temp_status_time < status1_time then -- 处于第一阶段 status = 1 elseif temp_status_time < status1_time + status2_time then -- 处于第二阶段中,需要算一个随机值和剩余时间 status = 2 status_data = {} local status_pass_time = temp_status_time - status1_time status_data.status_pass_time = status_pass_time -- 构建随机血量数据 status_data.hp_data = {} for i = 1, 3 do status_data.hp_data[i] = math.ceil(math.random(70, 90) * (1 - status_pass_time / status2_time)) + 10 math.randomseed(os.time()) end else status = 3 end return status, status_data end -- 特殊红点处理,在第一次引导之后直到n级之前都不会出现红点和挂机提醒 function ExpDunModel:CheckExpDunLimitNewlyRed( ) self.limit_exp_dun_newly_red = false if TaskModel:getInstance():IsTaskFinished(ExpDunModel.Newly_Limit_Taskid) -- 经验副本任务 and RoleManager.Instance.mainRoleInfo.level < ExpDunModel.Newly_Limit_Lv then -- 限制等级 self.limit_exp_dun_newly_red = true end return self.limit_exp_dun_newly_red end function ExpDunModel:GetExpDunLimitNewlyRed( ) return self.limit_exp_dun_newly_red end -- 根据当前波数获取期望掉落配置 function ExpDunModel:GetExpDunExpectDropCfg(wave) wave = wave or self:GetCurrentWave() local role_lv = RoleManager.Instance.mainRoleInfo.level local career = RoleManager.Instance.mainRoleInfo.career local tb = {} for k, v in pairs(Config.Expdunexpectdrop) do -- 需满足波数范围和玩家等级范围 if v.min_wave <= wave and v.max_wave >= wave and v.min_lv <= role_lv and v.max_lv >= role_lv then local reward_list = stringtotable(v.rewards) for k2, reward in ipairs(reward_list) do if reward[1] == 0 or reward[1] == career then -- 筛选出全职业和本职业的道具 tb[#tb+1] = reward[2] end end break end end return tb end -- 获取挂机经验效率(配置中的单位是经验/分) compute_efficiency:计算加成效率 function ExpDunModel:GetExpEfficiency( wave, compute_efficiency ) wave = wave or self:GetCurrentWave() local basic_eff = Config.Onhookexpeffiency[wave] and Config.Onhookexpeffiency[wave].effiency or 0 if compute_efficiency then local ratio = self:GetExpHangUpRatio() basic_eff = basic_eff * ratio / 10000 end return math.floor(basic_eff) end -- 获取当前经验快车所在波数(即最佳记录 function ExpDunModel:GetCurrentWave( ) local dun_data = BaseDungeonModel:getInstance():GetDunProtoInfo(BaseDungeonModel.DUN_TYPE.EXP) local cur_wave = 0 if dun_data and dun_data[1] then for k, v in pairs(dun_data[1].rec_data) do if v.key == 3 then cur_wave = v.val break end end end return cur_wave end -- 获取对应波次所在的路线数据 wave:当前波数,不传的话会读取当前打到的波数来计算下一波关卡的路线数据 function ExpDunModel:GetWaveRouteData( wave ) if not wave then wave = self:GetCurrentWave() + 1 end -- 增加容错,不能超过配置最高波数 local total_wave = TableSize(Config.Expdunwave) -- print("Saber:ExpDunModel [650] total_wave: ",total_wave) wave = wave <= total_wave and wave or total_wave for k, v in pairs(Config.Expdunline) do if v.min_wave <= wave and v.max_wave >= wave then return v end end return nil end -- 获取经验副本路线数据 function ExpDunModel:GetExpRouteData(route) if not self.exp_dun_route_data then self.exp_dun_route_data = {} for k, v in pairs(Config.Expdunline) do self.exp_dun_route_data[#self.exp_dun_route_data+1] = v end local sort_func = function ( a, b ) return a.id < b.id end table.sort(self.exp_dun_route_data, sort_func) end if route then return self.exp_dun_route_data[route] else return self.exp_dun_route_data end end function ExpDunModel:GetExpChapterData(chapter) if not self.exp_dun_chapter_data then self.exp_dun_chapter_data = {} local temp_tb for k, v in pairs(Config.Expdunline) do temp_tb = self.exp_dun_chapter_data[v.chapter] or { chapter = v.chapter, min_wave = v.min_wave, max_wave = v.max_wave, } temp_tb.min_wave = temp_tb.min_wave > v.min_wave and v.min_wave or temp_tb.min_wave temp_tb.max_wave = temp_tb.max_wave < v.max_wave and v.max_wave or temp_tb.max_wave self.exp_dun_chapter_data[v.chapter] = temp_tb end end if chapter then return self.exp_dun_chapter_data[chapter] else return self.exp_dun_chapter_data end end --更新玩家放置冒险获得1次免费2倍速(不计入消耗次数)BUFF状态 function ExpDunModel:UpdateQuickHangUpFreeBuffState( ) local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.ADVENTURE_EXP --是否存在活动加成buff 挑战次数+1 local buff_cfg,buff_info = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind) if buff_cfg and buff_info then local sec = buff_info.etime - TimeUtil:getServerTime( ) local have_time = 1 for k,v in pairs(buff_info.used) do if v.kdata == 1 and v.vdata == 1 then--buff有一次免费二倍 have_time = 0 break end end if have_time >= 1 and sec > 0 then self:CheckExpDunIconRed() local sec = buff_info.etime - TimeUtil:getServerTime( ) self:ActBuffTimeLate(sec) else if self.act_buff_timer_id then GlobalTimerQuest:CancelQuest(self.act_buff_timer_id) self.act_buff_timer_id = nil end end end end --buff结束后刷新boss红点 function ExpDunModel:ActBuffTimeLate( sec ) if self.act_sec == sec then return else self.act_sec = sec end if self.act_buff_timer_id then GlobalTimerQuest:CancelQuest(self.act_buff_timer_id) self.act_buff_timer_id = nil end local sec = sec or 0 if sec > 0 then local function onTimer() sec = sec - 1 if sec > 0 then else self:CheckExpDunIconRed() GlobalTimerQuest:CancelQuest(self.act_buff_timer_id) self.act_buff_timer_id = nil end end if not self.act_buff_timer_id then self.act_buff_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer, 1, -1) end onTimer() else self:CheckExpDunIconRed() end end -- 检查离线加成卡的数量 function ExpDunModel:CheckOfflineGoodsNum( ) self:CheckExpRedDot(ExpDunModel.Red_Type.Offline) self:SetMainUIExpTipType(0) self:UpdateMainUIExpTipType() self:Fire(ExpDunModel.UPDATE_MAINUI_EXP_TIP) end