local UIFriendRechargeInviteList = UIViewClass() local private = {} local FriendIndex = 0 local GuildIndex = 1 local RefershFriendInfoCDTime = 1 --刷新好友信息的时间 秒 -- 已发起邀约-可邀约-不可邀约排序 local function GetSortIndex(acid) local isMyInvitation = MDL.FriendRecharge.GetIsMyInvitationByAcid(acid) local OthersInvitationInfo = MDL.FriendRecharge.GetIsOthersInvitationInfoByAcid(acid) if isMyInvitation then return 0 -- 已邀约 else if OthersInvitationInfo then if not string.isNilOrEmpty(OthersInvitationInfo.completedAcid) and OthersInvitationInfo.completedAcid ~= BattleDataGetter.GetAcID() then return 2 else return 1 end else return 1 end end return 1 end local function SortRechargeFunc(playerInfo_a, playerInfo_b) local sortIndex_a = GetSortIndex(playerInfo_a.acid) local sortIndex_b = GetSortIndex(playerInfo_b.acid) if sortIndex_a == sortIndex_b then local friendRechargeInfo_a = MDL.FriendRecharge.GetFriendRechargeInfo(playerInfo_a.acid) local friendRechargeInfo_b = MDL.FriendRecharge.GetFriendRechargeInfo(playerInfo_b.acid) if friendRechargeInfo_a.rechargeType == friendRechargeInfo_b.rechargeType then if not playerInfo_a.isOnline and playerInfo_b.isOnline then return false elseif not playerInfo_b.isOnline and playerInfo_a.isOnline then return false end end return friendRechargeInfo_a.rechargeType > friendRechargeInfo_b.rechargeType end return sortIndex_a < sortIndex_b end function UIFriendRechargeInviteList:OnCreated() -- 由于三个类型玩家列表数据结构不一致 为避免转换数据造成的堆资源浪费 使用特定大小的通用结构集合 private.MaxShowNum = DataSheetManager.ConstData:GetDataByID("TeamListMax").IntValue end function UIFriendRechargeInviteList:OnOpened(context) self.activityType = context.activityType self.activityId = context.activityId self:RegistSystemEvent(EventID.UI_UpdateFriendInfo, self.RefreshInviteList) self:RegistSystemEvent(EventID.UI_Guild_GuildInfoRefresh, self.RefreshInviteList) self:RegistSystemEvent(EventID.UI_FriendRecharger_RefreshInviteList, self.RefreshInviteList) self:RegistSystemEvent(CTL.RedPoint.RedPointKey.FriendRecharge_Invite, self.RefreshRedPoint) UTL.Toggle.InitToggleGroupByIDS(self.toggle_Tab, "text_toggle", {Const_IDS.IDS_FriendRecharge_Invitation_Hint9, Const_IDS.IDS_FriendRecharge_Invitation_Hint10}) UTL.Toggle.InitToggleGroupByIDS(self.toggle_Type, "text_toggle", {Const_IDS.IDS_TeamUI_ActiveInvitation_Friend, Const_IDS.IDS_TeamUI_ActiveInvitation_Legion}) self.toggle_Tab:SelectIndex(0) self.toggle_Type:SelectIndex(0) self:RefreshRedPoint() end function UIFriendRechargeInviteList:OnBackButtonPressed() self:OnButtonClicked(self.btn_Close) end function UIFriendRechargeInviteList:OnButtonClicked(comp) if comp == self.btn_Close then self:CloseView() end end function UIFriendRechargeInviteList:OnValueChanged(comp, index) if comp == self.toggle_Type then self.currentIndex = index if self.currentIndex == FriendIndex then self:SendRefreshFriendRechargeInfos() elseif self.currentIndex == GuildIndex then MDL.Guild.GetGuildInfoReq() end elseif comp == self.toggle_Tab then self.currentTabIndex = index if self.currentTabIndex == 0 then UIUtils.SetActive(self.toggle_Type.gameObject, true) if self.currentIndex == FriendIndex then self:SendRefreshFriendRechargeInfos() elseif self.currentIndex == GuildIndex then MDL.Guild.GetGuildInfoReq() end elseif self.currentTabIndex == 1 then UIUtils.SetActive(self.toggle_Type.gameObject, false) self:RefreshInvitedList() CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Invite) end end end function UIFriendRechargeInviteList:OnCellInit(scrollRect, index, cellTable, data) CTL.FriendRecharge:SetFriendRechargePlayerInfo(cellTable, data) local memberFriendRechargeInfo = MDL.FriendRecharge.GetFriendRechargeInfo(data.acid) if memberFriendRechargeInfo then if memberFriendRechargeInfo.rechargeType == MDL.FriendRecharge.RechargeType.FRTeam then cellTable.state_RechargeSwitch:SetState(0) elseif memberFriendRechargeInfo.rechargeType == MDL.FriendRecharge.RechargeType.FRSingle then cellTable.state_RechargeSwitch:SetState(1) end cellTable.group_Recharge:SetState((memberFriendRechargeInfo.rechargeType == nil or memberFriendRechargeInfo.rechargeType <= 0) and 0 or 1) else cellTable.group_Recharge:SetState(0) cellTable.state_RechargeSwitch:SetState(0) end if scrollRect == self.loop_InviteList then local isMyInvitation = MDL.FriendRecharge.GetIsMyInvitationByAcid(data.acid) local OthersInvitationInfo = MDL.FriendRecharge.GetIsOthersInvitationInfoByAcid(data.acid, self.currentIndex) if isMyInvitation then cellTable.state_btn:SetState(1) else if OthersInvitationInfo then if not string.isNilOrEmpty(OthersInvitationInfo.completedAcid) and OthersInvitationInfo.completedAcid ~= BattleDataGetter.GetAcID() then if OthersInvitationInfo.rechargeType == MDL.FriendRecharge.RechargeType.FRSingle then cellTable.state_btn:SetState(3) else cellTable.state_btn:SetState(2) end else cellTable.state_btn:SetState(0) end else cellTable.state_btn:SetState(0) end end cellTable.btn_Invite:SetGray(false) elseif scrollRect == self.loop_InvitedList then end end function UIFriendRechargeInviteList:OnCellClicked(scrollRect, index, cellTable, target, data) if scrollRect == self.loop_InviteList then if target == cellTable.btn_Invite then -- 邀请 MDL.FriendRecharge.FriendRechargeFriendOptRequest(self.activityId, MDL.FriendRecharge.FriendOptType.FRInvite, data.acid) elseif target == cellTable.btn_Cancel then -- 取消邀请 MDL.FriendRecharge.FriendRechargeFriendOptRequest(self.activityId, MDL.FriendRecharge.FriendOptType.FRCancelInvite, data.acid) elseif target == cellTable.btn_Chat then -- 私聊 CTL.Friend.PrivateTalkToAcid(data.acid) self:CloseView() end elseif scrollRect == self.loop_InvitedList then if target == cellTable.btn_Refuse then -- 拒绝邀请 local func = function() MDL.FriendRecharge.FriendRechargeFriendOptRequest(self.activityId, MDL.FriendRecharge.FriendOptType.FRRefuse, data.acid) end local tipsStr = string.FormatByIdsId(Const_IDS.IDS_FriendRecharge_Invitation_Hint18, data.name) UTL.MessageBox.ShowOKCancelBox(nil, tipsStr, func, nil) elseif target == cellTable.btn_Agree then -- 接受邀请 local func = function() MDL.FriendRecharge.FriendRechargeFriendOptRequest(self.activityId, MDL.FriendRecharge.FriendOptType.FRAccept, data.acid) self:CloseView() end local tipsStr = string.FormatByIdsId(Const_IDS.IDS_FriendRecharge_Invitation_Hint17, data.name) UTL.MessageBox.ShowOKCancelBox(nil, tipsStr, func, nil) elseif target == cellTable.btn_Chat then -- 私聊 CTL.Friend.PrivateTalkToAcid(data.acid) self:CloseView() end end end function UIFriendRechargeInviteList:RefreshInviteList(playerInfoList) if self.currentTabIndex == 0 then if self.currentIndex == FriendIndex then self:RefreshFriendRechargeInfos() elseif self.currentIndex == GuildIndex then self:RefreshGuildRechargeInfos(playerInfoList) end elseif self.currentTabIndex == 1 then self:RefreshInvitedList() end end function UIFriendRechargeInviteList:RefreshFriendRechargeInfos() if self.currentIndex ~= FriendIndex then return end if self.loop_InviteList.Count > 0 then self.loop_InviteList:ClearCells() end if self.loop_InvitedList.Count > 0 then self.loop_InvitedList:ClearCells() end --MDL.Friend.GetSortedList方法返回的是一个private中的数组,拿到的是表的地址,需要进行深复制 local friends = {} for i, v in ipairs(MDL.Friend.GetSortedList(MDL.Friend.ListType.Friend)) do table.insert(friends, v) end table.sort(friends, SortRechargeFunc) local showLength = #friends >= private.MaxShowNum and private.MaxShowNum or #friends for i = 1, showLength do self.loop_InviteList:AddData(friends[i], 0) end if self.loop_InviteList.Count == 0 then self.state_ChangeList:SetState(2) else self.state_ChangeList:SetState(0) end end function UIFriendRechargeInviteList:RefreshGuildRechargeInfos(guildInfos) if self.currentIndex ~= GuildIndex then return end if self.loop_InviteList.Count > 0 then self.loop_InviteList:ClearCells() end if self.loop_InvitedList.Count > 0 then self.loop_InvitedList:ClearCells() end if guildInfos then self.guildInfos = guildInfos end if not self.guildInfos then self.state_ChangeList:SetState(2) return end --工会基础信息 self.guildBaseInfo = self.guildInfos.listInfo local showLength = #self.guildInfos.members >= private.MaxShowNum and private.MaxShowNum or #self.guildInfos.members local members = {} for _, member in pairs (self.guildInfos.members) do -- 剔除掉自己本身 if member.roleInfo and BattleDataGetter.GetAcID() ~= member.roleInfo.acid then table.insert(members, member.roleInfo) if self.loop_InviteList.Count == showLength then break end end end table.sort(members, SortRechargeFunc) for i = 1, #members do self.loop_InviteList:AddData(members[i], 0) end if self.loop_InviteList.Count == 0 then self.state_ChangeList:SetState(2) else self.state_ChangeList:SetState(0) end end function UIFriendRechargeInviteList:RefreshInvitedList() if self.loop_InviteList.Count > 0 then self.loop_InviteList:ClearCells() end if self.loop_InvitedList.Count > 0 then self.loop_InvitedList:ClearCells() end local invitedPlayerInfoList = {} local invitedList = MDL.FriendRecharge.GetInvitedList() if #invitedList > 0 then for k,v in ipairs(invitedList) do table.insert(invitedPlayerInfoList, MDL.FriendRecharge.GetMemberPlayerInfo(v)) end end local showLength = #invitedPlayerInfoList >= private.MaxShowNum and private.MaxShowNum or #invitedPlayerInfoList table.sort(invitedPlayerInfoList, function(playerInfo_a, playerInfo_b) local friendRechargeInfo_a = MDL.FriendRecharge.GetFriendRechargeInfo(playerInfo_a.acid) local friendRechargeInfo_b = MDL.FriendRecharge.GetFriendRechargeInfo(playerInfo_b.acid) if friendRechargeInfo_a.rechargeType == friendRechargeInfo_b.rechargeType then if not playerInfo_a.isOnline and playerInfo_b.isOnline then return false elseif not playerInfo_b.isOnline and playerInfo_a.isOnline then return false end end return friendRechargeInfo_a.rechargeType > friendRechargeInfo_b.rechargeType end) table.sort(invitedPlayerInfoList, SortRechargeFunc) for i = 1, showLength do self.loop_InvitedList:AddData(invitedPlayerInfoList[i], 0) end if self.loop_InvitedList.Count == 0 then self.state_ChangeList:SetState(2) else self.state_ChangeList:SetState(1) end end --请求好友信息增加一个1s的CD时间 (避免请求压力大) function UIFriendRechargeInviteList:SendRefreshFriendRechargeInfos() if self.lastRefreshFriendInfoStamp == nil then self.lastRefreshFriendInfoStamp = UTL.Time.GetServerTimestamp() MDL.Friend.SendRefreshFriendInfos() else local currentTime = UTL.Time.GetServerTimestamp() if (currentTime - self.lastRefreshFriendInfoStamp) > RefershFriendInfoCDTime then MDL.Friend.SendRefreshFriendInfos() self.lastRefreshFriendInfoStamp = currentTime else self:RefreshFriendRechargeInfos() end end end function UIFriendRechargeInviteList:RefreshRedPoint() self.toggle_Tab:SetRedPoint(1, CTL.RedPoint.GetRedPointActive(CTL.RedPoint.RedPointKey.FriendRecharge_Invite)) end return UIFriendRechargeInviteList