Overhaul leaderboards menu

This commit is contained in:
2025-06-15 16:50:20 -07:00
parent c8fe25e85d
commit 0b1edbe7d4
4 changed files with 3587 additions and 934 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
using UnityEngine;
public class IgnoreRaycast : MonoBehaviour, ICanvasRaycastFilter
{
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera) => false;
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9213dca44899f70ffb449db66c6d1764

View File

@@ -8,35 +8,85 @@ using UnityEngine.UI;
public class LeaderboardsMenu : MonoBehaviour public class LeaderboardsMenu : MonoBehaviour
{ {
public GameObject content;
public TMP_Dropdown showAmountDropdown;
public TMP_Text statusText; public TMP_Text statusText;
public Button backButton;
public Button refreshButton;
public GameObject sampleObject;
private void Awake() public GameObject selectionPanel;
public Button selectionScoreButton;
public Button selectionBerryButton;
public Button selectionBackButton;
public GameObject scorePanel;
public GameObject scoreContent;
public Button scoreBackButton;
public Button scoreRefreshButton;
public GameObject scoreSampleObject;
public GameObject berryPanel;
public GameObject berryContent;
public TMP_Dropdown berryShowTypeDropdown;
public Button berryBackButton;
public Button berryRefreshButton;
public GameObject berrySampleObject;
void Awake()
{ {
GetTopPlayers(0); selectionScoreButton.onClick.AddListener(() => SwitchMenu(1));
showAmountDropdown.onValueChanged.AddListener(value => selectionBerryButton.onClick.AddListener(() => SwitchMenu(2));
{ selectionBackButton.onClick.AddListener(async () => await SceneManager.LoadSceneAsync("MainMenu"));
GetTopPlayers(value);
}); scoreBackButton.onClick.AddListener(() => SwitchMenu(0));
backButton.onClick.AddListener(async () => scoreRefreshButton.onClick.AddListener(() => GetTopPlayersScore());
{
await SceneManager.LoadSceneAsync("MainMenu"); berryShowTypeDropdown.onValueChanged.AddListener(value => GetTopPlayersBerry(value));
}); berryBackButton.onClick.AddListener(() => SwitchMenu(0));
refreshButton.onClick.AddListener(() => berryRefreshButton.onClick.AddListener(() => GetTopPlayersBerry(berryShowTypeDropdown.value));
{
GetTopPlayers(showAmountDropdown.value);
});
} }
async void GetTopPlayers(int showAmount) void SwitchMenu(int menu) {
UpdateStatus(false, "");
foreach (Transform item in scoreContent.transform)
{ {
refreshButton.interactable = false; if (item.gameObject.activeSelf)
showAmountDropdown.interactable = false; {
foreach (Transform item in content.transform) Destroy(item.gameObject);
}
}
foreach (Transform item in berryContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
switch (menu)
{
case 0:
selectionPanel.SetActive(true);
scorePanel.SetActive(false);
berryPanel.SetActive(false);
break;
case 1:
GetTopPlayersScore();
selectionPanel.SetActive(false);
scorePanel.SetActive(true);
berryPanel.SetActive(false);
break;
case 2:
berryShowTypeDropdown.value = 0;
GetTopPlayersBerry(0);
selectionPanel.SetActive(false);
scorePanel.SetActive(false);
berryPanel.SetActive(true);
break;
}
}
async void GetTopPlayersScore()
{
scoreBackButton.interactable = false;
scoreRefreshButton.interactable = false;
foreach (Transform item in scoreContent.transform)
{ {
if (item.gameObject.activeSelf) if (item.gameObject.activeSelf)
{ {
@@ -45,7 +95,7 @@ public class LeaderboardsMenu : MonoBehaviour
} }
UpdateStatus(true, "Loading..."); UpdateStatus(true, "Loading...");
EncryptedWWWForm dataForm = new(); EncryptedWWWForm dataForm = new();
dataForm.AddField("showAmount", showAmount.ToString()); dataForm.AddField("type", "0");
using UnityWebRequest request = UnityWebRequest.Post(SensitiveInfo.SERVER_DATABASE_PREFIX + "getTopPlayers.php", dataForm.GetWWWForm()); using UnityWebRequest request = UnityWebRequest.Post(SensitiveInfo.SERVER_DATABASE_PREFIX + "getTopPlayers.php", dataForm.GetWWWForm());
request.SetRequestHeader("Requester", "BerryDashClient"); request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version); request.SetRequestHeader("ClientVersion", Application.version);
@@ -58,23 +108,21 @@ public class LeaderboardsMenu : MonoBehaviour
if (response == "-999") if (response == "-999")
{ {
UpdateStatus(true, "Server error while fetching data"); UpdateStatus(true, "Server error while fetching data");
return;
} }
else if (response == "-998") else if (response == "-998")
{ {
UpdateStatus(true, "Client version too outdated to access servers"); UpdateStatus(true, "Client version too outdated to access servers");
return;
} }
else if (response == "-997") else if (response == "-997")
{ {
UpdateStatus(true, "Encryption/decryption issues"); UpdateStatus(true, "Encryption/decryption issues");
return;
} }
else if (response == "-1") else if (response == "-1")
{ {
UpdateStatus(true, "Server returned no results"); UpdateStatus(true, "No entries for this leaderboard found!");
return;
} }
else
{
var splitResponse = response.Split(';'); var splitResponse = response.Split(';');
for (int i = 0; i < splitResponse.Length; i++) for (int i = 0; i < splitResponse.Length; i++)
{ {
@@ -86,7 +134,7 @@ public class LeaderboardsMenu : MonoBehaviour
var overlay = split[3]; var overlay = split[3];
var uid = split[4]; var uid = split[4];
var entryInfo = Instantiate(sampleObject, content.transform); 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 playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>(); var playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>();
@@ -119,12 +167,110 @@ public class LeaderboardsMenu : MonoBehaviour
entryInfo.SetActive(true); entryInfo.SetActive(true);
} }
} }
}
else else
{ {
UpdateStatus(true, "Failed to fetch leaderboard stats"); UpdateStatus(true, "Failed to fetch leaderboard stats");
} }
refreshButton.interactable = true; scoreBackButton.interactable = true;
showAmountDropdown.interactable = true; scoreRefreshButton.interactable = true;
}
async void GetTopPlayersBerry(int showAmount)
{
berryShowTypeDropdown.interactable = false;
berryBackButton.interactable = false;
berryRefreshButton.interactable = false;
foreach (Transform item in berryContent.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
UpdateStatus(true, "Loading...");
EncryptedWWWForm dataForm = new();
dataForm.AddField("showType", showAmount.ToString());
dataForm.AddField("type", "1");
using UnityWebRequest request = UnityWebRequest.Post(SensitiveInfo.SERVER_DATABASE_PREFIX + "getTopPlayers.php", dataForm.GetWWWForm());
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 = SensitiveInfo.Decrypt(request.downloadHandler.text, SensitiveInfo.SERVER_RECEIVE_TRANSFER_KEY);
if (response == "-999")
{
UpdateStatus(true, "Server error while fetching data");
}
else if (response == "-998")
{
UpdateStatus(true, "Client version too outdated to access servers");
}
else if (response == "-997")
{
UpdateStatus(true, "Encryption/decryption issues");
}
else if (response == "-1")
{
UpdateStatus(true, "No entries for this leaderboard found!");
}
else
{
var splitResponse = response.Split(';');
for (int i = 0; i < splitResponse.Length; i++)
{
var entry = splitResponse[i];
var split = entry.Split(":");
var username = Encoding.UTF8.GetString(Convert.FromBase64String(split[0]));
var highScore = split[1];
var icon = split[2];
var overlay = split[3];
var uid = split[4];
var entryInfo = Instantiate(berrySampleObject, berryContent.transform);
var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>();
var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>();
var playerOverlayIcon = playerIcon.transform.GetChild(0).GetComponent<Image>();
var highScoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
usernameText.text = $"{username} (#{i + 1})";
highScoreText.text += Tools.FormatWithCommas(highScore);
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + icon);
if (icon == "1")
{
playerIcon.sprite = Tools.GetIconForUser(int.Parse(uid));
}
playerOverlayIcon.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + overlay);
if (overlay == "0")
{
playerOverlayIcon.gameObject.SetActive(false);
}
else if (overlay == "8")
{
playerOverlayIcon.transform.localPosition = new Vector2(-16.56f, 14.81f);
}
else if (overlay == "11")
{
playerOverlayIcon.transform.localPosition = new Vector2(-14.74451f, 20.39122f);
}
else if (overlay == "13")
{
playerOverlayIcon.transform.localPosition = new Vector2(-16.54019f, 14.70365f);
}
entryInfo.SetActive(true);
}
}
}
else
{
UpdateStatus(true, "Failed to fetch leaderboard stats");
}
berryShowTypeDropdown.interactable = true;
berryBackButton.interactable = true;
berryRefreshButton.interactable = true;
} }
private void UpdateStatus(bool enabled, string message = "") private void UpdateStatus(bool enabled, string message = "")