public async UniTaskVoid HandleRequestClaimMailItems(RequestHandlerData requestHandler, RequestClaimMailItemsMessage request, RequestProceedResultDelegate <ResponseClaimMailItemsMessage> result)
        {
#if UNITY_STANDALONE && !CLIENT_BUILD
            IPlayerCharacterData playerCharacter;
            if (GameInstance.ServerUserHandlers.TryGetPlayerCharacter(requestHandler.ConnectionId, out playerCharacter))
            {
                UITextKeys  message  = UITextKeys.NONE;
                GetMailResp mailResp = await DbServiceClient.GetMailAsync(new GetMailReq()
                {
                    MailId = request.id,
                    UserId = playerCharacter.UserId,
                });

                Mail mail = mailResp.Mail;
                if (mail.IsClaim)
                {
                    message = UITextKeys.UI_ERROR_MAIL_CLAIM_ALREADY_CLAIMED;
                }
                else if (mail.IsDelete)
                {
                    message = UITextKeys.UI_ERROR_CANNOT_ACCESS_STORAGE;
                }
                else
                {
                    if (mail.Items.Count > 0)
                    {
                        List <CharacterItem> increasingItems = new List <CharacterItem>();
                        foreach (KeyValuePair <int, short> mailItem in mail.Items)
                        {
                            increasingItems.Add(CharacterItem.Create(mailItem.Key, amount: mailItem.Value));
                        }
                        if (playerCharacter.IncreasingItemsWillOverwhelming(increasingItems))
                        {
                            message = UITextKeys.UI_ERROR_WILL_OVERWHELMING;
                        }
                        else
                        {
                            playerCharacter.IncreaseItems(increasingItems);
                        }
                    }
                    if (message == UITextKeys.NONE && mail.Currencies.Count > 0)
                    {
                        List <CurrencyAmount> increasingCurrencies = new List <CurrencyAmount>();
                        Currency tempCurrency;
                        foreach (KeyValuePair <int, int> mailCurrency in mail.Currencies)
                        {
                            if (!GameInstance.Currencies.TryGetValue(mailCurrency.Key, out tempCurrency))
                            {
                                continue;
                            }
                            increasingCurrencies.Add(new CurrencyAmount()
                            {
                                currency = tempCurrency,
                                amount   = mailCurrency.Value
                            });
                        }
                        playerCharacter.IncreaseCurrencies(increasingCurrencies);
                    }
                    if (message == UITextKeys.NONE && mail.Gold > 0)
                    {
                        playerCharacter.Gold = playerCharacter.Gold.Increase(mail.Gold);
                    }
                }
                if (message != UITextKeys.NONE)
                {
                    result.Invoke(AckResponseCode.Error, new ResponseClaimMailItemsMessage()
                    {
                        message = message,
                    });
                    return;
                }
                UpdateClaimMailItemsStateResp resp = await DbServiceClient.UpdateClaimMailItemsStateAsync(new UpdateClaimMailItemsStateReq()
                {
                    MailId = request.id,
                    UserId = playerCharacter.UserId,
                });

                message = resp.Error;
                result.Invoke(
                    message == UITextKeys.NONE ? AckResponseCode.Success : AckResponseCode.Error,
                    new ResponseClaimMailItemsMessage()
                {
                    message = message,
                    mail    = resp.Mail,
                });
            }
            else
            {
                result.Invoke(AckResponseCode.Error, new ResponseClaimMailItemsMessage()
                {
                    message = UITextKeys.UI_ERROR_SERVICE_NOT_AVAILABLE,
                });
            }
#endif
        }
Esempio n. 2
0
        public async UniTaskVoid HandleRequestClaimMailItems(RequestHandlerData requestHandler, RequestClaimMailItemsMessage request, RequestProceedResultDelegate <ResponseClaimMailItemsMessage> result)
        {
#if UNITY_STANDALONE && !CLIENT_BUILD
            IPlayerCharacterData playerCharacter;
            if (!GameInstance.ServerUserHandlers.TryGetPlayerCharacter(requestHandler.ConnectionId, out playerCharacter))
            {
                result.Invoke(AckResponseCode.Error, new ResponseClaimMailItemsMessage()
                {
                    message = UITextKeys.UI_ERROR_NOT_LOGGED_IN,
                });
                return;
            }
            UITextKeys message = await ClaimMailItems(request.id, playerCharacter);

            if (message != UITextKeys.NONE)
            {
                result.Invoke(AckResponseCode.Error, new ResponseClaimMailItemsMessage()
                {
                    message = message,
                });
                return;
            }
            result.Invoke(AckResponseCode.Success, new ResponseClaimMailItemsMessage());
#endif
        }