public IEnumerable <ItemNameInfo> GetItems( int startPosition = 0, int?count = null, string overallCategoryFilter = null, string categoryFilter = null, string subCategoryFilter = null, int?jobFilter = null, bool?cashFilter = null, int?minLevelFilter = null, int?maxLevelFilter = null, int?genderFilter = null, string searchFor = null ) { WZProperty stringWz = WZ.Resolve("String"); string[] jobFilterNames = jobFilter == null ? null : JobNameLookup.Where(b => (b.Key & jobFilter) == b.Key && (b.Key != 0 || jobFilter == 0)).Select(b => b.Value).ToArray(); // TODO: Refactor this IEnumerable <ItemNameInfo> results = ItemNameInfo.GetNames(stringWz).Select(name => { if (WZ.EquipMeta.ContainsKey(name.Id)) { name.RequiredJobs = WZ.EquipMeta[name.Id].Item1; name.RequiredLevel = WZ.EquipMeta[name.Id].Item2; name.IsCash = WZ.EquipMeta[name.Id].Item3; } return(name); }) .Where(item => { bool matchesFilter = true; matchesFilter &= overallCategoryFilter == null || item.TypeInfo.OverallCategory.Equals(overallCategoryFilter, StringComparison.CurrentCultureIgnoreCase); matchesFilter &= categoryFilter == null || item.TypeInfo.Category.Equals(categoryFilter, StringComparison.CurrentCultureIgnoreCase); matchesFilter &= subCategoryFilter == null || item.TypeInfo.SubCategory.Equals(subCategoryFilter, StringComparison.CurrentCultureIgnoreCase); matchesFilter &= jobFilter == null || (item.RequiredJobs?.SequenceEqual(jobFilterNames) ?? false); matchesFilter &= cashFilter == null || item.IsCash == cashFilter; matchesFilter &= minLevelFilter == null || minLevelFilter <= item.RequiredLevel; matchesFilter &= maxLevelFilter == null || maxLevelFilter >= item.RequiredLevel; matchesFilter &= genderFilter == null || item.RequiredGender == genderFilter; matchesFilter &= searchFor == null || (item.Name?.ToLower().Contains(searchFor.ToLower()) ?? false) || (item.Desc?.ToLower().Contains(searchFor.ToLower()) ?? false); return(matchesFilter); }) .Skip(startPosition); if (count != null && count.HasValue) { return(results.Take(count.Value)); } return(results); }
public Tuple <ItemNameInfo, IconInfo, EquipInfo>[] BulkItemInfo(int[] itemIds) { WZProperty stringWz = WZ.Resolve("String"); ILookup <int, ItemNameInfo> nameLookup = ItemNameInfo.GetNameLookup(stringWz); return(itemIds.Select(c => { ItemNameInfo name = nameLookup[c].FirstOrDefault(); if (name != null) { return new Tuple <int, ItemNameInfo>(c, name); } return null; }).Where(c => c != null) .Select(c => { WZProperty info = GetItemNode(c.Item1).Resolve("info"); return new Tuple <ItemNameInfo, IconInfo, EquipInfo>(c.Item2, IconInfo.Parse(info), EquipInfo.Parse(info)); }) .ToArray()); }
public static Mob Parse(WZProperty stringWz, bool followLink = true) { int id; if (!int.TryParse(stringWz.NameWithoutExtension, out id)) { return(null); } Mob result = new Mob(); result.Id = id; result.mobImage = stringWz.ResolveOutlink($"Mob/{id.ToString("D7")}") ?? stringWz.ResolveOutlink($"Mob2/{id.ToString("D7")}"); result.Name = stringWz.ResolveForOrNull <string>("name"); result.Meta = result.mobImage.Children.Any(c => c.NameWithoutExtension.Equals("info")) ? MobMeta.Parse(result.mobImage.Resolve("info")) : null; result.LinksTo = result.Meta.LinksToOtherMob; result.Framebooks = result.mobImage.Children .Where(c => c.NameWithoutExtension != "info") .DistinctBy(c => c.NameWithoutExtension) .ToDictionary(c => c.NameWithoutExtension, c => FrameBook.GetFrameCount(c)); WZProperty familiarEntry = stringWz.ResolveOutlink($"String/MonsterBook/{id}"); result.Description = familiarEntry?.ResolveForOrNull <string>("episode"); ILookup <int, MapName> lookup = MapName.GetMapNameLookup(stringWz); result.FoundAt = stringWz.ResolveOutlink($"Etc/MobLocation/{id}")? .Children.Concat(familiarEntry?.Resolve("map")?.Children ?? (new Dictionary <string, WZProperty>()).Values) .Select(c => c.ResolveFor <int>() ?? -1).Distinct() .Select(c => lookup[c]?.FirstOrDefault() ?? new MapName() { Name = "Unknown", StreetName = "Unknown", Id = c }) .ToArray(); ILookup <int, ItemNameInfo> reportedDrops = ItemNameInfo.GetNameLookup(stringWz.ResolveOutlink("String")); result.Drops = familiarEntry?.Resolve("reward")?.Children .Select(c => c.ResolveFor <int>() ?? -1) .Select(c => reportedDrops[c]?.FirstOrDefault()) .Where(c => c != null) .ToArray(); List <int> linkFollowed = new List <int>(); Mob linked = result; while (followLink && linked.Meta.LinksToOtherMob.HasValue && !linkFollowed.Contains(linked.Meta.LinksToOtherMob.Value)) { linkFollowed.Add(linked.Meta.LinksToOtherMob.Value); linked = Parse(stringWz.ResolveOutlink($"String/Mob/{linked.Meta.LinksToOtherMob.Value}"), false); } if (linked != result) { result.Extend(linked); } return(result); }