public void RefundItemHandler(GameSession session, CRefundItemReqMessage message)
        {
            var shop = GameServer.Instance.ResourceCache.GetShop();

            var item = session.Player.Inventory[message.ItemId];

            if (item == null)
            {
                Logger.Error()
                .Account(session)
                .Message($"Item {message.ItemId} not found")
                .Write();
                session.SendAsync(new SRefundItemAckMessage {
                    Result = ItemRefundResult.Failed
                });
                return;
            }

            var price = shop.GetPrice(item);

            if (price == null)
            {
                Logger.Error()
                .Account(session)
                .Message($"No shop entry found for {item.ItemNumber} {item.PriceType} {item.PeriodType} {item.Period}")
                .Write();
                session.SendAsync(new SRefundItemAckMessage {
                    Result = ItemRefundResult.Failed
                });
                return;
            }
            if (!price.CanRefund)
            {
                Logger.Error()
                .Account(session)
                .Message($"Cannot refund {item.ItemNumber} {item.PriceType} {item.PeriodType} {item.Period}")
                .Write();
                session.SendAsync(new SRefundItemAckMessage {
                    Result = ItemRefundResult.Failed
                });
                return;
            }

            session.Player.PEN += item.CalculateRefund();
            session.Player.Inventory.Remove(item);

            session.SendAsync(new SRefundItemAckMessage {
                Result = ItemRefundResult.OK, ItemId = item.Id
            });
            session.SendAsync(new SRefreshCashInfoAckMessage {
                PEN = session.Player.PEN, AP = session.Player.AP
            });
        }
        public void DiscardItemHandler(GameSession session, CRefundItemReqMessage message)
        {
            var shop = GameServer.Instance.ResourceCache.GetShop();

            var item = session.Player.Inventory[message.ItemId];

            if (item == null)
            {
                Logger.Error()
                .Account(session)
                .Message($"Item {message.ItemId} not found")
                .Write();
                session.SendAsync(new SDiscardItemAckMessage {
                    Result = 2
                });
                return;
            }

            var shopItem = shop.GetItem(item.ItemNumber);

            if (shopItem == null)
            {
                Logger.Error()
                .Account(session)
                .Message($"No shop entry found for {item.ItemNumber} {item.PriceType} {item.PeriodType} {item.Period}")
                .Write();
                session.SendAsync(new SDiscardItemAckMessage {
                    Result = 2
                });
                return;
            }

            if (shopItem.IsDestroyable)
            {
                Logger.Error()
                .Account(session)
                .Message($"Cannot discard {item.ItemNumber} {item.PriceType} {item.PeriodType} {item.Period}")
                .Write();
                session.SendAsync(new SDiscardItemAckMessage {
                    Result = 2
                });
                return;
            }

            session.Player.Inventory.Remove(item);
            session.SendAsync(new SDiscardItemAckMessage {
                Result = 0, ItemId = item.Id
            });
        }
Beispiel #3
0
        public async Task <bool> OnHandle(MessageContext context, CRefundItemReqMessage message)
        {
            var session = context.GetSession <Session>();
            var plr     = session.Player;
            var item    = plr.Inventory[message.ItemId];
            var logger  = plr.AddContextToLogger(_logger);

            if (item == null)
            {
                logger.Warning("Item={ItemId} not found", message.ItemId);
                session.Send(new SRefundItemAckMessage(ItemRefundResult.Failed, 0));
                return(true);
            }

            var price = item.GetShopPrice();

            if (price == null)
            {
                logger.Warning("No shop entry found item={ItemId}", message.ItemId);
                session.Send(new SRefundItemAckMessage(ItemRefundResult.Failed, 0));
                return(true);
            }

            if (!price.CanRefund)
            {
                logger.Warning("Cannot refund item={ItemId}", message.ItemId);
                session.Send(new SRefundItemAckMessage(ItemRefundResult.Failed, 0));
                return(true);
            }

            plr.PEN += item.CalculateRefund();
            plr.Inventory.Remove(item);

            session.Send(new SRefundItemAckMessage(ItemRefundResult.OK, item.Id));
            plr.SendMoneyUpdate();

            return(true);
        }
        public async Task RefundItemHandler(GameSession session, CRefundItemReqMessage message)
        {
            var shop = GameServer.Instance.ResourceCache.GetShop();

            var item = session.Player.Inventory[message.ItemId];

            if (item == null)
            {
                _logger.Error()
                .Account(session)
                .Message("Item {0} not found", message.ItemId)
                .Write();
                await session.SendAsync(new SRefundItemAckMessage { Result = ItemRefundResult.Failed })
                .ConfigureAwait(false);

                return;
            }

            var price = shop.GetPrice(item);

            if (price == null)
            {
                _logger.Error()
                .Account(session)
                .Message("No shop entry found for {0} {1} {2} {3}", item.ItemNumber, item.PriceType, item.PeriodType, item.Period)
                .Write();
                await session.SendAsync(new SRefundItemAckMessage { Result = ItemRefundResult.Failed })
                .ConfigureAwait(false);

                return;
            }
            if (!price.CanRefund)
            {
                _logger.Error()
                .Account(session)
                .Message("Cannot refund {0} {1} {2} {3}", item.ItemNumber, item.PriceType, item.PeriodType, item.Period)
                .Write();
                await session.SendAsync(new SRefundItemAckMessage { Result = ItemRefundResult.Failed })
                .ConfigureAwait(false);

                return;
            }

            session.Player.PEN += item.CalculateRefund();
            session.Player.Inventory.Remove(item);


            using (var scope = new DataAccessScope())
            {
                var playerDto = GameDatabase.Instance.Players.GetReference((int)session.Player.Account.Id);
                playerDto.PEN = (int)session.Player.PEN;

                await scope.CompleteAsync()
                .ConfigureAwait(false);
            }

            await session.SendAsync(new SRefundItemAckMessage { Result = ItemRefundResult.OK, ItemId = item.Id })
            .ConfigureAwait(false);

            await session.SendAsync(new SRefreshCashInfoAckMessage { PEN = session.Player.PEN, AP = session.Player.AP })
            .ConfigureAwait(false);
        }