Fix + massively improve the leaderboards script/menu

This commit is contained in:
2026-02-02 14:29:09 -07:00
parent d2e6885692
commit 7d7228f49a
4 changed files with 1000 additions and 5029 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,4 @@
using System; using System;
using System.Numerics;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
@@ -22,99 +21,36 @@ public class LeaderboardsMenu : MonoBehaviour
[SerializeField] private Button selectionLegacyButton; [SerializeField] private Button selectionLegacyButton;
[SerializeField] private Button selectionTotalBerriesButton; [SerializeField] private Button selectionTotalBerriesButton;
[SerializeField] private GameObject scorePanel; [SerializeField] private GameObject scoresPanel;
[SerializeField] private GameObject scoreContent; [SerializeField] private GameObject content;
[SerializeField] private GameObject scoreSampleObject; [SerializeField] private GameObject sampleObject;
[SerializeField] private GameObject berryPanel;
[SerializeField] private GameObject berryContent;
[SerializeField] private TMP_Dropdown berryShowTypeDropdown; [SerializeField] private TMP_Dropdown berryShowTypeDropdown;
[SerializeField] private GameObject berrySampleObject;
[SerializeField] private GameObject coinPanel; private int mode = -1;
[SerializeField] private GameObject coinContent;
[SerializeField] private GameObject coinSampleObject;
[SerializeField] private GameObject legacyPanel;
[SerializeField] private GameObject legacyContent;
[SerializeField] private GameObject legacySampleObject;
[SerializeField] private GameObject totalBerriesPanel;
[SerializeField] private GameObject totalBerriesContent;
[SerializeField] private GameObject totalBerriesSampleObject;
void Awake() void Awake()
{ {
selectionScoreButton.onClick.AddListener(() => SwitchMenu(1)); selectionScoreButton.onClick.AddListener(() => { mode = 0; SwitchMenu(1); });
selectionBerryButton.onClick.AddListener(() => SwitchMenu(2)); selectionBerryButton.onClick.AddListener(() => { mode = 1; SwitchMenu(1); });
selectionCoinButton.onClick.AddListener(() => SwitchMenu(3)); selectionCoinButton.onClick.AddListener(() => { mode = 2; SwitchMenu(1); });
selectionLegacyButton.onClick.AddListener(() => SwitchMenu(4)); selectionLegacyButton.onClick.AddListener(() => { mode = 3; SwitchMenu(1); });
selectionTotalBerriesButton.onClick.AddListener(() => SwitchMenu(5)); selectionTotalBerriesButton.onClick.AddListener(() => { mode = 4; SwitchMenu(1); });
berryShowTypeDropdown.onValueChanged.AddListener(_ => GetTopPlayers());
berryShowTypeDropdown.onValueChanged.AddListener(value => GetTopPlayersBerry(value));
backButton.onClick.AddListener(async () => backButton.onClick.AddListener(async () =>
{ {
if (selectionPanel.activeSelf) await SceneManager.LoadSceneAsync("MainMenu"); if (selectionPanel.activeSelf) await SceneManager.LoadSceneAsync("MainMenu");
else if (scorePanel.activeSelf || berryPanel.activeSelf || coinPanel.activeSelf || legacyPanel.activeSelf || totalBerriesPanel.activeSelf) SwitchMenu(0); else if (scoresPanel.activeSelf) SwitchMenu(0);
});
refreshButton.onClick.AddListener(() =>
{
if (scorePanel.activeSelf) GetTopPlayersScore();
else if (berryPanel.activeSelf) GetTopPlayersBerry(berryShowTypeDropdown.value);
else if (coinPanel.activeSelf) GetTopPlayersCoin();
else if (legacyPanel.activeSelf) GetTopPlayersLegacy();
else if (totalBerriesPanel.activeSelf) GetTopPlayersTotalBerries();
}); });
refreshButton.onClick.AddListener(GetTopPlayers);
} }
void SwitchMenu(int menu) void SwitchMenu(int menu)
{ {
UpdateStatus(false, ""); UpdateStatus(false, "");
if (scorePanel.activeSelf) if (!selectionPanel.activeSelf)
{ {
foreach (Transform item in scoreContent.transform) foreach (Transform item in content.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
}
else if (berryPanel.activeSelf)
{
foreach (Transform item in berryContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
}
else if (coinPanel.activeSelf)
{
foreach (Transform item in coinContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
}
else if (legacyPanel.activeSelf)
{
foreach (Transform item in legacyContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
}
else if (totalBerriesPanel.activeSelf)
{
foreach (Transform item in totalBerriesContent.transform)
{ {
if (item.gameObject.activeSelf) if (item.gameObject.activeSelf)
{ {
@@ -123,81 +59,30 @@ public class LeaderboardsMenu : MonoBehaviour
} }
} }
switch (menu) if (menu == 0)
{ {
case 0: mode = -1;
refreshButton.gameObject.SetActive(false); refreshButton.gameObject.SetActive(false);
selectionPanel.SetActive(true); selectionPanel.SetActive(true);
scorePanel.SetActive(false); scoresPanel.SetActive(false);
berryPanel.SetActive(false); }
coinPanel.SetActive(false); else if (menu == 1)
legacyPanel.SetActive(false); {
totalBerriesPanel.SetActive(false); refreshButton.transform.localPosition = mode == 1 ? new Vector2(402.5f, 282.33f) : new Vector2(-402.5f, -282.33f);
break; refreshButton.gameObject.SetActive(true);
case 1: berryShowTypeDropdown.gameObject.SetActive(mode == 1);
refreshButton.transform.localPosition = new UnityEngine.Vector2(-402.5f, -282.33f); berryShowTypeDropdown.value = 0;
refreshButton.gameObject.SetActive(true); selectionPanel.SetActive(false);
GetTopPlayersScore(); scoresPanel.SetActive(true);
selectionPanel.SetActive(false); GetTopPlayers();
scorePanel.SetActive(true);
berryPanel.SetActive(false);
coinPanel.SetActive(false);
legacyPanel.SetActive(false);
totalBerriesPanel.SetActive(false);
break;
case 2:
refreshButton.transform.localPosition = new UnityEngine.Vector2(402.5f, 282.33f);
refreshButton.gameObject.SetActive(true);
berryShowTypeDropdown.value = 0;
GetTopPlayersBerry(0);
selectionPanel.SetActive(false);
scorePanel.SetActive(false);
berryPanel.SetActive(true);
coinPanel.SetActive(false);
legacyPanel.SetActive(false);
totalBerriesPanel.SetActive(false);
break;
case 3:
refreshButton.transform.localPosition = new UnityEngine.Vector2(-402.5f, -282.33f);
refreshButton.gameObject.SetActive(true);
GetTopPlayersCoin();
selectionPanel.SetActive(false);
scorePanel.SetActive(false);
berryPanel.SetActive(false);
coinPanel.SetActive(true);
legacyPanel.SetActive(false);
totalBerriesPanel.SetActive(false);
break;
case 4:
refreshButton.transform.localPosition = new UnityEngine.Vector2(-402.5f, -282.33f);
refreshButton.gameObject.SetActive(true);
GetTopPlayersLegacy();
selectionPanel.SetActive(false);
scorePanel.SetActive(false);
berryPanel.SetActive(false);
coinPanel.SetActive(false);
legacyPanel.SetActive(true);
totalBerriesPanel.SetActive(false);
break;
case 5:
refreshButton.transform.localPosition = new UnityEngine.Vector2(-402.5f, -282.33f);
refreshButton.gameObject.SetActive(true);
GetTopPlayersTotalBerries();
selectionPanel.SetActive(false);
scorePanel.SetActive(false);
berryPanel.SetActive(false);
coinPanel.SetActive(false);
legacyPanel.SetActive(false);
totalBerriesPanel.SetActive(true);
break;
} }
} }
async void GetTopPlayersScore() async void GetTopPlayers()
{ {
backButton.interactable = false; backButton.interactable = false;
refreshButton.interactable = false; refreshButton.interactable = false;
foreach (Transform item in scoreContent.transform) foreach (Transform item in content.transform)
{ {
if (item.gameObject.activeSelf) if (item.gameObject.activeSelf)
{ {
@@ -205,7 +90,15 @@ public class LeaderboardsMenu : MonoBehaviour
} }
} }
UpdateStatus(true, "Loading..."); UpdateStatus(true, "Loading...");
using UnityWebRequest request = UnityWebRequest.Get(Endpoints.LEADERBOARDS_SCORE_ENDPOINT); using UnityWebRequest request = UnityWebRequest.Get(mode == 0
? Endpoints.LEADERBOARDS_SCORE_ENDPOINT
: mode == 1
? Endpoints.LEADERBOARDS_BERRY_ENDPOINT + "?berry=" + berryShowTypeDropdown.value
: mode == 2
? Endpoints.LEADERBOARDS_COIN_ENDPOINT
: mode == 3
? Endpoints.LEADERBOARDS_LEGACY_ENDPOINT
: Endpoints.LEADERBOARDS_TOTAL_ENDPOINT);
request.SetRequestHeader("Requester", "BerryDashClient"); request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version); request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString()); request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
@@ -219,481 +112,50 @@ public class LeaderboardsMenu : MonoBehaviour
var jsonResponse = JObject.Parse(response); var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"]) if ((bool)jsonResponse["success"])
{ {
var entries = (JObject)jsonResponse["data"]; foreach (var entry in jsonResponse["data"].ToObject<LeaderboardEntry[]>())
foreach (var prop in entries.Properties())
{ {
JObject entry = (JObject)prop.Value; var entryInfo = Instantiate(sampleObject, content.transform);
var username = (string)entry["username"];
var highScore = BigInteger.Parse((string)entry["value"]);
var icon = (int)entry["icon"];
var overlay = (int)entry["overlay"];
var uid = BigInteger.Parse(prop.Name);
var birdColor = (JArray)entry["birdColor"];
var overlayColor = (JArray)entry["overlayColor"];
var customIcon = (string)entry["customIcon"];
var entryInfo = Instantiate(scoreSampleObject, scoreContent.transform);
var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>(); var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>();
var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>(); var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>();
var playerIconButton = usernameText.transform.GetChild(0).GetComponent<Button>(); var playerIconButton = usernameText.transform.GetChild(0).GetComponent<Button>();
var playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>(); var playerOverlay = playerIcon.transform.GetChild(0).GetComponent<Image>();
var highScoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>(); var scoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
usernameText.text = $"{username} (#{uid + 1})"; usernameText.text = $"{entry.Username} (#{entry.UserID + 1})";
highScoreText.text += Tools.FormatWithCommas(highScore); scoreText.text = (mode == 2 ? "Coins: " : "Berries: ") + Tools.FormatWithCommas(entry.Value);
if (BazookaManager.Instance.GetAccountID() == uid) if (BazookaManager.Instance.GetAccountID() == entry.UserID)
{ {
usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>"; usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>";
highScoreText.text = $"<color=#7FFFD4>{highScoreText.text}</color>"; scoreText.text = $"<color=#7FFFD4>{scoreText.text}</color>";
} }
if (customIcon == null) if (entry.CustomIcon == null)
{ {
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + icon); playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + entry.Icon);
if (icon == 1) playerIcon.sprite = Tools.GetIconForUser(uid); if (entry.Icon == 1) playerIcon.sprite = Tools.GetIconForUser(entry.UserID);
playerOverlayIcon.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + overlay); playerOverlay.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + entry.Overlay);
if (overlay != 0) playerOverlayIcon.gameObject.SetActive(true); if (entry.Overlay != 0) playerOverlay.gameObject.SetActive(true);
if (overlay == 8) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.56f, 14.81f); if (entry.Overlay == 8) playerOverlay.transform.localPosition = new Vector2(-16.56f, 14.81f);
else if (overlay == 11) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-14.74451f, 20.39122f); else if (entry.Overlay == 11) playerOverlay.transform.localPosition = new Vector2(-14.74451f, 20.39122f);
else if (overlay == 13) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.54019f, 14.70365f); else if (entry.Overlay == 13) playerOverlay.transform.localPosition = new Vector2(-16.54019f, 14.70365f);
try try
{ {
playerIcon.color = new Color((int)birdColor[0] / 255f, (int)birdColor[1] / 255f, (int)birdColor[2] / 255f); playerIcon.color = new Color(entry.BirdColor[0] / 255f, entry.BirdColor[1] / 255f, entry.BirdColor[2] / 255f);
playerOverlayIcon.color = new Color((int)overlayColor[0] / 255f, (int)overlayColor[1] / 255f, (int)overlayColor[2] / 255f); playerOverlay.color = new Color(entry.BirdColor[0] / 255f, entry.BirdColor[1] / 255f, entry.BirdColor[2] / 255f);
} }
catch catch
{ {
playerIcon.color = Color.white; playerIcon.color = Color.white;
playerOverlayIcon.color = Color.white; playerOverlay.color = Color.white;
} }
} }
else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = customIcon; else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = entry.CustomIcon;
playerIconButton.onClick.AddListener(async () => playerIconButton.onClick.AddListener(async () =>
{ {
var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent); var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent);
clone.SetActive(true); clone.SetActive(true);
await clone.GetComponent<ProfileMenu>().Init(uid); await clone.GetComponent<ProfileMenu>().Init(entry.UserID);
});
entryInfo.SetActive(true);
}
CustomIconLoader.Init(FindObjectsByType<WaitingForCustomIcon>(FindObjectsSortMode.None));
}
else
{
UpdateStatus(true, (string)jsonResponse["message"]);
}
}
catch (Exception e)
{
UpdateStatus(true, "Failed to fetch leaderboard stats: " + e);
}
}
else
{
UpdateStatus(true, "Failed to fetch leaderboard stats");
}
backButton.interactable = true;
refreshButton.interactable = true;
}
async void GetTopPlayersBerry(int showAmount)
{
berryShowTypeDropdown.interactable = false;
backButton.interactable = false;
refreshButton.interactable = false;
foreach (Transform item in berryContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
UpdateStatus(true, "Loading...");
using UnityWebRequest request = UnityWebRequest.Get(Endpoints.LEADERBOARDS_BERRY_ENDPOINT + "?berry=" + showAmount.ToString());
request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
await request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
UpdateStatus(false);
string response = request.downloadHandler.text;
try
{
var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"])
{
var entries = (JObject)jsonResponse["data"];
foreach (var prop in entries.Properties())
{
JObject entry = (JObject)prop.Value;
var username = (string)entry["username"];
var highScore = BigInteger.Parse((string)entry["value"]);
var icon = (int)entry["icon"];
var overlay = (int)entry["overlay"];
var uid = BigInteger.Parse(prop.Name);
var birdColor = (JArray)entry["birdColor"];
var overlayColor = (JArray)entry["overlayColor"];
var customIcon = (string)entry["customIcon"];
var entryInfo = Instantiate(berrySampleObject, berryContent.transform);
var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>();
var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>();
var playerIconButton = usernameText.transform.GetChild(0).GetComponent<Button>();
var playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>();
var highScoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
usernameText.text = $"{username} (#{uid + 1})";
highScoreText.text += Tools.FormatWithCommas(highScore);
if (BazookaManager.Instance.GetAccountID() == uid)
{
usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>";
highScoreText.text = $"<color=#7FFFD4>{highScoreText.text}</color>";
}
if (customIcon == null)
{
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + icon);
if (icon == 1) playerIcon.sprite = Tools.GetIconForUser(uid);
playerOverlayIcon.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + overlay);
if (overlay != 0) playerOverlayIcon.gameObject.SetActive(true);
if (overlay == 8) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.56f, 14.81f);
else if (overlay == 11) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-14.74451f, 20.39122f);
else if (overlay == 13) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.54019f, 14.70365f);
try
{
playerIcon.color = new Color((int)birdColor[0] / 255f, (int)birdColor[1] / 255f, (int)birdColor[2] / 255f);
playerOverlayIcon.color = new Color((int)overlayColor[0] / 255f, (int)overlayColor[1] / 255f, (int)overlayColor[2] / 255f);
}
catch
{
playerIcon.color = Color.white;
playerOverlayIcon.color = Color.white;
}
}
else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = customIcon;
playerIconButton.onClick.AddListener(async () =>
{
var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent);
clone.SetActive(true);
await clone.GetComponent<ProfileMenu>().Init(uid);
});
entryInfo.SetActive(true);
}
CustomIconLoader.Init(FindObjectsByType<WaitingForCustomIcon>(FindObjectsSortMode.None));
}
else
{
UpdateStatus(true, (string)jsonResponse["message"]);
}
}
catch (Exception e)
{
UpdateStatus(true, "Failed to fetch leaderboard stats: " + e);
}
}
else
{
UpdateStatus(true, "Failed to fetch leaderboard stats");
}
berryShowTypeDropdown.interactable = true;
backButton.interactable = true;
refreshButton.interactable = true;
}
async void GetTopPlayersCoin()
{
backButton.interactable = false;
refreshButton.interactable = false;
foreach (Transform item in coinContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
UpdateStatus(true, "Loading...");
using UnityWebRequest request = UnityWebRequest.Get(Endpoints.LEADERBOARDS_COIN_ENDPOINT);
request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
await request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
UpdateStatus(false);
string response = request.downloadHandler.text;
try
{
var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"])
{
var entries = (JObject)jsonResponse["data"];
foreach (var prop in entries.Properties())
{
JObject entry = (JObject)prop.Value;
var username = (string)entry["username"];
var highScore = BigInteger.Parse((string)entry["value"]);
var icon = (int)entry["icon"];
var overlay = (int)entry["overlay"];
var uid = BigInteger.Parse(prop.Name);
var birdColor = (JArray)entry["birdColor"];
var overlayColor = (JArray)entry["overlayColor"];
var customIcon = (string)entry["customIcon"];
var entryInfo = Instantiate(coinSampleObject, coinContent.transform);
var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>();
var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>();
var playerIconButton = usernameText.transform.GetChild(0).GetComponent<Button>();
var playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>();
var highScoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
usernameText.text = $"{username} (#{uid + 1})";
highScoreText.text += Tools.FormatWithCommas(highScore);
if (BazookaManager.Instance.GetAccountID() == uid)
{
usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>";
highScoreText.text = $"<color=#7FFFD4>{highScoreText.text}</color>";
}
if (customIcon == null)
{
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + icon);
if (icon == 1) playerIcon.sprite = Tools.GetIconForUser(uid);
playerOverlayIcon.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + overlay);
if (overlay != 0) playerOverlayIcon.gameObject.SetActive(true);
if (overlay == 8) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.56f, 14.81f);
else if (overlay == 11) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-14.74451f, 20.39122f);
else if (overlay == 13) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.54019f, 14.70365f);
try
{
playerIcon.color = new Color((int)birdColor[0] / 255f, (int)birdColor[1] / 255f, (int)birdColor[2] / 255f);
playerOverlayIcon.color = new Color((int)overlayColor[0] / 255f, (int)overlayColor[1] / 255f, (int)overlayColor[2] / 255f);
}
catch
{
playerIcon.color = Color.white;
playerOverlayIcon.color = Color.white;
}
}
else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = customIcon;
playerIconButton.onClick.AddListener(async () =>
{
var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent);
clone.SetActive(true);
await clone.GetComponent<ProfileMenu>().Init(uid);
});
entryInfo.SetActive(true);
}
CustomIconLoader.Init(FindObjectsByType<WaitingForCustomIcon>(FindObjectsSortMode.None));
}
else
{
UpdateStatus(true, (string)jsonResponse["message"]);
}
}
catch (Exception e)
{
UpdateStatus(true, "Failed to fetch leaderboard stats: " + e);
}
}
else
{
UpdateStatus(true, "Failed to fetch leaderboard stats");
}
backButton.interactable = true;
refreshButton.interactable = true;
}
async void GetTopPlayersLegacy()
{
backButton.interactable = false;
refreshButton.interactable = false;
foreach (Transform item in legacyContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
UpdateStatus(true, "Loading...");
using UnityWebRequest request = UnityWebRequest.Get(Endpoints.LEADERBOARDS_LEGACY_ENDPOINT);
request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
await request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
UpdateStatus(false);
string response = request.downloadHandler.text;
try
{
var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"])
{
var entries = (JObject)jsonResponse["data"];
foreach (var prop in entries.Properties())
{
JObject entry = (JObject)prop.Value;
var username = (string)entry["username"];
var highScore = BigInteger.Parse((string)entry["value"]);
var icon = (int)entry["icon"];
var overlay = (int)entry["overlay"];
var uid = BigInteger.Parse(prop.Name);
var birdColor = (JArray)entry["birdColor"];
var overlayColor = (JArray)entry["overlayColor"];
var customIcon = (string)entry["customIcon"];
var entryInfo = Instantiate(legacySampleObject, legacyContent.transform);
var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>();
var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>();
var playerIconButton = usernameText.transform.GetChild(0).GetComponent<Button>();
var playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>();
var highScoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
usernameText.text = $"{username} (#{uid + 1})";
highScoreText.text += Tools.FormatWithCommas(highScore);
if (BazookaManager.Instance.GetAccountID() == uid)
{
usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>";
highScoreText.text = $"<color=#7FFFD4>{highScoreText.text}</color>";
}
if (customIcon == null)
{
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + icon);
if (icon == 1) playerIcon.sprite = Tools.GetIconForUser(uid);
playerOverlayIcon.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + overlay);
if (overlay != 0) playerOverlayIcon.gameObject.SetActive(true);
if (overlay == 8) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.56f, 14.81f);
else if (overlay == 11) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-14.74451f, 20.39122f);
else if (overlay == 13) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.54019f, 14.70365f);
try
{
playerIcon.color = new Color((int)birdColor[0] / 255f, (int)birdColor[1] / 255f, (int)birdColor[2] / 255f);
playerOverlayIcon.color = new Color((int)overlayColor[0] / 255f, (int)overlayColor[1] / 255f, (int)overlayColor[2] / 255f);
}
catch
{
playerIcon.color = Color.white;
playerOverlayIcon.color = Color.white;
}
}
else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = customIcon;
playerIconButton.onClick.AddListener(async () =>
{
var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent);
clone.SetActive(true);
await clone.GetComponent<ProfileMenu>().Init(uid);
});
entryInfo.SetActive(true);
}
CustomIconLoader.Init(FindObjectsByType<WaitingForCustomIcon>(FindObjectsSortMode.None));
}
else
{
UpdateStatus(true, (string)jsonResponse["message"]);
}
}
catch (Exception e)
{
UpdateStatus(true, "Failed to fetch leaderboard stats: " + e);
}
}
else
{
UpdateStatus(true, "Failed to fetch leaderboard stats");
}
backButton.interactable = true;
refreshButton.interactable = true;
}
async void GetTopPlayersTotalBerries()
{
backButton.interactable = false;
refreshButton.interactable = false;
foreach (Transform item in totalBerriesContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
UpdateStatus(true, "Loading...");
WWWForm dataForm = new();
dataForm.AddField("type", "4");
using UnityWebRequest request = UnityWebRequest.Get(Endpoints.LEADERBOARDS_TOTAL_ENDPOINT);
request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
await request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
UpdateStatus(false);
string response = request.downloadHandler.text;
try
{
var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"])
{
var entries = (JObject)jsonResponse["data"];
foreach (var prop in entries.Properties())
{
JObject entry = (JObject)prop.Value;
var username = (string)entry["username"];
var highScore = BigInteger.Parse((string)entry["value"]);
var icon = (int)entry["icon"];
var overlay = (int)entry["overlay"];
var uid = BigInteger.Parse(prop.Name);
var birdColor = (JArray)entry["birdColor"];
var overlayColor = (JArray)entry["overlayColor"];
var customIcon = (string)entry["customIcon"];
var entryInfo = Instantiate(totalBerriesSampleObject, totalBerriesContent.transform);
var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>();
var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>();
var playerIconButton = usernameText.transform.GetChild(0).GetComponent<Button>();
var playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>();
var highScoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
usernameText.text = $"{username} (#{uid + 1})";
highScoreText.text += Tools.FormatWithCommas(highScore);
if (BazookaManager.Instance.GetAccountID() == uid)
{
usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>";
highScoreText.text = $"<color=#7FFFD4>{highScoreText.text}</color>";
}
if (customIcon == null)
{
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + icon);
if (icon == 1) playerIcon.sprite = Tools.GetIconForUser(uid);
playerOverlayIcon.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + overlay);
if (overlay != 0) playerOverlayIcon.gameObject.SetActive(true);
if (overlay == 8) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.56f, 14.81f);
else if (overlay == 11) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-14.74451f, 20.39122f);
else if (overlay == 13) playerOverlayIcon.transform.localPosition = new UnityEngine.Vector2(-16.54019f, 14.70365f);
try
{
playerIcon.color = new Color((int)birdColor[0] / 255f, (int)birdColor[1] / 255f, (int)birdColor[2] / 255f);
playerOverlayIcon.color = new Color((int)overlayColor[0] / 255f, (int)overlayColor[1] / 255f, (int)overlayColor[2] / 255f);
}
catch
{
playerIcon.color = Color.white;
playerOverlayIcon.color = Color.white;
}
}
else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = customIcon;
playerIconButton.onClick.AddListener(async () =>
{
var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent);
clone.SetActive(true);
await clone.GetComponent<ProfileMenu>().Init(uid);
}); });
entryInfo.SetActive(true); entryInfo.SetActive(true);
} }

View File

@@ -0,0 +1,39 @@
using System.Numerics;
using Newtonsoft.Json;
using UnityEngine.Scripting;
[Preserve]
public class LeaderboardEntry
{
[Preserve]
[JsonProperty("id")]
public BigInteger UserID { get; set; }
[Preserve]
[JsonProperty("username")]
public string Username { get; set; }
[Preserve]
[JsonProperty("value")]
public BigInteger Value { get; set; }
[Preserve]
[JsonProperty("icon")]
public int Icon { get; set; }
[Preserve]
[JsonProperty("overlay")]
public int Overlay { get; set; }
[Preserve]
[JsonProperty("birdColor")]
public int[] BirdColor { get; set; }
[Preserve]
[JsonProperty("overlayColor")]
public int[] OverlayColor { get; set; }
[Preserve]
[JsonProperty("customIcon")]
public string CustomIcon { get; set; }
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c59a6226bb2d44d36aeb40cf5340bbb9