-- <* -- @Author: Saber -- @Description: 跨服社团排行玩法伤害排行界面 -- *> GuildCSGRRankView = GuildCSGRRankView or BaseClass(BaseView) local GuildCSGRRankView = GuildCSGRRankView function GuildCSGRRankView:__init() self.base_file = "guildCSGR" self.layout_file = "GuildCSGRRankView" self.layer_name = "Activity" self.destroy_imm = true self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置 self.change_scene_close = true --是否切换场景时关闭(弹出界面使用) self.tab_list = { {id = 1, name = "社团排行"}, {id = 2, name = "个人排行"}, } self.sroll_end_req_evt = false -- 滑动到底时请求协议锁 self.rank_data_cache = {} -- 排行信息缓存 self.model = GuildModel:getInstance() self.main_vo = RoleManager.Instance.mainRoleInfo -- 获取奖励配置 self.guild_reward_list, self.guild_normal_reward_list, self.role_reward_list = self.model:GetCSGRRankRewardCfg() self.load_callback = function () self:LoadSuccess() self:AddEvent() -- 打开界面时及时请求两个排行榜的第一手数据 self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 41005, 0, GuildModel.RankPageSize, 1) self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 41005, 1, GuildModel.RankPageSize, 1) end self.open_callback = function ( ) self:UpdateView() end self.destroy_callback = function ( ) self:DestroySuccess() end end function GuildCSGRRankView:Open( ) --self.data = data BaseView.Open(self) end function GuildCSGRRankView:LoadSuccess() local nodes = { "item_scroll", "item_scroll/Viewport/item_con", "my_reward_con", } self:GetChildren(nodes) local function close_callback() self:Close() end local function select_callback(index) self:SwitchTab(index) end self.tabWindowComponent = UITabWindow.New(self.transform, self.tab_list, select_callback, close_callback, self.background_wnd, nil, UITabWindow.SizeSmall, nil, nil, false) self.tabWindowComponent:SetTitleText("伤害排行") self.tabWindowComponent:SetBackgroundRes("rw_score_rank_bg") end function GuildCSGRRankView:AddEvent() local function update_rank_data(vo) self:UpdateRankData(vo) end self:BindEvent(self.model, GuildModel.UPDATE_CSGR_DMG_RANK, update_rank_data) end function GuildCSGRRankView:UpdateView() self:SwitchTab(1) end function GuildCSGRRankView:UpdateRankData(vo) if not vo then return end self.rank_data_cache[vo.rank_type] = self.rank_data_cache[vo.rank_type] or {} self.rank_data_cache[vo.rank_type].hurt_rank = self.rank_data_cache[vo.rank_type].hurt_rank or {} -- 当前页码 self.rank_data_cache[vo.rank_type].page_num = vo.page_num if vo.hurt_rank and TableSize(vo.hurt_rank) > 0 then for k, v in ipairs(vo.hurt_rank) do table.insert(self.rank_data_cache[vo.rank_type].hurt_rank, v) end self.sroll_end_req_evt = false end self:UpdateRankItems(false) end function GuildCSGRRankView:SwitchTab( index ) if index == 1 then -- 社团排行 self.cur_rank_type = 1 -- 社团排行类型 elseif index == 2 then -- 个人排行 self.cur_rank_type = 0 -- 个人排行类型 end if self.tabWindowComponent then self.tabWindowComponent:SetTabBarIndex(index) end self:UpdateRankItems(true) end -- 创建排行节点 scroll_to_top:是否滚动到最顶部 function GuildCSGRRankView:UpdateRankItems(scroll_to_top) local rank_list = self.rank_data_cache[self.cur_rank_type] and self.rank_data_cache[self.cur_rank_type].hurt_rank or {} local cur_page = self.rank_data_cache[self.cur_rank_type] and self.rank_data_cache[self.cur_rank_type].page_num or 1 local total_page = self.rank_data_cache[self.cur_rank_type] and self.rank_data_cache[self.cur_rank_type].total_page or 1 self.rank_item_creator = self.rank_item_creator or self:AddUIComponent(UI.ItemListCreator) local info = { data_list = rank_list, item_con = self.item_con, scroll_view = self.item_scroll, item_class = GuildCSGRRankItem, item_height = 89, create_frequency = 0.01, is_scroll_back_on_update = scroll_to_top, alignment = UnityEngine.TextAnchor.UpperLeft, on_update_item = function(item, i, v) if i == #rank_list - 1 and not self.sroll_end_req_evt and cur_page < total_page then -- 调整标志量,请求协议 self.sroll_end_req_evt = true self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 41005, self.cur_rank_type, GuildModel.RankPageSize, cur_page + 1) end item:SetData(self.cur_rank_type, i, v, self:GetRewardCfgByRank(i, v), false) end, } self.rank_item_creator:UpdateItems(info) -- 更新底部固定内容 self.my_rank_item = self.my_rank_item or GuildCSGRRankItem.New(self.my_reward_con) self.my_rank_item:SetAnchoredPosition(0, -2) -- 遍历数据获取玩家排行数据 local is_role_rank = self.cur_rank_type == 0 local my_rank_data, my_rank local compare_key = is_role_rank and self.main_vo.name or self.main_vo.guild_name for k, v in pairs(rank_list) do if compare_key == v.name and self.main_vo.server_num == v.server_num then my_rank_data = v my_rank = k break end end -- 没有数据的话需要构造一份表 my_rank_data = my_rank_data or { server_num = self.main_vo.server_num, name = is_role_rank and self.main_vo.name or self.main_vo.guild_name, val = my_rank_data and my_rank_data.val or 0, vip = self.main_vo.vip_flag, svip_type = self.main_vo.sup_vip_type, gender = self.main_vo.sex, rank = my_rank, lv = self.main_vo.level, photo_profile_id = self.main_vo.profile_photo_id, dress_id = self.main_vo.dress_board, guild_flag = self.model:GetGuildFlag(), first_arena = my_rank_data and my_rank_data.first_arena or 0, } -- 获取我的奖励配置,不存在排行或者排行奖励配置就拿最后一个 local my_reward_cfg = self:GetRewardCfgByRank(my_rank, my_rank_data) self.my_rank_item:SetData(self.cur_rank_type, my_rank, my_rank_data, my_reward_cfg, true) end function GuildCSGRRankView:GetRewardCfgByRank(rank, data) -- 获取目标配置表 if rank then local target_list if self.cur_rank_type == 1 then target_list = data and data.first_arena == 1 and self.guild_reward_list or self.guild_normal_reward_list else target_list = self.role_reward_list end for k, v in ipairs(target_list) do if v.rank_min <= rank and v.rank_max >= rank then return v end end end return {is_empty = true} end function GuildCSGRRankView:DestroySuccess( ) if self.tabWindowComponent then self.tabWindowComponent:DeleteMe() self.tabWindowComponent = nil end if self.my_rank_item then self.my_rank_item:DeleteMe() self.my_rank_item = nil end end