Beispiel #1
0
        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);
        }