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