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