コード例 #1
0
        protected virtual void OnUserDataComplete(GetUserDataResult result)
        {
            Debug.Log("MetaLoopGameManager User Data downloaded...");

            if (result != null && result.Data.ContainsKey(MetaStateSettings._MetaDataStateFileName) && !string.IsNullOrEmpty(result.Data[MetaStateSettings._MetaDataStateFileName].Value))
            {
                //being able to retreive userData confirm that user can't be a new user.
                IsNewInstall = false;

                MetaDataStateBase onlineData = (MetaDataStateBase)JsonConvert.DeserializeObject(result.Data[MetaStateSettings._MetaDataStateFileName].Value, MetaStateSettings.PolymorhTypes[typeof(MetaDataStateBase)]);

                if (onlineData.Version > GameData.Current.MetaDataState.Version || forceCloudVersionFromAccountSync)
                {
                    MetaDataStateBase.LoadData(onlineData);
                    GameData.Current.OverwriteMetaDataState(onlineData);
                }
                else
                {
                    MetaDataStateBase.LoadData(GameData.Current.MetaDataState);
                }
            }
            else
            {
                MetaDataStateBase.LoadData(GameData.Current.MetaDataState);
            }

            OnGameDataAndBackOfficeReady();
        }
コード例 #2
0
        private static void HandleShopResult(CloudScriptResponse response, MetaDataStateBase metaDataState, ShopTransactionItem shopTransactionItem, Action <ShopRequestResult> callBack, bool isIAP = false)
        {
            ShopRequestResult result = null;

            if (response.ResponseCode == ResponseCode.Success && response.Params != null && response.Params.ContainsKey("ShopRequestResult"))
            {
                result = JsonConvert.DeserializeObject <ShopRequestResult>(response.Params["ShopRequestResult"].ToString()) as ShopRequestResult;

                if (result.Result == GenericRequestRewardResultType.Success)
                {
                    shopTransactionItem.Result = GenericRequestRewardResultType.Success;

                    if (result.GetCost() != null && result.GetCost().ConsumableCostItems.Count > 0)
                    {
                        metaDataState.Consumables.SpendConsumables(result.GetCost().ConsumableCostItems);
                    }

                    foreach (RewardDataItem entry in result.GetReward())
                    {
                        metaDataState.Consumables.AddConsumable(entry.Consumable, entry.Amount, isIAP ? "InAppPurchase" : string.Empty);
                    }
                }
            }

            shopTransactionItem.SetTransactionTime();
            metaDataState.ShopState.AllTransactions.Add(shopTransactionItem);

            //result with error code.
            if (result == null)
            {
                result = new ShopRequestResult();
            }

            callBack.Invoke(result);
        }
コード例 #3
0
        public DailyObjectiveStatus GetObjectiveStatus(MetaDataStateBase state)
        {
            var stateItem = GetObjectiveState(state);

            if (stateItem != null)
            {
                if (stateItem.Claimed)
                {
                    return(DailyObjectiveStatus.Claimed);
                }
                if (LevelRequired > 0 && state.PlayerLevel.LevelId < LevelRequired)
                {
                    return(DailyObjectiveStatus.Unavailabe);
                }

                if (stateItem.Count >= CountRequired)
                {
                    return(DailyObjectiveStatus.CanBeClaimed);
                }

                return(DailyObjectiveStatus.Availabe);
            }

            return(DailyObjectiveStatus.Unavailabe);
        }
コード例 #4
0
        public int GetCurrentCount(MetaDataStateBase state)
        {
            var stateItem = GetAchievementStateItem(state);

            if (stateItem == null)
            {
                return(0);
            }
            return(stateItem.Count);
        }
コード例 #5
0
        public static void ValidateIAP(MetaDataStateBase metaDataState, string internalId, string receiptID, bool isOffer, Action <ShopRequestResult> callBack)
        {
            ShopTransactionItem shopTransactionItem = new ShopTransactionItem(ShopItemType.HardCurrency, internalId);
            string            platformType          = UnityEngine.Application.platform.ToString();
            CloudScriptMethod cloudScriptMethod     = new CloudScriptMethod("Shop/ValidateIAP", false);

            cloudScriptMethod.Params.Add("internalId", internalId);
            cloudScriptMethod.Params.Add("receiptID", receiptID);
            cloudScriptMethod.Params.Add("platformType", platformType);
            PlayFabManager.Instance.InvokeBackOffice(cloudScriptMethod, (CloudScriptResponse r, CloudScriptMethod m) => HandleShopResult(r, metaDataState, shopTransactionItem, callBack, true));
        }
