private void InitializeMods(List <Modifier> modifiers, bool normalizeValues = true) { if (modifiers.Count == 0) { return; } PriceFilterCategory category = null; foreach (var modifier in modifiers) { if (category == null) { category = new PriceFilterCategory(); } InitializeFilter(category, nameof(StatFilter), modifier.Id, !string.IsNullOrEmpty(modifier.Category) ? $"({modifier.Category}) {modifier.Text}" : modifier.Text, modifier.Values, normalizeValues: normalizeValues, enabled: settings.Modifiers.Contains(modifier.Id) ); } if (category != null) { Filters.Add(category); } }
private void InitializeMods(List <Modifier> modifiers, bool normalizeValues = true) { if (modifiers.Count == 0) { return; } PriceFilterCategory category = null; var settingMods = Item.Category switch { Category.Accessory => settings.AccessoryModifiers, Category.Armour => settings.ArmourModifiers, Category.Flask => settings.FlaskModifiers, Category.Jewel => settings.JewelModifiers, Category.Map => settings.MapModifiers, Category.Weapon => settings.WeaponModifiers, _ => new List <string>(), }; foreach (var modifier in modifiers) { if (category == null) { category = new PriceFilterCategory(); } if (modifier.OptionValue != null) { InitializeFilter(category, nameof(StatFilter), 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 { InitializeFilter(category, nameof(StatFilter), 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 InitializeFilter <T>(PriceFilterCategory category, string type, string id, string label, T value, double delta = 5, bool enabled = false, double?min = null, bool alwaysIncluded = false) { if (value is bool boolValue) { if (!boolValue && !alwaysIncluded) { return; } } else if (value is int intValue) { if (intValue == 0 && !alwaysIncluded) { return; } if (min == null) { min = (int)Math.Min(intValue - delta, intValue * 0.9); } } else if (value is double doubleValue) { if (doubleValue == 0 && !alwaysIncluded) { return; } if (min == null) { min = (int)Math.Min(doubleValue - delta, doubleValue * 0.9); } } else if (value is IGrouping <string, Magnitude> groupValue) { min = groupValue.Select(x => x.Min).OrderBy(x => x).FirstOrDefault(); if (min.HasValue) { min = (int)Math.Min(min.Value - delta, min.Value * 0.9); } } var priceFilter = new PriceFilter() { Enabled = enabled, Type = type, Id = id, Text = label, Min = min, Max = null, HasRange = min.HasValue }; priceFilter.PropertyChanged += async(object sender, PropertyChangedEventArgs e) => { await UpdateQuery(); }; category.Filters.Add(priceFilter); }
private void InitializeMods(List <Mod> mods) { if (mods.Count == 0) { return; } PriceFilterCategory category = null; var magnitudes = mods .SelectMany(x => x.Magnitudes) .GroupBy(x => x.Hash) .Select(x => new { Definition = statDataService.GetById(x.First().Hash), Magnitudes = x }) .ToList(); foreach (var magnitude in magnitudes) { if (category == null) { category = new PriceFilterCategory() { Label = magnitude.Definition.Category }; } InitializeFilter(category, nameof(StatFilter), magnitude.Definition.Id, magnitude.Definition.Text, magnitude.Magnitudes, enabled: settings.Modifiers.Contains(magnitude.Definition.Id) ); } if (category != null) { Filters.Add(category); } }
private void InitializeFilters() { Filters = new ObservableList <PriceFilterCategory>(); var propertyCategory = new PriceFilterCategory() { Label = PriceResources.Filters_Properties }; InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Armor), languageProvider.Language.DescriptionArmour, Item.Armor); InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.EnergyShield), languageProvider.Language.DescriptionEnergyShield, Item.EnergyShield); InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Evasion), languageProvider.Language.DescriptionEvasion, Item.Evasion); InitializeFilter(propertyCategory, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Block), languageProvider.Language.DescriptionChanceToBlock, Item.ChanceToBlock, delta: 1); InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemQuantity), languageProvider.Language.DescriptionItemQuantity, Item.ItemQuantity); InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemRarity), languageProvider.Language.DescriptionItemRarity, Item.ItemRarity); InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.MonsterPackSize), languageProvider.Language.DescriptionMonsterPackSize, Item.MonsterPackSize); InitializeFilter(propertyCategory, nameof(SearchFilters.MapFilters), nameof(MapFilter.Blighted), languageProvider.Language.PrefixBlighted, Item.Blighted, enabled: Item.Blighted); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Quality), languageProvider.Language.DescriptionQuality, Item.Quality, enabled: Item.Rarity == Rarity.Gem && Item.Quality >= 20, min: Item.Rarity == Rarity.Gem && Item.Quality >= 20 ? (double?)Item.Quality : null); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.GemLevel), languageProvider.Language.DescriptionLevel, Item.GemLevel, enabled: Item.GemLevel >= 20, min: Item.GemLevel >= 20 ? Item.GemLevel : (double?)null); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ItemLevel), languageProvider.Language.DescriptionItemLevel, Item.ItemLevel, enabled: Item.ItemLevel >= 80, min: Item.ItemLevel >= 80 ? (double?)Item.ItemLevel : null); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Corrupted), languageProvider.Language.DescriptionCorrupted, Item.Corrupted, alwaysIncluded: Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique, enabled: (Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique) && Item.Corrupted); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.CrusaderItem), languageProvider.Language.InfluenceCrusader, Item.Influences.Crusader, enabled: Item.Influences.Crusader); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ElderItem), languageProvider.Language.InfluenceElder, Item.Influences.Elder, enabled: Item.Influences.Elder); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.HunterItem), languageProvider.Language.InfluenceHunter, Item.Influences.Hunter, enabled: Item.Influences.Hunter); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.RedeemerItem), languageProvider.Language.InfluenceRedeemer, Item.Influences.Redeemer, enabled: Item.Influences.Redeemer); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ShaperItem), languageProvider.Language.InfluenceShaper, Item.Influences.Shaper, enabled: Item.Influences.Shaper); InitializeFilter(propertyCategory, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.WarlordItem), languageProvider.Language.InfluenceWarlord, Item.Influences.Warlord, enabled: Item.Influences.Warlord); InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.PhysicalDps), PriceResources.Filters_PDps, Item.Extended.PhysicalDps); InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.ElementalDps), PriceResources.Filters_EDps, Item.Extended.ElementalDps); InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.DamagePerSecond), PriceResources.Filters_Dps, Item.Extended.DamagePerSecond); InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.AttacksPerSecond), languageProvider.Language.DescriptionAttacksPerSecond, Item.AttacksPerSecond, delta: 0.1); InitializeFilter(propertyCategory, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.CriticalStrikeChance), languageProvider.Language.DescriptionCriticalStrikeChance, Item.CriticalStrikeChance, delta: 1); if (propertyCategory.Filters.Any()) { Filters.Add(propertyCategory); } InitializeMods(Item.Extended.Mods.Pseudo); InitializeMods(Item.Extended.Mods.Implicit); InitializeMods(Item.Extended.Mods.Explicit); InitializeMods(Item.Extended.Mods.Crafted); InitializeMods(Item.Extended.Mods.Enchant); if (Filters.Count == 0) { Filters = null; } }
private void InitializeFilter <T>(PriceFilterCategory category, string type, string id, string label, T value, double delta = 5, bool enabled = false, double?min = null, double?max = null, bool alwaysIncluded = false, bool normalizeValues = true, bool applyNegative = false) { ModifierOption option = null; 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}"; } } else 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; } } else if (value is ModifierOption modifierOption) { option = modifierOption; min = null; max = null; } var priceFilter = new PriceFilter() { Enabled = enabled, Type = type, Id = id, Text = label, Min = min, Max = max, HasRange = min.HasValue || max.HasValue, ApplyNegative = applyNegative, Option = option, }; 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 InitializeFilter(propertyCategory1, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Quality), languageProvider.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 InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Armor), languageProvider.Language.DescriptionArmour, Item.Properties.Armor); // Evasion InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Evasion), languageProvider.Language.DescriptionEvasion, Item.Properties.Evasion); // Energy shield InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.EnergyShield), languageProvider.Language.DescriptionEnergyShield, Item.Properties.EnergyShield); // Block InitializeFilter(propertyCategory1, nameof(SearchFilters.ArmourFilters), nameof(ArmorFilter.Block), languageProvider.Language.DescriptionChanceToBlock, Item.Properties.ChanceToBlock, delta: 1); // Gem level InitializeFilter(propertyCategory1, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.GemLevel), languageProvider.Language.DescriptionLevel, Item.Properties.GemLevel, enabled: true, min: Item.Properties.GemLevel); // Item quantity InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemQuantity), languageProvider.Language.DescriptionItemQuantity, Item.Properties.ItemQuantity); // Item rarity InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.ItemRarity), languageProvider.Language.DescriptionItemRarity, Item.Properties.ItemRarity); // Monster pack size InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.MonsterPackSize), languageProvider.Language.DescriptionMonsterPackSize, Item.Properties.MonsterPackSize); // Blighted InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.Blighted), languageProvider.Language.PrefixBlighted, Item.Properties.Blighted, enabled: Item.Properties.Blighted); // Map tier InitializeFilter(propertyCategory1, nameof(SearchFilters.MapFilters), nameof(MapFilter.MapTier), languageProvider.Language.DescriptionMapTier, Item.Properties.MapTier, enabled: true, min: Item.Properties.MapTier); // Physical Dps InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.PhysicalDps), PriceResources.Filters_PDps, Item.Properties.PhysicalDps); // Elemental Dps InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.ElementalDps), PriceResources.Filters_EDps, Item.Properties.ElementalDps); // Total Dps InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.DamagePerSecond), PriceResources.Filters_Dps, Item.Properties.DamagePerSecond); // Attacks per second InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.AttacksPerSecond), languageProvider.Language.DescriptionAttacksPerSecond, Item.Properties.AttacksPerSecond, delta: 0.1); // Critical strike chance InitializeFilter(propertyCategory1, nameof(SearchFilters.WeaponFilters), nameof(WeaponFilter.CriticalStrikeChance), languageProvider.Language.DescriptionCriticalStrikeChance, Item.Properties.CriticalStrikeChance, delta: 1); // Item level InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ItemLevel), languageProvider.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 InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.Corrupted), languageProvider.Language.DescriptionCorrupted, Item.Corrupted, alwaysIncluded: Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique, enabled: (Item.Rarity == Rarity.Gem || Item.Rarity == Rarity.Unique) && Item.Corrupted, applyNegative: true); // Crusader InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.CrusaderItem), languageProvider.Language.InfluenceCrusader, Item.Influences.Crusader, enabled: Item.Influences.Crusader); // Elder InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ElderItem), languageProvider.Language.InfluenceElder, Item.Influences.Elder, enabled: Item.Influences.Elder); // Hunter InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.HunterItem), languageProvider.Language.InfluenceHunter, Item.Influences.Hunter, enabled: Item.Influences.Hunter); // Redeemer InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.RedeemerItem), languageProvider.Language.InfluenceRedeemer, Item.Influences.Redeemer, enabled: Item.Influences.Redeemer); // Shaper InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.ShaperItem), languageProvider.Language.InfluenceShaper, Item.Influences.Shaper, enabled: Item.Influences.Shaper); // Warlord InitializeFilter(propertyCategory2, nameof(SearchFilters.MiscFilters), nameof(MiscFilter.WarlordItem), languageProvider.Language.InfluenceWarlord, Item.Influences.Warlord, enabled: Item.Influences.Warlord); if (propertyCategory1.Filters.Any()) { Filters.Add(propertyCategory1); } if (propertyCategory2.Filters.Any()) { Filters.Add(propertyCategory2); } // Modifiers InitializeMods(Item.Modifiers.Pseudo); InitializeMods(Item.Modifiers.Enchant, false); InitializeMods(Item.Modifiers.Implicit); InitializeMods(Item.Modifiers.Explicit); InitializeMods(Item.Modifiers.Crafted); InitializeMods(Item.Modifiers.Fractured); if (Filters.Count == 0) { Filters = null; } }
private void InitializeFilter <T>(PriceFilterCategory category, string type, string id, string label, T value, double delta = 5, bool enabled = false, double?min = 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 = NormalizeValue(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 = NormalizeValue(doubleValue, delta); } if (LabelValues.IsMatch(label)) { label = LabelValues.Replace(label, doubleValue.ToString("0.00")); } else { label += $": {doubleValue:0.00}"; } } else if (value is List <double> groupValue) { min = groupValue.OrderBy(x => x).FirstOrDefault(); if (normalizeValues) { min = NormalizeValue(min, delta); } } var priceFilter = new PriceFilter() { Enabled = enabled, Type = type, Id = id, Text = label, Min = min, Max = null, HasRange = min.HasValue }; priceFilter.PropertyChanged += async(object sender, PropertyChangedEventArgs e) => { await UpdateQuery(); }; category.Filters.Add(priceFilter); }