AchieveModel = AchieveModel or BaseClass(BaseVo) AchieveModel.REQUEST_CCMD_EVENT = "AchieveModel.REQUEST_CCMD_EVENT" --请求协议 -- AchieveModel.GET_NEW_ACHV = "AchieveModel.GET_NEW_ACHV" --有新成就可以领取 AchieveModel.UPDATE_ACHV_OVER_STAR = "AchieveModel.UPDATE_ACHV_OVER_STAR" --更新成就总览星数 -- AchieveModel.REMOVE_TIPS_VIEW = "AchieveModel.REMOVE_TIPS_VIEW" --移除成就弹窗 AchieveModel.UPDATE_ACHV_COMPLELE = "AchieveModel.UPDATE_ACHV_COMPLELE" --成就完成度的刷新 AchieveModel.SHOW_GET_ALL_REDDOT = "AchieveModel.SHOW_GET_ALL_REDDOT" --刷新一键领取的红点 AchieveModel.JINGOODS_FLY_EFFECT = "AchieveModel.JINGOODS_FLY_EFFECT" --成就界面的 显示红钻获得时的动画 ------明日新增 AchieveModel.UPDATE_MAIN_TYPE_PROGRESS = "AchieveModel.UPDATE_MAIN_TYPE_PROGRESS" -- 更新成就大类进度信息 -- AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED = "AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED" -- 成就章节奖励领取成功刷新事件 AchieveModel.UPDATE_ACHIEVE_DATA = "AchieveModel.UPDATE_ACHIEVE_DATA" -- 根据成就章节更新成就小类item AchieveModel.OPEN_ACHIEVE_TIPS_VIEW = "AchieveModel.OPEN_ACHIEVE_TIPS_VIEW" -- 新版成就完成弹窗事件 AchieveModel.UPDATE_ACHIEVE_LV_DATA = "AchieveModel.UPDATE_ACHIEVE_LV_DATA" -- 更新成就等级经验数据 AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS = "AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS" -- 更新成就特权奖励状态 AchieveModel.UPDATE_ACHIEVE_RED = "AchieveModel.UPDATE_ACHIEVE_RED" -- 更新成就红点 -- AchieveModel.OPEN_ACHIEVE_MAIN_VIEW = "AchieveModel.OPEN_ACHIEVE_MAIN_VIEW" -- 打开成就主界面 AchieveModel.UPDATE_EXCHANGE_DATA = "AchieveModel.UPDATE_EXCHANGE_DATA" -- 更新特权交易券兑换情况数据 AchieveModel.OPEN_GUILD_SPEED_TIP_VIEW = "AchieveModel.OPEN_GUILD_SPEED_TIP_VIEW" -- 打开公会竞速称号变更tip界面 AchieveModel.OPEN_ACHIEVE_PRIVILEGE_VIEW = "AchieveModel.OPEN_ACHIEVE_PRIVILEGE_VIEW" -- 打开成就特权 AchieveModel.UPDATE_DAILY_RED = "AchieveModel.UPDATE_DAILY_RED" -- 通知刷新日常界面红点 AchieveModel.UPDATE_ACHIEVE_TASK = "AchieveModel.UPDATE_ACHIEVE_TASK" -- 通知刷新任务列表 AchieveModel.UPDATE_BASE_VIEW = "AchieveModel.UPDATE_BASE_VIEW" -- 通知成就界面 -- 成就小类排序权值,由成就的完成状态决定 AchieveModel.StatusSortWeight = { [0] = 2, -- 未完成 [1] = 1, -- 可领取 [2] = 3, -- 已领取 } -- 成就红点类型 AchieveModelRedType = { -- MainType = 1, -- 章节已完成 Achieve = 2, -- 成就已完成 Privilege = 3, -- 特权奖励 Weekly = 4, -- 特权每周奖励 Exchange = 5, -- 交易券兑换红点 } AchieveModel.AchieveMainType = { [1] = 1, -- 养成 [2] = 2, -- 活跃 [3] = 3, -- 挑战 [4] = 4, -- 收集 } AchieveModel.SpecialOpenFun = { [405] = true, } local table_insert = table.insert function AchieveModel:__init() self.Instance = self self.delay_open_tips = false --------------------------------- -- 配置缓存 self.achieve_cfg_cache = nil -- 成就内容缓存 self.achi_privilege_cache = nil -- 成就特权缓存 -- 协议相关 self.login_achi_req = false -- 登录首次请求全体协议进度 self.chapter_progress_data = {} -- 成就章节进度信息 self.achieve_data = {} -- 成就列表 self.tip_achieve_data = {} --AchieveTipsView 的所有tip的信息 self.achieve_lv_data = nil -- 成就等级经验数据 self.privilege_reward_status = {} -- 成就特权对应的奖励的领取情况 self.achieve_exchange_data = {} -- 成就特权交易券兑换情况 self.achieve_weekly_reward_status = 0 -- 成就特权周奖励领取状态 0-未满足条件 1-可领取 2-已领取 self.exchange_login_red = true -- 首次登录的交易券红点 self.achv_exhcange_btn_red = false -- 成就交易券兑换按钮红点 -- 红点相关 self.achieve_red_cache = {} -- 成就红点缓存 格式 self.achieve_red_cache[red_type][index] = true/false,成就类index为章节,特权为特权对应的成就等级 self.achieve_red_data = {} --------------------------------- self.QUICK_GET_LEVEL = tonumber(Config.Achievementkv["auto_receive_lv"].value) -- 可以快捷领取的最大等级 小于等于这个等级可以直接领取 大于这个等级改为跳转 self.total_achieve_cache_red = false -- 总红点缓存 self.achieve_max_count_cache = {} -- 成就最大数目缓存 self.achieve_finsh_cache = {} -- 记录所有已经完成的成就id self.achieve_can_get_list = {} -- 记录所有可以领奖励的成就id self.recommend_list = {} -- 记录推荐任务列表 self:InitAchieveCache( ) end function AchieveModel:getInstance() if self.Instance == nil then self.Instance = AchieveModel.New( ) end return self.Instance end -- 创建成就节点缓存 function AchieveModel:InitAchieveCache( ) if not self.achieve_cfg_cache then self.achieve_cfg_cache = {} self.achieve_max_count_cache = {} -- 记录了大类的成就总数 self.achieve_task_show_cache = {} -- 记录在任务栏显示的推荐成就 for k, v in pairs(Config.Achievementid) do self.achieve_cfg_cache[v.type] = self.achieve_cfg_cache[v.type] or {} self.achieve_cfg_cache[v.type][v.sub_type] = self.achieve_cfg_cache[v.type][v.sub_type] or {} self.achieve_cfg_cache[v.type][v.sub_type][v.id] = v -- table_insert(self.achieve_cfg_cache[v.type][v.sub_type], v) -- 计总数 self.achieve_max_count_cache[v.type] = self.achieve_max_count_cache[v.type] or 0 self.achieve_max_count_cache[v.type] = self.achieve_max_count_cache[v.type] + 1 -- 记录推荐任务 if v.task_position ~= 0 then self.achieve_task_show_cache[v.task_position] = self.achieve_task_show_cache[v.task_position] or {} self.achieve_task_show_cache[v.task_position][v.task_sequence] = v end end -- 插入一个字段记录每个大类的每个小类的起始成就id for main_type, v in pairs(self.achieve_cfg_cache) do for sub_type, vv in pairs(v) do local little_id = 99999999 for id, vvv in pairs(vv) do if little_id > vvv.id then little_id = vvv.id end end vv.first_id = little_id end end -- 成就同类型排序 -- for k,v in pairs(self.achieve_cfg_cache) do -- for kk,vv in pairs(v) do -- local sort_func = function ( a, b ) -- return a.id < b.id -- end -- table.sort(vv, sort_func) -- end -- end -- PrintTable(self.achieve_task_show_cache) end end function AchieveModel:GetAchieveMaxCount( main_type ) if not main_type then return end if not self.achieve_max_count_cache[main_type] then self:InitAchieveCache() end return self.achieve_max_count_cache[main_type] end -- 创建特权节点缓存 function AchieveModel:InitAchievePrivilegeCache( ) if not self.achi_privilege_cache then self.achi_privilege_cache = {} for k, v in pairs(Config.Achievementstageprivilege) do self.achi_privilege_cache[#self.achi_privilege_cache+1] = v end end end -- 设置成就大类后端数据 function AchieveModel:SetMainTypeProgress( list ) if not list then return end self.type_progress_data = self.type_progress_data or {} for k, v in ipairs(list) do self.type_progress_data[v.type] = v end -- 填充一下空数据 for k,v in pairs(AchieveModel.AchieveMainType) do if not self.type_progress_data[v] then self.type_progress_data[v] = { type = v, count = 0, } end end -- 如果是首次登录,则需要获取全体进度的协议信息(待优化,这个遍历发送请求真的是太蛋疼了) if not self.login_achi_req then local function delay_method( ) for k, v in pairs(AchieveModel.AchieveMainType) do self:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40902, v) end self.login_achi_req = true end setTimeout(delay_method, 3) end end -- 获取大类进度数据 function AchieveModel:GetMainTypeProgressData() return self.type_progress_data or {} end -- -- 成就协议相关逻辑start -- -- 缓存成就章节进度信息 40900 -- function AchieveModel:SetChapterProgress(vo) -- if not vo then return end -- self.chapter_progress_data = self.chapter_progress_data or {} -- for k, v in ipairs(vo.detailed_list) do -- self.chapter_progress_data[v.category] = v -- end -- -- 如果是首次登录,则需要获取全体进度的协议信息(待优化,这个遍历发送请求真的是太蛋疼了) -- if not self.login_achi_req then -- local function delay_method( ) -- for k, v in pairs(Config.Achievementcategoryreward) do -- self:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40902, v.category) -- end -- self.login_achi_req = true -- end -- setTimeout(delay_method, 3) -- end -- end --[[-- 获取成就界面页签展示所需的章节进度信息,避免跳章节的问题,同时需要对章节进行升序排序 function AchieveModel:GetChapterProgressTabData(add_total_tab) local tb = {} local category_progress for k, v in pairs(Config.Achievementcategoryreward) do -- cfg = DeepCopy(v) -- category_progress = self:GetTargetChapterProgress(v.category) -- cfg.cur_count = category_progress.count or 0 -- cfg.status = category_progress.status or 0 tb[#tb+1] = v end local sort_func = function ( a, b ) return a.category < b.category end table.sort(tb, sort_func) -- 需要添加总览页签按钮 if add_total_tab then local total_tab = { name = "成就总览" } table.insert(tb, 1, total_tab) end return tb end--]] -- -- 根据成就章节直接查找章节整体进度数据 -- function AchieveModel:GetTargetChapterProgress(category) -- if category then -- return self.chapter_progress_data[category] or {} -- else -- return self.chapter_progress_data -- end -- end -- -- 领取成就章节奖励成功后,前端刷新奖励领取标识并刷新界面 40901 -- function AchieveModel:UpdateChapterRewardStatus(category) -- if category and self.chapter_progress_data[category] then -- self.chapter_progress_data[category].status = 2 -- 2为已领取 -- end -- end -- 获取成就列表 40902 function AchieveModel:SetAchieveData(vo) self.achieve_data[vo.type] = {} for k, v in ipairs(vo.list) do v.sort_weight = AchieveModel.StatusSortWeight[v.status] self.achieve_data[vo.type][v.sub_type] = v self.achieve_data[vo.type][v.sub_type].type = vo.type self:RecordAchieveFinsh(v) end self:UpdateRecommendAchiList( true ) end function AchieveModel:GetAchieveData(main_type) return main_type and self.achieve_data[main_type] or nil end -- 通过大类获取成就信息 function AchieveModel:GetAchieveDataByMainType( main_type ) if not main_type then return end local tb = {} if not self.achieve_cfg_cache then self:InitAchieveCache() end for k, v in pairs(self.achieve_cfg_cache[main_type]) do -- 拿一下后端数据 local first_data = v[v.first_id] -- 这个成就的起始数据 local achieve_data = self:GetTargetAchieveData(first_data.type, first_data.sub_type) -- 有后端数据就查进度 if achieve_data and achieve_data.id then for kk, vv in pairs(v) do if kk ~= "first_id" and achieve_data.id == vv.id then local temp = vv -- local temp = DeepCopy(vv) temp.progress = achieve_data.progress or 0 temp.status = achieve_data.status or 0 temp.sort_weight = achieve_data.sort_weight or AchieveModel.StatusSortWeight[temp.status] tb[#tb+1] = temp break end end else local temp = first_data temp.progress = 0 temp.status = 0 temp.sort_weight = AchieveModel.StatusSortWeight[temp.status] tb[#tb+1] = temp end end self:SortAchieveData(tb) return tb end --[[-- 获取成就章节中的成就节点数据(等配置,改为读取配置形式) function AchieveModel:GetAchieveDataByCategory(category) if not category then return nil end local tb = {} local achieve_data if not self.achieve_cfg_cache then self:InitAchieveCache() end for k, v in pairs(self.achieve_cfg_cache[category]) do if v.category == category then achieve_data = self:GetTargetAchieveData(v.category, v.sub_category) v.progress = achieve_data.progress or 0 v.status = achieve_data.status or 0 v.sort_weight = achieve_data.sort_weight or AchieveModel.StatusSortWeight[v.status] tb[#tb+1] = v end end self:SortAchieveData(tb) return tb end--]] -- 根据成就章节和小类直接查找成就进度 function AchieveModel:GetTargetAchieveData(main_type, sub_type) return self.achieve_data[main_type] and self.achieve_data[main_type][sub_type] or {} end -- 领取成就奖励后,更新成就状态 40903 function AchieveModel:UpdateAchieveStatus(vo) if not vo then return end self.achieve_data[vo.type] = self.achieve_data[vo.type] or {} self.achieve_data[vo.type][vo.sub_type] = self.achieve_data[vo.type][vo.sub_type] or {} local cfg = self.achieve_cfg_cache[vo.type][vo.sub_type][vo.id] local need_anim = false if cfg.next_id and cfg.next_id ~= 0 then -- 有下一个任务 后端会发04协议刷新 这里就不刷了 self.achieve_data[vo.type][vo.sub_type] = { type = vo.type, sub_type = vo.sub_type, id = cfg.next_id, status = 0, progress = 0, sort_weight = AchieveModel.StatusSortWeight[0], } else -- 没下一个任务了 所以后端不会发04过来刷新 所以得刷新界面 self.achieve_data[vo.type][vo.sub_type].status = 2 self.achieve_data[vo.type][vo.sub_type].sort_weight = AchieveModel.StatusSortWeight[2] need_anim = true -- 如果有任务完成了全部系列 需要动画 self:Fire(AchieveModel.UPDATE_ACHIEVE_DATA, vo.type, need_anim) end self:RecordAchieveFinsh(self.achieve_data[vo.type][vo.sub_type]) self:UpdateRecommendAchiList( true ) end -- 给成就章节中的成就小类排序 function AchieveModel:SortAchieveData(list) local sort_func = function ( a, b ) if a.status == b.status then local a_seq_cfg = Config.Achievementseq[a.type .. "@" .. a.sub_type] local b_seq_cfg = Config.Achievementseq[b.type .. "@" .. b.sub_type] if a_seq_cfg and b_seq_cfg then -- 排序表有数据就按排序表 排序 return a_seq_cfg.seq < b_seq_cfg.seq else -- 否则按子类排 return a.sub_type < b.sub_type end else return a.sort_weight < b.sort_weight end end table.sort(list, sort_func) end -- 更新成就信息 40904 function AchieveModel:UpdateAchieveData(list) if not list then return end for k, v in ipairs(list) do self.achieve_data[v.type] = self.achieve_data[v.type] or {} self.achieve_data[v.type][v.sub_type] = self.achieve_data[v.type][v.sub_type] or {} self.achieve_data[v.type][v.sub_type].status = v.status self.achieve_data[v.type][v.sub_type].id = v.id self.achieve_data[v.type][v.sub_type].progress = v.progress self.achieve_data[v.type][v.sub_type].sort_weight = AchieveModel.StatusSortWeight[v.status] -- 更新已完成成就缓存 self:RecordAchieveFinsh(self.achieve_data[v.type][v.sub_type]) end self:UpdateRecommendAchiList( ) end -- 更新对获得新的成就的数据的存储,并根据情况弹出提示界面 is_chapter:是否是章节奖励 40904 40905 function AchieveModel:SetAchieveTipData(data_list, is_chapter) if not data_list then return end local need_tips_view = false for i, data in ipairs(data_list) do if data.status == 1 then -- 出现已完成的成就就弹出提示界面 local vo = {data = data, is_chapter = is_chapter} table_insert(self.tip_achieve_data, vo) need_tips_view = true end end if need_tips_view then self:Fire(AchieveModel.OPEN_ACHIEVE_TIPS_VIEW, true) end end -- 直接从缓存中推出一个成就 function AchieveModel:GetAchieveTipData() if self.tip_achieve_data and self.tip_achieve_data[1] then return table.remove(self.tip_achieve_data, 1) else return false end end function AchieveModel:RemoveAchieveTipData(not_remove) if not not_remove and #self.tip_achieve_data > 0 then table.remove(self.tip_achieve_data, 1) end end -- -- 更新章节进度信息 40905 -- function AchieveModel:UpdateMainTypeProgress(list) -- if not list then return end -- for k, v in ipairs(list) do -- self.chapter_progress_data[v.type] = v -- end -- end -- 获得成就等级经验数据 40906 function AchieveModel:SetAchieveLvData(vo) self.achieve_lv_data = vo end function AchieveModel:GetAchieveLvData( ) return self.achieve_lv_data or {} end -- 设置成就等级特权信息 40907 function AchieveModel:SetAchievePrivilegeStatus(vo) if not vo then return end for k, v in ipairs(vo.detial_list) do -- 这里的键值用的每个特权对应的那个等级,方便在特权节点那边获取数据 self.privilege_reward_status[v.lv] = v end end function AchieveModel:GetAchievePrivilegeStatus(privilege_lv) return self.privilege_reward_status[privilege_lv] or {} end -- 获取成就特权按钮数据(需等特权配置) function AchieveModel:GetAchievePrivilegeTabData( ) if not self.achi_privilege_cache then self:InitAchievePrivilegeCache() local sort_func = function ( a, b ) return a.stage < b.stage end table.sort(self.achi_privilege_cache, sort_func) end return self.achi_privilege_cache end -- 更新成就特权奖励领取状态 40908 function AchieveModel:UpdateAchievePrivilegeStatus(vo) if not vo then return end self.privilege_reward_status[vo.lv] = self.privilege_reward_status[vo.lv] or {} self.privilege_reward_status[vo.lv] = vo end -- 获取交易券兑换情况 40910 40911 function AchieveModel:SetAchieveExchangeData(vo) self.achieve_exchange_data.now_count = vo.now_count self.achieve_exchange_data.max_count = vo.max_count end function AchieveModel:GetAchieveExchangeData( ) return self.achieve_exchange_data end -- 获取/领取周固定奖励 40912 function AchieveModel:SetWeeklyPrivilegeRewardStatus(vo) self.achieve_weekly_reward_status = vo.status end function AchieveModel:GetWeeklyPrivilegeRewardStatus( ) return self.achieve_weekly_reward_status end -- 成就协议相关逻辑end -- 成就红点相关逻辑start -- 检查成就红点 function AchieveModel:CheckAchieveAllRed( ) local bool = false bool = bool or self:CheckAchieveChapterRed() bool = bool or self:CheckAchieveItemRed() bool = bool or self:CheckAchievePrivilegeRed() bool = bool or self:CheckAcheiveWeeklyRewardRed() bool = bool or self:CheckAchieveExchangeRed() NewMainRoleModel:getInstance():Fire(NewMainRoleModel.UPDATE_RED_DOT, NewMainRoleModel.TabId.ROLE) end -- 根据红点类型更新红点缓存 function AchieveModel:CheckAchieveRed(type, is_all, index) local bool -- if type == AchieveModelRedType.Chapter then -- 章节完成红点 -- bool = self:CheckAchieveChapterRed(index) -- else if type == AchieveModelRedType.Achieve then -- 成就完成红点 bool = self:CheckAchieveItemRed(index) elseif type == AchieveModelRedType.Privilege then -- 成就特权终生奖励 bool = self:CheckAchievePrivilegeRed(index) elseif type == AchieveModelRedType.Weekly then -- 成就特权每周奖励 bool = self:CheckAcheiveWeeklyRewardRed() elseif type == AchieveModelRedType.Exchange then -- 成就特权交易券红点(不要了这个功能) bool = false -- self:CheckAchieveExchangeRed() end self:Fire(AchieveModel.UPDATE_ACHIEVE_RED, type, index, bool) if is_all then -- -- 发送事件更新角色界面的成就红点 -- NewMainRoleModel:getInstance():Fire(NewMainRoleModel.UPDATE_RED_DOT, NewMainRoleModel.TabId.ROLE) GlobalEventSystem:Fire(AchieveModel.UPDATE_DAILY_RED) end return bool end -- 获取成就系统的缓存红点 -- type 红点类型 index 成就页签(章节),子类(小类)传对应的main_type 特权传指定的特权对应打的成就等级 function AchieveModel:GetAchieveCacheRed(type, index) if not type then return false elseif not index then if type == AchieveModelRedType.Weekly or type == AchieveModelRedType.Exchange then return self.achieve_red_cache[type] or false else return self.achieve_red_cache[type] or {} end else return self.achieve_red_cache[type] and self.achieve_red_cache[type][index] or false end end -- 更新角色界面的成就页签红点 function AchieveModel:CheckMainRoleInfoViewAchieveRed() local bool = false for red_type, type_data in pairs(self.achieve_red_cache) do if type(type_data) == "table" then for k, has_red in pairs(type_data) do bool = has_red or bool end else bool = type_data or bool end end self:SetAchieveTotalRedCache( bool ) return bool end -- 设置成就总红点 function AchieveModel:SetAchieveTotalRedCache( bool ) self.total_achieve_cache_red = bool end -- 获取成就总红点 function AchieveModel:GetAchieveTotalRedCache( bool ) return self.total_achieve_cache_red end --[[-- 获取成就章节完成的红点 category:传入章节将获得章节页签的红点 function AchieveModel:CheckAchieveChapterRed(category) self.achieve_red_cache[AchieveModelRedType.Chapter] = self.achieve_red_cache[AchieveModelRedType.Chapter] or {} local bool = false -- 若传入了特定的成就章节,则只更新对应的红点 if category then bool = self.chapter_progress_data[category] and self.chapter_progress_data[category].status == 1 or false self.achieve_red_cache[AchieveModelRedType.Chapter][category] = bool else for k, v in pairs(self.chapter_progress_data) do -- 存在章节已完成的情况返回true(这里不考虑成就完成情况) bool = bool or v.status == 1 self.achieve_red_cache[AchieveModelRedType.Chapter][v.category] = v.status and v.status == 1 or false end end return bool end--]] -- 获取成就小类(item)的红点 function AchieveModel:CheckAchieveItemRed(main_type) self.achieve_red_cache[AchieveModelRedType.Achieve] = self.achieve_red_cache[AchieveModelRedType.Achieve] or {} local bool = false -- 若传入了特定的成就章节,则只更新对应的红点 if main_type then self.achieve_data[main_type] = self.achieve_data[main_type] or {} self.achieve_red_cache[AchieveModelRedType.Achieve][main_type] = false -- 初始是没有红点 for k, v in pairs(self.achieve_data[main_type]) do bool = bool or v.status == 1 self.achieve_red_cache[AchieveModelRedType.Achieve][main_type] = self.achieve_red_cache[AchieveModelRedType.Achieve][main_type] or v.status == 1 end else -- 清除缓存 self.achieve_red_cache[AchieveModelRedType.Achieve] = {} for k, main_type_data in pairs(self.achieve_data) do self.achieve_red_cache[AchieveModelRedType.Achieve][k] = false -- 本来没有红点 for k2, achieve in pairs(main_type_data) do bool = bool or achieve.status == 1 self.achieve_red_cache[AchieveModelRedType.Achieve][k] = self.achieve_red_cache[AchieveModelRedType.Achieve][k] or achieve.status == 1 end end end return bool end -- 检查成就特权奖励领取红点 function AchieveModel:CheckAchievePrivilegeRed( ) self.achieve_red_cache[AchieveModelRedType.Privilege] = self.achieve_red_cache[AchieveModelRedType.Privilege] or {} local bool = false local privilege_cfg for k, v in pairs(self.privilege_reward_status) do privilege_cfg = Config.Achievementstageprivilege[v.lv] if privilege_cfg and privilege_cfg.icon ~= 3 and privilege_cfg.icon ~= 4 then -- 过滤掉两个特殊处理红点的特权 bool = bool or v.status == 1 self.achieve_red_cache[AchieveModelRedType.Privilege][v.lv] = v.status == 1 end end return bool end -- 检查成就特权每周奖励红点 function AchieveModel:CheckAcheiveWeeklyRewardRed( ) local bool = self.achieve_weekly_reward_status == 1 self.achieve_red_cache[AchieveModelRedType.Weekly] = bool return bool end -- 检查成就交易券兑换特权页签红点 function AchieveModel:CheckAchieveExchangeRed( ) local bool = false if self.exchange_login_red then bool = self:CheckAchieveExchangeBtnRed() end self.achieve_red_cache[AchieveModelRedType.Exchange] = bool return bool end -- 检查成就交易券兑换按钮红点(与页签红点分开) function AchieveModel:CheckAchieveExchangeBtnRed( ) self.achv_exhcange_btn_red = false local cur_ach_lv = self.achieve_lv_data and self.achieve_lv_data.lv or 0 for k, v in pairs(Config.Achievementstageprivilege) do if v.icon == 4 then -- 先判断是否达到目标特权所需成就等级 self.achv_exhcange_btn_red = cur_ach_lv >= v.stage end end if self.achv_exhcange_btn_red then -- 判断有无剩余次数 local time_data = self:GetAchieveExchangeData() if time_data.now_count and time_data.max_count then -- now_count:已经兑换的次数 self.achv_exhcange_btn_red = time_data.now_count < time_data.max_count end end return self.achv_exhcange_btn_red end function AchieveModel:GetAchieveExchangeBtnRed( ) return self.achv_exhcange_btn_red end -- 红点逻辑 end -- 界面获取数据的逻辑汇总 -- 根据等级获取当前成就特权等级 function AchieveModel:GetAchievePrivilegeLv(lv) lv = lv or self.achieve_lv_data.lv or 0 local privilge_lv = 0 for k, v in pairs(Config.Achievementstageprivilege) do -- 如果配置等级不高于当前成就等级,特权等级+1 if v.stage <= lv then privilge_lv = privilge_lv + 1 end end return privilge_lv end -- 是否解锁了每日十环扫荡日常的特权 function AchieveModel:HasUnlockedFreeDailyTask( ) local unlocked = false local cur_ach_lv = self.achieve_lv_data and self.achieve_lv_data.lv or 0 for k, v in pairs(Config.Achievementstageprivilege) do if v.icon == 5 then -- 先判断是否达到目标特权所需成就等级 unlocked = cur_ach_lv >= v.stage break end end return unlocked end -- 检查是否可以快捷领取 function AchieveModel:CheckCanQuickGetReward( ) return RoleManager.Instance.mainRoleInfo.level <= self.QUICK_GET_LEVEL end -- 获取当前特权数据 function AchieveModel:GetCurPrivilegeStage( ) local cur_achieve_lv = self:GetAchieveLvData().lv or 1 local privilege_data = self:GetAchievePrivilegeTabData() local index = 1 for k,v in ipairs(privilege_data) do if v.stage <= cur_achieve_lv then index = k end end return index end -- 主界面用(totalview) 获取第一个可领的index 或者是下一个将可领取的index function AchieveModel:GetCanGetPrivilegeStage( ) local cur_achieve_lv = self:GetAchieveLvData().lv or 1 local privilege_data = self:GetAchievePrivilegeTabData() local index = 0 for k,v in ipairs(privilege_data) do if v.stage <= cur_achieve_lv then index = k local status_data = self:GetAchievePrivilegeStatus(v.stage) if status_data.status and status_data.status == 1 then -- 如果有奖领 就返回了 return index end end end if index ~= #privilege_data then -- 下一个可领特权 index = index + 1 end return index end -- 获取当前特权的数据缓存 function AchieveModel:GetCurPrivilegeData( ) local index = self:GetCurPrivilegeStage( ) local privilege_data = self:GetAchievePrivilegeTabData() return privilege_data[index] end ----------推荐任务相关-start--------- -- 更新列表 02 03 04协议更新成就进度后都会刷一下 function AchieveModel:UpdateRecommendAchiList( for_update ) local count = TableSize(self.recommend_list) or 0 self.recommend_list = {} for pos, list in ipairs(self.achieve_task_show_cache) do for seq, cfg in pairsByKeys(list) do if not self:AchiIsFinish(cfg.id) then --找到第一个未领取奖励的成就 local progress_data = self:GetTargetAchieveData(cfg.type, cfg.sub_type) if progress_data and progress_data.id and progress_data.id < cfg.id then -- 进度还没到的成就不进推荐 break end if self.achieve_can_get_list[cfg.id] then -- 当前可领奖的不放在推荐任务这里 break end self.recommend_list[pos] = cfg break end end end local new_count = TableSize(self.recommend_list) or 0 local is_achi_count_change = new_count ~= count self:Fire(AchieveModel.UPDATE_ACHIEVE_TASK, is_achi_count_change or for_update) end -- 获取推荐成就列表 function AchieveModel:GetRecommendAchiList( ) return self.recommend_list end -- 获取当前可领奖的成就任务列表 function AchieveModel:GetCanGetAchiList( ) return self.achieve_can_get_list end -- 判断指定成就是否已经完成(指的是领完奖励) function AchieveModel:AchiIsFinish( id ) return self.achieve_finsh_cache[id] == true end -- 记录已经完成的任务(指的是领完奖励) function AchieveModel:RecordAchieveFinsh( data ) -- if data.status ~= 2 then return end -- 只记录已经领取的任务 if not self.achieve_cfg_cache then self:InitAchieveCache() end if not data.type then return end local cfg = self.achieve_cfg_cache[data.type][data.sub_type] if not cfg then return end for k,v in self:PairsByKeys( cfg ) do if k ~= "first_id" and v.id < data.id then self.achieve_finsh_cache[v.id] = true self.achieve_can_get_list[v.id] = nil elseif data.status == 2 and v.id == data.id then self.achieve_finsh_cache[v.id] = true self.achieve_can_get_list[v.id] = nil elseif data.status == 1 and v.id == data.id then self.achieve_can_get_list[v.id] = v end end end function AchieveModel:SetOpenFunCache( main_type, sub_type ) self.temp_open_fun_cache = { main_type = main_type, sub_type = sub_type, } end function AchieveModel:GetOpenFunCache( ) return self.temp_open_fun_cache end function AchieveModel:DelOpenFunCache( ) self.temp_open_fun_cache = nil end -- 通用那个不能带有string 这里会排除string的干扰 function AchieveModel:PairsByKeys(t) local temp = {} for k in pairs(t) do if type(k) == "number" then temp[#temp+1] = k end end table.sort(temp) local i = 0 return function() i = i+1 return temp[i], t[temp[i]] end end -- 解析描述进度的condition 返回进度字符串(0/1) function AchieveModel:ParseCondition( cfg_data ) local achieve_cfg = cfg_data local progress_data = self:GetTargetAchieveData(cfg_data.type, cfg_data.sub_type) progress_data.progress = progress_data.progress or 0 local str = "" if achieve_cfg then local condition = stringtotable(achieve_cfg.condition)[1] -- 将成就的需求总数固定存在条件的第一个中 local percentage = 0 if condition[1] == "arena_rank" then -- 竞技联赛不显示进度,改为追加显示当前排行 percentage = progress_data.status == 0 and 0 or 1 local my_info = PkRankModel:getInstance().my_info if progress_data.status ~= 0 then str = "" elseif not my_info or not my_info.rank or my_info.rank == 0 then str = string.format("当前名次:%s", HtmlColorTxt("未上榜", ColorUtil.GREEN_DARK)) else str = string.format("当前名次:%s", HtmlColorTxt( tostring(my_info.rank), ColorUtil.GREEN_DARK) ) end elseif condition[1] == "uranium_skill" then -- 技能激活 str = HtmlColorTxt( progress_data.progress, ColorUtil.GREEN_DARK) .. "/" .. condition[3] elseif condition[1] == "stage" then -- 进阶 str = HtmlColorTxt( progress_data.progress, ColorUtil.GREEN_DARK) .. "/1" else str = HtmlColorTxt( progress_data.progress, ColorUtil.GREEN_DARK) .. "/" .. condition[2] end end local str = str ~= "" and "(" .. str .. ")" or "" return str end ----------推荐任务相关-end----------- ----------成就动画状态-start--------- function AchieveModel:SetAchieveItemAnimState( is_anim ) self.achieve_item_is_animing = is_anim end function AchieveModel:AchieveItemIsAniming( ) return self.achieve_item_is_animing end function AchieveModel:SetSCMDWaitFlag( bool ) self.wait_scmd40903 = bool end function AchieveModel:GetSCMDWaitFlag( ) return self.wait_scmd40903 end ----------成就动画状态-end-----------