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 }); }
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); }
public bool Exists(PlayerItem item) { return(ThreadExecuter.Execute( () => _repo.Exists(item) )); }
/// <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); }