public IEnumerable <MapName> GetMapNames(string searchFor = null, int startPosition = 0, int?count = null) { if (!string.IsNullOrEmpty(searchFor)) { searchFor.ToLower(); } return(WZ.Resolve("String/Map").Children .SelectMany(c => c.Children) .Where(c => { int mapId = 0; if (!int.TryParse(c.NameWithoutExtension, out mapId)) { return false; } string eightDigitId = mapId.ToString("D8"); string nineDigitId = mapId.ToString("D9"); WZProperty eightDigits = WZ.Resolve($"Map/Map/Map{eightDigitId[0]}"); WZProperty nineDigits = WZ.Resolve($"Map/Map/Map{nineDigitId[0]}"); return (eightDigits?.Children?.Any(m => m.NameWithoutExtension.Equals(eightDigitId) || m.NameWithoutExtension.Equals(nineDigitId)) ?? false) || (nineDigits?.Children?.Any(m => m.NameWithoutExtension.Equals(eightDigitId) || m.NameWithoutExtension.Equals(nineDigitId)) ?? false); }) .Where(c => c != null) .Select(c => MapName.Parse(c)) .Where(c => string.IsNullOrEmpty(searchFor) || (!string.IsNullOrEmpty(c.Name) && c.Name.ToLower().Contains(searchFor)) || (!string.IsNullOrEmpty(c.StreetName) && c.StreetName.ToLower().Contains(searchFor))) .Skip(startPosition) .Take(count ?? int.MaxValue)); }
public Skill GetSkill(int id) { WZProperty skillBooks = WZ.Resolve("Skill"); string friendlyId = id.ToString(); WZProperty skillBook = null; if (skillBook == null) { skillBook = skillBooks.Children.FirstOrDefault(c => c.NameWithoutExtension.Equals(friendlyId.Substring(0, 6)))?.Resolve($"skill/{friendlyId}"); } if (skillBook == null) { skillBook = skillBooks.Children.FirstOrDefault(c => c.NameWithoutExtension.Equals(friendlyId.Substring(0, 5)))?.Resolve($"{friendlyId.Substring(0, 5)}/skill/{friendlyId}"); } if (skillBook == null) { skillBook = skillBooks.Children.FirstOrDefault(c => c.NameWithoutExtension.Equals(friendlyId.Substring(0, 4)))?.Resolve($"{friendlyId.Substring(0, 4)}/skill/{friendlyId}"); } if (skillBook == null) { skillBook = skillBooks.Children.FirstOrDefault(c => c.NameWithoutExtension.Equals(friendlyId.Substring(0, 3)))?.Resolve($"{friendlyId.Substring(0, 3)}/skill/{friendlyId}"); } if (skillBook == null) { skillBook = skillBooks.Children.SelectMany(c => c.Resolve("skill")?.Children).Where(c => c != null && c.NameWithoutExtension.Equals(friendlyId)).First(); } return(Skill.Parse(skillBook, GetSkillDescription)); }
public MapName GetMapName(int id) { WZProperty mapName = WZ.Resolve("String/Map").Children .SelectMany(c => c.Children) .Where(c => c.NameWithoutExtension == id.ToString()) .FirstOrDefault(); MapName name = MapName.Parse(mapName); return(name); }
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 WZProperty GetItemNode(int id) { string idString = id.ToString("D8"); // TODO: Refactor to use character grouping IDs WZProperty item = WZ.Resolve("Character").Children.SelectMany(c => c.Resolve().Children).Where(c => c.Type == PropertyType.Image || c.Type == PropertyType.Lua).FirstOrDefault(c => c.NameWithoutExtension == idString)?.Resolve(); if (item != null) { return(item); } item = WZ.Resolve($"Item/Etc/{idString.Substring(0, 4)}/{idString}"); if (item != null) { return(item); } item = WZ.Resolve($"Item/Install").Children.FirstOrDefault(b => idString.StartsWith(b.NameWithoutExtension))?.Resolve(idString); if (item != null) { return(item); } item = WZ.Resolve($"Item/Cash/{idString.Substring(0, 4)}/{idString}"); if (item != null) { return(item); } item = WZ.Resolve($"Item/Consume/{idString.Substring(0, 4)}/{idString}"); if (item != null) { return(item); } item = WZ.Resolve($"Item/Special/{idString.Substring(0, 4)}/{idString}"); if (item != null) { return(item); } item = WZ.Resolve($"Item/Pet/{idString}"); if (item != null) { return(item); } return(null); }
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 Image <Rgba32> RenderPet(int petId, string animation, int frame, int petEquip) { Pet eq = GetPet(petId); Frame[] frames = eq.frameBooks[animation].First().frames.ToArray(); int frameCount = frames.Count(); int realFrame = (frame % frameCount); Frame petFrame = frames[realFrame]; if (petEquip != -1) { Point origin = petFrame.OriginOrZero; WZProperty equipPetIdList = WZ.Resolve($"Character/PetEquip/{petEquip.ToString("D8")}"); WZProperty equipNode = equipPetIdList?.Resolve(petId.ToString())?.Resolve()?.Resolve($"{animation}/{realFrame}")?.Resolve(); if (equipNode == null) { return(petFrame.Image); } Frame equipFrame = Frame.Parse(equipNode); Point equipOrigin = equipFrame.OriginOrZero; Point renderEquipAt = new Point(origin.X - equipOrigin.X, origin.Y - equipOrigin.Y); int minX = Math.Min(renderEquipAt.X, 0); int minY = Math.Min(renderEquipAt.Y, 0); int maxX = Math.Max(renderEquipAt.X + equipFrame.Image.Width, petFrame.Image.Width); int maxY = Math.Max(renderEquipAt.Y + equipFrame.Image.Height, petFrame.Image.Height); Image <Rgba32> result = new Image <Rgba32>(maxX - minX, maxY - minY); result.Mutate(x => { x.DrawImage(petFrame.Image, 1, new Point(0 - minX, 0 - minY)); x.DrawImage(equipFrame.Image, 1, new Point(renderEquipAt.X - minX, renderEquipAt.Y - minY)); }); return(result); } else { return(petFrame.Image); } }
public IEnumerable <QuestMeta> GetQuests(string searchFor = null, int startPosition = 0, int?count = null) { if (!string.IsNullOrEmpty(searchFor)) { searchFor.ToLower(); } IEnumerable <Quest> quests = Quest.GetQuests(WZ.Resolve("Quest")).OrderBy(c => c.Id); return(quests.Select(q => new QuestMeta( q.Id, q.Name, q.RequirementToStart?.LevelMinimum, q.RequirementToStart?.StartTime, q.RequirementToStart?.EndTime ) ) .Where(c => string.IsNullOrEmpty(searchFor) || (!string.IsNullOrEmpty(c.Name) && c.Name.ToLower().Contains(searchFor))) .Skip(startPosition) .Take(count ?? int.MaxValue)); }
public Quest GetQuest(int id) => Quest.GetQuest(WZ.Resolve("Quest"), id);
public SkillDescription GetSkillDescription(int id) => SkillDescription.Parse(WZ.Resolve($"String/Skill/{id}"));
public SkillBook GetSkillBook(int id) => SkillBook.Parse(WZ.Resolve($"Skill/{id}"), id, GetJob(id), (c) => GetSkillDescription(c));
public Android GetAndroid(int androidId) { return(Android.Parse(WZ.Resolve($"Etc/Android/{androidId.ToString("D4")}"), androidId)); }
public IEnumerable <Job> GetJobs() => WZ.Resolve("Etc/GrowHelp/career").Children.Select(c => new Job(c));
public byte[] GetSong(string songPath) => WZ.Resolve("Sound").ResolveForOrNull <byte[]>($"{songPath.Trim('/', ' ', '\\').Replace(".img", "")}");
public SMap GetSMap() => SMap.Parse(WZ.Resolve("Base"));
public Pet GetPet(int petId) { WZProperty petItem = (WZ.Resolve("String/Pet") ?? WZ.Resolve("String/Item/Pet")).Resolve(petId.ToString()); return(Pet.Parse(petItem)); }
public IEnumerable <Tips> GetTips() => Tips.GetTips(WZ.Resolve("Etc"));
public Mob GetMob(int id) => Mob.Parse(WZ.Resolve($"String/Mob/{id}"));
public IEnumerable<MobInfo> GetMobs(int startPosition = 0, int? count = null, int? minLevelFilter = null, int? maxLevelFilter = null, string searchFor = null) => WZ.Resolve("String/Mob").Children .Select(MobInfo.Parse) .Where(c => (!minLevelFilter.HasValue || (c.Level.HasValue && c.Level >= minLevelFilter)) && (!maxLevelFilter.HasValue || (c.Level.HasValue && c.Level <= maxLevelFilter)) && (string.IsNullOrEmpty(searchFor) || (!string.IsNullOrEmpty(c.Name) && c.Name.ToLower().Contains(searchFor.ToLower())))) .Skip(startPosition) .Take(count ?? int.MaxValue); // MaxValue isn't a nice alternative, but it should probably work
public bool DoesSoundExist(string songPath) => WZ.Resolve("Sound").Resolve($"{songPath.Trim('/', ' ', '\\').Replace(".img", "")}")?.Type == PropertyType.Audio;
public string[] GetSounds(int startPosition = 0, int?count = null) => RecursiveGetSoundPath(WZ.Resolve("Sound").Children).Skip(startPosition).Take(count ?? int.MaxValue).ToArray();
public IEnumerable <int> GetAndroidIDs() { return(WZ.Resolve("Etc/Android").Children.Select(c => int.Parse(c.NameWithoutExtension))); }
public ZMap GetZMap() => ZMap.Parse(WZ.Resolve("Base"));
public IEnumerable <NPCInfo> GetNPCs(int startAt, int count, string filter) => WZ.Resolve("String/Npc").Children.Select(NPCInfo.Parse).Where(c => string.IsNullOrEmpty(filter) || (!string.IsNullOrEmpty(c.Name) && c.Name.ToLower().Contains(filter.ToLower()))).Skip(startAt).Take(count);
public IActionResult GetNameTag([FromQuery] string Name, [FromQuery] string ringIdsJoined = "") { if (Name.Length > 64) { Name = Name.Substring(0, 64); } int[] ringIds = ringIdsJoined.Split(',').Select(b => int.TryParse(b, out int d) ? (int?)d : null).Where(b => b.HasValue).Select(b => b.Value).ToArray(); WZProperty rings = WZ.Resolve("Character/Ring"); int? chatBalloonID = ringIds.Select(b => rings.ResolveFor <int>($"{b.ToString("D8")}.img/info/nameTag")).Where(b => b.HasValue).Select(b => b.Value).FirstOrDefault(); WZProperty nameTag = null; if (chatBalloonID.HasValue) { nameTag = WZ.Resolve($"UI/NameTag/{chatBalloonID.Value}"); } Image <Rgba32> c = nameTag?.ResolveForOrNull <Image <Rgba32> >("c"); Point cOrigin = nameTag?.ResolveFor <Point>("c/origin") ?? Point.Empty; Image <Rgba32> w = nameTag?.ResolveForOrNull <Image <Rgba32> >("w"); Point wOrigin = nameTag?.ResolveFor <Point>("w/origin") ?? Point.Empty; Image <Rgba32> e = nameTag?.ResolveForOrNull <Image <Rgba32> >("e"); Point eOrigin = nameTag?.ResolveFor <Point>("e/origin") ?? Point.Empty; int nameColorVal = nameTag?.ResolveFor <int>("clr") ?? -1; Rgba32 nameColor = new Rgba32(); new Argb32((uint)nameColorVal).ToRgba32(ref nameColor); Font MaplestoryFont = maplestory.io.Services.Implementations.MapleStory.AvatarFactory.fonts.Families .First(f => f.Name.Equals("Arial Unicode MS", StringComparison.CurrentCultureIgnoreCase)).CreateFont(12, FontStyle.Regular); SizeF realNameSize = TextMeasurer.Measure(Name, new RendererOptions(MaplestoryFont)); Rectangle nameTagSize = new Rectangle(0, 0, (int)realNameSize.Width, (int)realNameSize.Height); int startY = Math.Max(c?.Height ?? 0, Math.Max(w?.Height ?? 0, e?.Height ?? 0)); if (nameTag != null) { nameTagSize = new Rectangle(0, 0, nameTagSize.Width + w.Width + e.Width - eOrigin.X, nameTagSize.Height + startY); } else { nameTagSize = new Rectangle(0, 0, nameTagSize.Width + 8, nameTagSize.Height + 8); } Image <Rgba32> withName = new Image <Rgba32>(nameTagSize.Width + 4, nameTagSize.Height + 4); withName.Mutate(x => { if (nameTag == null) { x.Fill(new Rgba32(0, 0, 0, 128), nameTagSize); IPathCollection iPath = BuildCorners(0, 0, nameTagSize.Width, nameTagSize.Height, 4); x.Fill(new Rgba32(0, 0, 0, 0), iPath); x.DrawText(Name, MaplestoryFont, nameColor, new PointF(4, 2)); } else { x.DrawImage(w, 1, new Point(0, startY - wOrigin.Y)); using (var cv = c.Clone(v => v.Resize(new Size((int)realNameSize.Width, c.Height)))) x.DrawImage(cv, 1, new Point(w.Width, startY - cOrigin.Y)); x.DrawImage(e, 1, new Point((int)(nameTagSize.Width - (e.Width - eOrigin.X)), startY - eOrigin.Y)); x.DrawText(Name, MaplestoryFont, nameColor, new PointF(w.Width, startY + 2 - cOrigin.Y)); } }); return(File(withName.ImageToByte(Request), "image/png")); }
public IActionResult GetChat([FromQuery] string ringIdsJoined, [FromQuery] string message) { if (message.Length > 512) { throw new InvalidOperationException("Too long of a message"); } int[] ringIds = ringIdsJoined.Split(',').Select(b => int.TryParse(b, out int d) ? (int?)d : null).Where(b => b.HasValue).Select(b => b.Value).ToArray(); WZProperty rings = WZ.Resolve("Character/Ring"); int chatBalloonID = ringIds.Select(b => rings.ResolveFor <int>($"{b.ToString("D8")}.img/info/chatBalloon")).Where(b => b.HasValue).Select(b => b.Value).FirstOrDefault(); WZProperty chatBalloon = WZ.Resolve($"UI/ChatBalloon/{chatBalloonID}"); Image <Rgba32> c = null, e = null, n = null, ne = null, nw = null, s = null, se = null, sw = null, w = null, arrow = null; Point cOrigin = Point.Empty, eOrigin = Point.Empty, nOrigin = Point.Empty, neOrigin = Point.Empty, nwOrigin = Point.Empty, sOrigin = Point.Empty, seOrigin = Point.Empty, swOrigin = Point.Empty, wOrigin = Point.Empty, arrowOrigin = Point.Empty; int color = 0; foreach (WZProperty prop in chatBalloon.Children) { if (prop.Name == "c") { c = prop.ResolveForOrNull <Image <Rgba32> >(); cOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "e") { e = prop.ResolveForOrNull <Image <Rgba32> >(); eOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "n") { n = prop.ResolveForOrNull <Image <Rgba32> >(); nOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "w") { w = prop.ResolveForOrNull <Image <Rgba32> >(); wOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "s") { s = prop.ResolveForOrNull <Image <Rgba32> >(); sOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "ne") { ne = prop.ResolveForOrNull <Image <Rgba32> >(); neOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "nw") { nw = prop.ResolveForOrNull <Image <Rgba32> >(); nwOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "se") { se = prop.ResolveForOrNull <Image <Rgba32> >(); seOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "sw") { sw = prop.ResolveForOrNull <Image <Rgba32> >(); swOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "arrow") { arrow = prop.ResolveForOrNull <Image <Rgba32> >(); arrowOrigin = prop.ResolveFor <Point>("origin") ?? Point.Empty; } if (prop.Name == "clr") { color = prop.ResolveFor <int>() ?? 0; } } Rgba32 nameColor = new Rgba32(); new Argb32((uint)color).ToRgba32(ref nameColor); Font font = maplestory.io.Services.Implementations.MapleStory.AvatarFactory.fonts.Families.First(f => f.Name.Equals("Arial Unicode MS", StringComparison.CurrentCultureIgnoreCase)).CreateFont(12, FontStyle.Regular); RendererOptions textOptions = new RendererOptions(font); string[] lines = message.Batch(32).Select(b => new string(b.ToArray())).ToArray(); SizeF[] lineSizes = lines.Select(line => TextMeasurer.Measure(line, textOptions)).ToArray(); int leftPadding = new[] { nw.Width, w.Width, sw.Width }.Max(); int topPadding = new[] { ne.Height, n.Height, nw.Height }.Max(); int rightPadding = new[] { ne.Width, e.Width, se.Width }.Max(); int bottomPadding = new[] { se.Height, s.Height, sw.Height }.Max() + arrow.Height; int textWidth = (int)Math.Ceiling(lineSizes.Select(b => b.Width).Max()); textWidth = textWidth + (c.Width - (textWidth % c.Width)); if (textWidth < c.Width * 2) { textWidth = c.Width * 2; } int width = leftPadding + rightPadding + textWidth; int textHeight = (int)Math.Ceiling(lineSizes.Sum(b => b.Height)); int adjustTextY = (c.Height - (textHeight % c.Height)); textHeight = textHeight + adjustTextY; if (textHeight < c.Height * 2) { textHeight = c.Height * 2; } int height = topPadding + bottomPadding + textHeight; Point center = new Point(width / 2, (height - arrow.Height) / 2); Point nwPos = new Point((leftPadding - nw.Width) + nwOrigin.X, nwOrigin.Y); Point nePos = new Point(neOrigin.X + width - rightPadding, neOrigin.Y); Point swPos = new Point((leftPadding - sw.Width) + swOrigin.X, swOrigin.Y + height - bottomPadding); Point sePos = new Point(seOrigin.X + width - rightPadding, seOrigin.Y + height - bottomPadding); Point arrowPos = new Point(center.X, arrowOrigin.Y + height - arrow.Height); Image <Rgba32> result = new Image <Rgba32>(width, height); Tuple <Image <Rgba32>, Point, Point>[] corners = new Tuple <Image <Rgba32>, Point, Point>[] { new Tuple <Image <Rgba32>, Point, Point>(nw, nwOrigin, nwPos), new Tuple <Image <Rgba32>, Point, Point>(ne, neOrigin, nePos), new Tuple <Image <Rgba32>, Point, Point>(sw, swOrigin, swPos), new Tuple <Image <Rgba32>, Point, Point>(se, seOrigin, sePos) }; Tuple <Image <Rgba32>, Point, Point, Point>[] sides = new Tuple <Image <Rgba32>, Point, Point, Point>[] { new Tuple <Image <Rgba32>, Point, Point, Point>(w, wOrigin, new Point(leftPadding, nw.Height), new Point(leftPadding, swPos.Y - swOrigin.Y)), new Tuple <Image <Rgba32>, Point, Point, Point>(e, eOrigin, new Point(width - rightPadding, ne.Height), new Point(width - rightPadding, sePos.Y - seOrigin.Y)), new Tuple <Image <Rgba32>, Point, Point, Point>(n, nOrigin, new Point(nw.Width, topPadding), new Point(width - rightPadding, topPadding)), new Tuple <Image <Rgba32>, Point, Point, Point>(s, sOrigin, new Point((swPos.X + sw.Width - swOrigin.X), height - bottomPadding), new Point(width - rightPadding, height - bottomPadding)) }; result.Mutate(image => { for (int x = leftPadding; x < textWidth + leftPadding; x += c.Width) { for (int y = topPadding; y < textHeight + topPadding; y += c.Height) { image.DrawImage(c, 1, new Point(x, y)); } } foreach (var side in sides) { for (int x = side.Item3.X; x <= side.Item4.X; x += (side.Item1.Width)) { for (int y = side.Item3.Y; y <= side.Item4.Y; y += (side.Item1.Height)) { image.DrawImage(side.Item1, 1, new Point(x - side.Item2.X, y - side.Item2.Y)); if (side.Item3.Y == side.Item4.Y || (y + side.Item1.Height >= side.Item4.Y)) { break; } } if (side.Item3.X == side.Item4.X || (x + side.Item1.Width >= side.Item4.X)) { break; } } } foreach (var corner in corners) { image.DrawImage(corner.Item1, PixelBlenderMode.Src, 1, new Point(corner.Item3.X - corner.Item2.X, corner.Item3.Y - corner.Item2.Y)); } for (int i = 0; i < lines.Length; ++i) { int x = center.X - ((int)lineSizes[i].Width / 2); int y = (int)lineSizes.Take(i).Select(b => b.Height).DefaultIfEmpty(0).Sum(b => b) + ((height - arrow.Height) - textHeight) / 2; image.DrawText(lines[i], font, nameColor, new Point(x, y + adjustTextY / 2)); } image.DrawImage(arrow, 1, new Point(center.X - arrowOrigin.X, swPos.Y - arrowOrigin.Y)); }); return(File(result.ImageToByte(Request), "image/png")); }
public IEnumerable <KeyValuePair <int, string> > GetPets(int startPosition = 0, int?count = null) { WZProperty pets = WZ.Resolve("String/Pet") ?? WZ.Resolve("String/Item/Pet"); return(pets.Children.ToDictionary(c => int.Parse(c.NameWithoutExtension), c => c.ResolveForOrNull <string>("name")).Skip(startPosition).Take(count ?? int.MaxValue)); }
public MapleItem Search(int id, Func <int, int[]> getDroppedBy) { WZProperty stringWz = WZ.Resolve("String"); string idString = id.ToString(); MapleItem result = null; WZProperty item = (stringWz.Resolve("Eqp/Eqp") ?? stringWz.Resolve("Item/Eqp")).Children.FirstOrDefault(c => c.Children.Any(b => b.NameWithoutExtension.Equals(idString)))?.Resolve(idString); if (item != null) { result = Equip.Parse(item); } if (result == null) { item = (stringWz.Resolve("Etc/Etc") ?? stringWz.Resolve("Item/Etc"))?.Resolve(idString); if (item != null) { result = Etc.Parse(item); } } if (result == null) { item = (stringWz.Resolve("Ins") ?? stringWz.Resolve("Item/Ins")).Resolve(idString); if (item != null) { result = Install.Parse(item); } } if (result == null) { item = (stringWz.Resolve("Cash") ?? stringWz.Resolve("Item/Cash")).Resolve(idString); if (item != null) { result = Cash.Parse(item); } } if (result == null) { item = (stringWz.Resolve("Consume") ?? stringWz.Resolve("Item/Con")).Resolve(idString); if (item != null) { result = Consume.Parse(item); } } if (result == null) { item = (stringWz.Resolve("Pet") ?? stringWz.Resolve("Item/Pet")).Resolve(idString); if (item != null) { result = Pet.Parse(item); } } MobFactory mobs = new MobFactory(); mobs.CloneWZFrom(this); if (result != null && result.MetaInfo != null) { result.MetaInfo.DroppedBy = getDroppedBy(id)?.Join(mobs.GetMobs().Where(c => c != null), c => c, c => c.Id, (a, b) => b)?.ToArray(); } return(result); }
public NPC GetNPC(int id) => NPC.Parse(WZ.Resolve($"String/Npc/{id}"));
public MapMark GetMapMark(string markName) => MapMark.Parse(WZ.Resolve($"Map/MapHelper.img/mark/{markName}"));