Пример #1
0
        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);
        }
Пример #2
0
        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());
        }
Пример #3
0
        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);
        }