using System; using System.Collections; using System.Collections.Generic; using System.Linq; using PowerTools; using UnityEngine; using UnityEngine.Purchasing; using UnityEngine.Purchasing.Extension; public class StoreMenu : MonoBehaviour, IStoreListener { public PurchaseStates PurchaseState { get; private set; } public SpriteRenderer HatSlot; public SpriteRenderer SkinSlot; public SpriteAnim PetSlot; public TextRenderer ItemName; public SpriteRenderer PurchaseBackground; public TextRenderer PriceText; public PurchaseButton PurchasablePrefab; public SpriteRenderer HortLinePrefab; public TextRenderer LoadingText; public TextRenderer RestorePurchasesButton; public GameObject RestorePurchasesObj; public SpriteRenderer BannerPrefab; public Sprite HatBanner; public Sprite SkinsBanner; public Sprite HolidayBanner; public Sprite PetsBanner; public SpriteRenderer TopArrow; public SpriteRenderer BottomArrow; public const string BoughtAdsProductId = "bought_ads"; private IStoreController controller; private IExtensionProvider extensions; public Scroller Scroller; public Vector2 StartPositionVertical; public FloatRange XRange = new FloatRange(-1f, 1f); public int NumPerRow = 4; private PurchaseButton CurrentButton; private List AllObjects = new List(); private const float NormalHeight = -0.45f; private const float BoxHeight = -0.75f; public void Start() { this.PetSlot.gameObject.SetActive(false); SteamPurchasingModule steamPurchasingModule = new SteamPurchasingModule(this); foreach (PetBehaviour petBehaviour in DestroyableSingleton.Instance.AllPets) { if (petBehaviour.SteamId != 0U) { steamPurchasingModule.IdTranslator.Add(petBehaviour.ProdId, petBehaviour.SteamId); } } ConfigurationBuilder configurationBuilder = ConfigurationBuilder.Instance(steamPurchasingModule, Array.Empty()); foreach (PetBehaviour petBehaviour2 in DestroyableSingleton.Instance.AllPets) { if (!petBehaviour2.Free) { configurationBuilder.AddProduct(petBehaviour2.ProdId, ProductType.NonConsumable); } } UnityPurchasing.Initialize(this, configurationBuilder); this.PurchaseBackground.color = new Color(0.5f, 0.5f, 0.5f, 1f); this.PriceText.Color = new Color(0.8f, 0.8f, 0.8f, 1f); this.PriceText.Text = ""; } public void Update() { this.TopArrow.enabled = !this.Scroller.AtTop; this.BottomArrow.enabled = !this.Scroller.AtBottom; } public void RestorePurchases() { } private void DestroySliderObjects() { for (int i = 0; i < this.AllObjects.Count; i++) { UnityEngine.Object.Destroy(this.AllObjects[i]); } this.AllObjects.Clear(); } private void FinishRestoring() { this.ShowAllButtons(); this.RestorePurchasesButton.Text = "Purchases Restored"; } public void SetProduct(PurchaseButton button) { if (this.PurchaseState == PurchaseStates.Started) { return; } this.CurrentButton = button; if (this.CurrentButton.Product is HatBehaviour) { HatBehaviour hatBehaviour = (HatBehaviour)this.CurrentButton.Product; this.HatSlot.gameObject.SetActive(true); this.SkinSlot.gameObject.SetActive(false); this.PetSlot.gameObject.SetActive(false); PlayerControl.SetHatImage(hatBehaviour, this.HatSlot); this.ItemName.Text = (string.IsNullOrWhiteSpace(hatBehaviour.StoreName) ? hatBehaviour.name : hatBehaviour.StoreName); if (hatBehaviour.RelatedSkin) { TextRenderer itemName = this.ItemName; itemName.Text += " (Includes skin!)"; this.SkinSlot.gameObject.SetActive(true); PlayerControl.SetSkinImage(hatBehaviour.RelatedSkin, this.SkinSlot); } } else if (this.CurrentButton.Product is SkinData) { SkinData skinData = (SkinData)this.CurrentButton.Product; this.SkinSlot.gameObject.SetActive(true); this.HatSlot.gameObject.SetActive(true); this.PetSlot.gameObject.SetActive(false); PlayerControl.SetHatImage(skinData.RelatedHat, this.HatSlot); PlayerControl.SetSkinImage(skinData, this.SkinSlot); this.ItemName.Text = (string.IsNullOrWhiteSpace(skinData.StoreName) ? skinData.name : skinData.StoreName); } else if (this.CurrentButton.Product is PetBehaviour) { PetBehaviour petBehaviour = (PetBehaviour)this.CurrentButton.Product; this.SkinSlot.gameObject.SetActive(false); this.HatSlot.gameObject.SetActive(false); this.PetSlot.gameObject.SetActive(true); SpriteRenderer component = this.PetSlot.GetComponent(); component.material = new Material(petBehaviour.rend.sharedMaterial); PlayerControl.SetPlayerMaterialColors((int)SaveManager.BodyColor, component); this.PetSlot.Play(petBehaviour.idleClip, 1f); this.ItemName.Text = (string.IsNullOrWhiteSpace(petBehaviour.StoreName) ? petBehaviour.name : petBehaviour.StoreName); } else { this.HatSlot.gameObject.SetActive(false); this.SkinSlot.gameObject.SetActive(false); this.PetSlot.gameObject.SetActive(false); this.ItemName.Text = "Remove All Ads"; } if (button.Purchased) { this.PurchaseBackground.color = new Color(0.5f, 0.5f, 0.5f, 1f); this.PriceText.Color = new Color(0.8f, 0.8f, 0.8f, 1f); this.PriceText.Text = "Owned"; return; } this.PurchaseBackground.color = Color.white; this.PriceText.Color = Color.white; this.PriceText.Text = button.Price; } public void BuyProduct() { if (!this.CurrentButton || this.CurrentButton.Purchased || this.PurchaseState == PurchaseStates.Started) { return; } base.StartCoroutine(this.WaitForPurchaseAds(this.CurrentButton)); } public IEnumerator WaitForPurchaseAds(PurchaseButton button) { this.PurchaseState = PurchaseStates.Started; this.controller.InitiatePurchase(button.ProductId); while (this.PurchaseState == PurchaseStates.Started) { yield return null; } if (this.PurchaseState == PurchaseStates.Success) { foreach (PurchaseButton purchaseButton in from p in this.AllObjects select p.GetComponent() into h where h && h.ProductId == button.ProductId select h) { purchaseButton.SetPurchased(); } } this.SetProduct(button); yield break; } public void Close() { HatsTab hatsTab = UnityEngine.Object.FindObjectOfType(); if (hatsTab) { hatsTab.OnDisable(); hatsTab.OnEnable(); } base.gameObject.SetActive(false); } private void ShowAllButtons() { this.DestroySliderObjects(); string text = ""; try { text = "Couldn't fetch products"; foreach (Product product in this.controller.products.all) { if (product != null && product.hasReceipt) { try { SaveManager.SetPurchased(product.definition.id); } catch { } } } Vector3 vector = this.StartPositionVertical; UnityEngine.Object.Destroy(this.RestorePurchasesObj); text = "Couldn't fetch products"; text = "Couldn't fetch pet data"; vector.y += -0.375f; PetBehaviour[] array = (from h in DestroyableSingleton.Instance.AllPets where !h.Free select h into p orderby p.StoreName select p).ToArray(); vector = this.InsertBanner(vector, this.PetsBanner); Vector3 position = vector; Product[] all; Product[] allProducts = all; IBuyable[] hats = array; vector = this.InsertHatsFromList(position, allProducts, hats); text = "Couldn't finalize menu"; this.Scroller.YBounds.max = Mathf.Max(0f, -vector.y - 2.5f); this.LoadingText.gameObject.SetActive(false); } catch (Exception ex) { Debug.Log(string.Concat(new object[] { "Exception: ", text, ": ", ex })); this.DestroySliderObjects(); this.LoadingText.gameObject.SetActive(true); this.LoadingText.Text = "Loading Failed:\r\n" + text; } } private Vector3 InsertHortLine(Vector3 position) { position.x = 1.2f; SpriteRenderer spriteRenderer = UnityEngine.Object.Instantiate(this.HortLinePrefab, this.Scroller.Inner); spriteRenderer.transform.localPosition = position; spriteRenderer.gameObject.SetActive(true); position.y += -0.33749998f; return position; } private Vector3 InsertHatsFromList(Vector3 position, Product[] allProducts, IBuyable[] hats) { int num = 0; for (int i = 0; i < hats.Length; i++) { IBuyable item = hats[i]; Product product = allProducts.FirstOrDefault((Product p) => item.ProdId == p.definition.id); if (product != null && product.definition != null && product.availableToPurchase) { int num2 = num % this.NumPerRow; position.x = this.StartPositionVertical.x + this.XRange.Lerp((float)num2 / ((float)this.NumPerRow - 1f)); if (num2 == 0 && num > 1) { position.y += -0.75f; } this.InsertProduct(position, product, item); num++; } } position.y += -0.75f; return position; } private void InsertProduct(Vector3 position, Product product, IBuyable item) { PurchaseButton purchaseButton = UnityEngine.Object.Instantiate(this.PurchasablePrefab, this.Scroller.Inner); this.AllObjects.Add(purchaseButton.gameObject); purchaseButton.transform.localPosition = position; purchaseButton.Parent = this; PurchaseButton purchaseButton2 = purchaseButton; string id = product.definition.id; ProductMetadata metadata = product.metadata; string name; if (metadata == null) { name = null; } else { string localizedTitle = metadata.localizedTitle; name = ((localizedTitle != null) ? localizedTitle.Replace("(Among Us)", "") : null); } ProductMetadata metadata2 = product.metadata; purchaseButton2.SetItem(item, id, name, (metadata2 != null) ? metadata2.localizedPriceString : null, product.hasReceipt || SaveManager.GetPurchase(product.definition.id)); } private Vector3 InsertBanner(Vector3 position, Sprite s) { position.x = this.StartPositionVertical.x; SpriteRenderer spriteRenderer = UnityEngine.Object.Instantiate(this.BannerPrefab, this.Scroller.Inner); spriteRenderer.sprite = s; spriteRenderer.transform.localPosition = position; position.y += -spriteRenderer.sprite.bounds.size.y; this.AllObjects.Add(spriteRenderer.gameObject); return position; } public void OnInitialized(IStoreController controller, IExtensionProvider extensions) { this.controller = controller; this.extensions = extensions; if (this.controller == null || this.controller.products == null) { this.LoadingText.Text = "Product controller\r\nfailed to load"; return; } this.ShowAllButtons(); } public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e) { this.PurchaseState = PurchaseStates.Success; SaveManager.SetPurchased(e.purchasedProduct.definition.id); return PurchaseProcessingResult.Complete; } public void OnInitializeFailed(InitializationFailureReason error) { this.RestorePurchasesObj.SetActive(false); this.LoadingText.gameObject.SetActive(true); if (error == InitializationFailureReason.NoProductsAvailable) { this.LoadingText.Text = "Coming Soon!"; return; } if (error == InitializationFailureReason.PurchasingUnavailable) { this.LoadingText.Text = "Loading Failed:\r\nSteam must be running and logged in to view products."; return; } this.LoadingText.Text = "Loading Failed:\r\n" + error; } public void OnPurchaseFailed(Product i, PurchaseFailureReason error) { if (error == PurchaseFailureReason.ProductUnavailable) { this.DestroySliderObjects(); this.LoadingText.gameObject.SetActive(true); this.LoadingText.Text = "Coming Soon!"; } else if (error == PurchaseFailureReason.PurchasingUnavailable) { this.DestroySliderObjects(); this.LoadingText.gameObject.SetActive(true); this.LoadingText.Text = "Steam overlay is required for in-game purchasing. You can still buy and install DLC in Steam."; } else { this.DestroySliderObjects(); this.LoadingText.gameObject.SetActive(true); this.LoadingText.Text = "Loading Failed:\r\n" + error; } Debug.LogError("Failed: " + error); this.PurchaseState = PurchaseStates.Fail; } }