private void InitializeModifierFilter <T>(PriceFilterCategory category, string id, string label, T value, double delta = 5, bool enabled = false, double?min = null, double?max = null, bool normalizeValues = true) { ModifierOption option = null; if (value is List <double> groupValue) { var itemValue = groupValue.OrderBy(x => x).FirstOrDefault(); if (itemValue >= 0) { min = itemValue; if (normalizeValues) { min = NormalizeMinValue(min, delta); } } else { max = itemValue; if (normalizeValues) { max = NormalizeMaxValue(max, delta); } } if (!groupValue.Any()) { min = null; max = null; } } var priceFilter = new PriceFilter() { Enabled = enabled, PropertyType = null, Id = id, Text = label, Min = min, Max = max, HasRange = min.HasValue || max.HasValue, Option = option, }; priceFilter.PropertyChanged += (object sender, PropertyChangedEventArgs e) => { UpdateDebounce(); }; category.Filters.Add(priceFilter); }
private void InitializeModifierFilters(List <Modifier> modifiers, bool normalizeValues = true) { if (modifiers.Count == 0) { return; } PriceFilterCategory category = null; var settingMods = Item.Category switch { Category.Accessory => settings.Price_Mods_Accessory, Category.Armour => settings.Price_Mods_Armour, Category.Flask => settings.Price_Mods_Flask, Category.Jewel => settings.Price_Mods_Jewel, Category.Map => settings.Price_Mods_Map, Category.Weapon => settings.Price_Mods_Weapon, _ => new List <string>(), }; foreach (var modifier in modifiers) { if (category == null) { category = new PriceFilterCategory(); } if (modifier.OptionValue != null) { InitializeModifierFilter(category, modifier.Id, !string.IsNullOrEmpty(modifier.Category) ? $"({modifier.Category}) {modifier.Text}" : modifier.Text, modifier.OptionValue, normalizeValues: normalizeValues, enabled: settingMods.Contains(modifier.Id) && Item.Rarity != Rarity.Unique ); } else { InitializeModifierFilter(category, modifier.Id, !string.IsNullOrEmpty(modifier.Category) ? $"({modifier.Category}) {modifier.Text}" : modifier.Text, modifier.Values, normalizeValues: normalizeValues, enabled: settingMods.Contains(modifier.Id) && Item.Rarity != Rarity.Unique ); } } if (category != null) { Filters.Add(category); } }
private void InitializePropertyFilter <T>(PriceFilterCategory category, PropertyFilterType type, string label, T value, double delta = 5, bool enabled = false, double?min = null, double?max = null, bool alwaysIncluded = false, bool normalizeValues = true) { if (value is bool boolValue) { if (!boolValue && !alwaysIncluded) { return; } } else if (value is int intValue) { if (intValue == 0 && !alwaysIncluded) { return; } if (min == null && normalizeValues) { min = NormalizeMinValue(intValue, delta); } if (LabelValues.IsMatch(label)) { label = LabelValues.Replace(label, intValue.ToString()); } else { label += $": {value}"; } } else if (value is double doubleValue) { if (doubleValue == 0 && !alwaysIncluded) { return; } if (min == null && normalizeValues) { min = NormalizeMinValue(doubleValue, delta); } if (LabelValues.IsMatch(label)) { label = LabelValues.Replace(label, doubleValue.ToString("0.00")); } else { label += $": {doubleValue:0.00}"; } } var priceFilter = new PriceFilter() { Enabled = enabled, PropertyType = type, Text = label, Min = min, Max = max, HasRange = min.HasValue || max.HasValue, Option = null, }; priceFilter.PropertyChanged += (object sender, PropertyChangedEventArgs e) => { UpdateDebounce(); }; category.Filters.Add(priceFilter); }
private void InitializeFilters() { // No filters for prophecies, currencies and divination cards, etc. if (Item.Category == Category.DivinationCard || Item.Category == Category.Currency || Item.Category == Category.Prophecy || Item.Category == Category.ItemisedMonster || Item.Category == Category.Leaguestone || Item.Category == Category.Watchstone || Item.Category == Category.Undefined) { Filters = null; return; } Filters = new ObservableList <PriceFilterCategory>(); var propertyCategory1 = new PriceFilterCategory(); var propertyCategory2 = new PriceFilterCategory(); // Quality InitializePropertyFilter(propertyCategory1, PropertyFilterType.Misc_Quality, gameLanguageProvider.Language.DescriptionQuality, Item.Properties.Quality, enabled: Item.Rarity == Rarity.Gem, min: Item.Rarity == Rarity.Gem && Item.Properties.Quality >= 20 ? (double?)Item.Properties.Quality : null); // Armour InitializePropertyFilter(propertyCategory1, PropertyFilterType.Armour_Armour, gameLanguageProvider.Language.DescriptionArmour, Item.Properties.Armor); // Evasion InitializePropertyFilter(propertyCategory1, PropertyFilterType.Armour_Evasion, gameLanguageProvider.Language.DescriptionEvasion, Item.Properties.Evasion); // Energy shield InitializePropertyFilter(propertyCategory1, PropertyFilterType.Armour_EnergyShield, gameLanguageProvider.Language.DescriptionEnergyShield, Item.Properties.EnergyShield); // Block InitializePropertyFilter(propertyCategory1, PropertyFilterType.Armour_Block, gameLanguageProvider.Language.DescriptionChanceToBlock, Item.Properties.ChanceToBlock, delta: 1); // Gem level InitializePropertyFilter(propertyCategory1, PropertyFilterType.Misc_GemLevel, gameLanguageProvider.Language.DescriptionLevel, Item.Properties.GemLevel, enabled: true, min: Item.Properties.GemLevel); // Item quantity InitializePropertyFilter(propertyCategory1, PropertyFilterType.Map_ItemQuantity, gameLanguageProvider.Language.DescriptionItemQuantity, Item.Properties.ItemQuantity); // Item rarity InitializePropertyFilter(propertyCategory1, PropertyFilterType.Map_ItemRarity, gameLanguageProvider.Language.DescriptionItemRarity, Item.Properties.ItemRarity); // Monster pack size InitializePropertyFilter(propertyCategory1, PropertyFilterType.Map_MonsterPackSize, gameLanguageProvider.Language.DescriptionMonsterPackSize, Item.Properties.MonsterPackSize); // Blighted InitializePropertyFilter(propertyCategory1, PropertyFilterType.Map_Blighted, gameLanguageProvider.Language.PrefixBlighted, Item.Properties.Blighted, enabled: Item.Properties.Blighted); // Map tier InitializePropertyFilter(propertyCategory1, PropertyFilterType.Map_Tier, gameLanguageProvider.Language.DescriptionMapTier, Item.Properties.MapTier, enabled: true, min: Item.Properties.MapTier); // Physical Dps InitializePropertyFilter(propertyCategory1, PropertyFilterType.Weapon_PhysicalDps, PriceResources.Filters_PDps, Item.Properties.PhysicalDps); // Elemental Dps InitializePropertyFilter(propertyCategory1, PropertyFilterType.Weapon_ElementalDps, PriceResources.Filters_EDps, Item.Properties.ElementalDps); // Total Dps InitializePropertyFilter(propertyCategory1, PropertyFilterType.Weapon_Dps, PriceResources.Filters_Dps, Item.Properties.DamagePerSecond); // Attacks per second InitializePropertyFilter(propertyCategory1, PropertyFilterType.Weapon_AttacksPerSecond, gameLanguageProvider.Language.DescriptionAttacksPerSecond, Item.Properties.AttacksPerSecond, delta: 0.1); // Critical strike chance InitializePropertyFilter(propertyCategory1, PropertyFilterType.Weapon_CriticalStrikeChance, gameLanguageProvider.Language.DescriptionCriticalStrikeChance, Item.Properties.CriticalStrikeChance, delta: 1); // Item level InitializePropertyFilter(propertyCategory2, PropertyFilterType.Misc_ItemLevel, gameLanguageProvider.Language.DescriptionItemLevel, Item.ItemLevel, enabled: Item.ItemLevel >= 80 && Item.Properties.MapTier == 0 && Item.Rarity != Rarity.Unique, min: Item.ItemLevel >= 80 ? (double?)Item.ItemLevel : null); // Corrupted InitializePropertyFilter(propertyCategory2, PropertyFilterType.Misc_Corrupted, gameLanguageProvider.Language.DescriptionCorrupted, Item.Corrupted, alwaysIncluded: Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique, enabled: (Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique || Item.Rarity == Rarity.Rare) && Item.Corrupted); // Crusader InitializePropertyFilter(propertyCategory2, PropertyFilterType.Influence_Crusader, gameLanguageProvider.Language.InfluenceCrusader, Item.Influences.Crusader, enabled: Item.Influences.Crusader); // Elder InitializePropertyFilter(propertyCategory2, PropertyFilterType.Influence_Elder, gameLanguageProvider.Language.InfluenceElder, Item.Influences.Elder, enabled: Item.Influences.Elder); // Hunter InitializePropertyFilter(propertyCategory2, PropertyFilterType.Influence_Hunter, gameLanguageProvider.Language.InfluenceHunter, Item.Influences.Hunter, enabled: Item.Influences.Hunter); // Redeemer InitializePropertyFilter(propertyCategory2, PropertyFilterType.Influence_Redeemer, gameLanguageProvider.Language.InfluenceRedeemer, Item.Influences.Redeemer, enabled: Item.Influences.Redeemer); // Shaper InitializePropertyFilter(propertyCategory2, PropertyFilterType.Influence_Shaper, gameLanguageProvider.Language.InfluenceShaper, Item.Influences.Shaper, enabled: Item.Influences.Shaper); // Warlord InitializePropertyFilter(propertyCategory2, PropertyFilterType.Influence_Warlord, gameLanguageProvider.Language.InfluenceWarlord, Item.Influences.Warlord, enabled: Item.Influences.Warlord); if (propertyCategory1.Filters.Any()) { Filters.Add(propertyCategory1); } if (propertyCategory2.Filters.Any()) { Filters.Add(propertyCategory2); } // Modifiers InitializeModifierFilters(Item.Modifiers.Pseudo); InitializeModifierFilters(Item.Modifiers.Enchant, false); InitializeModifierFilters(Item.Modifiers.Implicit); InitializeModifierFilters(Item.Modifiers.Explicit); InitializeModifierFilters(Item.Modifiers.Crafted); InitializeModifierFilters(Item.Modifiers.Fractured); if (Filters.Count == 0) { Filters = null; } }