Beispiel #1
0
        private ClassifiedItems Classify(StashTab tab)
        {
            var stacked = tab.Items.Where(item =>
                                          item.StackCount > 1 ||
                                          _cache.StackableRecords.Contains(item.BaseRecord) ||
                                          _cache.SpecialRecords.Contains(item.BaseRecord) // Special "single seed" items.
                                          ).ToList();

            var unknownItems = tab.Items.Where(item => !_cache.AllRecords.Contains(item.BaseRecord)).ToList();

            var duplicates = tab.Items
                             .Where(item => _playerItemDao.Exists(Arz.TransferStashService.Map(item, null, false))) // We don't care about mod/hardcore for dupe checking.
                             .ToList();

            var remaining = tab.Items
                            .SkipWhile(item => duplicates.Contains(item))
                            .SkipWhile(item => stacked.Contains(item))
                            .SkipWhile(item => unknownItems.Contains(item))
                            .ToList();

            return(new ClassifiedItems {
                Stacked = stacked,
                Duplicates = duplicates,
                Unknown = unknownItems,
                Remaining = remaining
            });
        }
Beispiel #2
0
        public void Add(Item item)
        {
            // Dupe-check list

            bool stacked = item.StackCount > 1 ||
                           _cache.StackableRecords.Contains(item.BaseRecord) ||
                           _cache.SpecialRecords.Contains(item.BaseRecord); // Special "single seed" items.

            if (stacked)
            {
                Stacked.Add(item);
                All.Add(item);
                return;
            }

            // TODO: Detect slith rings etc


            // We don't have this record at all, unknown to IA. Probably need to parse DB.
            bool unknownItem = !_cache.AllRecords.Contains(item.BaseRecord);

            if (unknownItem)
            {
                if (item.BaseRecord.StartsWith("records/storyelements/rewards/"))
                {
                    Quest.Add(item);
                }
                else
                {
                    Unknown.Add(item);
                }

                All.Add(item);
                return;
            }

            // We already have this item..
            if (All.Any(m => m.Equals(item)))
            {
                Duplicates.Add(item);
                All.Add(item);
                return;
            }

            // We already have this item..
            if (_playerItemDao.Exists(TransferStashService.Map(item, null, false)))
            {
                Duplicates.Add(item);
                All.Add(item);
                return;
            }

            Remaining.Add(item);
            All.Add(item);
        }
Beispiel #3
0
 public bool Exists(PlayerItem item)
 {
     return(ThreadExecuter.Execute(
                () => _repo.Exists(item)
                ));
 }
Beispiel #4
0
        /// <summary>
        ///     Loot all the items stored on page X, and store them to the local database
        /// </summary>
        /// <param name="filename"></param>
        private string EmptyPageX(string filename)
        {
            Logger.InfoFormat("Looting {0}", filename);

            var pCrypto = new GDCryptoDataBuffer(DataBuffer.ReadBytesFromDisk(filename));
            var stash   = new Stash();

            if (stash.Read(pCrypto))
            {
                var lootFromIndex = GetStashToLootFrom(stash);
                var isHardcore    = GlobalPaths.IsHardcore(filename);

#if DEBUG
                if (stash.Tabs.Count < 5)
                {
                    while (stash.Tabs.Count < 5)
                    {
                        stash.Tabs.Add(new StashTab());
                    }

                    SafelyWriteStash(filename, stash);
                    Logger.Info("Upgraded stash to 5 pages.");

                    return(string.Empty);
                }
#endif

                // Update the internal listing of unlooted items (in other stash tabs)
                var unlootedLocal = new List <Item>();

                for (var idx = 0; idx < stash.Tabs.Count; idx++)
                {
                    if (idx != lootFromIndex)
                    {
                        unlootedLocal.AddRange(stash.Tabs[idx].Items);
                    }
                }

                Interlocked.Exchange(ref _unlootedItems, new ConcurrentBag <Item>(unlootedLocal));
                StashUpdated?.Invoke(null, null);

                if (stash.Tabs.Count < 2)
                {
                    Logger.WarnFormat($"File \"{filename}\" only contains {stash.Tabs.Count} pages. IA requires at least 2 stash pages to function properly.");
                    return(GlobalSettings.Language.GetTag("iatag_not_enough_stash", filename, stash.Tabs.Count));
                }

                if (stash.Tabs.Count < lootFromIndex + 1)
                {
                    Logger.Warn($"You have configured IA to loot from stash {lootFromIndex + 1} but you only have {stash.Tabs.Count} pages");
                    return(GlobalSettings.Language.GetTag("iatag_invalid_loot_stash_number", lootFromIndex + 1, stash.Tabs.Count));
                }

                if (stash.Tabs[lootFromIndex].Items.Count > 0)
                {
                    _hasLootedItemsOnceThisSession = true;

                    // Grab the items and clear the tab
                    var items = stash.Tabs[lootFromIndex].Items
                                .Where(m => m.StackCount <= 1)
                                .Where(m => !_playerItemDao.Exists(Map(m, stash.ModLabel, isHardcore, stash.IsExpansion1)))
                                .ToList();
                    var notLootedDueToStackSize = stash.Tabs[lootFromIndex].Items.Where(m => m.StackCount > 1).ToList();

                    if (notLootedDueToStackSize.Count > 0)
                    {
                        _setFeedback("Warning", GlobalSettings.Language.GetTag("iatag_feedback_stacked_not_looted", notLootedDueToStackSize.Count));
                    }

                    var notLootedDueToDuplicate = stash.Tabs[lootFromIndex].Items.ToList();

                    notLootedDueToDuplicate.RemoveAll(m => items.Contains(m) || m.StackCount > 1);

                    if (notLootedDueToDuplicate.Count > 0)
                    {
                        _setFeedback("Warning", GlobalSettings.Language.GetTag("iatag_feedback_duplicates_not_looted", notLootedDueToDuplicate.Count));
                    }

                    stash.Tabs[lootFromIndex].Items.RemoveAll(e => items.Any(m => m.Equals(e)));

                    var storedItems = StoreItemsToDatabase(items, stash.ModLabel, isHardcore, stash.IsExpansion1);
                    var message     = GlobalSettings.Language.GetTag("iatag_looted_from_stash", items.Count, lootFromIndex + 1);

                    if (storedItems != null)
                    {
                        Logger.Info(message);

                        if (!SafelyWriteStash(filename, stash))
                        {
                            _playerItemDao.Remove(storedItems);
                        }
                    }

                    _performedLootCallback();

                    return(message);
                }

                Logger.Info($"Looting of stash {lootFromIndex + 1} halted, no items available.");

                return(GlobalSettings.Language.GetTag("iatag_feedback_no_items_to_loot"));
            }

            Logger.Error("Could not load stash file.");
            Logger.Error("An update from the developer is most likely required.");

            return(string.Empty);
        }