源战役客户端
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

191 rader
7.2 KiB

1 månad sedan
  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 跨服社团排行玩法伤害排行界面
  4. -- *>
  5. GuildCSGRRankView = GuildCSGRRankView or BaseClass(BaseView)
  6. local GuildCSGRRankView = GuildCSGRRankView
  7. function GuildCSGRRankView:__init()
  8. self.base_file = "guildCSGR"
  9. self.layout_file = "GuildCSGRRankView"
  10. self.layer_name = "Activity"
  11. self.destroy_imm = true
  12. self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置
  13. self.change_scene_close = true --是否切换场景时关闭(弹出界面使用)
  14. self.tab_list = {
  15. {id = 1, name = "社团排行"},
  16. {id = 2, name = "个人排行"},
  17. }
  18. self.sroll_end_req_evt = false -- 滑动到底时请求协议锁
  19. self.rank_data_cache = {} -- 排行信息缓存
  20. self.model = GuildModel:getInstance()
  21. self.main_vo = RoleManager.Instance.mainRoleInfo
  22. -- 获取奖励配置
  23. self.guild_reward_list, self.guild_normal_reward_list, self.role_reward_list = self.model:GetCSGRRankRewardCfg()
  24. self.load_callback = function ()
  25. self:LoadSuccess()
  26. self:AddEvent()
  27. -- 打开界面时及时请求两个排行榜的第一手数据
  28. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 41005, 0, GuildModel.RankPageSize, 1)
  29. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 41005, 1, GuildModel.RankPageSize, 1)
  30. end
  31. self.open_callback = function ( )
  32. self:UpdateView()
  33. end
  34. self.destroy_callback = function ( )
  35. self:DestroySuccess()
  36. end
  37. end
  38. function GuildCSGRRankView:Open( )
  39. --self.data = data
  40. BaseView.Open(self)
  41. end
  42. function GuildCSGRRankView:LoadSuccess()
  43. local nodes = {
  44. "item_scroll",
  45. "item_scroll/Viewport/item_con",
  46. "my_reward_con",
  47. }
  48. self:GetChildren(nodes)
  49. local function close_callback()
  50. self:Close()
  51. end
  52. local function select_callback(index)
  53. self:SwitchTab(index)
  54. end
  55. self.tabWindowComponent = UITabWindow.New(self.transform, self.tab_list, select_callback, close_callback, self.background_wnd, nil, UITabWindow.SizeSmall, nil, nil, false)
  56. self.tabWindowComponent:SetTitleText("伤害排行")
  57. self.tabWindowComponent:SetBackgroundRes("rw_score_rank_bg")
  58. end
  59. function GuildCSGRRankView:AddEvent()
  60. local function update_rank_data(vo)
  61. self:UpdateRankData(vo)
  62. end
  63. self:BindEvent(self.model, GuildModel.UPDATE_CSGR_DMG_RANK, update_rank_data)
  64. end
  65. function GuildCSGRRankView:UpdateView()
  66. self:SwitchTab(1)
  67. end
  68. function GuildCSGRRankView:UpdateRankData(vo)
  69. if not vo then return end
  70. self.rank_data_cache[vo.rank_type] = self.rank_data_cache[vo.rank_type] or {}
  71. self.rank_data_cache[vo.rank_type].hurt_rank = self.rank_data_cache[vo.rank_type].hurt_rank or {}
  72. -- 当前页码
  73. self.rank_data_cache[vo.rank_type].page_num = vo.page_num
  74. if vo.hurt_rank and TableSize(vo.hurt_rank) > 0 then
  75. for k, v in ipairs(vo.hurt_rank) do
  76. table.insert(self.rank_data_cache[vo.rank_type].hurt_rank, v)
  77. end
  78. self.sroll_end_req_evt = false
  79. end
  80. self:UpdateRankItems(false)
  81. end
  82. function GuildCSGRRankView:SwitchTab( index )
  83. if index == 1 then -- 社团排行
  84. self.cur_rank_type = 1 -- 社团排行类型
  85. elseif index == 2 then -- 个人排行
  86. self.cur_rank_type = 0 -- 个人排行类型
  87. end
  88. if self.tabWindowComponent then
  89. self.tabWindowComponent:SetTabBarIndex(index)
  90. end
  91. self:UpdateRankItems(true)
  92. end
  93. -- 创建排行节点 scroll_to_top:是否滚动到最顶部
  94. function GuildCSGRRankView:UpdateRankItems(scroll_to_top)
  95. local rank_list = self.rank_data_cache[self.cur_rank_type] and self.rank_data_cache[self.cur_rank_type].hurt_rank or {}
  96. local cur_page = self.rank_data_cache[self.cur_rank_type] and self.rank_data_cache[self.cur_rank_type].page_num or 1
  97. local total_page = self.rank_data_cache[self.cur_rank_type] and self.rank_data_cache[self.cur_rank_type].total_page or 1
  98. self.rank_item_creator = self.rank_item_creator or self:AddUIComponent(UI.ItemListCreator)
  99. local info = {
  100. data_list = rank_list,
  101. item_con = self.item_con,
  102. scroll_view = self.item_scroll,
  103. item_class = GuildCSGRRankItem,
  104. item_height = 89,
  105. create_frequency = 0.01,
  106. is_scroll_back_on_update = scroll_to_top,
  107. alignment = UnityEngine.TextAnchor.UpperLeft,
  108. on_update_item = function(item, i, v)
  109. if i == #rank_list - 1 and not self.sroll_end_req_evt and cur_page < total_page then
  110. -- 调整标志量,请求协议
  111. self.sroll_end_req_evt = true
  112. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 41005, self.cur_rank_type, GuildModel.RankPageSize, cur_page + 1)
  113. end
  114. item:SetData(self.cur_rank_type, i, v, self:GetRewardCfgByRank(i, v), false)
  115. end,
  116. }
  117. self.rank_item_creator:UpdateItems(info)
  118. -- 更新底部固定内容
  119. self.my_rank_item = self.my_rank_item or GuildCSGRRankItem.New(self.my_reward_con)
  120. self.my_rank_item:SetAnchoredPosition(0, -2)
  121. -- 遍历数据获取玩家排行数据
  122. local is_role_rank = self.cur_rank_type == 0
  123. local my_rank_data, my_rank
  124. local compare_key = is_role_rank and self.main_vo.name or self.main_vo.guild_name
  125. for k, v in pairs(rank_list) do
  126. if compare_key == v.name and self.main_vo.server_num == v.server_num then
  127. my_rank_data = v
  128. my_rank = k
  129. break
  130. end
  131. end
  132. -- 没有数据的话需要构造一份表
  133. my_rank_data = my_rank_data or {
  134. server_num = self.main_vo.server_num,
  135. name = is_role_rank and self.main_vo.name or self.main_vo.guild_name,
  136. val = my_rank_data and my_rank_data.val or 0,
  137. vip = self.main_vo.vip_flag,
  138. svip_type = self.main_vo.sup_vip_type,
  139. gender = self.main_vo.sex,
  140. rank = my_rank,
  141. lv = self.main_vo.level,
  142. photo_profile_id = self.main_vo.profile_photo_id,
  143. dress_id = self.main_vo.dress_board,
  144. guild_flag = self.model:GetGuildFlag(),
  145. first_arena = my_rank_data and my_rank_data.first_arena or 0,
  146. }
  147. -- 获取我的奖励配置,不存在排行或者排行奖励配置就拿最后一个
  148. local my_reward_cfg = self:GetRewardCfgByRank(my_rank, my_rank_data)
  149. self.my_rank_item:SetData(self.cur_rank_type, my_rank, my_rank_data, my_reward_cfg, true)
  150. end
  151. function GuildCSGRRankView:GetRewardCfgByRank(rank, data)
  152. -- 获取目标配置表
  153. if rank then
  154. local target_list
  155. if self.cur_rank_type == 1 then
  156. target_list = data and data.first_arena == 1 and self.guild_reward_list or self.guild_normal_reward_list
  157. else
  158. target_list = self.role_reward_list
  159. end
  160. for k, v in ipairs(target_list) do
  161. if v.rank_min <= rank and v.rank_max >= rank then
  162. return v
  163. end
  164. end
  165. end
  166. return {is_empty = true}
  167. end
  168. function GuildCSGRRankView:DestroySuccess( )
  169. if self.tabWindowComponent then
  170. self.tabWindowComponent:DeleteMe()
  171. self.tabWindowComponent = nil
  172. end
  173. if self.my_rank_item then
  174. self.my_rank_item:DeleteMe()
  175. self.my_rank_item = nil
  176. end
  177. end