コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }