コード例 #1
0
 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));
 }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
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);
        }
コード例 #5
0
        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);
        }
コード例 #6
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());
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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));
        }
コード例 #9
0
 public Quest GetQuest(int id)
 => Quest.GetQuest(WZ.Resolve("Quest"), id);
コード例 #10
0
 public SkillDescription GetSkillDescription(int id)
 => SkillDescription.Parse(WZ.Resolve($"String/Skill/{id}"));
コード例 #11
0
 public SkillBook GetSkillBook(int id)
 => SkillBook.Parse(WZ.Resolve($"Skill/{id}"), id, GetJob(id), (c) => GetSkillDescription(c));
コード例 #12
0
 public Android GetAndroid(int androidId)
 {
     return(Android.Parse(WZ.Resolve($"Etc/Android/{androidId.ToString("D4")}"), androidId));
 }
コード例 #13
0
 public IEnumerable <Job> GetJobs()
 => WZ.Resolve("Etc/GrowHelp/career").Children.Select(c => new Job(c));
コード例 #14
0
 public byte[] GetSong(string songPath)
 => WZ.Resolve("Sound").ResolveForOrNull <byte[]>($"{songPath.Trim('/', ' ', '\\').Replace(".img", "")}");
コード例 #15
0
 public SMap GetSMap()
 => SMap.Parse(WZ.Resolve("Base"));
コード例 #16
0
        public Pet GetPet(int petId)
        {
            WZProperty petItem = (WZ.Resolve("String/Pet") ?? WZ.Resolve("String/Item/Pet")).Resolve(petId.ToString());

            return(Pet.Parse(petItem));
        }
コード例 #17
0
 public IEnumerable <Tips> GetTips() => Tips.GetTips(WZ.Resolve("Etc"));
コード例 #18
0
 public Mob GetMob(int id)
     => Mob.Parse(WZ.Resolve($"String/Mob/{id}"));
コード例 #19
0
 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
コード例 #20
0
 public bool DoesSoundExist(string songPath)
 => WZ.Resolve("Sound").Resolve($"{songPath.Trim('/', ' ', '\\').Replace(".img", "")}")?.Type == PropertyType.Audio;
コード例 #21
0
 public string[] GetSounds(int startPosition = 0, int?count = null)
 => RecursiveGetSoundPath(WZ.Resolve("Sound").Children).Skip(startPosition).Take(count ?? int.MaxValue).ToArray();
コード例 #22
0
 public IEnumerable <int> GetAndroidIDs()
 {
     return(WZ.Resolve("Etc/Android").Children.Select(c => int.Parse(c.NameWithoutExtension)));
 }
コード例 #23
0
 public ZMap GetZMap()
 => ZMap.Parse(WZ.Resolve("Base"));
コード例 #24
0
 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);
コード例 #25
0
        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"));
        }
コード例 #26
0
        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"));
        }
コード例 #27
0
        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));
        }
コード例 #28
0
        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);
        }
コード例 #29
0
 public NPC GetNPC(int id)
 => NPC.Parse(WZ.Resolve($"String/Npc/{id}"));
コード例 #30
0
 public MapMark GetMapMark(string markName) => MapMark.Parse(WZ.Resolve($"Map/MapHelper.img/mark/{markName}"));