源战役客户端
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.

426 lines
15 KiB

  1. require("game.achievement.AchieveModel")
  2. require("game.achievement.AchieveView")
  3. require("game.achievement.AchieveTotalView")
  4. require("game.achievement.AchieveTotalAttrItem")
  5. require("game.achievement.AchieveTabBtnItem")
  6. require("game.achievement.AchieveVarietyView")
  7. require("game.achievement.AchieveItem")
  8. require("game.achievement.AchieveTipsView")
  9. require("game.achievement.AchievePrivilegeItem")
  10. require("game.achievement.AchievePrivilegeView")
  11. require("game.achievement.AchieveGuildSpeedTipsView")--公会竞速称号变化的弹出提示界面
  12. require("game.achievement.AchieveMainTypeItem") -- 大类成就
  13. require("game.proto.409.Require409")
  14. AchieveController = AchieveController or BaseClass(BaseController)
  15. function AchieveController:__init()
  16. AchieveController.Instance = self
  17. self.model = AchieveModel:getInstance()
  18. self.tips_view_list = {}
  19. self.scmd_errorcode_count = 0 -- 连续收到40903错误码的次数
  20. self:registerAllProtocals()
  21. self:addEvents()
  22. end
  23. function AchieveController:registerAllProtocals()
  24. -- self:RegisterProtocal(40900, "handler40900") -- 成就章节信息
  25. self:RegisterProtocal(40901, "handler40901") -- 成就大类总进度
  26. self:RegisterProtocal(40902, "handler40902") -- 获取成就列表
  27. self:RegisterProtocal(40903, "handler40903") -- 领取成就奖励
  28. self:RegisterProtocal(40904, "handler40904") -- 更新成就(推送协议)
  29. self:RegisterProtocal(40905, "handler40905") -- 更新大类总进度(推送协议)
  30. self:RegisterProtocal(40906, "handler40906") -- 成就等级经验
  31. self:RegisterProtocal(40907, "handler40907") -- 成就等级特权信息
  32. self:RegisterProtocal(40908, "handler40908") -- 领取成就特权奖励
  33. self:RegisterProtocal(40909, "handler40909") -- 成就系统错误码
  34. self:RegisterProtocal(40910, "handler40910") -- 获取交易券兑换情况
  35. self:RegisterProtocal(40911, "handler40911") -- 交易券兑换
  36. self:RegisterProtocal(40912, "handler40912") -- 获取/领取周固定奖励
  37. end
  38. function AchieveController:addEvents()
  39. local function onGameStart()
  40. if RoleManager.Instance.mainRoleInfo and RoleManager.Instance.mainRoleInfo.level >= Config.Moduleid[409].open_lv then
  41. -- self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40900)
  42. self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40901)
  43. self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40906)
  44. self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40907)
  45. -- self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40910)
  46. -- self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40912, 1)
  47. end
  48. end
  49. GlobalEventSystem:Bind(EventName.GAME_START, onGameStart)
  50. -- 满足等级后请求一次成就信息
  51. local function onLevelUp(lv)
  52. if lv == Config.Moduleid[409].open_lv then
  53. onGameStart()
  54. end
  55. end
  56. RoleManager.Instance.mainRoleInfo:Bind(EventName.CHANGE_LEVEL, onLevelUp)
  57. --[[ local function open_achieve_main_view(show, index)
  58. if show then
  59. if not GetModuleIsOpen(409) then return end
  60. if not self.achieve_main_view then
  61. self.achieve_main_view = AchieveView.New()
  62. end
  63. if not self.achieve_main_view:HasOpen() then
  64. self.achieve_main_view:Open(index)
  65. else
  66. self.achieve_main_view:ChangeTab(index)
  67. end
  68. else
  69. if self.achieve_main_view then
  70. self.achieve_main_view:Close()
  71. end
  72. end
  73. end
  74. self.model:Bind(AchieveModel.OPEN_ACHIEVE_MAIN_VIEW, open_achieve_main_view)--]]
  75. local function open_privilege_view( show )
  76. if show then
  77. if not GetModuleIsOpen(409) then return end
  78. if not self.achieve_privilege_view then
  79. self.achieve_privilege_view = AchievePrivilegeView.New()
  80. end
  81. if not self.achieve_privilege_view:HasOpen() then
  82. self.achieve_privilege_view:Open()
  83. else
  84. self.achieve_privilege_view:UpdateView()
  85. end
  86. else
  87. if self.achieve_privilege_view then
  88. self.achieve_privilege_view:Close()
  89. end
  90. end
  91. end
  92. self.model:Bind(AchieveModel.OPEN_ACHIEVE_PRIVILEGE_VIEW, open_privilege_view) -- 特权预览界面
  93. local function open_achieve_tips_view(show)
  94. if RoleManager.Instance.mainRoleInfo.level < Config.Moduleid[409].open_lv then return end
  95. -- 如果界面还没加载完或者已经存在且在动画中则跳出
  96. if self.tips_view and (not self.tips_view:HasOpen() or self.tips_view.is_animating) then return end
  97. local function close_tips_view()
  98. if self.tips_view:HasOpen() then
  99. self.tips_view:Close()
  100. end
  101. end
  102. if show then
  103. local tip_data = self.model:GetAchieveTipData()
  104. if tip_data then
  105. if self.tips_view == nil then
  106. self.tips_view = AchieveTipsView.New()
  107. end
  108. if not self.tips_view:HasOpen() then
  109. self.tips_view:Open(tip_data)
  110. else
  111. self.tips_view:ResetViewInfo(tip_data)
  112. end
  113. else
  114. close_tips_view()
  115. end
  116. else
  117. close_tips_view()
  118. end
  119. end
  120. -- 2021/3/15 策划说不要弹成就弹窗
  121. -- self.model:Bind(AchieveModel.OPEN_ACHIEVE_TIPS_VIEW, open_achieve_tips_view)
  122. local function openAchieveGuildSpeedTipsView(data,is_close)--公会竞速称号变化的弹出提示界面
  123. if not GetModuleIsOpen(331,66) then return end
  124. if self.AchieveGuildSpeedTipsView == nil then
  125. self.AchieveGuildSpeedTipsView = AchieveGuildSpeedTipsView.New()
  126. end
  127. if self.AchieveGuildSpeedTipsView:HasOpen() and not is_close then
  128. elseif not is_close then
  129. self.AchieveGuildSpeedTipsView:Open(data)
  130. else
  131. self.AchieveGuildSpeedTipsView:Close()
  132. end
  133. end
  134. GlobalEventSystem:Bind(AchieveModel.OPEN_GUILD_SPEED_TIP_VIEW, openAchieveGuildSpeedTipsView)
  135. local function onRequestHandler(...)
  136. local args_list = {...}
  137. if args_list[1] == 40903 then
  138. self:SendFmtToGame(args_list[1], "hhh", args_list[2], args_list[3], args_list[4])
  139. self:AddSetWaitSCMDTimer()
  140. elseif args_list[1] == 40902 or args_list[1] == 40908 then
  141. self:SendFmtToGame(args_list[1], "h", args_list[2])
  142. elseif args_list[1] == 40911 then -- 兑换协议,一次请求默认兑换一次
  143. self:SendFmtToGame(args_list[1], "c", 1)
  144. elseif args_list[1] == 40912 then
  145. self:SendFmtToGame(args_list[1], "c", args_list[2])
  146. else
  147. self:SendFmtToGame(args_list[1])
  148. end
  149. end
  150. self.model:Bind(AchieveModel.REQUEST_CCMD_EVENT, onRequestHandler)
  151. local function updata_rewardAndGiftInfo_on_changeDay()
  152. local function delay_method()
  153. --今天是星期几,周一刷新周礼包信息
  154. local cur_weekday = tonumber(os.date("%w", TimeUtil:getServerTime()))
  155. cur_weekday = cur_weekday ~= 0 and cur_weekday or 7
  156. if cur_weekday == 1 then
  157. -- self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40912, 1) -- 周领取
  158. self.model.exchange_login_red = true -- 首次登陆交易卷红点重置 不加这个会不刷新按钮
  159. -- self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40910)
  160. end
  161. end
  162. setTimeout(delay_method, 3)
  163. end
  164. self.change_day_id = GlobalEventSystem:Bind(EventName.CHANE_DAY, updata_rewardAndGiftInfo_on_changeDay)
  165. local function update_achieve_red()
  166. self.model:CheckMainRoleInfoViewAchieveRed()
  167. end
  168. -- 红点检查
  169. self.model:Bind(AchieveModel.UPDATE_ACHIEVE_RED, update_achieve_red)
  170. end
  171. -- 2021年3月1日新增 领取奖励成功之后自动跳转到下一个有奖励的章节
  172. function AchieveController:AutoSwitchCategoryAfterClaimReward( )
  173. self.model:Fire(AchieveModel.UPDATE_BASE_VIEW)
  174. -- if self.achieve_main_view and self.achieve_main_view:HasOpen() then
  175. -- local tab_index = self.achieve_main_view.cur_tab_index
  176. -- local cur_category = tab_index - 1
  177. -- local category_red = self.model:GetAchieveCacheRed(AchieveModelRedType.Achieve)
  178. -- if category_red then
  179. -- if not category_red[cur_category] then -- 当前查看的章节已经没有红点了,则自动切换章节页签
  180. -- local target_index
  181. -- for k, v in pairs(category_red) do
  182. -- if v and (not target_index or target_index > k) then -- 存在红点
  183. -- target_index = k
  184. -- end
  185. -- end
  186. -- if target_index then
  187. -- self.model:Fire(AchieveModel.OPEN_ACHIEVE_MAIN_VIEW, true, target_index + 1)
  188. -- end
  189. -- end
  190. -- end
  191. -- end
  192. end
  193. function AchieveController:AddSetWaitSCMDTimer( )
  194. self:ClearWaitSCMDTimer()
  195. local function wait_scmd()
  196. self.model:SetSCMDWaitFlag(false)
  197. self:ClearWaitSCMDTimer()
  198. end
  199. self.wait_scmd_timer_id = GlobalTimerQuest:AddPeriodQuest(wait_scmd, 3, 1)
  200. end
  201. function AchieveController:ClearWaitSCMDTimer()
  202. if self.wait_scmd_timer_id then
  203. TimerQuest.CancelQuest(GlobalTimerQuest, self.wait_scmd_timer_id)
  204. self.wait_scmd_timer_id = nil
  205. end
  206. end
  207. --[[-- 成就章节进度信息
  208. function AchieveController:handler40900()
  209. local vo = SCMD40900.New(true)
  210. self.model:SetChapterProgress(vo)
  211. self.model:CheckAchieveRed(AchieveModelRedType.Chapter, true)
  212. self.model:Fire(AchieveModel.UPDATE_CHAPTER_PROGRESS)
  213. end--]]
  214. -- ############## 成就大类总进度 ##############
  215. -- protocol=40901
  216. -- {
  217. -- c2s{
  218. -- }
  219. -- s2c{
  220. -- type_list:array{
  221. -- type :int16 // 成就大类
  222. -- count :int8 // 当前完成数量
  223. -- }
  224. -- }
  225. -- }
  226. -- 成就大类总进度
  227. function AchieveController:handler40901()
  228. local vo = SCMD40901.New(true)
  229. -- if vo.errcode == 1 then -- 章节奖励领取成功
  230. -- self.model:UpdateChapterRewardStatus(vo.category)
  231. -- self.model:CheckAchieveRed(AchieveModelRedType.Chapter, true, vo.category)
  232. -- self.model:Fire(AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED, vo.category)
  233. -- else
  234. -- ErrorCodeShow(vo.errcode)
  235. -- end
  236. -- logWarn('=======Msh:AchieveController.lua[213]=======')
  237. -- PrintTable(vo)
  238. self.model:SetMainTypeProgress(vo.type_list)
  239. self.model:CheckAchieveRed(nil, true)
  240. end
  241. -- ############## 获取成就列表 ##############
  242. -- protocol=40902
  243. -- {
  244. -- c2s{
  245. -- type :int16 // 成就大类
  246. -- }
  247. -- s2c{
  248. -- type :int16 // 成就大类
  249. -- list:array{ // p.s. 每个小类只发送当前最接近完成/完成未领奖的成就
  250. -- sub_type :int16 // 成就小类
  251. -- id :int16 // 成就id
  252. -- progress :int32 // 进度
  253. -- status :int8 // 成就状态 0:未完成 1:已完成未领取 2:已领取
  254. -- }
  255. -- }
  256. -- }
  257. -- 获取成就列表
  258. function AchieveController:handler40902()
  259. local vo = SCMD40902.New(true)
  260. self.model:SetAchieveData(vo)
  261. -- logWarn('=======Msh:AchieveController.lua[246]=======')
  262. -- PrintTable(vo)
  263. self.model:CheckAchieveRed(AchieveModelRedType.Achieve, true)
  264. self.model:Fire(AchieveModel.UPDATE_ACHIEVE_DATA, vo.type)
  265. end
  266. --[[############## 领取成就奖励 ##############
  267. protocol=40903
  268. {
  269. c2s{
  270. type :int16 //
  271. sub_type :int16 //
  272. id :int16 // id
  273. }
  274. s2c{
  275. errcode :int32 // 0- 1-
  276. type :int16 //
  277. sub_type :int16 //
  278. id :int16 // id
  279. }
  280. }--]]
  281. -- 领取成就小类奖励后,前端更新缓存
  282. function AchieveController:handler40903()
  283. local vo = SCMD40903.New(true)
  284. -- logWarn('=======Msh:AchieveController.lua[293]=======')
  285. -- PrintTable(vo)
  286. if vo.errcode == 1 then
  287. self.scmd_errorcode_count = 0
  288. lua_soundM:PlayUIEffectSound(LuaSoundManager.SOUND_UI.SUCCESS)
  289. self.model:UpdateAchieveStatus(vo)
  290. self.model:CheckAchieveRed(AchieveModelRedType.Achieve, true, vo.type)
  291. -- self:AutoSwitchCategoryAfterClaimReward()
  292. else
  293. ErrorCodeShow(vo.errcode)
  294. self.scmd_errorcode_count = self.scmd_errorcode_count + 1
  295. if self.scmd_errorcode_count > 1 then -- 连续收到2次或以上 错误码就强刷一遍界面
  296. self.model:Fire(AchieveModel.UPDATE_ACHIEVE_DATA, vo.type, false)
  297. end
  298. end
  299. self:ClearWaitSCMDTimer()
  300. self.model:SetSCMDWaitFlag(false)
  301. end
  302. --[[############## 更新成就(推送协议) ##############
  303. protocol=40904
  304. {
  305. s2c{
  306. list:array{ // p.s.
  307. type :int16 //
  308. sub_type :int16 //
  309. id :int16 // id
  310. progress :int32 //
  311. status :int8 // 0: 1: 2:
  312. }
  313. }
  314. }--]]
  315. -- 更新成就进度
  316. function AchieveController:handler40904()
  317. local vo = SCMD40904.New(true)
  318. -- logWarn('=======Msh:AchieveController.lua[320]=======')
  319. -- PrintTable(vo)
  320. self.model:UpdateAchieveData(vo.list)
  321. -- self.model:SetAchieveTipData(vo.list, false)
  322. self.model:CheckAchieveRed(AchieveModelRedType.Achieve, true)
  323. self.model:Fire(AchieveModel.UPDATE_ACHIEVE_DATA, vo.list[1] and vo.list[1].type or nil, true)
  324. end
  325. -- 更新大类总进度(推送协议)
  326. function AchieveController:handler40905()
  327. local vo = SCMD40905.New(true)
  328. self.model:SetMainTypeProgress(vo.list)
  329. -- self.model:SetAchieveTipData(vo.list, true)
  330. -- self.model:CheckAchieveRed(AchieveModelRedType.Chapter, true)
  331. self.model:Fire(AchieveModel.UPDATE_MAIN_TYPE_PROGRESS)
  332. end
  333. -- 成就等级经验
  334. function AchieveController:handler40906()
  335. local vo = SCMD40906.New(true)
  336. -- 等级是否发生变动
  337. -- local per_lv_data = self.model:GetAchieveLvData()
  338. -- local changed_lv = per_lv_data and per_lv_data.lv ~= vo.lv or false
  339. self.model:SetAchieveLvData(vo)
  340. -- self.model:CheckAchieveRed(AchieveModelRedType.Weekly, true)
  341. self.model:CheckAchieveRed(AchieveModelRedType.Exchange, true)
  342. self.model:Fire(AchieveModel.UPDATE_ACHIEVE_LV_DATA)
  343. end
  344. -- 成就等级特权信息
  345. function AchieveController:handler40907()
  346. local vo = SCMD40907.New(true)
  347. self.model:SetAchievePrivilegeStatus(vo)
  348. self.model:CheckAchieveRed(AchieveModelRedType.Privilege, true)
  349. self.model:Fire(AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS)
  350. end
  351. -- 领取成就特权奖励
  352. function AchieveController:handler40908()
  353. local vo = SCMD40908.New(true)
  354. self.model:UpdateAchievePrivilegeStatus(vo)
  355. self.model:CheckAchieveRed(AchieveModelRedType.Privilege, true, vo.lv)
  356. self.model:Fire(AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS)
  357. end
  358. -- 成就系统错误码
  359. function AchieveController:handler40909( )
  360. local vo = SCMD40909.New(true)
  361. if vo.errcode ~= 1 then
  362. ErrorCodeShow(vo.errcode)
  363. end
  364. end
  365. -- 获取交易券兑换情况
  366. function AchieveController:handler40910( )
  367. local vo = SCMD40910.New(true)
  368. -- print("Saber:AchieveController [start:217] vo ------------------------------------------")
  369. -- PrintTable(vo)
  370. self.model:SetAchieveExchangeData(vo)
  371. self.model:CheckAchieveRed(AchieveModelRedType.Exchange, true)
  372. self.model:Fire(AchieveModel.UPDATE_EXCHANGE_DATA)
  373. end
  374. -- 交易券兑换协议
  375. function AchieveController:handler40911( )
  376. local vo = SCMD40911.New(true)
  377. self.model:SetAchieveExchangeData(vo)
  378. -- 如果已经点过了登录红点,这边要手动处理一次,然后再下面的总入口那边刷新
  379. if not self.model.exchange_login_red then
  380. self.model:CheckAchieveExchangeBtnRed()
  381. end
  382. self.model:CheckAchieveRed(AchieveModelRedType.Exchange, true)
  383. self.model:Fire(AchieveModel.UPDATE_EXCHANGE_DATA)
  384. end
  385. -- 获取/领取周固定奖励
  386. function AchieveController:handler40912( )
  387. local vo = SCMD40912.New(true)
  388. -- print("Saber:AchieveController [start:231] vo ------------------------------------------")
  389. -- PrintTable(vo)
  390. self.model:SetWeeklyPrivilegeRewardStatus(vo)
  391. self.model:CheckAchieveRed(AchieveModelRedType.Weekly, true)
  392. self.model:Fire(AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS)
  393. end