Add purchasing icons

This commit is contained in:
2025-07-16 21:59:41 -07:00
parent 90d5c2d8c2
commit b997eb553e
5 changed files with 101 additions and 21 deletions

View File

@@ -5238,7 +5238,7 @@ GameObject:
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 1 m_IsActive: 0
--- !u!224 &1866125038 --- !u!224 &1866125038
RectTransform: RectTransform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@@ -142,7 +142,7 @@ public class BazookaManager : MonoBehaviour
public void SetCustomBirdIconData(MarketplaceIconStorageType value) public void SetCustomBirdIconData(MarketplaceIconStorageType value)
{ {
if (saveFile["bird"] == null) saveFile["bird"] = new JObject(); if (saveFile["bird"] == null) saveFile["bird"] = new JObject();
saveFile["bird"]["customIcon"] = value.ConvertTo<JObject>(); saveFile["bird"]["customIcon"] = JObject.FromObject(value);
} }
public void UnsetCustomBirdIconData() public void UnsetCustomBirdIconData()

View File

@@ -1,3 +1,5 @@
using System.Collections;
using System.Linq;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
@@ -12,6 +14,8 @@ public class IconMarketplaceDownloadIcon : MonoBehaviour
public Button backButton; public Button backButton;
public GameObject content; public GameObject content;
public GameObject sample; public GameObject sample;
private string statusMessage;
private Coroutine statusRoutine;
void Awake() void Awake()
{ {
@@ -21,6 +25,7 @@ public class IconMarketplaceDownloadIcon : MonoBehaviour
internal void Load() internal void Load()
{ {
GetIcons(); GetIcons();
balanceText.text = "You have " + Tools.FormatWithCommas(BazookaManager.Instance.GetCustomBirdIconData().Balance) + " coins to spend";
} }
async void GetIcons() async void GetIcons()
@@ -32,7 +37,7 @@ public class IconMarketplaceDownloadIcon : MonoBehaviour
Destroy(item.gameObject); Destroy(item.gameObject);
} }
} }
Tools.UpdateStatusText(statusText, "Loading...", Color.white); ShowStatus("Loading...");
using UnityWebRequest request = UnityWebRequest.Get(SensitiveInfo.SERVER_DATABASE_PREFIX + "getMarketplaceIcons.php"); using UnityWebRequest request = UnityWebRequest.Get(SensitiveInfo.SERVER_DATABASE_PREFIX + "getMarketplaceIcons.php");
request.SetRequestHeader("Requester", "BerryDashClient"); request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version); request.SetRequestHeader("ClientVersion", Application.version);
@@ -40,33 +45,33 @@ public class IconMarketplaceDownloadIcon : MonoBehaviour
await request.SendWebRequest(); await request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success) if (request.result != UnityWebRequest.Result.Success)
{ {
Tools.UpdateStatusText(statusText, "Failed to make HTTP request", Color.red); ShowStatus("Failed to make HTTP request");
return; return;
} }
string response = SensitiveInfo.Decrypt(request.downloadHandler.text, SensitiveInfo.SERVER_RECEIVE_TRANSFER_KEY); string response = SensitiveInfo.Decrypt(request.downloadHandler.text, SensitiveInfo.SERVER_RECEIVE_TRANSFER_KEY);
if (response == "-999") if (response == "-999")
{ {
Tools.UpdateStatusText(statusText, "Server error while fetching data", Color.red); ShowStatus("Server error while fetching data");
return; return;
} }
else if (response == "-998") else if (response == "-998")
{ {
Tools.UpdateStatusText(statusText, "Client version too outdated to access servers", Color.red); ShowStatus("Client version too outdated to access servers");
return; return;
} }
else if (response == "-997") else if (response == "-997")
{ {
Tools.UpdateStatusText(statusText, "Encryption/decryption issues", Color.red); ShowStatus("Encryption/decryption issues");
return; return;
} }
else if (response == "-996") else if (response == "-996")
{ {
Tools.UpdateStatusText(statusText, "Can't send requests on self-built instance", Color.red); ShowStatus("Can't send requests on self-built instance");
return; return;
} }
else else
{ {
Tools.UpdateStatusText(statusText, "", Color.red); ShowStatus(null);
var jsonResponse = JArray.Parse(response); var jsonResponse = JArray.Parse(response);
foreach (var item in jsonResponse) foreach (var item in jsonResponse)
{ {
@@ -77,17 +82,89 @@ public class IconMarketplaceDownloadIcon : MonoBehaviour
Tools.RenderFromBase64(entry.Data, newIcon.transform.GetChild(0).GetChild(0).GetComponent<Image>()); Tools.RenderFromBase64(entry.Data, newIcon.transform.GetChild(0).GetChild(0).GetComponent<Image>());
newIcon.transform.GetChild(1).GetComponent<TMP_Text>().text = "Bird Name: " + entry.Name; newIcon.transform.GetChild(1).GetComponent<TMP_Text>().text = "Bird Name: " + entry.Name;
newIcon.transform.GetChild(2).GetComponent<TMP_Text>().text = "Price " + entry.Price + " coin"; newIcon.transform.GetChild(2).GetComponent<TMP_Text>().text = "Price " + entry.Price + " coin";
newIcon.transform.GetChild(3).GetComponent<TMP_Text>().text = "Designer Name: " + entry.CreatorUsername; newIcon.transform.GetChild(3).GetComponent<TMP_Text>().text = "Designer Name: " + ((JObject)item)["username"].ToString();
newIcon.transform.GetChild(4).GetChild(0).GetComponent<TMP_Text>().text = "Purchase";
newIcon.transform.GetChild(4).GetComponent<Button>().onClick.AddListener(() => HandlePurchase(entry)); var btn = newIcon.transform.GetChild(4).GetComponent<Button>();
var btnText = btn.transform.GetChild(0).GetComponent<TMP_Text>();
bool alreadyBought = BazookaManager.Instance.GetCustomBirdIconData().Data.Any(d => d.UUID == entry.UUID);
if (alreadyBought)
{
btn.interactable = false;
btnText.text = "Purchased";
}
else
{
btn.onClick.AddListener(() => HandlePurchase(entry, btn));
btnText.text = "Purchase";
}
newIcon.SetActive(true); newIcon.SetActive(true);
} }
} }
} }
void HandlePurchase(MarketplaceIconType data) void HandlePurchase(MarketplaceIconType data, Button button)
{ {
//will work on this MarketplaceIconStorageType marketplaceIconStorage = BazookaManager.Instance.GetCustomBirdIconData();
if (data.Price > marketplaceIconStorage.Balance)
{
ShowStatus("You can't afford this icon! You need " + (data.Price - marketplaceIconStorage.Balance) + " more coins");
return;
}
var list = marketplaceIconStorage.Data.ToList();
list.Add(data);
marketplaceIconStorage.Data = list.ToArray();
marketplaceIconStorage.Balance -= data.Price;
button.interactable = false;
button.transform.GetChild(0).GetComponent<TMP_Text>().text = "Purchased";
balanceText.text = "You have " + Tools.FormatWithCommas(marketplaceIconStorage.Balance) + " coins to spend";
BazookaManager.Instance.SetCustomBirdIconData(marketplaceIconStorage);
}
void ShowStatus(string content)
{
if (content == null)
{
if (statusRoutine != null) StopCoroutine(statusRoutine);
statusText.gameObject.SetActive(false);
statusText.text = "";
}
statusMessage = content;
if (statusRoutine != null) StopCoroutine(statusRoutine);
statusRoutine = StartCoroutine(StatusRoutine());
}
IEnumerator StatusRoutine()
{
statusText.gameObject.SetActive(true);
statusText.text = statusMessage;
statusText.color = new Color(statusText.color.r, statusText.color.g, statusText.color.b, 0f);
float t = 0f;
while (t < 0.5f)
{
t += Time.deltaTime;
float a = t / 0.5f;
statusText.color = new Color(statusText.color.r, statusText.color.g, statusText.color.b, a);
yield return null;
}
yield return new WaitForSeconds(2f);
t = 0f;
while (t < 0.5f)
{
t += Time.deltaTime;
float a = 1f - (t / 0.5f);
statusText.color = new Color(statusText.color.r, statusText.color.g, statusText.color.b, a);
yield return null;
}
statusText.gameObject.SetActive(false);
statusText.text = "";
statusRoutine = null;
} }
} }

