コード例 #1
0
        public ItemSellResult SellItem(
            SessionToken token, string userId, Guid itemId, long amount, decimal pricePerItem)
        {
            if (amount <= 0 || pricePerItem <= 0)
            {
                return(new ItemSellResult(ItemTradeState.RequestToLow));
            }

            var character = GetCharacterAsync(token, userId);

            if (character == null)
            {
                return(new ItemSellResult(ItemTradeState.Failed));
            }

            if (!playerManager.AcquiredUserLock(token, character))
            {
                return(new ItemSellResult(ItemTradeState.Failed));
            }

            var itemsToSell = gameData.GetInventoryItems(character.Id, itemId);

            var totalItemCount = itemsToSell.Count > 0 ? itemsToSell.Sum(x => x.Amount.GetValueOrDefault()) : 0;
            var newItemAmount  = totalItemCount - amount;

            if (itemsToSell.Count == 0 || newItemAmount < 0)
            {
                return(new ItemSellResult(ItemTradeState.DoesNotOwn));
            }

            gameData.RemoveRange(itemsToSell);

            if (newItemAmount > 0)
            {
                var mergedInventoryItem = new InventoryItem
                {
                    Id          = Guid.NewGuid(),
                    Amount      = newItemAmount,
                    CharacterId = character.Id,
                    Equipped    = false,
                    ItemId      = itemId,
                };
                gameData.Add(mergedInventoryItem);
            }

            var marketItem = new DataModels.MarketItem
            {
                Id                = Guid.NewGuid(),
                Amount            = amount,
                Created           = DateTime.UtcNow,
                ItemId            = itemId,
                PricePerItem      = pricePerItem,
                SellerCharacterId = character.Id,
            };

            gameData.Add(marketItem);

            return(new ItemSellResult(ItemTradeState.Success));
        }
コード例 #2
0
ファイル: ModelMapper.cs プロジェクト: GreatisNate/RavenNest
 public static Models.InventoryItem Map(InventoryItem items)
 {
     return(new Models.InventoryItem
     {
         Id = items.Id,
         Amount = items.Amount.GetValueOrDefault(),
         Equipped = items.Equipped,
         ItemId = items.ItemId
                  //Item = Map(items.Item)
     });
 }
コード例 #3
0
ファイル: ModelMapper.cs プロジェクト: zerratar/RavenNest
 public static Models.InventoryItem Map(InventoryItem items)
 {
     return(new Models.InventoryItem
     {
         Id = items.Id,
         Amount = items.Amount.GetValueOrDefault(),
         Equipped = items.Equipped,
         ItemId = items.ItemId,
         Tag = items.Tag,
         Enchantment = items.Enchantment,
         Flags = items.Flags ?? 0,
         Name = items.Name,
         Soulbound = items.Soulbound,
         TransmogrificationId = items.TransmogrificationId,
     });
 }
コード例 #4
0
        public void EquipBestItems(Character character)
        {
            var equippedPetInventoryItem = gameData.GetEquippedItem(character.Id, ItemCategory.Pet);

            UnequipAllItems(character);

            var skills         = gameData.GetSkills(character.SkillsId);
            var inventoryItems = gameData
                                 .GetInventoryItems(character.Id)
                                 .Select(x => new { InventoryItem = x, Item = gameData.GetItem(x.ItemId) })
                                 .Where(x => CanEquipItem(x.Item, skills))
                                 .OrderByDescending(x => GetItemValue(x.Item))
                                 .ToList();

            var weaponToEquip = inventoryItems.FirstOrDefault(x => x.Item.Category == (int)ItemCategory.Weapon);

            if (weaponToEquip != null)
            {
                EquipItem(character, weaponToEquip.InventoryItem);
            }

            InventoryItem equippedPet = null;

            if (equippedPetInventoryItem != null)
            {
                equippedPet = gameData.GetInventoryItem(character.Id, equippedPetInventoryItem.ItemId);
                if (equippedPet != null)
                {
                    EquipItem(character, equippedPet);
                }
            }

            foreach (var itemGroup in inventoryItems
                     .Where(x => x.Item.Category != (int)ItemCategory.Weapon && x.Item.Category != (int)ItemCategory.Pet)
                     .GroupBy(x => x.Item.Type))
            {
                var itemToEquip = itemGroup
                                  .OrderByDescending(x => GetItemValue(x.Item))
                                  .FirstOrDefault();

                if (itemToEquip != null)
                {
                    EquipItem(character, itemToEquip.InventoryItem);
                }
            }
        }
