public AddItemResult AddItem(SessionToken token, string userId, Guid itemId) { var item = gameData.GetItem(itemId); if (item == null) { return(AddItemResult.Failed); } var character = GetCharacter(token, userId); if (character == null) { return(AddItemResult.Failed); } if (!integrityChecker.VerifyPlayer(token.SessionId, character.Id, 0)) { return(AddItemResult.Failed); } var skills = gameData.GetSkills(character.SkillsId); var equippedItems = gameData.FindPlayerItems(character.Id, x => { var xItem = gameData.GetItem(x.ItemId); return(x.Equipped && xItem.Type == item.Type && xItem.Category == item.Category); }); var equipped = false; if (equippedItems.Count > 0) { var bestFirst = equippedItems.Select(x => new { Equipped = x, Item = gameData.GetItem(x.ItemId) }).OrderByDescending(x => GetItemValue(x.Item)); var bestEquipped = bestFirst.First(); if (CanEquipItem(item, skills) && IsItemBetter(item, bestEquipped.Item)) { equipped = true; } if (!equipped) { bestEquipped.Equipped.Equipped = true; } for (var i = 1; i < equippedItems.Count; ++i) { equippedItems[i].Equipped = false; } } var addNew = true; if (!equipped) { var inv = gameData.GetInventoryItem(character.Id, itemId); if (inv != null) { inv.Amount++; addNew = false; } } if (addNew) { gameData.Add(new InventoryItem { Id = Guid.NewGuid(), ItemId = item.Id, Amount = 1, CharacterId = character.Id, Equipped = equipped }); } return(equipped ? AddItemResult.AddedAndEquipped : AddItemResult.Added); }