191 lines
8.4 KiB
C#
191 lines
8.4 KiB
C#
using Newtonsoft.Json.Linq;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
using UnityEngine.Networking;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.UI;
|
|
|
|
public class LeaderboardsMenu : MonoBehaviour
|
|
{
|
|
[SerializeField] private TMP_Text statusText;
|
|
[SerializeField] private Button backButton;
|
|
[SerializeField] private Button refreshButton;
|
|
[SerializeField] private ProfileMenu profilePrefab;
|
|
|
|
[SerializeField] private GameObject selectionPanel;
|
|
[SerializeField] private Button selectionScoreButton;
|
|
[SerializeField] private Button selectionBerryButton;
|
|
[SerializeField] private Button selectionCoinButton;
|
|
[SerializeField] private Button selectionLegacyButton;
|
|
[SerializeField] private Button selectionTotalBerriesButton;
|
|
|
|
[SerializeField] private GameObject scoresPanel;
|
|
[SerializeField] private GameObject content;
|
|
[SerializeField] private GameObject sampleObject;
|
|
[SerializeField] private TMP_Dropdown berryShowTypeDropdown;
|
|
|
|
private LeaderboardMode mode = LeaderboardMode.None;
|
|
private bool changedByCode = false;
|
|
|
|
void Awake()
|
|
{
|
|
selectionScoreButton.onClick.AddListener(() => { mode = LeaderboardMode.Score; SwitchMenu(1); });
|
|
selectionBerryButton.onClick.AddListener(() => { mode = LeaderboardMode.Berry; SwitchMenu(1); });
|
|
selectionCoinButton.onClick.AddListener(() => { mode = LeaderboardMode.Coin; SwitchMenu(1); });
|
|
selectionLegacyButton.onClick.AddListener(() => { mode = LeaderboardMode.Legacy; SwitchMenu(1); });
|
|
selectionTotalBerriesButton.onClick.AddListener(() => { mode = LeaderboardMode.TotalBerries; SwitchMenu(1); });
|
|
berryShowTypeDropdown.onValueChanged.AddListener(_ => GetTopPlayers());
|
|
|
|
backButton.onClick.AddListener(async () =>
|
|
{
|
|
if (selectionPanel.activeSelf) await SceneManager.LoadSceneAsync("MainMenu");
|
|
else if (scoresPanel.activeSelf) SwitchMenu(0);
|
|
});
|
|
refreshButton.onClick.AddListener(GetTopPlayers);
|
|
}
|
|
|
|
void SwitchMenu(int menu)
|
|
{
|
|
UpdateStatus(false, "");
|
|
if (!selectionPanel.activeSelf)
|
|
{
|
|
foreach (Transform item in content.transform)
|
|
{
|
|
if (item.gameObject.activeSelf)
|
|
{
|
|
Destroy(item.gameObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (menu == 0)
|
|
{
|
|
mode = LeaderboardMode.None;
|
|
refreshButton.gameObject.SetActive(false);
|
|
selectionPanel.SetActive(true);
|
|
scoresPanel.SetActive(false);
|
|
}
|
|
else if (menu == 1)
|
|
{
|
|
refreshButton.transform.localPosition = mode == LeaderboardMode.Berry ? new Vector2(402.5f, 282.33f) : new Vector2(-402.5f, -282.33f);
|
|
refreshButton.gameObject.SetActive(true);
|
|
berryShowTypeDropdown.gameObject.SetActive(mode == LeaderboardMode.Berry);
|
|
changedByCode = true;
|
|
berryShowTypeDropdown.value = 0;
|
|
changedByCode = false;
|
|
selectionPanel.SetActive(false);
|
|
scoresPanel.SetActive(true);
|
|
GetTopPlayers();
|
|
}
|
|
}
|
|
|
|
async void GetTopPlayers()
|
|
{
|
|
if (changedByCode) return;
|
|
backButton.interactable = false;
|
|
refreshButton.interactable = false;
|
|
foreach (Transform item in content.transform)
|
|
{
|
|
if (item.gameObject.activeSelf)
|
|
{
|
|
Destroy(item.gameObject);
|
|
}
|
|
}
|
|
UpdateStatus(true, "Loading...");
|
|
using UnityWebRequest request = UnityWebRequest.Get(mode == LeaderboardMode.Score
|
|
? Endpoints.LEADERBOARDS_SCORE_ENDPOINT
|
|
: mode == LeaderboardMode.Berry
|
|
? Endpoints.LEADERBOARDS_BERRY_ENDPOINT + "?berry=" + berryShowTypeDropdown.value
|
|
: mode == LeaderboardMode.Coin
|
|
? Endpoints.LEADERBOARDS_COIN_ENDPOINT
|
|
: mode == LeaderboardMode.Legacy
|
|
? Endpoints.LEADERBOARDS_LEGACY_ENDPOINT
|
|
: Endpoints.LEADERBOARDS_TOTAL_ENDPOINT);
|
|
request.SetRequestHeader("Requester", "BerryDashClient");
|
|
request.SetRequestHeader("ClientVersion", Application.version);
|
|
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
|
|
await request.SendWebRequest();
|
|
if (request.downloadHandler.text == null)
|
|
{
|
|
UpdateStatus(true, "Failed to fetch leaderboard stats");
|
|
return;
|
|
}
|
|
UpdateStatus(false);
|
|
var jsonResponse = JObject.Parse(request.downloadHandler.text);
|
|
if ((bool)jsonResponse["success"])
|
|
{
|
|
var entries = jsonResponse["data"].ToObject<LeaderboardEntry[]>();
|
|
for (int i = 0; i < entries.Length; i++)
|
|
{
|
|
var entry = entries[i];
|
|
var entryInfo = Instantiate(sampleObject, content.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 playerOverlay = playerIcon.transform.GetChild(0).GetComponent<Image>();
|
|
var scoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
|
|
|
|
usernameText.text = $"{entry.Username} (#{i + 1})";
|
|
scoreText.text = (mode == LeaderboardMode.Berry || mode == LeaderboardMode.TotalBerries ? "Berries: " : mode == LeaderboardMode.Coin ? "Coins: " : "Score: ") + Tools.FormatWithCommas(entry.Value);
|
|
|
|
if (BazookaManager.Instance.GetAccountID() == entry.UserID)
|
|
{
|
|
usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>";
|
|
scoreText.text = $"<color=#7FFFD4>{scoreText.text}</color>";
|
|
}
|
|
|
|
if (entry.CustomIcon == null)
|
|
{
|
|
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + entry.Icon);
|
|
if (entry.Icon == 1) playerIcon.sprite = Tools.GetIconForUser(entry.UserID);
|
|
playerOverlay.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + entry.Overlay);
|
|
if (entry.Overlay != 0) playerOverlay.gameObject.SetActive(true);
|
|
if (entry.Overlay == 8) playerOverlay.transform.localPosition = new Vector2(-16.56f, 14.81f);
|
|
else if (entry.Overlay == 11) playerOverlay.transform.localPosition = new Vector2(-14.74451f, 20.39122f);
|
|
else if (entry.Overlay == 13) playerOverlay.transform.localPosition = new Vector2(-16.54019f, 14.70365f);
|
|
try
|
|
{
|
|
playerIcon.color = new Color(entry.BirdColor[0] / 255f, entry.BirdColor[1] / 255f, entry.BirdColor[2] / 255f);
|
|
playerOverlay.color = new Color(entry.BirdColor[0] / 255f, entry.BirdColor[1] / 255f, entry.BirdColor[2] / 255f);
|
|
}
|
|
catch
|
|
{
|
|
playerIcon.color = Color.white;
|
|
playerOverlay.color = Color.white;
|
|
}
|
|
}
|
|
else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = entry.CustomIcon;
|
|
playerIconButton.onClick.AddListener(async () =>
|
|
{
|
|
var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent);
|
|
clone.SetActive(true);
|
|
await clone.GetComponent<ProfileMenu>().Init(entry.UserID);
|
|
});
|
|
entryInfo.SetActive(true);
|
|
}
|
|
CustomIconLoader.Init(FindObjectsByType<WaitingForCustomIcon>(FindObjectsSortMode.None));
|
|
}
|
|
else
|
|
{
|
|
UpdateStatus(true, (string)jsonResponse["message"]);
|
|
}
|
|
backButton.interactable = true;
|
|
refreshButton.interactable = true;
|
|
}
|
|
|
|
private void UpdateStatus(bool enabled, string message = "")
|
|
{
|
|
statusText.gameObject.SetActive(enabled);
|
|
statusText.text = message;
|
|
}
|
|
|
|
async void Update()
|
|
{
|
|
if (Keyboard.current.escapeKey.wasPressedThisFrame && FindFirstObjectByType<ProfileMenu>() == null)
|
|
{
|
|
if (!selectionPanel.activeSelf) SwitchMenu(0);
|
|
else await SceneManager.LoadSceneAsync("MainMenu");
|
|
}
|
|
}
|
|
} |