private int BuyMarketItemAsync( SessionToken token, Guid itemId, Character character, DataModels.MarketItem marketItem, long amount, decimal cost) { var buyAmount = marketItem.Amount >= amount ? amount : marketItem.Amount; if (marketItem.Amount == buyAmount) { gameData.Remove(marketItem); } else { marketItem.Amount -= buyAmount; } var sellerResources = gameData.GetResourcesByCharacterId(marketItem.SellerCharacterId); var buyerResources = gameData.GetResourcesByCharacterId(character.Id); sellerResources.Coins += cost; buyerResources.Coins -= cost; var sellerCharacter = gameData.GetCharacter(marketItem.SellerCharacterId); var seller = gameData.GetUser(sellerCharacter.UserId); var buyer = gameData.GetUser(character.UserId); var inventoryItems = gameData.GetInventoryItems(character.Id, itemId); var mergeAmount = buyAmount; if (inventoryItems.Count > 0) { mergeAmount += inventoryItems.Sum(x => x.Amount.GetValueOrDefault()); gameData.RemoveRange(inventoryItems); } var mergedInventoryItem = new InventoryItem { Id = Guid.NewGuid(), Amount = mergeAmount, CharacterId = character.Id, Equipped = false, ItemId = itemId, }; gameData.Add(mergedInventoryItem); var model = new ItemTradeUpdate { SellerId = seller?.UserId, BuyerId = buyer?.UserId, ItemId = itemId, Amount = amount, Cost = cost }; var sellerSession = gameData.GetUserSession( sellerCharacter.UserIdLock.GetValueOrDefault()); if (sellerSession != null) { AddGameEvent(sellerSession.Id, GameEventType.ItemSell, model); } AddGameEvent(token.SessionId, GameEventType.ItemBuy, model); return((int)buyAmount); }
private async Task BuyMarketItemAsync( SessionToken token, Guid itemId, RavenfallDbContext db, Character character, DataModels.MarketItem marketItem, long amount, decimal cost) { var buyAmount = marketItem.Amount >= amount ? amount : marketItem.Amount; if (marketItem.Amount - buyAmount <= 0) { db.Remove(marketItem); } else { marketItem.Amount = buyAmount; db.Update(marketItem); } marketItem.SellerCharacter.Resources.Coins += cost; character.Resources.Coins -= cost; db.Update(marketItem.SellerCharacter.Resources); db.Update(character.Resources); var seller = await db.User.FirstOrDefaultAsync(x => x.Id == marketItem.SellerCharacter.UserId); var buyer = await db.User.FirstOrDefaultAsync(x => x.Id == character.UserId); var inventoryItems = await db.InventoryItem .Where(x => x.CharacterId == character.Id && !x.Equipped && x.ItemId == itemId) .ToListAsync(); var mergeAmount = buyAmount; if (inventoryItems.Count > 0) { mergeAmount += inventoryItems.Sum(x => x.Amount.GetValueOrDefault()); db.RemoveRange(inventoryItems); } var mergedInventoryItem = new InventoryItem { Id = Guid.NewGuid(), Amount = mergeAmount, CharacterId = character.Id, Equipped = false, ItemId = itemId, Character = character }; await db.InventoryItem.AddAsync(mergedInventoryItem); var model = new ItemTradeUpdate { SellerId = seller?.UserId, BuyerId = buyer?.UserId, ItemId = itemId, Amount = amount, Cost = cost }; var sellerSession = await db.GameSession .OrderByDescending(x => x.Started) .FirstOrDefaultAsync( x => x.UserId == marketItem.SellerCharacter.UserIdLock && x.Status == (int)SessionStatus.Active); if (sellerSession != null) { await AddGameEventAsync(db, sellerSession.Id, GameEventType.ItemSell, model); } await AddGameEventAsync(db, token.SessionId, GameEventType.ItemBuy, model); }
private int BuyMarketItem( SessionToken token, Guid itemId, Character character, DataModels.MarketItem marketItem, long amount, double pricePerItem) { // todo(zerratar): Rewrite this!! This is horrible var buyAmount = marketItem.Amount >= amount ? amount : marketItem.Amount; var buyerResources = gameData.GetResourcesByCharacterId(character.Id); var totalCost = buyAmount * pricePerItem; if (totalCost > buyerResources.Coins) { return(0); } if (marketItem.Amount == buyAmount) { gameData.Remove(marketItem); } else { marketItem.Amount -= buyAmount; } var sellerResources = gameData.GetResourcesByCharacterId(marketItem.SellerCharacterId); sellerResources.Coins += totalCost; buyerResources.Coins -= totalCost; var sellerCharacter = gameData.GetCharacter(marketItem.SellerCharacterId); var seller = gameData.GetUser(sellerCharacter.UserId); var buyer = gameData.GetUser(character.UserId); var inventory = inventoryProvider.Get(character.Id); inventory.AddItem(itemId, buyAmount, tag: marketItem.Tag); gameData.Add( new MarketItemTransaction { Id = Guid.NewGuid(), Amount = buyAmount, BuyerCharacterId = character.Id, SellerCharacterId = sellerCharacter.Id, ItemId = itemId, PricePerItem = (totalCost / buyAmount), TotalPrice = totalCost, Created = DateTime.UtcNow }); var model = new ItemTradeUpdate { SellerId = seller?.UserId, BuyerId = buyer?.UserId, ItemId = itemId, Amount = buyAmount,//amount, Cost = totalCost }; var sellerSession = gameData.GetSessionByUserId( sellerCharacter.UserIdLock.GetValueOrDefault()); if (sellerSession != null) { AddGameEvent(sellerSession.Id, GameEventType.ItemSell, model); } AddGameEvent(token.SessionId, GameEventType.ItemBuy, model); return((int)buyAmount); }