コード例 #5
0
        public void EquipItem(Character character, InventoryItem item)
        {
            if (item.Amount > 1)
            {
                --item.Amount;

                item = new InventoryItem
                {
                    Id          = Guid.NewGuid(),
                    CharacterId = character.Id,
                    Amount      = 1,
                    Equipped    = true,
                    ItemId      = item.ItemId,
                };
                gameData.Add(item);
            }
            else
            {
                item.Equipped = true;
            }
        }
コード例 #6
0
        public async Task <ItemSellResult> SellItemAsync(
            SessionToken token, string userId, Guid itemId, long amount, decimal pricePerItem)
        {
            if (amount <= 0 || pricePerItem <= 0)
            {
                return(new ItemSellResult(ItemTradeState.RequestToLow));
            }

            using (var db = dbProvider.Get())
            {
                var character = await GetCharacterAsync(db, token, userId);

                if (character == null)
                {
                    return(new ItemSellResult(ItemTradeState.Failed));
                }

                if (!await PlayerManager.AcquiredUserLockAsync(token, db, character))
                {
                    return(new ItemSellResult(ItemTradeState.Failed));
                }

                var itemsToSell = character.InventoryItem
                                  .Where(x => x.ItemId == itemId && !x.Equipped)
                                  .ToList();


                var totalItemCount = itemsToSell.Count > 0 ? itemsToSell.Sum(x => x.Amount.GetValueOrDefault()) : 0;
                var newItemAmount  = totalItemCount - amount;

                if (itemsToSell.Count == 0 || newItemAmount < 0)
                {
                    return(new ItemSellResult(ItemTradeState.DoesNotOwn));
                }

                db.RemoveRange(itemsToSell);

                if (newItemAmount > 0)
                {
                    var mergedInventoryItem = new InventoryItem
                    {
                        Id          = Guid.NewGuid(),
                        Amount      = newItemAmount,
                        CharacterId = character.Id,
                        Equipped    = false,
                        ItemId      = itemId,
                        Character   = character
                    };
                    await db.InventoryItem.AddAsync(mergedInventoryItem);
                }

                var marketItem = new DataModels.MarketItem
                {
                    Id                = Guid.NewGuid(),
                    Amount            = amount,
                    Created           = DateTime.UtcNow,
                    ItemId            = itemId,
                    PricePerItem      = pricePerItem,
                    SellerCharacterId = character.Id,
                    SellerCharacter   = character
                };

                await db.MarketItem.AddAsync(marketItem);

                await db.SaveChangesAsync();
            }

            return(new ItemSellResult(ItemTradeState.Success));
        }
コード例 #7
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);
        }
コード例 #8
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);
        }
コード例 #9
0
        public bool EquipItem(SessionToken token, string userId, Guid itemId)
        {
            var character = GetCharacter(token, userId);

            if (character == null)
            {
                return(false);
            }

            var item = gameData.GetItem(itemId);

            if (item == null)
            {
                return(false);
            }

            var invItem = gameData.GetInventoryItem(character.Id, itemId);

            var skills = gameData.GetSkills(character.SkillsId);

            if (invItem == null || !CanEquipItem(gameData.GetItem(invItem.ItemId), skills))
            {
                return(false);
            }

            if (invItem.Amount > 1)
            {
                --invItem.Amount;

                invItem = new InventoryItem
                {
                    Id          = Guid.NewGuid(),
                    CharacterId = character.Id,
                    Amount      = 1,
                    Equipped    = true,
                    ItemId      = invItem.ItemId,
                };
                gameData.Add(invItem);
            }
            else
            {
                invItem.Equipped = true;
            }

            InventoryItem invItemEq = gameData.FindPlayerItem(character.Id, x =>
            {
                var xItem = gameData.GetItem(x.ItemId);
                return(xItem.Type == item.Type && xItem.Category == item.Category && x.Equipped);
            });

            if (invItemEq != null)
            {
                var stack = gameData.GetInventoryItem(character.Id, invItemEq.ItemId);

                if (stack != null)
                {
                    ++stack.Amount;
                    gameData.Remove(invItemEq);
                }
                else
                {
                    invItemEq.Equipped = false;
                }
            }

            return(true);
        }
