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