您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

240 行
10 KiB

  1. using System;
  2. using CIG.Extensions;
  3. using CIG.Translation;
  4. using CIGEnums;
  5. using SUISS.Core;
  6. using UnityEngine;
  7. namespace CIG
  8. {
  9. public sealed class PurchaseHandler : MonoBehaviour
  10. {
  11. private void OnDestroy()
  12. {
  13. this.CancelInvoke(new Action(this.TryConsumingPurchases));
  14. this.CancelInvoke(new Action(this.ValidatePurchases));
  15. if (this._store != null)
  16. {
  17. this._store.PurchaseSuccessEvent -= this.OnPurchaseSuccess;
  18. this._store.PurchaseFailedEvent -= this.OnPurchaseFailed;
  19. this._store.PurchaseDeferredEvent -= this.OnPurchaseDeferred;
  20. this._store = null;
  21. }
  22. }
  23. public void Init(IAPStore<CIG3StoreProduct> store)
  24. {
  25. this._store = store;
  26. this._store.PurchaseSuccessEvent += this.OnPurchaseSuccess;
  27. this._store.PurchaseFailedEvent += this.OnPurchaseFailed;
  28. this._store.PurchaseDeferredEvent += this.OnPurchaseDeferred;
  29. this.TryConsumingPurchases();
  30. this.InvokeRepeating(new Action(this.ValidatePurchases), 10f, 600f, true);
  31. }
  32. public void InitiatePurchase(CIG3StoreProduct product, Action purchaseCollectedCallback = null)
  33. {
  34. if (this._store == null)
  35. {
  36. UnityEngine.Debug.LogErrorFormat("Cannot initiate Purchase, PurchaseHandler was never initialized.", new object[0]);
  37. return;
  38. }
  39. //TODODO ¹ºÂòÖ±½Ó³É¹¦
  40. this._store.FirePurchaseSuccessEvent(product);
  41. return;
  42. if (this._store.LoadingError == IAPStoreError.None)
  43. {
  44. if (this._purchaseProductPopup == null)
  45. {
  46. this._purchaseProductPopup = SingletonMonobehaviour<PopupManager>.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("please_wait"), Localization.Key("social_loading"), null, null, null, null, null, false);
  47. SingletonMonobehaviour<CIGSessionRestarter>.Instance.RegisterCriticalProcess(this);
  48. SingletonMonobehaviour<CIGGameStats>.Instance.AddIAPInitiated();
  49. this._purchaseCollectedCallback = purchaseCollectedCallback;
  50. this._store.InitiatePurchase(product);
  51. }
  52. else
  53. {
  54. UnityEngine.Debug.LogError("Purchase failed, Another purchase is still pending.");
  55. }
  56. }
  57. else
  58. {
  59. SingletonMonobehaviour<PopupManager>.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("purchase.failed_title"), Localization.Format(Localization.Key("purchase.failed_desc"), new ILocalizedString[]
  60. {
  61. this.StoreLoadingError
  62. }), Localization.Key("ok"), null, null, null, null, true);
  63. }
  64. }
  65. private void ValidatePurchases()
  66. {
  67. this._store.ValidatePurchases();
  68. }
  69. private void TryConsumingPurchases()
  70. {
  71. CIG3StoreProduct[] unconsumedPurchases = this._store.UnconsumedPurchases;
  72. int num = unconsumedPurchases.Length;
  73. if (num == 0)
  74. {
  75. return;
  76. }
  77. if (SingletonMonobehaviour<PopupManager>.Instance.PopupIsOpen())
  78. {
  79. this.Invoke(new Action(this.TryConsumingPurchases), 60f, false);
  80. return;
  81. }
  82. for (int i = 0; i < num; i++)
  83. {
  84. this.ShowPurchaseSuccessPopup(unconsumedPurchases[i]);
  85. }
  86. }
  87. private void ShowPurchaseSuccessPopup(CIG3StoreProduct Product)
  88. {
  89. Action action = delegate ()
  90. {
  91. this.OnConsumeProduct(Product, SingletonMonobehaviour<CIGStoreManager>.Instance.IAPShopProductConsumer);
  92. };
  93. switch (Product.Category)
  94. {
  95. case StoreProductCategory.Shop:
  96. case StoreProductCategory.ShopSale:
  97. SingletonMonobehaviour<PopupManager>.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("build_purchase_succeeded_title"), Localization.Format(Localization.Key("build_purchase_succeeded_message"), new ILocalizedString[]
  98. {
  99. Product.Currencies.LocalizedString()
  100. }), Localization.Key("ok"), null, action, null, action, true);
  101. break;
  102. case StoreProductCategory.Packs:
  103. SingletonMonobehaviour<PopupManager>.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("build_purchase_succeeded_title"), Localization.Key("build_purchase_succeeded_title"), Localization.Key("ok"), null, action, null, action, true);
  104. break;
  105. case StoreProductCategory.Cranes:
  106. SingletonMonobehaviour<PopupManager>.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("build_purchase_succeeded_title"), Localization.Format(Localization.Key("crane_purchased"), new ILocalizedString[]
  107. {
  108. Localization.Integer(SingletonMonobehaviour<CIGBuilderManager>.Instance.MaxBuildCount + 1)
  109. }), Localization.Key("ok"), null, action, null, action, true);
  110. break;
  111. default:
  112. break;
  113. }
  114. }
  115. private void OnConsumeProduct(CIG3StoreProduct Product, IProductConsumer productConsumer)
  116. {
  117. if (!productConsumer.ConsumeProduct(Product))
  118. {
  119. return;
  120. }
  121. this._store.MarkPurchaseAsConsumed(Product);
  122. SingletonMonobehaviour<CIGGameStats>.Instance.AddIAPPurchased();
  123. StorageController.SaveAll();
  124. productConsumer.FireProductConsumedEvent(Product);
  125. UnityEngine.Debug.Log("IAP handled, purchases marked as consumed.");
  126. if (this._purchaseCollectedCallback != null)
  127. {
  128. this._purchaseCollectedCallback();
  129. this._purchaseCollectedCallback = null;
  130. }
  131. }
  132. private void OnPurchaseSuccess(CIG3StoreProduct Product)
  133. {
  134. if (this._purchaseProductPopup != null)
  135. {
  136. this._purchaseProductPopup.ClosePopup(null, true, true);
  137. this._purchaseProductPopup = null;
  138. }
  139. this.ShowPurchaseSuccessPopup(Product);
  140. SingletonMonobehaviour<CIGSessionRestarter>.Instance.UnregisterCriticalProcess(this);
  141. }
  142. private void OnPurchaseFailed(CIG3StoreProduct product, IAPStorePurchaseFailedError error)
  143. {
  144. if (this._purchaseProductPopup != null)
  145. {
  146. this._purchaseProductPopup.ClosePopup(null, true, true);
  147. this._purchaseProductPopup = null;
  148. }
  149. ILocalizedString localizedString;
  150. switch (error)
  151. {
  152. case IAPStorePurchaseFailedError.StoreLoadingError:
  153. localizedString = this.StoreLoadingError;
  154. goto IL_CA;
  155. case IAPStorePurchaseFailedError.PurchasingUnavailable:
  156. localizedString = Localization.Key("purchase.failed_purchasing_unavailable");
  157. goto IL_CA;
  158. case IAPStorePurchaseFailedError.ExistingPurchasePending:
  159. localizedString = Localization.Key("purchase.failed_pending_purchase");
  160. goto IL_CA;
  161. case IAPStorePurchaseFailedError.ProductUnavailable:
  162. localizedString = Localization.Key("purchase.failed_product_unavailable");
  163. goto IL_CA;
  164. case IAPStorePurchaseFailedError.SignatureInvalid:
  165. localizedString = Localization.Key("purchase.failed_signature_invalid");
  166. goto IL_CA;
  167. case IAPStorePurchaseFailedError.UserCancelled:
  168. localizedString = Localization.Key("purchase.failed_user_cancelled");
  169. goto IL_CA;
  170. case IAPStorePurchaseFailedError.PaymentDeclined:
  171. localizedString = Localization.Key("purchase.failed_payment_declined");
  172. goto IL_CA;
  173. }
  174. localizedString = Localization.EmptyLocalizedString;
  175. IL_CA:
  176. if (product != null)
  177. {
  178. if (error == IAPStorePurchaseFailedError.StoreLoadingError)
  179. {
  180. }
  181. else
  182. {
  183. }
  184. }
  185. SingletonMonobehaviour<PopupManager>.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("purchase.failed_title"), Localization.Format(Localization.Key("purchase.failed_desc"), new ILocalizedString[]
  186. {
  187. localizedString
  188. }), Localization.Key("ok"), null, null, null, null, true);
  189. SingletonMonobehaviour<CIGSessionRestarter>.Instance.UnregisterCriticalProcess(this);
  190. }
  191. private void OnPurchaseDeferred(CIG3StoreProduct product)
  192. {
  193. if (this._purchaseProductPopup != null)
  194. {
  195. this._purchaseProductPopup.ClosePopup(null, true, true);
  196. this._purchaseProductPopup = null;
  197. }
  198. SingletonMonobehaviour<CIGSessionRestarter>.Instance.UnregisterCriticalProcess(this);
  199. }
  200. private ILocalizedString StoreLoadingError
  201. {
  202. get
  203. {
  204. IAPStoreError loadingError = this._store.LoadingError;
  205. if (loadingError == IAPStoreError.PurchasingUnavailable)
  206. {
  207. return Localization.Key("purchase.failed_purchasing_unavailable");
  208. }
  209. if (loadingError != IAPStoreError.StoreInitializing)
  210. {
  211. return Localization.EmptyLocalizedString;
  212. }
  213. return Localization.Key("purchase.failed_internet_connection");
  214. }
  215. }
  216. private const float CONSUMPTION_RETRYTIME = 60f;
  217. private IAPStore<CIG3StoreProduct> _store;
  218. private GenericPopupState _purchaseProductPopup;
  219. private Action _purchaseCollectedCallback;
  220. }
  221. }