コード例 #10
0
        public async Task <string> ImportJsonDatabaseAsync()
        {
            var itemRepo = new PlayerRepository("E:\\git\\Ravenfall\\Data\\Repositories");

            try
            {
                var db       = dbProvider.Get();
                var zerratar = await db.User.FirstOrDefaultAsync(x => x.UserId == "72424639");

                if (zerratar == null)
                {
                    zerratar          = new User();
                    zerratar.Id       = Guid.NewGuid();
                    zerratar.UserId   = "72424639";
                    zerratar.UserName = "******";
                    zerratar.Created  = DateTime.UtcNow;
                    await db.User.AddAsync(zerratar);
                }

                var players = itemRepo.All();

                foreach (var player in players)
                {
                    if (player.Name.StartsWith("Player "))
                    {
                        continue;
                    }
                    if (string.IsNullOrEmpty(player.UserId))
                    {
                        continue;                                      // MUST HAVE A USERID!!
                    }
                    var user = await db.User
                               .Include(x => x.CharacterUser)
                               .FirstOrDefaultAsync(x => x.UserId == player.UserId);

                    if (user == null)
                    {
                        user = new User
                        {
                            Id       = Guid.NewGuid(),
                            UserName = player.Name,
                            UserId   = player.UserId,
                            Created  = DateTime.UtcNow
                        };
                        await db.User.AddAsync(user);
                    }

                    if (user.CharacterUser?.FirstOrDefault(x => !x.Local) != null)
                    {
                        continue; // we already have a global character
                    }

                    var resources = new Resources
                    {
                        Id    = Guid.NewGuid(),
                        Coins = (decimal)player.SkillResources.Coins.Value,
                        Ore   = (decimal)player.SkillResources.Mining.Value,
                        Wheat = (decimal)player.SkillResources.Farming.Value,
                        Fish  = (decimal)player.SkillResources.Fishing.Value,
                        Wood  = (decimal)player.SkillResources.Woodcutting.Value
                    };
                    await db.Resources.AddAsync(resources);

                    var skills = new Skills
                    {
                        Id          = Guid.NewGuid(),
                        Attack      = player.CombatStats.Attack.Experience,
                        Defense     = player.CombatStats.Defense.Experience,
                        Strength    = player.CombatStats.Strength.Experience,
                        Health      = player.CombatStats.Health.Experience,
                        Woodcutting = player.SkillStats.Woodcutting.Experience,
                        Fishing     = player.SkillStats.Fishing.Experience,
                        Mining      = player.SkillStats.Mining.Experience,
                        Crafting    = player.SkillStats.Crafting.Experience,
                        Cooking     = player.SkillStats.Cooking.Experience,
                        Farming     = player.SkillStats.Farming.Experience,
                        Sailing     = player.SkillStats.Sailing.Experience
                    };
                    await db.Skills.AddAsync(skills);

                    var appearance = DataMapper.Map <DataModels.Appearance, PlayerAppearanceDefinition>(player.Appearance);
                    appearance.Id = Guid.NewGuid();
                    await db.Appearance.AddAsync(appearance);

                    var statistics = DataMapper.Map <DataModels.Statistics, Statistics>(player.Statistics);
                    statistics.Id = Guid.NewGuid();
                    await db.Statistics.AddAsync(statistics);

                    var character = new Character
                    {
                        Id           = Guid.NewGuid(),
                        StatisticsId = statistics.Id,
                        Statistics   = statistics,
                        OriginUserId = zerratar.Id,
                        OriginUser   = zerratar,
                        UserId       = user.Id,
                        User         = user,
                        Created      = DateTime.UtcNow,
                        Revision     = 0,
                        Name         = player.Name,
                        Resources    = resources,
                        ResourcesId  = resources.Id,
                        Appearance   = appearance,
                        AppearanceId = appearance.Id,
                        Skills       = skills,
                        SkillsId     = skills.Id,
                        Local        = false,
                    };

                    await db.Character.AddAsync(character);

                    foreach (var equip in player.Inventory.Equipped)
                    {
                        var invItem = new DataModels.InventoryItem
                        {
                            Id          = Guid.NewGuid(),
                            ItemId      = equip.Id,
                            Character   = character,
                            CharacterId = character.Id,
                            Amount      = 1,
                            Equipped    = true
                        };

                        await db.InventoryItem.AddAsync(invItem);
                    }

                    foreach (var inv in player.Inventory.Backpack)
                    {
                        var invItem = new DataModels.InventoryItem
                        {
                            Id          = Guid.NewGuid(),
                            ItemId      = inv.Id,
                            Character   = character,
                            CharacterId = character.Id,
                            Amount      = 1,
                            Equipped    = false
                        };

                        await db.InventoryItem.AddAsync(invItem);
                    }

                    await db.SaveChangesAsync();
                }

                return("yes");
            }
            catch (Exception exc)
            {
                return("no");
            }
        }