private IEnumerator <bool> PurchaseStoreItemInternal(string storeId, StoreItem storeItem, Action showStore) { bool isIapItem = storeItem.GetVirtualCurrenyPrice("RM") > 0; if (isIapItem) { #if USING_UNITY_PURCHASING && !UNITY_XBOXONE // Making sure we're properly initialized if (this.IsInitialized == false) { var initialize = this.Initialize(); while (initialize.IsDone == false) { yield return(default(bool)); } // Early out if initialization failed if (initialize.HasError || this.IsInitialized == false) { if (initialize.HasError) { PlayFabMessages.HandleError(initialize.Exception); } yield return(false); yield break; } } var iapPurchaseItem = Lost.IAP.UnityPurchasingManager.Instance.PurchaseProduct(storeItem.ItemId); while (iapPurchaseItem.IsDone == false) { yield return(default(bool)); } if (iapPurchaseItem.HasError) { PlayFabMessages.HandleError(iapPurchaseItem.Exception); } else { if (Debug.isDebugBuild || Application.isEditor) { var purchase = UnityTask <bool> .Run(this.DebugPurchaseStoreItem(iapPurchaseItem.Value)); while (purchase.IsDone == false) { yield return(default(bool)); } yield return(purchase.Value); } else { var purchase = UnityTask <bool> .Run(this.ProcessPurchaseCoroutine(iapPurchaseItem.Value, storeId)); while (purchase.IsDone == false) { yield return(default(bool)); } yield return(purchase.Value); } } #else throw new NotImplementedException("Trying to buy IAP Store Item when USING_UNITY_PURCHASING is not defined!"); #endif } else { string virtualCurrency = storeItem.GetVirtualCurrencyId(); int storeItemCost = storeItem.GetCost(virtualCurrency); bool hasSufficientFunds = PF.VC[virtualCurrency] >= storeItemCost; if (hasSufficientFunds == false) { var messageBoxDialog = PlayFabMessages.ShowInsufficientCurrency(); while (messageBoxDialog.IsDone == false) { yield return(default(bool)); } if (messageBoxDialog.Value == YesNoResult.Yes) { showStore?.Invoke(); } yield break; } var coroutine = this.Do(new PurchaseItemRequest { ItemId = storeItem.ItemId, Price = storeItemCost, VirtualCurrency = virtualCurrency, StoreId = storeId, }); while (coroutine.keepWaiting) { yield return(default(bool)); } bool isSuccessful = coroutine.Value != null; if (isSuccessful) { PF.Inventory.InvalidateUserInventory(); } yield return(isSuccessful); } }