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 }); }
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); }