源战役客户端
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

880 righe
31 KiB

4 settimane fa
  1. AchieveModel = AchieveModel or BaseClass(BaseVo)
  2. AchieveModel.REQUEST_CCMD_EVENT = "AchieveModel.REQUEST_CCMD_EVENT" --请求协议
  3. -- AchieveModel.GET_NEW_ACHV = "AchieveModel.GET_NEW_ACHV" --有新成就可以领取
  4. AchieveModel.UPDATE_ACHV_OVER_STAR = "AchieveModel.UPDATE_ACHV_OVER_STAR" --更新成就总览星数
  5. -- AchieveModel.REMOVE_TIPS_VIEW = "AchieveModel.REMOVE_TIPS_VIEW" --移除成就弹窗
  6. AchieveModel.UPDATE_ACHV_COMPLELE = "AchieveModel.UPDATE_ACHV_COMPLELE" --成就完成度的刷新
  7. AchieveModel.SHOW_GET_ALL_REDDOT = "AchieveModel.SHOW_GET_ALL_REDDOT" --刷新一键领取的红点
  8. AchieveModel.JINGOODS_FLY_EFFECT = "AchieveModel.JINGOODS_FLY_EFFECT" --成就界面的 显示红钻获得时的动画
  9. ------明日新增
  10. AchieveModel.UPDATE_MAIN_TYPE_PROGRESS = "AchieveModel.UPDATE_MAIN_TYPE_PROGRESS" -- 更新成就大类进度信息
  11. -- AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED = "AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED" -- 成就章节奖励领取成功刷新事件
  12. AchieveModel.UPDATE_ACHIEVE_DATA = "AchieveModel.UPDATE_ACHIEVE_DATA" -- 根据成就章节更新成就小类item
  13. AchieveModel.OPEN_ACHIEVE_TIPS_VIEW = "AchieveModel.OPEN_ACHIEVE_TIPS_VIEW" -- 新版成就完成弹窗事件
  14. AchieveModel.UPDATE_ACHIEVE_LV_DATA = "AchieveModel.UPDATE_ACHIEVE_LV_DATA" -- 更新成就等级经验数据
  15. AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS = "AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS" -- 更新成就特权奖励状态
  16. AchieveModel.UPDATE_ACHIEVE_RED = "AchieveModel.UPDATE_ACHIEVE_RED" -- 更新成就红点
  17. -- AchieveModel.OPEN_ACHIEVE_MAIN_VIEW = "AchieveModel.OPEN_ACHIEVE_MAIN_VIEW" -- 打开成就主界面
  18. AchieveModel.UPDATE_EXCHANGE_DATA = "AchieveModel.UPDATE_EXCHANGE_DATA" -- 更新特权交易券兑换情况数据
  19. AchieveModel.OPEN_GUILD_SPEED_TIP_VIEW = "AchieveModel.OPEN_GUILD_SPEED_TIP_VIEW" -- 打开公会竞速称号变更tip界面
  20. AchieveModel.OPEN_ACHIEVE_PRIVILEGE_VIEW = "AchieveModel.OPEN_ACHIEVE_PRIVILEGE_VIEW" -- 打开成就特权
  21. AchieveModel.UPDATE_DAILY_RED = "AchieveModel.UPDATE_DAILY_RED" -- 通知刷新日常界面红点
  22. AchieveModel.UPDATE_ACHIEVE_TASK = "AchieveModel.UPDATE_ACHIEVE_TASK" -- 通知刷新任务列表
  23. AchieveModel.UPDATE_BASE_VIEW = "AchieveModel.UPDATE_BASE_VIEW" -- 通知成就界面
  24. -- 成就小类排序权值,由成就的完成状态决定
  25. AchieveModel.StatusSortWeight = {
  26. [0] = 2, -- 未完成
  27. [1] = 1, -- 可领取
  28. [2] = 3, -- 已领取
  29. }
  30. -- 成就红点类型
  31. AchieveModelRedType = {
  32. -- MainType = 1, -- 章节已完成
  33. Achieve = 2, -- 成就已完成
  34. Privilege = 3, -- 特权奖励
  35. Weekly = 4, -- 特权每周奖励
  36. Exchange = 5, -- 交易券兑换红点
  37. }
  38. AchieveModel.AchieveMainType = {
  39. [1] = 1, -- 养成
  40. [2] = 2, -- 活跃
  41. [3] = 3, -- 挑战
  42. [4] = 4, -- 收集
  43. }
  44. AchieveModel.SpecialOpenFun = {
  45. [405] = true,
  46. }
  47. local table_insert = table.insert
  48. function AchieveModel:__init()
  49. self.Instance = self
  50. self.delay_open_tips = false
  51. ---------------------------------
  52. -- 配置缓存
  53. self.achieve_cfg_cache = nil -- 成就内容缓存
  54. self.achi_privilege_cache = nil -- 成就特权缓存
  55. -- 协议相关
  56. self.login_achi_req = false -- 登录首次请求全体协议进度
  57. self.chapter_progress_data = {} -- 成就章节进度信息
  58. self.achieve_data = {} -- 成就列表
  59. self.tip_achieve_data = {} --AchieveTipsView 的所有tip的信息
  60. self.achieve_lv_data = nil -- 成就等级经验数据
  61. self.privilege_reward_status = {} -- 成就特权对应的奖励的领取情况
  62. self.achieve_exchange_data = {} -- 成就特权交易券兑换情况
  63. self.achieve_weekly_reward_status = 0 -- 成就特权周奖励领取状态 0-未满足条件 1-可领取 2-已领取
  64. self.exchange_login_red = true -- 首次登录的交易券红点
  65. self.achv_exhcange_btn_red = false -- 成就交易券兑换按钮红点
  66. -- 红点相关
  67. self.achieve_red_cache = {} -- 成就红点缓存 格式 self.achieve_red_cache[red_type][index] = true/false,成就类index为章节,特权为特权对应的成就等级
  68. self.achieve_red_data = {}
  69. ---------------------------------
  70. self.QUICK_GET_LEVEL = tonumber(Config.Achievementkv["auto_receive_lv"].value) -- 可以快捷领取的最大等级 小于等于这个等级可以直接领取 大于这个等级改为跳转
  71. self.total_achieve_cache_red = false -- 总红点缓存
  72. self.achieve_max_count_cache = {} -- 成就最大数目缓存
  73. self.achieve_finsh_cache = {} -- 记录所有已经完成的成就id
  74. self.achieve_can_get_list = {} -- 记录所有可以领奖励的成就id
  75. self.recommend_list = {} -- 记录推荐任务列表
  76. self:InitAchieveCache( )
  77. end
  78. function AchieveModel:getInstance()
  79. if self.Instance == nil then
  80. self.Instance = AchieveModel.New(
  81. )
  82. end
  83. return self.Instance
  84. end
  85. -- 创建成就节点缓存
  86. function AchieveModel:InitAchieveCache( )
  87. if not self.achieve_cfg_cache then
  88. self.achieve_cfg_cache = {}
  89. self.achieve_max_count_cache = {} -- 记录了大类的成就总数
  90. self.achieve_task_show_cache = {} -- 记录在任务栏显示的推荐成就
  91. for k, v in pairs(Config.Achievementid) do
  92. self.achieve_cfg_cache[v.type] = self.achieve_cfg_cache[v.type] or {}
  93. self.achieve_cfg_cache[v.type][v.sub_type] = self.achieve_cfg_cache[v.type][v.sub_type] or {}
  94. self.achieve_cfg_cache[v.type][v.sub_type][v.id] = v
  95. -- table_insert(self.achieve_cfg_cache[v.type][v.sub_type], v)
  96. -- 计总数
  97. self.achieve_max_count_cache[v.type] = self.achieve_max_count_cache[v.type] or 0
  98. self.achieve_max_count_cache[v.type] = self.achieve_max_count_cache[v.type] + 1
  99. -- 记录推荐任务
  100. if v.task_position ~= 0 then
  101. self.achieve_task_show_cache[v.task_position] = self.achieve_task_show_cache[v.task_position] or {}
  102. self.achieve_task_show_cache[v.task_position][v.task_sequence] = v
  103. end
  104. end
  105. -- 插入一个字段记录每个大类的每个小类的起始成就id
  106. for main_type, v in pairs(self.achieve_cfg_cache) do
  107. for sub_type, vv in pairs(v) do
  108. local little_id = 99999999
  109. for id, vvv in pairs(vv) do
  110. if little_id > vvv.id then
  111. little_id = vvv.id
  112. end
  113. end
  114. vv.first_id = little_id
  115. end
  116. end
  117. -- 成就同类型排序
  118. -- for k,v in pairs(self.achieve_cfg_cache) do
  119. -- for kk,vv in pairs(v) do
  120. -- local sort_func = function ( a, b )
  121. -- return a.id < b.id
  122. -- end
  123. -- table.sort(vv, sort_func)
  124. -- end
  125. -- end
  126. -- PrintTable(self.achieve_task_show_cache)
  127. end
  128. end
  129. function AchieveModel:GetAchieveMaxCount( main_type )
  130. if not main_type then return end
  131. if not self.achieve_max_count_cache[main_type] then
  132. self:InitAchieveCache()
  133. end
  134. return self.achieve_max_count_cache[main_type]
  135. end
  136. -- 创建特权节点缓存
  137. function AchieveModel:InitAchievePrivilegeCache( )
  138. if not self.achi_privilege_cache then
  139. self.achi_privilege_cache = {}
  140. for k, v in pairs(Config.Achievementstageprivilege) do
  141. self.achi_privilege_cache[#self.achi_privilege_cache+1] = v
  142. end
  143. end
  144. end
  145. -- 设置成就大类后端数据
  146. function AchieveModel:SetMainTypeProgress( list )
  147. if not list then return end
  148. self.type_progress_data = self.type_progress_data or {}
  149. for k, v in ipairs(list) do
  150. self.type_progress_data[v.type] = v
  151. end
  152. -- 填充一下空数据
  153. for k,v in pairs(AchieveModel.AchieveMainType) do
  154. if not self.type_progress_data[v] then
  155. self.type_progress_data[v] = {
  156. type = v,
  157. count = 0,
  158. }
  159. end
  160. end
  161. -- 如果是首次登录,则需要获取全体进度的协议信息(待优化,这个遍历发送请求真的是太蛋疼了)
  162. if not self.login_achi_req then
  163. local function delay_method( )
  164. for k, v in pairs(AchieveModel.AchieveMainType) do
  165. self:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40902, v)
  166. end
  167. self.login_achi_req = true
  168. end
  169. setTimeout(delay_method, 3)
  170. end
  171. end
  172. -- 获取大类进度数据
  173. function AchieveModel:GetMainTypeProgressData()
  174. return self.type_progress_data or {}
  175. end
  176. -- -- 成就协议相关逻辑start
  177. -- -- 缓存成就章节进度信息 40900
  178. -- function AchieveModel:SetChapterProgress(vo)
  179. -- if not vo then return end
  180. -- self.chapter_progress_data = self.chapter_progress_data or {}
  181. -- for k, v in ipairs(vo.detailed_list) do
  182. -- self.chapter_progress_data[v.category] = v
  183. -- end
  184. -- -- 如果是首次登录,则需要获取全体进度的协议信息(待优化,这个遍历发送请求真的是太蛋疼了)
  185. -- if not self.login_achi_req then
  186. -- local function delay_method( )
  187. -- for k, v in pairs(Config.Achievementcategoryreward) do
  188. -- self:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40902, v.category)
  189. -- end
  190. -- self.login_achi_req = true
  191. -- end
  192. -- setTimeout(delay_method, 3)
  193. -- end
  194. -- end
  195. --[[-- 获取成就界面页签展示所需的章节进度信息,避免跳章节的问题,同时需要对章节进行升序排序
  196. function AchieveModel:GetChapterProgressTabData(add_total_tab)
  197. local tb = {}
  198. local category_progress
  199. for k, v in pairs(Config.Achievementcategoryreward) do
  200. -- cfg = DeepCopy(v)
  201. -- category_progress = self:GetTargetChapterProgress(v.category)
  202. -- cfg.cur_count = category_progress.count or 0
  203. -- cfg.status = category_progress.status or 0
  204. tb[#tb+1] = v
  205. end
  206. local sort_func = function ( a, b )
  207. return a.category < b.category
  208. end
  209. table.sort(tb, sort_func)
  210. -- 需要添加总览页签按钮
  211. if add_total_tab then
  212. local total_tab = {
  213. name = "成就总览"
  214. }
  215. table.insert(tb, 1, total_tab)
  216. end
  217. return tb
  218. end--]]
  219. -- -- 根据成就章节直接查找章节整体进度数据
  220. -- function AchieveModel:GetTargetChapterProgress(category)
  221. -- if category then
  222. -- return self.chapter_progress_data[category] or {}
  223. -- else
  224. -- return self.chapter_progress_data
  225. -- end
  226. -- end
  227. -- -- 领取成就章节奖励成功后,前端刷新奖励领取标识并刷新界面 40901
  228. -- function AchieveModel:UpdateChapterRewardStatus(category)
  229. -- if category and self.chapter_progress_data[category] then
  230. -- self.chapter_progress_data[category].status = 2 -- 2为已领取
  231. -- end
  232. -- end
  233. -- 获取成就列表 40902
  234. function AchieveModel:SetAchieveData(vo)
  235. self.achieve_data[vo.type] = {}
  236. for k, v in ipairs(vo.list) do
  237. v.sort_weight = AchieveModel.StatusSortWeight[v.status]
  238. self.achieve_data[vo.type][v.sub_type] = v
  239. self.achieve_data[vo.type][v.sub_type].type = vo.type
  240. self:RecordAchieveFinsh(v)
  241. end
  242. self:UpdateRecommendAchiList( true )
  243. end
  244. function AchieveModel:GetAchieveData(main_type)
  245. return main_type and self.achieve_data[main_type] or nil
  246. end
  247. -- 通过大类获取成就信息
  248. function AchieveModel:GetAchieveDataByMainType( main_type )
  249. if not main_type then return end
  250. local tb = {}
  251. if not self.achieve_cfg_cache then
  252. self:InitAchieveCache()
  253. end
  254. for k, v in pairs(self.achieve_cfg_cache[main_type]) do
  255. -- 拿一下后端数据
  256. local first_data = v[v.first_id] -- 这个成就的起始数据
  257. local achieve_data = self:GetTargetAchieveData(first_data.type, first_data.sub_type)
  258. -- 有后端数据就查进度
  259. if achieve_data and achieve_data.id then
  260. for kk, vv in pairs(v) do
  261. if kk ~= "first_id" and achieve_data.id == vv.id then
  262. local temp = vv
  263. -- local temp = DeepCopy(vv)
  264. temp.progress = achieve_data.progress or 0
  265. temp.status = achieve_data.status or 0
  266. temp.sort_weight = achieve_data.sort_weight or AchieveModel.StatusSortWeight[temp.status]
  267. tb[#tb+1] = temp
  268. break
  269. end
  270. end
  271. else
  272. local temp = first_data
  273. temp.progress = 0
  274. temp.status = 0
  275. temp.sort_weight = AchieveModel.StatusSortWeight[temp.status]
  276. tb[#tb+1] = temp
  277. end
  278. end
  279. self:SortAchieveData(tb)
  280. return tb
  281. end
  282. --[[-- 获取成就章节中的成就节点数据(等配置,改为读取配置形式)
  283. function AchieveModel:GetAchieveDataByCategory(category)
  284. if not category then return nil end
  285. local tb = {}
  286. local achieve_data
  287. if not self.achieve_cfg_cache then
  288. self:InitAchieveCache()
  289. end
  290. for k, v in pairs(self.achieve_cfg_cache[category]) do
  291. if v.category == category then
  292. achieve_data = self:GetTargetAchieveData(v.category, v.sub_category)
  293. v.progress = achieve_data.progress or 0
  294. v.status = achieve_data.status or 0
  295. v.sort_weight = achieve_data.sort_weight or AchieveModel.StatusSortWeight[v.status]
  296. tb[#tb+1] = v
  297. end
  298. end
  299. self:SortAchieveData(tb)
  300. return tb
  301. end--]]
  302. -- 根据成就章节和小类直接查找成就进度
  303. function AchieveModel:GetTargetAchieveData(main_type, sub_type)
  304. return self.achieve_data[main_type] and self.achieve_data[main_type][sub_type] or {}
  305. end
  306. -- 领取成就奖励后,更新成就状态 40903
  307. function AchieveModel:UpdateAchieveStatus(vo)
  308. if not vo then return end
  309. self.achieve_data[vo.type] = self.achieve_data[vo.type] or {}
  310. self.achieve_data[vo.type][vo.sub_type] = self.achieve_data[vo.type][vo.sub_type] or {}
  311. local cfg = self.achieve_cfg_cache[vo.type][vo.sub_type][vo.id]
  312. local need_anim = false
  313. if cfg.next_id and cfg.next_id ~= 0 then -- 有下一个任务 后端会发04协议刷新 这里就不刷了
  314. self.achieve_data[vo.type][vo.sub_type] = {
  315. type = vo.type,
  316. sub_type = vo.sub_type,
  317. id = cfg.next_id,
  318. status = 0,
  319. progress = 0,
  320. sort_weight = AchieveModel.StatusSortWeight[0],
  321. }
  322. else -- 没下一个任务了 所以后端不会发04过来刷新 所以得刷新界面
  323. self.achieve_data[vo.type][vo.sub_type].status = 2
  324. self.achieve_data[vo.type][vo.sub_type].sort_weight = AchieveModel.StatusSortWeight[2]
  325. need_anim = true -- 如果有任务完成了全部系列 需要动画
  326. self:Fire(AchieveModel.UPDATE_ACHIEVE_DATA, vo.type, need_anim)
  327. end
  328. self:RecordAchieveFinsh(self.achieve_data[vo.type][vo.sub_type])
  329. self:UpdateRecommendAchiList( true )
  330. end
  331. -- 给成就章节中的成就小类排序
  332. function AchieveModel:SortAchieveData(list)
  333. local sort_func = function ( a, b )
  334. if a.status == b.status then
  335. local a_seq_cfg = Config.Achievementseq[a.type .. "@" .. a.sub_type]
  336. local b_seq_cfg = Config.Achievementseq[b.type .. "@" .. b.sub_type]
  337. if a_seq_cfg and b_seq_cfg then -- 排序表有数据就按排序表 排序
  338. return a_seq_cfg.seq < b_seq_cfg.seq
  339. else -- 否则按子类排
  340. return a.sub_type < b.sub_type
  341. end
  342. else
  343. return a.sort_weight < b.sort_weight
  344. end
  345. end
  346. table.sort(list, sort_func)
  347. end
  348. -- 更新成就信息 40904
  349. function AchieveModel:UpdateAchieveData(list)
  350. if not list then return end
  351. for k, v in ipairs(list) do
  352. self.achieve_data[v.type] = self.achieve_data[v.type] or {}
  353. self.achieve_data[v.type][v.sub_type] = self.achieve_data[v.type][v.sub_type] or {}
  354. self.achieve_data[v.type][v.sub_type].status = v.status
  355. self.achieve_data[v.type][v.sub_type].id = v.id
  356. self.achieve_data[v.type][v.sub_type].progress = v.progress
  357. self.achieve_data[v.type][v.sub_type].sort_weight = AchieveModel.StatusSortWeight[v.status]
  358. -- 更新已完成成就缓存
  359. self:RecordAchieveFinsh(self.achieve_data[v.type][v.sub_type])
  360. end
  361. self:UpdateRecommendAchiList( )
  362. end
  363. -- 更新对获得新的成就的数据的存储,并根据情况弹出提示界面 is_chapter:是否是章节奖励 40904 40905
  364. function AchieveModel:SetAchieveTipData(data_list, is_chapter)
  365. if not data_list then return end
  366. local need_tips_view = false
  367. for i, data in ipairs(data_list) do
  368. if data.status == 1 then -- 出现已完成的成就就弹出提示界面
  369. local vo = {data = data, is_chapter = is_chapter}
  370. table_insert(self.tip_achieve_data, vo)
  371. need_tips_view = true
  372. end
  373. end
  374. if need_tips_view then
  375. self:Fire(AchieveModel.OPEN_ACHIEVE_TIPS_VIEW, true)
  376. end
  377. end
  378. -- 直接从缓存中推出一个成就
  379. function AchieveModel:GetAchieveTipData()
  380. if self.tip_achieve_data and self.tip_achieve_data[1] then
  381. return table.remove(self.tip_achieve_data, 1)
  382. else
  383. return false
  384. end
  385. end
  386. function AchieveModel:RemoveAchieveTipData(not_remove)
  387. if not not_remove and #self.tip_achieve_data > 0 then
  388. table.remove(self.tip_achieve_data, 1)
  389. end
  390. end
  391. -- -- 更新章节进度信息 40905
  392. -- function AchieveModel:UpdateMainTypeProgress(list)
  393. -- if not list then return end
  394. -- for k, v in ipairs(list) do
  395. -- self.chapter_progress_data[v.type] = v
  396. -- end
  397. -- end
  398. -- 获得成就等级经验数据 40906
  399. function AchieveModel:SetAchieveLvData(vo)
  400. self.achieve_lv_data = vo
  401. end
  402. function AchieveModel:GetAchieveLvData( )
  403. return self.achieve_lv_data or {}
  404. end
  405. -- 设置成就等级特权信息 40907
  406. function AchieveModel:SetAchievePrivilegeStatus(vo)
  407. if not vo then return end
  408. for k, v in ipairs(vo.detial_list) do
  409. -- 这里的键值用的每个特权对应的那个等级,方便在特权节点那边获取数据
  410. self.privilege_reward_status[v.lv] = v
  411. end
  412. end
  413. function AchieveModel:GetAchievePrivilegeStatus(privilege_lv)
  414. return self.privilege_reward_status[privilege_lv] or {}
  415. end
  416. -- 获取成就特权按钮数据(需等特权配置)
  417. function AchieveModel:GetAchievePrivilegeTabData( )
  418. if not self.achi_privilege_cache then
  419. self:InitAchievePrivilegeCache()
  420. local sort_func = function ( a, b )
  421. return a.stage < b.stage
  422. end
  423. table.sort(self.achi_privilege_cache, sort_func)
  424. end
  425. return self.achi_privilege_cache
  426. end
  427. -- 更新成就特权奖励领取状态 40908
  428. function AchieveModel:UpdateAchievePrivilegeStatus(vo)
  429. if not vo then return end
  430. self.privilege_reward_status[vo.lv] = self.privilege_reward_status[vo.lv] or {}
  431. self.privilege_reward_status[vo.lv] = vo
  432. end
  433. -- 获取交易券兑换情况 40910 40911
  434. function AchieveModel:SetAchieveExchangeData(vo)
  435. self.achieve_exchange_data.now_count = vo.now_count
  436. self.achieve_exchange_data.max_count = vo.max_count
  437. end
  438. function AchieveModel:GetAchieveExchangeData( )
  439. return self.achieve_exchange_data
  440. end
  441. -- 获取/领取周固定奖励 40912
  442. function AchieveModel:SetWeeklyPrivilegeRewardStatus(vo)
  443. self.achieve_weekly_reward_status = vo.status
  444. end
  445. function AchieveModel:GetWeeklyPrivilegeRewardStatus( )
  446. return self.achieve_weekly_reward_status
  447. end
  448. -- 成就协议相关逻辑end
  449. -- 成就红点相关逻辑start
  450. -- 检查成就红点
  451. function AchieveModel:CheckAchieveAllRed( )
  452. local bool = false
  453. bool = bool or self:CheckAchieveChapterRed()
  454. bool = bool or self:CheckAchieveItemRed()
  455. bool = bool or self:CheckAchievePrivilegeRed()
  456. bool = bool or self:CheckAcheiveWeeklyRewardRed()
  457. bool = bool or self:CheckAchieveExchangeRed()
  458. NewMainRoleModel:getInstance():Fire(NewMainRoleModel.UPDATE_RED_DOT, NewMainRoleModel.TabId.ROLE)
  459. end
  460. -- 根据红点类型更新红点缓存
  461. function AchieveModel:CheckAchieveRed(type, is_all, index)
  462. local bool
  463. -- if type == AchieveModelRedType.Chapter then -- 章节完成红点
  464. -- bool = self:CheckAchieveChapterRed(index)
  465. -- else
  466. if type == AchieveModelRedType.Achieve then -- 成就完成红点
  467. bool = self:CheckAchieveItemRed(index)
  468. elseif type == AchieveModelRedType.Privilege then -- 成就特权终生奖励
  469. bool = self:CheckAchievePrivilegeRed(index)
  470. elseif type == AchieveModelRedType.Weekly then -- 成就特权每周奖励
  471. bool = self:CheckAcheiveWeeklyRewardRed()
  472. elseif type == AchieveModelRedType.Exchange then -- 成就特权交易券红点(不要了这个功能)
  473. bool = false -- self:CheckAchieveExchangeRed()
  474. end
  475. self:Fire(AchieveModel.UPDATE_ACHIEVE_RED, type, index, bool)
  476. if is_all then
  477. -- -- 发送事件更新角色界面的成就红点
  478. -- NewMainRoleModel:getInstance():Fire(NewMainRoleModel.UPDATE_RED_DOT, NewMainRoleModel.TabId.ROLE)
  479. GlobalEventSystem:Fire(AchieveModel.UPDATE_DAILY_RED)
  480. end
  481. return bool
  482. end
  483. -- 获取成就系统的缓存红点
  484. -- type 红点类型 index 成就页签(章节),子类(小类)传对应的main_type 特权传指定的特权对应打的成就等级
  485. function AchieveModel:GetAchieveCacheRed(type, index)
  486. if not type then
  487. return false
  488. elseif not index then
  489. if type == AchieveModelRedType.Weekly or type == AchieveModelRedType.Exchange then
  490. return self.achieve_red_cache[type] or false
  491. else
  492. return self.achieve_red_cache[type] or {}
  493. end
  494. else
  495. return self.achieve_red_cache[type] and self.achieve_red_cache[type][index] or false
  496. end
  497. end
  498. -- 更新角色界面的成就页签红点
  499. function AchieveModel:CheckMainRoleInfoViewAchieveRed()
  500. local bool = false
  501. for red_type, type_data in pairs(self.achieve_red_cache) do
  502. if type(type_data) == "table" then
  503. for k, has_red in pairs(type_data) do
  504. bool = has_red or bool
  505. end
  506. else
  507. bool = type_data or bool
  508. end
  509. end
  510. self:SetAchieveTotalRedCache( bool )
  511. return bool
  512. end
  513. -- 设置成就总红点
  514. function AchieveModel:SetAchieveTotalRedCache( bool )
  515. self.total_achieve_cache_red = bool
  516. end
  517. -- 获取成就总红点
  518. function AchieveModel:GetAchieveTotalRedCache( bool )
  519. return self.total_achieve_cache_red
  520. end
  521. --[[-- 获取成就章节完成的红点 category:传入章节将获得章节页签的红点
  522. function AchieveModel:CheckAchieveChapterRed(category)
  523. self.achieve_red_cache[AchieveModelRedType.Chapter] = self.achieve_red_cache[AchieveModelRedType.Chapter] or {}
  524. local bool = false
  525. -- 若传入了特定的成就章节,则只更新对应的红点
  526. if category then
  527. bool = self.chapter_progress_data[category] and self.chapter_progress_data[category].status == 1 or false
  528. self.achieve_red_cache[AchieveModelRedType.Chapter][category] = bool
  529. else
  530. for k, v in pairs(self.chapter_progress_data) do
  531. -- 存在章节已完成的情况返回true(这里不考虑成就完成情况)
  532. bool = bool or v.status == 1
  533. self.achieve_red_cache[AchieveModelRedType.Chapter][v.category] = v.status and v.status == 1 or false
  534. end
  535. end
  536. return bool
  537. end--]]
  538. -- 获取成就小类(item)的红点
  539. function AchieveModel:CheckAchieveItemRed(main_type)
  540. self.achieve_red_cache[AchieveModelRedType.Achieve] = self.achieve_red_cache[AchieveModelRedType.Achieve] or {}
  541. local bool = false
  542. -- 若传入了特定的成就章节,则只更新对应的红点
  543. if main_type then
  544. self.achieve_data[main_type] = self.achieve_data[main_type] or {}
  545. self.achieve_red_cache[AchieveModelRedType.Achieve][main_type] = false -- 初始是没有红点
  546. for k, v in pairs(self.achieve_data[main_type]) do
  547. bool = bool or v.status == 1
  548. self.achieve_red_cache[AchieveModelRedType.Achieve][main_type] =
  549. self.achieve_red_cache[AchieveModelRedType.Achieve][main_type] or v.status == 1
  550. end
  551. else
  552. -- 清除缓存
  553. self.achieve_red_cache[AchieveModelRedType.Achieve] = {}
  554. for k, main_type_data in pairs(self.achieve_data) do
  555. self.achieve_red_cache[AchieveModelRedType.Achieve][k] = false -- 本来没有红点
  556. for k2, achieve in pairs(main_type_data) do
  557. bool = bool or achieve.status == 1
  558. self.achieve_red_cache[AchieveModelRedType.Achieve][k] =
  559. self.achieve_red_cache[AchieveModelRedType.Achieve][k] or achieve.status == 1
  560. end
  561. end
  562. end
  563. return bool
  564. end
  565. -- 检查成就特权奖励领取红点
  566. function AchieveModel:CheckAchievePrivilegeRed( )
  567. self.achieve_red_cache[AchieveModelRedType.Privilege] = self.achieve_red_cache[AchieveModelRedType.Privilege] or {}
  568. local bool = false
  569. local privilege_cfg
  570. for k, v in pairs(self.privilege_reward_status) do
  571. privilege_cfg = Config.Achievementstageprivilege[v.lv]
  572. if privilege_cfg and privilege_cfg.icon ~= 3 and privilege_cfg.icon ~= 4 then -- 过滤掉两个特殊处理红点的特权
  573. bool = bool or v.status == 1
  574. self.achieve_red_cache[AchieveModelRedType.Privilege][v.lv] = v.status == 1
  575. end
  576. end
  577. return bool
  578. end
  579. -- 检查成就特权每周奖励红点
  580. function AchieveModel:CheckAcheiveWeeklyRewardRed( )
  581. local bool = self.achieve_weekly_reward_status == 1
  582. self.achieve_red_cache[AchieveModelRedType.Weekly] = bool
  583. return bool
  584. end
  585. -- 检查成就交易券兑换特权页签红点
  586. function AchieveModel:CheckAchieveExchangeRed( )
  587. local bool = false
  588. if self.exchange_login_red then
  589. bool = self:CheckAchieveExchangeBtnRed()
  590. end
  591. self.achieve_red_cache[AchieveModelRedType.Exchange] = bool
  592. return bool
  593. end
  594. -- 检查成就交易券兑换按钮红点(与页签红点分开)
  595. function AchieveModel:CheckAchieveExchangeBtnRed( )
  596. self.achv_exhcange_btn_red = false
  597. local cur_ach_lv = self.achieve_lv_data and self.achieve_lv_data.lv or 0
  598. for k, v in pairs(Config.Achievementstageprivilege) do
  599. if v.icon == 4 then -- 先判断是否达到目标特权所需成就等级
  600. self.achv_exhcange_btn_red = cur_ach_lv >= v.stage
  601. end
  602. end
  603. if self.achv_exhcange_btn_red then
  604. -- 判断有无剩余次数
  605. local time_data = self:GetAchieveExchangeData()
  606. if time_data.now_count and time_data.max_count then
  607. -- now_count:已经兑换的次数
  608. self.achv_exhcange_btn_red = time_data.now_count < time_data.max_count
  609. end
  610. end
  611. return self.achv_exhcange_btn_red
  612. end
  613. function AchieveModel:GetAchieveExchangeBtnRed( )
  614. return self.achv_exhcange_btn_red
  615. end
  616. -- 红点逻辑 end
  617. -- 界面获取数据的逻辑汇总
  618. -- 根据等级获取当前成就特权等级
  619. function AchieveModel:GetAchievePrivilegeLv(lv)
  620. lv = lv or self.achieve_lv_data.lv or 0
  621. local privilge_lv = 0
  622. for k, v in pairs(Config.Achievementstageprivilege) do
  623. -- 如果配置等级不高于当前成就等级,特权等级+1
  624. if v.stage <= lv then
  625. privilge_lv = privilge_lv + 1
  626. end
  627. end
  628. return privilge_lv
  629. end
  630. -- 是否解锁了每日十环扫荡日常的特权
  631. function AchieveModel:HasUnlockedFreeDailyTask( )
  632. local unlocked = false
  633. local cur_ach_lv = self.achieve_lv_data and self.achieve_lv_data.lv or 0
  634. for k, v in pairs(Config.Achievementstageprivilege) do
  635. if v.icon == 5 then -- 先判断是否达到目标特权所需成就等级
  636. unlocked = cur_ach_lv >= v.stage
  637. break
  638. end
  639. end
  640. return unlocked
  641. end
  642. -- 检查是否可以快捷领取
  643. function AchieveModel:CheckCanQuickGetReward( )
  644. return RoleManager.Instance.mainRoleInfo.level <= self.QUICK_GET_LEVEL
  645. end
  646. -- 获取当前特权数据
  647. function AchieveModel:GetCurPrivilegeStage( )
  648. local cur_achieve_lv = self:GetAchieveLvData().lv or 1
  649. local privilege_data = self:GetAchievePrivilegeTabData()
  650. local index = 1
  651. for k,v in ipairs(privilege_data) do
  652. if v.stage <= cur_achieve_lv then
  653. index = k
  654. end
  655. end
  656. return index
  657. end
  658. -- 主界面用(totalview) 获取第一个可领的index 或者是下一个将可领取的index
  659. function AchieveModel:GetCanGetPrivilegeStage( )
  660. local cur_achieve_lv = self:GetAchieveLvData().lv or 1
  661. local privilege_data = self:GetAchievePrivilegeTabData()
  662. local index = 0
  663. for k,v in ipairs(privilege_data) do
  664. if v.stage <= cur_achieve_lv then
  665. index = k
  666. local status_data = self:GetAchievePrivilegeStatus(v.stage)
  667. if status_data.status and status_data.status == 1 then -- 如果有奖领 就返回了
  668. return index
  669. end
  670. end
  671. end
  672. if index ~= #privilege_data then -- 下一个可领特权
  673. index = index + 1
  674. end
  675. return index
  676. end
  677. -- 获取当前特权的数据缓存
  678. function AchieveModel:GetCurPrivilegeData( )
  679. local index = self:GetCurPrivilegeStage( )
  680. local privilege_data = self:GetAchievePrivilegeTabData()
  681. return privilege_data[index]
  682. end
  683. ----------推荐任务相关-start---------
  684. -- 更新列表 02 03 04协议更新成就进度后都会刷一下
  685. function AchieveModel:UpdateRecommendAchiList( for_update )
  686. local count = TableSize(self.recommend_list) or 0
  687. self.recommend_list = {}
  688. for pos, list in ipairs(self.achieve_task_show_cache) do
  689. for seq, cfg in pairsByKeys(list) do
  690. if not self:AchiIsFinish(cfg.id) then --找到第一个未领取奖励的成就
  691. local progress_data = self:GetTargetAchieveData(cfg.type, cfg.sub_type)
  692. if progress_data and progress_data.id and progress_data.id < cfg.id then -- 进度还没到的成就不进推荐
  693. break
  694. end
  695. if self.achieve_can_get_list[cfg.id] then -- 当前可领奖的不放在推荐任务这里
  696. break
  697. end
  698. self.recommend_list[pos] = cfg
  699. break
  700. end
  701. end
  702. end
  703. local new_count = TableSize(self.recommend_list) or 0
  704. local is_achi_count_change = new_count ~= count
  705. self:Fire(AchieveModel.UPDATE_ACHIEVE_TASK, is_achi_count_change or for_update)
  706. end
  707. -- 获取推荐成就列表
  708. function AchieveModel:GetRecommendAchiList( )
  709. return self.recommend_list
  710. end
  711. -- 获取当前可领奖的成就任务列表
  712. function AchieveModel:GetCanGetAchiList( )
  713. return self.achieve_can_get_list
  714. end
  715. -- 判断指定成就是否已经完成(指的是领完奖励)
  716. function AchieveModel:AchiIsFinish( id )
  717. return self.achieve_finsh_cache[id] == true
  718. end
  719. -- 记录已经完成的任务(指的是领完奖励)
  720. function AchieveModel:RecordAchieveFinsh( data )
  721. -- if data.status ~= 2 then return end -- 只记录已经领取的任务
  722. if not self.achieve_cfg_cache then
  723. self:InitAchieveCache()
  724. end
  725. if not data.type then return end
  726. local cfg = self.achieve_cfg_cache[data.type][data.sub_type]
  727. if not cfg then return end
  728. for k,v in self:PairsByKeys( cfg ) do
  729. if k ~= "first_id" and v.id < data.id then
  730. self.achieve_finsh_cache[v.id] = true
  731. self.achieve_can_get_list[v.id] = nil
  732. elseif data.status == 2 and v.id == data.id then
  733. self.achieve_finsh_cache[v.id] = true
  734. self.achieve_can_get_list[v.id] = nil
  735. elseif data.status == 1 and v.id == data.id then
  736. self.achieve_can_get_list[v.id] = v
  737. end
  738. end
  739. end
  740. function AchieveModel:SetOpenFunCache( main_type, sub_type )
  741. self.temp_open_fun_cache = {
  742. main_type = main_type,
  743. sub_type = sub_type,
  744. }
  745. end
  746. function AchieveModel:GetOpenFunCache( )
  747. return self.temp_open_fun_cache
  748. end
  749. function AchieveModel:DelOpenFunCache( )
  750. self.temp_open_fun_cache = nil
  751. end
  752. -- 通用那个不能带有string 这里会排除string的干扰
  753. function AchieveModel:PairsByKeys(t)
  754. local temp = {}
  755. for k in pairs(t) do
  756. if type(k) == "number" then
  757. temp[#temp+1] = k
  758. end
  759. end
  760. table.sort(temp)
  761. local i = 0
  762. return function()
  763. i = i+1
  764. return temp[i], t[temp[i]]
  765. end
  766. end
  767. -- 解析描述进度的condition 返回进度字符串(0/1)
  768. function AchieveModel:ParseCondition( cfg_data )
  769. local achieve_cfg = cfg_data
  770. local progress_data = self:GetTargetAchieveData(cfg_data.type, cfg_data.sub_type)
  771. progress_data.progress = progress_data.progress or 0
  772. local str = ""
  773. if achieve_cfg then
  774. local condition = stringtotable(achieve_cfg.condition)[1] -- 将成就的需求总数固定存在条件的第一个中
  775. local percentage = 0
  776. if condition[1] == "arena_rank" then -- 竞技联赛不显示进度,改为追加显示当前排行
  777. percentage = progress_data.status == 0 and 0 or 1
  778. local my_info = PkRankModel:getInstance().my_info
  779. if progress_data.status ~= 0 then
  780. str = ""
  781. elseif not my_info or not my_info.rank or my_info.rank == 0 then
  782. str = string.format("当前名次:%s", HtmlColorTxt("未上榜", ColorUtil.GREEN_DARK))
  783. else
  784. str = string.format("当前名次:%s", HtmlColorTxt( tostring(my_info.rank), ColorUtil.GREEN_DARK) )
  785. end
  786. elseif condition[1] == "uranium_skill" then -- 技能激活
  787. str = HtmlColorTxt( progress_data.progress, ColorUtil.GREEN_DARK) .. "/" .. condition[3]
  788. elseif condition[1] == "stage" then -- 进阶
  789. str = HtmlColorTxt( progress_data.progress, ColorUtil.GREEN_DARK) .. "/1"
  790. else
  791. str = HtmlColorTxt( progress_data.progress, ColorUtil.GREEN_DARK) .. "/" .. condition[2]
  792. end
  793. end
  794. local str = str ~= "" and "(" .. str .. ")" or ""
  795. return str
  796. end
  797. ----------推荐任务相关-end-----------
  798. ----------成就动画状态-start---------
  799. function AchieveModel:SetAchieveItemAnimState( is_anim )
  800. self.achieve_item_is_animing = is_anim
  801. end
  802. function AchieveModel:AchieveItemIsAniming( )
  803. return self.achieve_item_is_animing
  804. end
  805. function AchieveModel:SetSCMDWaitFlag( bool )
  806. self.wait_scmd40903 = bool
  807. end
  808. function AchieveModel:GetSCMDWaitFlag( )
  809. return self.wait_scmd40903
  810. end
  811. ----------成就动画状态-end-----------