コード例 #6
0
        public bool EvaluateRequirement(MetaDataStateBase state, DateTime utcNow)
        {
#if !BACKOFFICE
            if (Duration > 0 && utcNow < EndTime && CanBeListedInOffers)
            {
                return(true);
            }
#endif

            if (LevelMin > 0 && LevelMax > 0)
            {
                if (state.PlayerLevel.LevelId < LevelMin || state.PlayerLevel.LevelId > LevelMax)
                {
                    return(false);
                }
            }

            if (AgeMin > 0 && AgeMax > 0)
            {
                if (AgeMin < state.LoginCalendar.Count || state.LoginCalendar.Count > AgeMax)
                {
                    return(false);
                }
            }


            if (LowSoftCurrencyThreshold > 0)
            {
                if (state.Consumables.GetConsumableAmount(Consumable.GetByName(MetaStateSettings._SoftCurrencyId)) > LowSoftCurrencyThreshold)
                {
                    return(false);
                }
            }

            if (LowHardCurrencyThreshold > 0)
            {
                if (state.Consumables.GetConsumableAmount(Consumable.GetByName(MetaStateSettings._HardCurrencyId)) > LowHardCurrencyThreshold)
                {
                    return(false);
                }
            }

            if (LowEnergyThreshold > 0)
            {
                if (state.Consumables.GetConsumableAmount(Consumable.GetByName(MetaStateSettings._EnergyId)) > LowEnergyThreshold)
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #7
0
        public static ReceiptValidationResult ValidateAndroidReceipt(MetaDataStateBase playerState, string receipt)
        {
            if (string.IsNullOrEmpty(LicenseKeyAsXml))
            {
                RSACryptoServiceProvider provider = PEMKeyLoader.CryptoServiceProviderFromPublicKeyInfo(MetaStateSettings._GoogleLicenseKey);
                LicenseKeyAsXml = provider.ToXmlString(false);
            }

            var purchaseReceipt = JsonConvert.DeserializeObject <Dictionary <string, object> >(receipt);

            var store         = (string)purchaseReceipt["Store"];
            var payload       = (string)purchaseReceipt["Payload"];
            var transactionId = (string)purchaseReceipt["TransactionID"];

            var details = JsonConvert.DeserializeObject <Dictionary <string, object> >(payload);
            var json    = (string)details["json"];      // This is the INAPP_PURCHASE_DATA information
            var sig     = (string)details["signature"]; // This is the INAPP_DATA_SIGNATURE information

            var orderId = (string)JsonConvert.DeserializeObject <Dictionary <string, object> >(json)["orderId"];

            if (playerState.ShopState.AllTransactions.Where(y => y.ValidationId == transactionId).Count() == 0)
            {
                bool result = false;
                try
                {
                    // Create the provider and load the KEY
                    RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
                    provider.FromXmlString(LicenseKeyAsXml);

                    // The signature is supposed to be encoded in base64 and the SHA1 checksum
                    // Of the message is computed against the UTF-8 representation of the
                    // message
                    byte[]      signature = Convert.FromBase64String(sig);
                    SHA1Managed sha       = new SHA1Managed();
                    byte[]      data      = Encoding.UTF8.GetBytes(json);

                    result = provider.VerifyData(data, sha, signature);
                }
                catch (Exception /* e */) { /* TODO: add some kind of logging here */ }

                if (result && transactionId == orderId)
                {
                    return(new ReceiptValidationResult()
                    {
                        Validated = true, UniqueId = transactionId
                    });
                }
            }

            return(new ReceiptValidationResult());
        }
コード例 #8
0
        public int GetCompletion(MetaDataStateBase state)
        {
            float completion = (float)((float)GetCurrentCount(state)) / ((float)RequirementCount) * 100f;

            if (completion < 0)
            {
                completion = 0;
            }
            if (completion > 100)
            {
                completion = 100;
            }


            return((int)completion);
        }
コード例 #9
0
        protected virtual void OnUserDataComplete(GetUserDataResult result)
        {
            Debug.Log("MetaLoopGameManager User Data downloaded...");

            if (result != null && result.Data.ContainsKey(MetaStateSettings._MetaDataStateFileName))
            {
                var gameDataObject = JsonConvert.DeserializeObject(result.Data[MetaStateSettings._MetaDataStateFileName].Value, MetaStateSettings.PolymorhTypes[typeof(MetaDataStateBase)]);
                MetaDataStateBase.LoadData((MetaDataStateBase)gameDataObject);

                OnGameDataAndBackOfficeReady();
            }
            else
            {
                ShowUnavailableMessage(GameUnavailableMessageType.BACKOFFICE_ERROR);
            }
        }
コード例 #10
0
        public static ReceiptValidationResult ValidateAppleReceipt(MetaDataStateBase playerState, string receipt, bool isProduction)
        {
            var purchaseReceipt = JsonConvert.DeserializeObject <Dictionary <string, object> >(receipt);

            var payload       = (string)purchaseReceipt["Payload"];
            var transactionId = (string)purchaseReceipt["TransactionID"];

            ReceiptValidationResult receiptValidationResult = SendAppleReceiptValidationRequest(payload, isProduction);

            if (receiptValidationResult.Validated && !string.IsNullOrEmpty(receiptValidationResult.UniqueId))
            {
                if (playerState.ShopState.AllTransactions.Where(y => y.ValidationId == transactionId).Count() == 0)
                {
                    return(receiptValidationResult);
                }
            }

            return(new ReceiptValidationResult());
        }
コード例 #11
0
        public override async Task <CloudScriptResponse> ExecuteAsync(CloudScriptRequest request, string[] urlArguments)
        {
            DateTime benginRequest = DateTime.UtcNow;

            string playFabId   = urlArguments[0];
            string placementId = urlArguments[1];
            string eventId     = urlArguments[2];

            var cloudData = new PlayFabFileDetails(MetaSettings.MetaDataStateFileName);

            if (await PlayFabApiHandler.GetPlayerTitleData(playFabId, new List <PlayFabFileDetails>()
            {
                cloudData
            }))
            {
                MetaDataState state = MetaDataStateBase.FromJson <MetaDataState>(cloudData.DataAsString);

                AdPlacementType adPlacementType = (AdPlacementType)(Enum.Parse(typeof(AdPlacementType), placementId));
                //state.AdState.RegisterAdWatch(adPlacementType, state, () => AdData.GetAdRewardForTypeMethod(adPlacementType, state));

                cloudData.DataAsString = state.ToJson();

                if (await PlayFabApiHandler.UploadPlayerTitleData(playFabId, new List <PlayFabFileDetails>()
                {
                    cloudData
                }))
                {
                    CloudScriptResponse cloudScriptResponse = new CloudScriptResponse()
                    {
                        ResponseCode = ResponseCode.Success, Method = this.GetType().Name
                    };
                    cloudScriptResponse.Params.Add("status", eventId + ":OK");
                    return(cloudScriptResponse);
                }
            }

            return(new CloudScriptResponse()
            {
                ResponseCode = ResponseCode.Error
            });
        }
コード例 #12
0
        public static ConsumableCost GetVariableCost(VariableCostDataType costType, MetaDataStateBase state)
        {
            VariableCostData costData;
            int purchaseCount = state.ShopState.GetVariableCostData(costType) + 1;

            costData = DataLayer.Instance.GetTable(MetaStateSettings.PolymorhTypes[typeof(VariableCostData)]).Cast <VariableCostData>().Where(y => y.PurchaseType == costType && y.PurchaseCount == purchaseCount).SingleOrDefault();

            if (costData == null)
            {
                costData = DataLayer.Instance.GetTable(MetaStateSettings.PolymorhTypes[typeof(VariableCostData)]).Cast <VariableCostData>().Where(y => y.PurchaseType == costType).OrderBy(y => y.PurchaseCount).Last();
            }

            ConsumableCost result = new ConsumableCost(true);

            if (costData.SecondaryConsumable == null)
            {
                result.ConsumableCostItems.Add(new ConsumableCostItem()
                {
                    ConsumableId = costData.PrimaryConsumable.ConsumableId, Ammount = costData.PrimaryConsumable.Ammount
                });
            }
            else
            {
                if (state.Consumables.CheckBalance(costData.PrimaryConsumable.Consumable, costData.PrimaryConsumable.Ammount) >= 0)
                {
                    result.ConsumableCostItems.Add(new ConsumableCostItem()
                    {
                        ConsumableId = costData.PrimaryConsumable.ConsumableId, Ammount = costData.PrimaryConsumable.Ammount
                    });
                }
                else
                {
                    result.ConsumableCostItems.Add(new ConsumableCostItem()
                    {
                        ConsumableId = costData.SecondaryConsumable.ConsumableId, Ammount = costData.SecondaryConsumable.Ammount
                    });
                }
            }

            return(result);
        }
コード例 #13
0
        public AchievementStatus GetAchievementStatus(MetaDataStateBase state)
        {
            var stateItem = GetAchievementStateItem(state);

            if (stateItem != null)
            {
                if (stateItem.Claimed)
                {
                    return(AchievementStatus.Claimed);
                }

                if (stateItem.Count >= RequirementCount)
                {
                    return(AchievementStatus.CanBeClaimed);
                }

                return(AchievementStatus.Availabe);
            }
            else
            {
                return(AchievementStatus.Availabe);
            }
        }
コード例 #14
0
 protected virtual void OnPlayFabLoginFailed(PlayFabError obj)
 {
     IsOfflineMode = true;
     MetaDataStateBase.LoadData(GameData.Current.MetaDataState);
     OnGameDataAndBackOfficeReady();
 }
コード例 #15
0
 public ObjectiveStateItem GetObjectiveState(MetaDataStateBase state)
 {
     return(state.ObjectiveState.AllObjectiveStateItem.Where(y => y.Id == ObjectiveId).SingleOrDefault());
 }
コード例 #16
0
 public AchievementDataStateEntry GetAchievementStateItem(MetaDataStateBase state)
 {
     return(state.AchievementDataState.Achievements.Where(y => y.AchievementType == AchievementType).SingleOrDefault());
 }