源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

457 rivejä
16 KiB

1 kuukausi sitten
  1. EliteAssessModel = EliteAssessModel or BaseClass(BaseVo, true)
  2. local EliteAssessModel = EliteAssessModel
  3. EliteAssessModel.REQUEST_INFO = "EliteAssessModel.REQUEST_INFO"
  4. EliteAssessModel.OPEN_ELITE_ASSESS_VIEW = "EliteAssessModel.OPEN_ELITE_ASSESS_VIEW"--打开主界面
  5. EliteAssessModel.UPDATE_ELITE_ASSESS_VIEW = "EliteAssessModel.UPDATE_ELITE_ASSESS_VIEW"--更新主界面
  6. EliteAssessModel.REQUEST_INFO = "EliteAssessModel.REQUEST_INFO"--请求协议
  7. EliteAssessModel.OPEN_ELITE_ASSESS_AWARD_SHOW_VIEW = "EliteAssessModel.OPEN_ELITE_ASSESS_AWARD_SHOW_VIEW"--打开精英考核奖励展示界面
  8. EliteAssessModel.CLOSE_ELITE_ASSESS_VIEW = "EliteAssessModel.CLOSE_ELITE_ASSESS_VIEW"--关闭精英考核界面
  9. EliteAssessModel.PLAY_ELITE_ASSESS_ACTION = "EliteAssessModel.PLAY_ELITE_ASSESS_ACTION"--章节二领完就要做动画了
  10. EliteAssessModel.PLAY_MAINUI_EFFECT = "EliteAssessModel.PLAY_MAINUI_EFFECT"--主UI特效播放
  11. function EliteAssessModel:__init()
  12. EliteAssessModel.Instance = self
  13. self:Reset()
  14. end
  15. function EliteAssessModel:Reset()
  16. self.view_info = {}--界面信息
  17. self.tab_red_info_list = {}
  18. self.red_info_list = {}--红点信息列表
  19. self:InitCfg()
  20. end
  21. function EliteAssessModel:getInstance()
  22. if EliteAssessModel.Instance == nil then
  23. EliteAssessModel.Instance = EliteAssessModel.New()
  24. end
  25. return EliteAssessModel.Instance
  26. end
  27. --初始化配置
  28. function EliteAssessModel:InitCfg( )
  29. self.eliteAssess_cfg = {}--精英考核总配置
  30. local eliteAssess_cfg = DeepCopy(Config.Eliteassessreward)
  31. for k,v in pairs(eliteAssess_cfg) do
  32. local data = v
  33. data.reward = stringtotable(v.reward)--大奖奖励
  34. data.client_show = stringtotable(v.client_show)--展示模型
  35. self.eliteAssess_cfg[v.category] = data
  36. end
  37. self.eliteAssess_task_cfg = {}--精英考核任务总配置
  38. self.eliteAssess_task_id_cfg = {}--精英考核任务总配置
  39. self.eliteAssess_final_task_cfg = {}--精英考核章节总任务配置
  40. local eliteAssess_task_cfg = DeepCopy(Config.Eliteassesstask)
  41. for k,v in pairs(eliteAssess_task_cfg) do
  42. local data = v
  43. data.reward = stringtotable(v.reward)--大奖奖励
  44. data.content = stringtotable(v.content)--条件
  45. data.jump = stringtotable(v.jump)--跳转
  46. -- 取最后一个任务作为章节任务 单独拿出来
  47. -- 这么写很怪,之后有空再改
  48. -- author: lizhijian
  49. if v.task_id % 10 == 5 then
  50. self.eliteAssess_final_task_cfg[v.category] = data
  51. else
  52. if not self.eliteAssess_task_cfg[v.category] then
  53. self.eliteAssess_task_cfg[v.category] = {}
  54. end
  55. self.eliteAssess_task_cfg[v.category][v.task_id] = data
  56. self.eliteAssess_task_id_cfg[v.task_id] = data
  57. end
  58. end
  59. end
  60. --获取任务配置
  61. function EliteAssessModel:GetTaskCfg( category )
  62. if self.eliteAssess_task_cfg[category] then
  63. return self.eliteAssess_task_cfg[category]
  64. end
  65. end
  66. --获取任务配置通过task_id
  67. function EliteAssessModel:GetTaskCfgByTaskId( task_id )
  68. return self.eliteAssess_task_id_cfg[task_id]
  69. end
  70. --获取章节配置
  71. function EliteAssessModel:GetEliteAssessListCfg( category )
  72. if not category then
  73. return self.eliteAssess_cfg
  74. else
  75. return self.eliteAssess_cfg[category]
  76. end
  77. end
  78. --获取章节任务配置
  79. function EliteAssessModel:GetEliteAssessChapterTaskCfg( category )
  80. if not category then
  81. return self.eliteAssess_final_task_cfg
  82. else
  83. return self.eliteAssess_final_task_cfg[category]
  84. end
  85. end
  86. --检查红点
  87. function EliteAssessModel:CheckRedDot()
  88. local info = self:GetViewInfo()
  89. self.red_info_list = {}
  90. self.tab_red_info_list = {}
  91. local have_red = false
  92. if info then
  93. for category,task_list in pairs(info) do
  94. for task_id, task_info in pairs(task_list) do
  95. if task_info.status == 1 then
  96. self.red_info_list[task_id] = true
  97. self.tab_red_info_list[category] = true
  98. have_red = true
  99. end
  100. end
  101. end
  102. end
  103. local cur_category = self:GetCurCategory()
  104. local chapter_task_cfg = self:GetEliteAssessChapterTaskCfg(cur_category)
  105. local task_dun_cfg = chapter_task_cfg.content
  106. local dun_cfg = BaseDungeonModel:getInstance():GetDunCfg(task_dun_cfg[1][3])
  107. local fight = dun_cfg.recommend_power --
  108. local cur_fight = RoleManager.Instance.mainRoleInfo.fighting
  109. local chapter_task_status = self:GetTaskStatus(cur_category, chapter_task_cfg.task_id)
  110. local complete_num = self:GetProgressInCategory(cur_category)
  111. -- print("Lizhijian:EliteAssessModel [start:124] ")
  112. -- print(cur_fight, fight)
  113. -- print(chapter_task_status)
  114. -- print(complete_num)
  115. -- print("Lizhijian:EliteAssessModel [end:124] ")
  116. if cur_fight > fight and chapter_task_status == 0 and complete_num >= 4 then
  117. have_red = true
  118. end
  119. self.have_red = have_red
  120. -- print("huangcong:EliteAssessModel [start:93] self.red_info_list:", self.red_info_list)
  121. -- PrintTable(self.red_info_list)
  122. -- print("huangcong:EliteAssessModel [end]")
  123. end
  124. -- 总红点 给外部icon用
  125. function EliteAssessModel:GetRedDot(force)
  126. if force then
  127. self:CheckRedDot()
  128. end
  129. return self.have_red
  130. end
  131. --检测精英考核活动图标是否需要开启[兼顾设置精英考核活动内部的活动列表]
  132. function EliteAssessModel:CheckIconBoolOpen()
  133. end
  134. -- 设置界面信息
  135. -- 2021.7.21修改
  136. -- 返回章节信息数组 但数组内只会有当前章节的信息
  137. function EliteAssessModel:SetViewInfo( vo )
  138. local new_list = {}
  139. for i,v in pairs(vo.category_list) do
  140. new_list[v.category] = {}
  141. for i1, v1 in pairs(v.task_list) do
  142. new_list[v.category][v1.task_id] = v1
  143. end
  144. end
  145. -- print("Lizhijian:EliteAssessModel [start:132] ")
  146. -- PrintTable(new_list)
  147. -- print("Lizhijian:EliteAssessModel [end:132] ")
  148. self.view_info = new_list
  149. self:CheckRedDot()
  150. end
  151. --获取界面信息
  152. function EliteAssessModel:GetViewInfo()
  153. return self.view_info
  154. end
  155. --获取当前章节
  156. function EliteAssessModel:GetCurCategory()
  157. local view_info = self:GetViewInfo()
  158. local max = -1
  159. for key, _ in pairs(view_info) do
  160. max = max > key and max or key
  161. end
  162. return max < 1 and nil or max
  163. end
  164. --获得当前需要展示的任务
  165. function EliteAssessModel:GetCurShowTaskInfo()
  166. local server_info = self:GetViewInfo()
  167. -- return self.view_info[category]
  168. local category = self:GetCurCategory()
  169. if server_info and category and server_info[category] then
  170. local task_info = nil
  171. local can_get_info = nil
  172. for k,v in pairs(server_info.list) do--先寻找可领取的
  173. local task_cfg = self:GetTaskCfgByTaskId(v.task_id)
  174. if task_cfg and task_cfg.category == category then
  175. if v.status == 1 then
  176. task_info = v
  177. can_get_info = true
  178. break
  179. end
  180. end
  181. end
  182. if not can_get_info then--没有可领取的找未完成的
  183. for k,v in pairsByKeys(server_info.list) do
  184. local task_cfg = self:GetTaskCfgByTaskId(v.task_id)
  185. if task_cfg and task_cfg.category == category then
  186. if v.status ~= 2 then
  187. task_info = v
  188. break
  189. end
  190. end
  191. end
  192. end
  193. if task_info then
  194. local task_cfg = self:GetTaskCfgByTaskId(task_info.task_id)
  195. task_info = DeepCopy(task_info)
  196. task_info.task_cfg = DeepCopy(task_cfg)
  197. return task_info
  198. end
  199. end
  200. end
  201. function EliteAssessModel:GetProgressInCategory(category)
  202. local info = self:GetViewInfo()
  203. local count = 0
  204. if info then
  205. for key, value in pairs(info) do
  206. if key == category then
  207. for k1, v1 in pairs(value) do
  208. if v1.status == 2 then
  209. count = count + 1
  210. end
  211. end
  212. end
  213. end
  214. end
  215. -- 特殊处理 最后一个章节任务不算进完成进度内
  216. return count > 4 and 4 or count
  217. end
  218. function EliteAssessModel:GetResouceByTaskId(task_id)
  219. if task_id then
  220. return Config.Eliteassesstaskresource[task_id]
  221. end
  222. end
  223. --获得任务进度Max值
  224. function EliteAssessModel:GetTaskProMax( content )
  225. local max = 0
  226. if content[1][1] == "pass_dun" then
  227. max = 1
  228. elseif content[1][1] == "open_func" then
  229. max = 1
  230. elseif content[1][1] == "task" then
  231. max = 1
  232. elseif content[1][1] == "fast_dun" then
  233. max = content[1][3]
  234. elseif content[1][1] == "normal_tower_dun" then
  235. max = content[1][2] - 7000
  236. elseif content[1][1] == "diff_tower_dun" then
  237. max = 1
  238. elseif content[1][1] == "person_boss" then
  239. max = 1
  240. elseif content[1][1] == "deserted_boss" then
  241. max = content[1][3]
  242. elseif content[1][1] == "reward_boss" then
  243. max = 1
  244. elseif content[1][1] == "enter_dungeon" then
  245. max = 1
  246. elseif content[1][1] == "visus_dun" then
  247. max = content[1][3]
  248. elseif content[1][1] == "pet_dun" then
  249. max = content[1][2] - 12000
  250. else
  251. max = content[1][2]
  252. end
  253. return max
  254. end
  255. function EliteAssessModel:GetTaskStatus(category, task_id)
  256. if category and task_id then
  257. local view_info = self:GetViewInfo()
  258. if view_info and view_info[category] and view_info[category][task_id] then
  259. return view_info[category][task_id].status
  260. end
  261. end
  262. return 0
  263. end
  264. function EliteAssessModel:GetTaskLimit(task_id)
  265. local can_go = true
  266. local can_go_some = true
  267. local limit_str_go = ""
  268. local limit_str_go_some = ""
  269. local role_lv = RoleManager.Instance.mainRoleInfo.level
  270. local op_day = ServerTimeModel:getInstance():GetOpenServerDay()
  271. local power = RoleManager.Instance.mainRoleInfo.fighting
  272. if task_id then
  273. local task_cfg = self:GetTaskCfgByTaskId(task_id)
  274. if not task_cfg then return end
  275. if task_cfg.jump and task_cfg.jump[1] then
  276. local is_open, module_cfg = GetModuleIsOpen(task_cfg.jump[1], task_cfg.jump[2])
  277. if not is_open then
  278. if role_lv < module_cfg.open_lv then
  279. can_go = false
  280. limit_str_go = string.format("等级<color=%s>%s</color>解锁", ColorUtil.RED_DARK, module_cfg.open_lv)
  281. return can_go, limit_str_go
  282. end
  283. if op_day < module_cfg.open_day then
  284. can_go = false
  285. limit_str_go = string.format("开服<color=%s>%s</color>天解锁", ColorUtil.RED_DARK, module_cfg.open_day)
  286. return can_go, limit_str_go
  287. end
  288. local task_model = TaskModel:getInstance()
  289. local need_task_id = module_cfg.task_id
  290. if not task_model:IsTaskFinished(need_task_id) then
  291. local task_data = task_model:GetTaskById(need_task_id)
  292. local temp_str = task_model:IsMainTask(need_task_id) and "主线" or "支线"
  293. can_go = false
  294. if not task_data then
  295. limit_str_go = string.format("<color=%s>%s级%s</color>解锁", ColorUtil.RED_DARK, module_cfg.open_lv, temp_str)
  296. temp_str = "主线"
  297. else
  298. limit_str_go = string.format("<color=%s>%s级%s</color>解锁", ColorUtil.RED_DARK, task_data.level, temp_str)
  299. end
  300. return can_go, limit_str_go
  301. end
  302. end
  303. end
  304. if task_cfg.content[1][1] == "fast_dun" then
  305. local cur_wave = ExpDunModel:getInstance():GetCurrentWave()
  306. local next_wave = cur_wave < TableSize(Config.Expdunwave) and cur_wave + 1 or cur_wave
  307. local wave_cfg = Config.Expdunwave[next_wave]
  308. local match_power = power >= wave_cfg.power_limit
  309. local match_level = role_lv >= wave_cfg.lv_limit
  310. if not match_level then
  311. can_go_some = false
  312. limit_str_go_some = string.format("需要等级<color=%s>%s</color>", ColorUtil.RED_DARK,wave_cfg.lv_limit)
  313. return can_go, limit_str_go, can_go_some, limit_str_go_some
  314. end
  315. if not match_power then
  316. can_go_some = false
  317. limit_str_go_some = string.format("需要战力<color=%s>%s</color>", ColorUtil.RED_DARK,wave_cfg.power_limit)
  318. return can_go, limit_str_go, can_go_some, limit_str_go_some
  319. end
  320. elseif task_cfg.content[1][1] == "reward_boss" then
  321. local boss_id = task_cfg.content[1][2]
  322. local limit_lv = BossModel:GetInstance():GetMoneyBossLimitLv(boss_id)
  323. local is_lock = RoleManager.Instance.mainRoleInfo.level < limit_lv
  324. -------------------------
  325. if is_lock then
  326. can_go_some = false
  327. limit_str_go_some = string.format("需要等级<color=%s>%s</color>", ColorUtil.RED_DARK, limit_lv)
  328. return can_go, limit_str_go, can_go_some, limit_str_go_some
  329. end
  330. elseif task_cfg.content[1][1] == "deserted_boss" then
  331. local boss_id = task_cfg.content[1][2]
  332. local limit_lv = BossModel:GetInstance():GetMoneyBossLimitLv(boss_id)
  333. local is_lock = RoleManager.Instance.mainRoleInfo.level < limit_lv
  334. -------------------------
  335. if is_lock then
  336. can_go_some = false
  337. limit_str_go_some = string.format("需要等级<color=%s>%s</color>", ColorUtil.RED_DARK, limit_lv)
  338. return can_go, limit_str_go, can_go_some, limit_str_go_some
  339. end
  340. elseif task_cfg.content[1][1] == "person_boss" then
  341. local grade = task_cfg.content[1][2]
  342. local boss_cfg_list = BossModel:GetInstance():GetPersonBossList()
  343. local min_lv = 0
  344. for key, value in pairs(boss_cfg_list) do
  345. if value.grade == grade then
  346. min_lv = stringtotable(value.recommend_lv)[1][1]
  347. break
  348. end
  349. end
  350. local limit_lv = min_lv
  351. local is_lock = RoleManager.Instance.mainRoleInfo.level < limit_lv
  352. -------------------------
  353. if is_lock then
  354. can_go_some = false
  355. limit_str_go_some = string.format("需要等级<color=%s>%s</color>", ColorUtil.RED_DARK, limit_lv)
  356. return can_go, limit_str_go, can_go_some, limit_str_go_some
  357. end
  358. elseif task_cfg.content[1][1] == "diff_tower_dun" then
  359. BaseDungeonModel:getInstance().is_choose_hard_tower = true
  360. if role_lv < BaseDungeonModel.TowerdundiffcultLevel then
  361. can_go_some = false
  362. limit_str_go_some = string.format("需要等级<color=%s>%s</color>", ColorUtil.RED_DARK, BaseDungeonModel.TowerdundiffcultLevel)
  363. return can_go, limit_str_go, can_go_some, limit_str_go_some
  364. end
  365. local base_cfg_list = BaseDungeonModel:getInstance():GetDunCfg(nil,BaseDungeonModel.DUN_TYPE.ONE_TOWER)
  366. local cfg_list = DeepCopy(base_cfg_list)
  367. local new_cfg_list = {}
  368. for i,v in pairs(cfg_list) do
  369. local dungeon_level = BaseDungeonModel:getInstance():GetDungeonOpenLevel(v.id)
  370. if role_lv >= dungeon_level then
  371. new_cfg_list[#new_cfg_list + 1] = v
  372. end
  373. end
  374. local diffcult_dun_list = {}--困难副本
  375. for k,v in pairs(new_cfg_list) do
  376. if Config.Towerdundiffcult[v.id] then
  377. diffcult_dun_list[#diffcult_dun_list + 1] = v
  378. end
  379. end
  380. local sort_func = function ( a, b )
  381. return a.id < b.id
  382. end
  383. table.sort(diffcult_dun_list, sort_func)
  384. local dun_cfg = diffcult_dun_list[1]
  385. if dun_cfg then
  386. local lock_cfg = Config.Towerdundiffcult[dun_cfg.id]
  387. if not lock_cfg then return end
  388. local lock_dun_cfg = BaseDungeonModel:getInstance():GetDunCfg(lock_cfg.need_unlock,nil)
  389. if lock_dun_cfg and lock_dun_cfg.id then
  390. local info = BaseDungeonModel:getInstance():GetDunProtoInfoByDunId(BaseDungeonModel.DUN_TYPE.ONE_TOWER,lock_dun_cfg.id)
  391. if info.is_pass ~= 1 then
  392. can_go_some = false
  393. limit_str_go_some = string.format("需通关<color=%s>简单%s</color>", ColorUtil.RED_DARK,lock_dun_cfg.name)
  394. return can_go, limit_str_go, can_go_some, limit_str_go_some
  395. end
  396. end
  397. end
  398. elseif task_cfg.content[1][1] == "visus_dun" or task_cfg.content[1][1] == "pet_dun" then
  399. local dun_id = task_cfg.content[1][2]
  400. local dun_cfg = BaseDungeonModel:GetInstance():GetDunCfg(dun_id)
  401. for k,v in pairs(dun_cfg.condition) do
  402. if v[1] == "lv" then--要求等级
  403. if role_lv < tonumber(v[2]) then
  404. can_go_some = false
  405. limit_str_go_some = string.format("需要等级<color=%s>%s</color>", ColorUtil.RED_DARK,tonumber(v[2]))
  406. return can_go, limit_str_go, can_go_some, limit_str_go_some
  407. end
  408. -- elseif v[1] == "finish_dun_id" then--要求前置通关关卡
  409. -- local pre_dun_proto_info = BaseDungeonModel:GetInstance():GetDunProtoInfoByDunId(BaseDungeonModel.DUN_TYPE.MAINPLOT,tonumber(v[2]))
  410. -- if pre_dun_proto_info and pre_dun_proto_info.is_pass ~= 1 then
  411. -- can_go_some = false
  412. -- limit_str_go_some = string.format("<color=%s>需要等级%s</color>", ColorUtil.RED_DARK,wave_cfg.lv_limit)
  413. -- return can_go, limit_str_go, can_go_some, limit_str_go_some
  414. -- end
  415. elseif v[1] == "open_day" then
  416. if ServerTimeModel:getInstance():GetOpenServerDay() < tonumber(v[2]) then
  417. can_go_some = false
  418. limit_str_go_some = string.format("需要开服<color=%s>%s天</color>", ColorUtil.RED_DARK,tonumber(v[2]))
  419. return can_go, limit_str_go, can_go_some, limit_str_go_some
  420. end
  421. end
  422. end
  423. end
  424. return can_go, limit_str_go, can_go_some, limit_str_go_some
  425. end
  426. end