using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace TcgEngine.UI { /// /// Leaderboard panel contains the ranking of all top players /// public class LeaderboardPanel : UIPanel { #region 默认排行榜 public RectTransform content; public RankLine line_template; public RankLine my_line; public float line_spacing = 80f; #endregion #region 天梯排行榜 public RectTransform ladderContent; public LadderRankLine ladderLine_template; public LadderRankLine my_ladderLine; public float ladderLine_spacing = 120f; #endregion public Text test_text; public bool isLadderRank = true; public UIPanel defaultRank; public UIPanel ladderRank; public List lines = new List(); public List ladderLines = new List(); private const string DefaultAvatarId = "bear"; private static LeaderboardPanel instance; #region 临时方法 [SerializeField] private Button defaultRankButton; [SerializeField] private Button ladderRankButton; #endregion protected override void Awake() { base.Awake(); instance = this; //lines = scroll_content.GetComponentsInChildren(); my_line.onClick += OnClickLine; InitLines(); #region 临时方法 defaultRankButton.onClick.AddListener(() => { isLadderRank = false; RankPanelColl(); }); ladderRankButton.onClick.AddListener(() => { isLadderRank = true; RankPanelColl(); }); #endregion } private void OnDestroy() { } private void InitLines() { #region 加载默认排行榜 for (int i = 0; i < content.transform.childCount; i++) Destroy(content.transform.GetChild(i).gameObject); int nlines = 100; for (int i = 0; i < nlines; i++) { RankLine line = AddLine(line_template, i); lines.Add(line); } content.sizeDelta = new Vector2(content.sizeDelta.x, nlines * line_spacing + 20f); #endregion #region 加载天梯排行榜 for (int i = 0; i < ladderContent.transform.childCount; i++) Destroy(ladderContent.transform.GetChild(i).gameObject); int ladderNlines = 100; for (int i = 0; i < ladderNlines; i++) { LadderRankLine line = LadderAddLine(ladderLine_template, i); ladderLines.Add(line); } ladderContent.sizeDelta = new Vector2(content.sizeDelta.x, ladderNlines * line_spacing + 20f); #endregion } private RankLine AddLine(RankLine template, int index) { Vector2 pos = Vector2.down * line_spacing; GameObject line = Instantiate(template.gameObject, content); RectTransform rtrans = line.GetComponent(); RankLine rline = line.GetComponent(); rtrans.anchorMin = new Vector2(0.5f, 1f); rtrans.anchorMax = new Vector2(0.5f, 1f); rtrans.anchoredPosition = pos + Vector2.down * index * line_spacing; rline.onClick += OnClickLine; return rline; } private LadderRankLine LadderAddLine(LadderRankLine template, int index) { Vector2 pos = Vector2.down * ladderLine_spacing; GameObject line = Instantiate(template.gameObject, ladderContent); RectTransform rtrans = line.GetComponent(); LadderRankLine lrline = line.GetComponent(); rtrans.anchorMin = new Vector2(0.5f, 1); rtrans.anchorMax = new Vector2(0.5f, 1f); rtrans.anchoredPosition = pos + Vector2.down * index * ladderLine_spacing; lrline.onClick += OnClickLine; return lrline; } private async void RefreshPanel() { my_line.Hide(); foreach (RankLine line in lines) line.Hide(); test_text.enabled = !Authenticator.Get().IsApi(); if (!Authenticator.Get().IsApi()) return; UserData udata = ApiClient.Get().UserData; int index = 0; string url = ApiClient.ServerURL + "/users"; WebResponse res = await ApiClient.Get().SendGetRequest(url); UserData[] users = ApiTool.JsonToArray(res.data); List sorted_users = new List(users); sorted_users.Sort((UserData a, UserData b) => { return b.elo.CompareTo(a.elo); }); int previous_rank = 0; int previous_index = 0; foreach (UserData user in sorted_users) { if (user.permission_level != 1 || user.matches == 0) continue; //Dont show admins and user with no matches if (user.username == udata.username) { my_line.SetLine(user, index + 1, true); } if (index < lines.Count) { RankLine line = lines[index]; int rank_order = (previous_rank == user.elo) ? previous_index : index; line.SetLine(user, rank_order + 1, user.username == udata.username); previous_rank = user.elo; previous_index = rank_order; } index++; } } private async void RefreshLadderPanel() { my_line.Hide(); foreach (LadderRankLine line in ladderLines) line.Hide(); test_text.enabled = !Authenticator.Get().IsApi(); if (!Authenticator.Get().IsApi()) return; UserData udata = ApiClient.Get().UserData; int index = 0; string url = ApiClient.ServerURL + "/ladder/leaderboard"; WebResponse res = await ApiClient.Get().SendGetRequest(url); LadderLeaderboardEntry[] users = ApiTool.JsonToArray(res.data); List sorted_users = new List(users); sorted_users.Sort((a, b) => { return a.position.CompareTo(b.position); }); int previous_rank = 0; int previous_index = 0; if (users == null || users.Length == 0) { Debug.LogError("玩家数据为空"); return; } Debug.Log($"收到排行榜数据,共 {users.Length} 条"); foreach (LadderLeaderboardEntry rankData in sorted_users) { if (rankData.username == udata.username) { my_ladderLine.SetLine(rankData, index + 1, GetAvatar(udata.avatar), rankData.rankId, rankData.rankScore, rankData.stars, true); } if (index < ladderLines.Count) { LadderRankLine line = ladderLines[index]; int rank_order = (previous_rank == rankData.position) ? previous_index : index; line.SetLine(rankData, rank_order + 1,GetAvatar(rankData.avatar), rankData.rankId, rankData.rankScore, rankData.stars, false); previous_rank = rankData.position; previous_index = rank_order; } index++; } } private void RankPanelColl() { if (isLadderRank) { ladderRank.Show(); var lColor = ladderRankButton.image.color; lColor.a = 0.5f; ladderRankButton.image.color = lColor; defaultRank.Hide(); var dColor = defaultRankButton.image.color; dColor.a = 1f; defaultRankButton.image.color = dColor; } else { ladderRank.Hide(); var lColor = ladderRankButton.image.color; lColor.a = 1f; ladderRankButton.image.color = lColor; defaultRank.Show(); var dColor = defaultRankButton.image.color; dColor.a = 0.5f; defaultRankButton.image.color = dColor; } ladderRankButton.enabled = !isLadderRank; defaultRankButton.enabled = isLadderRank; } private void OnClickLine(string username) { } private Sprite GetAvatar(string id) { string targetId = string.IsNullOrEmpty(id) ? DefaultAvatarId : id; AvatarData avaData = AvatarData.Get(targetId); return avaData != null ? avaData.GetAvatar() : null; } public override void Show(bool instant = false) { base.Show(instant); RefreshPanel(); RefreshLadderPanel(); RankPanelColl(); } public void OnClickBack() { Hide(); } public static LeaderboardPanel Get() { return instance; } } }