using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using Steamworks; using UnityEngine; using UnityEngine.Purchasing; using UnityEngine.Purchasing.Extension; internal class SteamPurchasingModule : IPurchasingModule, IStore { public const string Name = "Steam"; public Dictionary IdTranslator = new Dictionary(StringComparer.OrdinalIgnoreCase); private IStoreCallback storeCallback; private Callback overlayCallback; private bool steamOverlayOpen; private StoreMenu parent; public SteamPurchasingModule(StoreMenu parent) { this.parent = parent; } public void Configure(IPurchasingBinder binder) { binder.RegisterStore("Steam", this); } public void FinishTransaction(ProductDefinition product, string transactionId) { } public void Initialize(IStoreCallback callback) { this.storeCallback = callback; if (!SteamManager.Initialized || !SteamUtils.IsOverlayEnabled()) { this.storeCallback.OnSetupFailed(InitializationFailureReason.PurchasingUnavailable); } this.overlayCallback = Callback.Create(new Callback.DispatchDelegate(this.HandleOverlayActivate)); } private void HandleOverlayActivate(GameOverlayActivated_t param) { this.steamOverlayOpen = (param.m_bActive > 0); } public void Purchase(ProductDefinition product, string developerPayload) { if (!SteamUtils.IsOverlayEnabled()) { this.storeCallback.OnPurchaseFailed(new PurchaseFailureDescription(product.storeSpecificId, PurchaseFailureReason.PurchasingUnavailable, "Steam overlay is disabled, but required for in-game purchasing.")); return; } uint value; if (this.IdTranslator.TryGetValue(product.id, out value)) { AppId_t appId_t = new AppId_t(value); SteamFriends.ActivateGameOverlayToStore(appId_t, EOverlayToStoreFlag.k_EOverlayToStoreFlag_AddToCartAndShow); this.parent.StartCoroutine(this.WaitForDlcPurchase(product, appId_t)); return; } this.storeCallback.OnPurchaseFailed(new PurchaseFailureDescription(product.storeSpecificId, PurchaseFailureReason.ProductUnavailable, "Couldn't find Product Id for " + product.id)); } private IEnumerator WaitForDlcPurchase(ProductDefinition product, AppId_t appId) { while (!this.steamOverlayOpen) { SteamAPI.RunCallbacks(); yield return null; } while (this.steamOverlayOpen) { SteamAPI.RunCallbacks(); yield return null; } ulong num; while (SteamApps.GetDlcDownloadProgress(appId, out num, out num)) { yield return null; } if (SteamApps.BIsDlcInstalled(appId)) { this.storeCallback.OnPurchaseSucceeded(product.id, "FakeReceipt", UnityEngine.Random.value.ToString()); } else { this.storeCallback.OnPurchaseFailed(new PurchaseFailureDescription(product.id, PurchaseFailureReason.UserCancelled, "Steam overlay closed without purchase completing")); } yield break; } public void RetrieveProducts(ReadOnlyCollection products) { if (!SteamManager.Initialized) { return; } List list = new List(products.Count); for (int i = 0; i < products.Count; i++) { ProductDefinition productDefinition = products[i]; uint value; if (this.IdTranslator.TryGetValue(productDefinition.id, out value)) { bool flag = SteamApps.BIsDlcInstalled(new AppId_t(value)); list.Add(new ProductDescription(productDefinition.id, new ProductMetadata("$2.99", null, null, "USD", 1m), flag ? "Bought" : null, null)); } } this.storeCallback.OnProductsRetrieved(list); } }