View File

@@ -48,11 +48,17 @@ public class IconMarketplaceManager : MonoBehaviour
uploadPanel.SetActive(false); uploadPanel.SetActive(false);
break; break;
case 1: case 1:
downloadPanelScript.Load(); foreach (Transform item in downloadPanelScript.content.transform)
downloadPanelScript.balanceText.text = "You have " + Tools.FormatWithCommas(BazookaManager.Instance.GetCustomBirdIconData().Balance) + " coins to spend"; {
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
normalPanel.SetActive(false); normalPanel.SetActive(false);
downloadPanel.SetActive(true); downloadPanel.SetActive(true);
uploadPanel.SetActive(false); uploadPanel.SetActive(false);
downloadPanelScript.Load();
break; break;
case 2: case 2:
uploadPanelScript.Reset(); uploadPanelScript.Reset();

View File

@@ -1,16 +1,13 @@
using System.Numerics;
using Newtonsoft.Json; using Newtonsoft.Json;
public class MarketplaceIconType { public class MarketplaceIconType {
[JsonProperty("username")]
public string CreatorUsername { get; set; }
[JsonProperty("userid")]
public string CreatorUserID { get; set; }
[JsonProperty("data")] [JsonProperty("data")]
public string Data { get; set; } public string Data { get; set; }
[JsonProperty("uuid")] [JsonProperty("uuid")]
public string UUID { get; set; } public string UUID { get; set; }
[JsonProperty("price")] [JsonProperty("price")]
public int Price { get; set; } public BigInteger Price { get; set; }
[JsonProperty("name")] [JsonProperty("name")]
public string Name { get; set; } public string Name { get; set; }
} }