public override Bitmap Render() { if (this.Recipe == null) { return(null); } int picHeight; Bitmap originBmp = RenderRecipe(out picHeight); Bitmap tooltip = new Bitmap(originBmp.Width, picHeight); Graphics g = Graphics.FromImage(tooltip); //绘制背景区域 GearGraphics.DrawNewTooltipBack(g, 0, 0, tooltip.Width, tooltip.Height); //复制图像 g.DrawImage(originBmp, 0, 0, new Rectangle(0, 0, originBmp.Width, picHeight), GraphicsUnit.Pixel); //左上角 g.DrawImage(Resource.UIToolTip_img_Item_Frame2_cover, 3, 3); if (this.ShowObjectID) { GearGraphics.DrawGearDetailNumber(g, 3, 3, Recipe.RecipeID.ToString("d8"), true); } if (originBmp != null) { originBmp.Dispose(); } g.Dispose(); return(tooltip); }
public override Bitmap Render() { if (this.SetItem == null) { return(null); } int picHeight; Bitmap originBmp = RenderSetItem(out picHeight); Bitmap tooltip = new Bitmap(261, picHeight); Graphics g = Graphics.FromImage(tooltip); //绘制背景区域 GearGraphics.DrawNewTooltipBack(g, 0, 0, tooltip.Width, tooltip.Height); //复制图像 g.DrawImage(originBmp, 0, 0, new Rectangle(0, 0, tooltip.Width, picHeight), GraphicsUnit.Pixel); if (originBmp != null) { originBmp.Dispose(); } g.Dispose(); return(tooltip); }
public override Bitmap Render() { if (this.SetItem == null) { return(null); } int width = 261; int picHeight1; Bitmap originBmp = RenderSetItem(out picHeight1); int picHeight2 = 0; Bitmap effectBmp = null; if (this.SetItem.ExpandToolTip) { effectBmp = RenderEffectPart(out picHeight2); width += 261; } Bitmap tooltip = new Bitmap(width, Math.Max(picHeight1, picHeight2)); Graphics g = Graphics.FromImage(tooltip); //绘制左侧 GearGraphics.DrawNewTooltipBack(g, 0, 0, originBmp.Width, picHeight1); g.DrawImage(originBmp, 0, 0, new Rectangle(0, 0, originBmp.Width, picHeight1), GraphicsUnit.Pixel); //绘制右侧 if (effectBmp != null) { GearGraphics.DrawNewTooltipBack(g, originBmp.Width, 0, effectBmp.Width, picHeight2); g.DrawImage(effectBmp, originBmp.Width, 0, new Rectangle(0, 0, effectBmp.Width, picHeight2), GraphicsUnit.Pixel); } originBmp?.Dispose(); effectBmp?.Dispose(); g.Dispose(); return(tooltip); }
public override Bitmap Render() { if (this.Skill == null) { return(null); } CanvasRegion region = this.IsWideMode ? CanvasRegion.Wide : CanvasRegion.Original; int picHeight; Bitmap originBmp = RenderSkill(region, out picHeight); Bitmap tooltip = new Bitmap(originBmp.Width, picHeight); Graphics g = Graphics.FromImage(tooltip); //绘制背景区域 GearGraphics.DrawNewTooltipBack(g, 0, 0, tooltip.Width, tooltip.Height); //复制图像 g.DrawImage(originBmp, 0, 0, new Rectangle(0, 0, originBmp.Width, picHeight), GraphicsUnit.Pixel); //左上角 g.DrawImage(Resource.UIToolTip_img_Item_Frame2_cover, 3, 3); if (this.ShowObjectID) { GearGraphics.DrawGearDetailNumber(g, 3, 3, Skill.SkillID.ToString("d7"), true); } if (originBmp != null) { originBmp.Dispose(); } g.Dispose(); return(tooltip); }
public override Bitmap Render() { if (MobInfo == null) { return(null); } Bitmap bmp = new Bitmap(1, 1, PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(bmp); //预绘制 List <TextBlock> titleBlocks = new List <TextBlock>(); if (MobInfo.ID > -1) { string mobName = GetMobName(MobInfo.ID); var block = PrepareText(g, mobName ?? "(null)", GearGraphics.ItemNameFont2, Brushes.White, 0, 0); titleBlocks.Add(block); block = PrepareText(g, "ID:" + MobInfo.ID, GearGraphics.ItemDetailFont, Brushes.White, block.Size.Width + 4, 4); titleBlocks.Add(block); } List <TextBlock> propBlocks = new List <TextBlock>(); int picY = 0; StringBuilder sbExt = new StringBuilder(); if (MobInfo.Boss) { sbExt.Append("Boss "); } if (MobInfo.Undead) { sbExt.Append("Undead "); } if (MobInfo.FirstAttack) { sbExt.Append("Aggressive "); } if (!MobInfo.BodyAttack) { sbExt.Append("Touch Damage "); } if (MobInfo.DamagedByMob) { sbExt.Append("Damaged by Monsters "); } if (MobInfo.Invincible) { sbExt.Append("Invincible "); } if (MobInfo.NotAttack) { sbExt.Append("Cannot Attack "); } if (MobInfo.FixedDamage > 0) { sbExt.Append("Fixed Damage: " + MobInfo.FixedDamage + " "); } if (sbExt.Length > 1) { sbExt.Remove(sbExt.Length - 1, 1); propBlocks.Add(PrepareText(g, sbExt.ToString(), GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); picY += 16; } if (MobInfo.RemoveAfter > 0) { propBlocks.Add(PrepareText(g, "Despawns after " + MobInfo.RemoveAfter + " much time", GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); picY += 16; } propBlocks.Add(PrepareText(g, "Level: " + MobInfo.Level, GearGraphics.ItemDetailFont, Brushes.White, 0, picY)); string hpNum = !string.IsNullOrEmpty(MobInfo.FinalMaxHP) ? this.AddCommaSeparators(MobInfo.FinalMaxHP) : MobInfo.MaxHP.ToString("N0"); propBlocks.Add(PrepareText(g, "HP: " + hpNum, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); string mpNum = !string.IsNullOrEmpty(MobInfo.FinalMaxMP) ? this.AddCommaSeparators(MobInfo.FinalMaxMP) : MobInfo.MaxMP.ToString("N0"); propBlocks.Add(PrepareText(g, "MP: " + mpNum, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "PAD: " + MobInfo.PADamage, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "MAD: " + MobInfo.MADamage, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "PDR: " + MobInfo.PDRate + "%", GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "MDR: " + MobInfo.MDRate + "%", GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "ACC: " + MobInfo.Acc, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "EVA: " + MobInfo.Eva, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "KB: " + MobInfo.Pushed.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "EXP: " + MobInfo.Exp.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, GetElemAttrString(MobInfo.ElemAttr), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); picY += 28; if (MobInfo.Revive.Count > 0) { Dictionary <int, int> reviveCounts = new Dictionary <int, int>(); foreach (var reviveID in MobInfo.Revive) { int count = 0; reviveCounts.TryGetValue(reviveID, out count); reviveCounts[reviveID] = count + 1; } StringBuilder sb = new StringBuilder(); sb.Append("Revive after death "); int rowCount = 0; foreach (var kv in reviveCounts) { if (rowCount++ > 0) { sb.AppendLine().Append(" "); } string mobName = GetMobName(kv.Key); sb.AppendFormat("{0}({1:D7})", mobName, kv.Key); if (kv.Value > 1) { sb.Append("*" + kv.Value); } } propBlocks.Add(PrepareText(g, sb.ToString(), GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); } g.Dispose(); bmp.Dispose(); //计算大小 Rectangle titleRect = Measure(titleBlocks); Rectangle imgRect = Rectangle.Empty; Rectangle textRect = Measure(propBlocks); Bitmap mobImg = MobInfo.Default.Bitmap; if (mobImg != null) { if (mobImg.Width > 250 || mobImg.Height > 300) //进行缩放 { double scale = Math.Min((double)250 / mobImg.Width, (double)300 / mobImg.Height); imgRect = new Rectangle(0, 0, (int)(mobImg.Width * scale), (int)(mobImg.Height * scale)); } else { imgRect = new Rectangle(0, 0, mobImg.Width, mobImg.Height); } } //布局 //水平排列 int width = 0; if (!imgRect.IsEmpty) { textRect.X = imgRect.Width + 4; } width = Math.Max(titleRect.Width, Math.Max(imgRect.Right, textRect.Right)); titleRect.X = (width - titleRect.Width) / 2; //垂直居中 int height = Math.Max(imgRect.Height, textRect.Height); imgRect.Y = (height - imgRect.Height) / 2; textRect.Y = (height - textRect.Height) / 2; if (!titleRect.IsEmpty) { height += titleRect.Height + 4; imgRect.Y += titleRect.Bottom + 4; textRect.Y += titleRect.Bottom + 4; } //绘制 bmp = new Bitmap(width + 20, height + 20); titleRect.Offset(10, 10); imgRect.Offset(10, 10); textRect.Offset(10, 10); g = Graphics.FromImage(bmp); //绘制背景 GearGraphics.DrawNewTooltipBack(g, 0, 0, bmp.Width, bmp.Height); //绘制标题 foreach (var item in titleBlocks) { DrawText(g, item, titleRect.Location); } //绘制图像 if (mobImg != null && !imgRect.IsEmpty) { g.DrawImage(mobImg, imgRect); } //绘制文本 foreach (var item in propBlocks) { DrawText(g, item, textRect.Location); } g.Dispose(); return(bmp); }
public override Bitmap Render() { if (MobInfo == null) { return(null); } Bitmap bmp = new Bitmap(1, 1, PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(bmp); //预绘制 List <TextBlock> titleBlocks = new List <TextBlock>(); if (MobInfo.ID > -1) { string mobName = GetMobName(MobInfo.ID); var block = PrepareText(g, mobName ?? "(null)", GearGraphics.ItemNameFont2, Brushes.White, 0, 0); titleBlocks.Add(block); block = PrepareText(g, "코드:" + MobInfo.ID, GearGraphics.ItemDetailFont, Brushes.White, block.Size.Width + 4, 4); titleBlocks.Add(block); } List <TextBlock> propBlocks = new List <TextBlock>(); int picY = 0; StringBuilder sbExt = new StringBuilder(); if (MobInfo.Boss) { sbExt.Append("[보스] "); } if (MobInfo.Undead) { sbExt.Append("[언데드] "); } if (MobInfo.FirstAttack) { sbExt.Append("[선제공격] "); } if (!MobInfo.BodyAttack) { sbExt.Append("[바디어택] "); } if (MobInfo.DamagedByMob) { sbExt.Append("[몬스터에게 피해를 받음] "); } if (MobInfo.Invincible) { sbExt.Append("[무적] "); } if (MobInfo.NotAttack) { sbExt.Append("[공격하지 않음] "); } if (MobInfo.FixedDamage > 0) { sbExt.Append("[고정 데미지 : " + MobInfo.FixedDamage + "] "); } if (sbExt.Length > 1) { sbExt.Remove(sbExt.Length - 1, 1); propBlocks.Add(PrepareText(g, sbExt.ToString(), GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); picY += 16; } if (MobInfo.RemoveAfter > 0) { propBlocks.Add(PrepareText(g, "생성 " + MobInfo.RemoveAfter + "초 후 자동으로 사라짐", GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); picY += 16; } propBlocks.Add(PrepareText(g, "레벨: " + MobInfo.Level, GearGraphics.ItemDetailFont, Brushes.White, 0, picY)); propBlocks.Add(PrepareText(g, "HP: " + (!string.IsNullOrEmpty(MobInfo.FinalMaxHP) ? MobInfo.FinalMaxHP : MobInfo.MaxHP.ToString()), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "MP: " + (!string.IsNullOrEmpty(MobInfo.FinalMaxMP) ? MobInfo.FinalMaxMP : MobInfo.MaxMP.ToString()), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "물리공격력: " + MobInfo.PADamage, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "마법공격력: " + MobInfo.MADamage, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "물리방어율: " + MobInfo.PDRate + "%", GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "마법방어율: " + MobInfo.MDRate + "%", GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); //propBlocks.Add(PrepareText(g, "명중치: " + MobInfo.Acc, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); //propBlocks.Add(PrepareText(g, "회피치: " + MobInfo.Eva, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); //propBlocks.Add(PrepareText(g, "넉백: " + MobInfo.Pushed, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "경험치: " + MobInfo.Exp, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, GetElemAttrString(MobInfo.ElemAttr), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); picY += 28; if (MobInfo.Revive.Count > 0) { Dictionary <int, int> reviveCounts = new Dictionary <int, int>(); foreach (var reviveID in MobInfo.Revive) { int count = 0; reviveCounts.TryGetValue(reviveID, out count); reviveCounts[reviveID] = count + 1; } StringBuilder sb = new StringBuilder(); sb.Append("해당 몬스터를 소환하며 죽음: "); int rowCount = 0; foreach (var kv in reviveCounts) { if (rowCount++ > 0) { sb.AppendLine().Append(" "); } string mobName = GetMobName(kv.Key); sb.AppendFormat("{0}({1:D7})", mobName, kv.Key); if (kv.Value > 1) { sb.Append("*" + kv.Value); } } propBlocks.Add(PrepareText(g, sb.ToString(), GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); } g.Dispose(); bmp.Dispose(); //计算大小 Rectangle titleRect = Measure(titleBlocks); Rectangle imgRect = Rectangle.Empty; Rectangle textRect = Measure(propBlocks); Bitmap mobImg = MobInfo.Default.Bitmap; if (mobImg != null) { if (mobImg.Width > 250 || mobImg.Height > 300) //进行缩放 { double scale = Math.Min((double)250 / mobImg.Width, (double)300 / mobImg.Height); imgRect = new Rectangle(0, 0, (int)(mobImg.Width * scale), (int)(mobImg.Height * scale)); } else { imgRect = new Rectangle(0, 0, mobImg.Width, mobImg.Height); } } //布局 //水平排列 int width = 0; if (!imgRect.IsEmpty) { textRect.X = imgRect.Width + 4; } width = Math.Max(titleRect.Width, Math.Max(imgRect.Right, textRect.Right)); titleRect.X = (width - titleRect.Width) / 2; //垂直居中 int height = Math.Max(imgRect.Height, textRect.Height); imgRect.Y = (height - imgRect.Height) / 2; textRect.Y = (height - textRect.Height) / 2; if (!titleRect.IsEmpty) { height += titleRect.Height + 4; imgRect.Y += titleRect.Bottom + 4; textRect.Y += titleRect.Bottom + 4; } //绘制 bmp = new Bitmap(width + 20, height + 20); titleRect.Offset(10, 10); imgRect.Offset(10, 10); textRect.Offset(10, 10); g = Graphics.FromImage(bmp); //绘制背景 GearGraphics.DrawNewTooltipBack(g, 0, 0, bmp.Width, bmp.Height); //绘制标题 foreach (var item in titleBlocks) { DrawText(g, item, titleRect.Location); } //绘制图像 if (mobImg != null && !imgRect.IsEmpty) { g.DrawImage(mobImg, imgRect); } //绘制文本 foreach (var item in propBlocks) { DrawText(g, item, textRect.Location); } g.Dispose(); return(bmp); }
public override Bitmap Render() { if (NpcInfo == null) { return(null); } Bitmap bmp = new Bitmap(1, 1, PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(bmp); //预绘制 List <TextBlock> titleBlocks = new List <TextBlock>(); List <TextBlock> propBlocks = new List <TextBlock>(); int picY = 0; if (NpcInfo.ID > -1) { string mobName = GetNpcName(NpcInfo.ID); var block = PrepareText(g, mobName ?? "(null)", GearGraphics.ItemNameFont2, Brushes.White, 0, 0); titleBlocks.Add(block); block = PrepareText(g, "ID:" + NpcInfo.ID, GearGraphics.ItemDetailFont, Brushes.White, block.Size.Width + 4, 4); titleBlocks.Add(block); } propBlocks.Add(PrepareText(g, "出没地区:", GearGraphics.ItemDetailFont, GearGraphics.GearNameBrushG, 0, 0)); if (NpcInfo.ID != null) { var locNode = PluginBase.PluginManager.FindWz("Etc\\NpcLocation.img\\" + NpcInfo.ID.ToString()); if (locNode != null) { foreach (var locMapNode in locNode.Nodes) { int mapID; string mapName = null; if (int.TryParse(locMapNode.Text, out mapID)) { mapName = GetMapName(mapID); } string npcLoc = string.Format(" {0}({1})", mapName ?? "null", locMapNode.Text); propBlocks.Add(PrepareText(g, npcLoc, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } } } if (propBlocks.Count == 1) //获取地区失败 { propBlocks.Add(PrepareText(g, " 不明", GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } //计算大小 Rectangle titleRect = Measure(titleBlocks); Rectangle imgRect = Rectangle.Empty; Rectangle textRect = Measure(propBlocks); Bitmap npcImg = NpcInfo.Default.Bitmap; if (npcImg != null) { if (npcImg.Width > 250 || npcImg.Height > 300) //进行缩放 { double scale = Math.Min((double)250 / npcImg.Width, (double)300 / npcImg.Height); imgRect = new Rectangle(0, 0, (int)(npcImg.Width * scale), (int)(npcImg.Height * scale)); } else { imgRect = new Rectangle(0, 0, npcImg.Width, npcImg.Height); } } //布局 //水平排列 int width = 0; if (!imgRect.IsEmpty) { textRect.X = imgRect.Width + 4; } width = Math.Max(titleRect.Width, Math.Max(imgRect.Right, textRect.Right)); titleRect.X = (width - titleRect.Width) / 2; //垂直居中 int height = Math.Max(imgRect.Height, textRect.Height); imgRect.Y = (height - imgRect.Height) / 2; textRect.Y = (height - textRect.Height) / 2; if (!titleRect.IsEmpty) { height += titleRect.Height + 4; imgRect.Y += titleRect.Bottom + 4; textRect.Y += titleRect.Bottom + 4; } //绘制 bmp = new Bitmap(width + 20, height + 20); titleRect.Offset(10, 10); imgRect.Offset(10, 10); textRect.Offset(10, 10); g = Graphics.FromImage(bmp); //绘制背景 GearGraphics.DrawNewTooltipBack(g, 0, 0, bmp.Width, bmp.Height); //绘制标题 foreach (var item in titleBlocks) { DrawText(g, item, titleRect.Location); } //绘制图像 if (npcImg != null && !imgRect.IsEmpty) { g.DrawImage(npcImg, imgRect); } //绘制文本 foreach (var item in propBlocks) { DrawText(g, item, textRect.Location); } g.Dispose(); return(bmp); }
public override Bitmap Render() { if (this.item == null) { return(null); } //绘制道具 int picHeight; Bitmap itemBmp = RenderItem(out picHeight); Bitmap recipeInfoBmp = null; Bitmap recipeItemBmp = null; Bitmap setItemBmp = null; //图纸相关 int recipeID; if (this.item.Specs.TryGetValue(ItemSpecType.recipe, out recipeID)) { int recipeSkillID = recipeID / 10000; Recipe recipe = null; //寻找配方 Wz_Node recipeNode = PluginBase.PluginManager.FindWz(string.Format(@"Skill\Recipe_{0}.img\{1}", recipeSkillID, recipeID)); if (recipeNode != null) { recipe = Recipe.CreateFromNode(recipeNode); } //生成配方图像 if (recipe != null) { if (this.LinkRecipeInfo) { recipeInfoBmp = RenderLinkRecipeInfo(recipe); } if (this.LinkRecipeItem) { int itemID = recipe.MainTargetItemID; int itemIDClass = itemID / 1000000; if (itemIDClass == 1) //通过ID寻找装备 { Wz_Node charaWz = PluginManager.FindWz(Wz_Type.Character); if (charaWz != null) { string imgName = itemID.ToString("d8") + ".img"; foreach (Wz_Node node0 in charaWz.Nodes) { Wz_Node imgNode = node0.FindNodeByPath(imgName, true); if (imgNode != null) { Gear gear = Gear.CreateFromNode(imgNode, path => PluginManager.FindWz(path)); if (gear != null) { recipeItemBmp = RenderLinkRecipeGear(gear); } break; } } } } else if (itemIDClass >= 2 && itemIDClass <= 5) //通过ID寻找道具 { Wz_Node itemWz = PluginManager.FindWz(Wz_Type.Item); if (itemWz != null) { string imgClass = (itemID / 10000).ToString("d4") + ".img\\" + itemID.ToString("d8"); foreach (Wz_Node node0 in itemWz.Nodes) { Wz_Node imgNode = node0.FindNodeByPath(imgClass, true); if (imgNode != null) { Item item = Item.CreateFromNode(imgNode, PluginManager.FindWz); if (item != null) { recipeItemBmp = RenderLinkRecipeItem(item); } break; } } } } } } } int setID; if (this.item.Props.TryGetValue(ItemPropType.setItemID, out setID)) { SetItem setItem; if (CharaSimLoader.LoadedSetItems.TryGetValue(setID, out setItem)) { setItemBmp = RenderSetItem(setItem); } } //计算布局 Size totalSize = new Size(itemBmp.Width, picHeight); Point recipeInfoOrigin = Point.Empty; Point recipeItemOrigin = Point.Empty; Point setItemOrigin = Point.Empty; if (recipeItemBmp != null) { recipeItemOrigin.X = totalSize.Width; totalSize.Width += recipeItemBmp.Width; if (recipeInfoBmp != null) { recipeInfoOrigin.X = itemBmp.Width - recipeInfoBmp.Width; recipeInfoOrigin.Y = picHeight; totalSize.Height = Math.Max(picHeight + recipeInfoBmp.Height, recipeItemBmp.Height); } else { totalSize.Height = Math.Max(picHeight, recipeItemBmp.Height); } } else if (recipeInfoBmp != null) { totalSize.Width += recipeInfoBmp.Width; totalSize.Height = Math.Max(picHeight, recipeInfoBmp.Height); recipeInfoOrigin.X = itemBmp.Width; } if (setItemBmp != null) { setItemOrigin = new Point(totalSize.Width, 0); totalSize.Width += setItemBmp.Width; totalSize.Height = Math.Max(totalSize.Height, setItemBmp.Height); } //开始绘制 Bitmap tooltip = new Bitmap(totalSize.Width, totalSize.Height); Graphics g = Graphics.FromImage(tooltip); if (itemBmp != null) { //绘制背景区域 GearGraphics.DrawNewTooltipBack(g, 0, 0, itemBmp.Width, picHeight); //复制图像 g.DrawImage(itemBmp, 0, 0, new Rectangle(0, 0, itemBmp.Width, picHeight), GraphicsUnit.Pixel); //左上角 g.DrawImage(Resource.UIToolTip_img_Item_Frame2_cover, 3, 3); if (this.ShowObjectID) { GearGraphics.DrawGearDetailNumber(g, 3, 3, item.ItemID.ToString("d8"), true); } } //绘制配方 if (recipeInfoBmp != null) { g.DrawImage(recipeInfoBmp, recipeInfoOrigin.X, recipeInfoOrigin.Y, new Rectangle(Point.Empty, recipeInfoBmp.Size), GraphicsUnit.Pixel); } //绘制产出道具 if (recipeItemBmp != null) { g.DrawImage(recipeItemBmp, recipeItemOrigin.X, recipeItemOrigin.Y, new Rectangle(Point.Empty, recipeItemBmp.Size), GraphicsUnit.Pixel); } //绘制套装 if (setItemBmp != null) { g.DrawImage(setItemBmp, setItemOrigin.X, setItemOrigin.Y, new Rectangle(Point.Empty, setItemBmp.Size), GraphicsUnit.Pixel); } if (itemBmp != null) { itemBmp.Dispose(); } if (recipeInfoBmp != null) { recipeInfoBmp.Dispose(); } if (recipeItemBmp != null) { recipeItemBmp.Dispose(); } if (setItemBmp != null) { setItemBmp.Dispose(); } g.Dispose(); return(tooltip); }
public override Bitmap Render() { if (MobInfo == null) { return(null); } Bitmap bmp = new Bitmap(1, 1, PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(bmp); //预绘制 List <TextBlock> titleBlocks = new List <TextBlock>(); if (MobInfo.ID > -1) { string mobName = GetMobName(MobInfo.ID); var block = PrepareText(g, mobName ?? "(null)", GearGraphics.ItemNameFont2, Brushes.White, 0, 0); titleBlocks.Add(block); block = PrepareText(g, "ID:" + MobInfo.ID, GearGraphics.ItemDetailFont, Brushes.White, block.Size.Width + 4, 4); titleBlocks.Add(block); } List <TextBlock> propBlocks = new List <TextBlock>(); int picY = 0; StringBuilder sbExt = new StringBuilder(); if (MobInfo.Boss && MobInfo.PartyBonusMob) { sbExt.Append("[Mini-Boss] "); } if (MobInfo.Boss && !MobInfo.PartyBonusMob) { sbExt.Append("[Boss] "); } if (MobInfo.Undead) { sbExt.Append("[Undead] "); } if (MobInfo.FirstAttack) { sbExt.Append("[Auto-Aggressive] "); } if (!MobInfo.BodyAttack) { sbExt.Append("[No Touch Damage] "); } if (MobInfo.FixedBodyAttackDamageR > 0) { sbExt.Append("[Fixed Touch Damage: " + MobInfo.FixedBodyAttackDamageR + "%] "); } if (MobInfo.DamagedByMob || MobInfo.AllyMob) { sbExt.Append("[Ally Mob] "); } if (MobInfo.Invincible) { sbExt.Append("[Invincible] "); } if (MobInfo.NotAttack) { sbExt.Append("[Cannot Attack] "); } if (MobInfo.IgnoreMoveImpact) { sbExt.Append("[Immune to Rush] "); } if (MobInfo.IgnoreMovable) { sbExt.Append("[Immune to Stun/Bind] "); } if (MobInfo.FixedDamage > 0) { sbExt.Append("[Fixed Damage: " + MobInfo.FixedDamage + "] "); } if (MobInfo.ChangeableMob) { sbExt.Append("[Level/Stats Scale to Average Level] "); } if (MobInfo.OnlyNormalAttack) { sbExt.Append("[Only Damaged by Basic Attacks] "); } if (MobInfo.OnlyHittedByCommonAttack) { sbExt.Append("[Only Hit by Basic Attacks] "); } if (sbExt.Length > 1) { sbExt.Remove(sbExt.Length - 1, 1); propBlocks.Add(PrepareText(g, sbExt.ToString(), GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); picY += 16; } if (MobInfo.RemoveAfter > 0) { propBlocks.Add(PrepareText(g, "[After " + MobInfo.RemoveAfter + " seconds, dies automatically] ", GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); picY += 16; } propBlocks.Add(PrepareText(g, "LEVEL: " + MobInfo.Level, GearGraphics.ItemDetailFont, Brushes.White, 0, picY)); string hpNum = !string.IsNullOrEmpty(MobInfo.FinalMaxHP) ? this.AddCommaSeparators(MobInfo.FinalMaxHP) : MobInfo.MaxHP.ToString("N0"); propBlocks.Add(PrepareText(g, "HP: " + hpNum, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); string mpNum = !string.IsNullOrEmpty(MobInfo.FinalMaxMP) ? this.AddCommaSeparators(MobInfo.FinalMaxMP) : MobInfo.MaxMP.ToString("N0"); propBlocks.Add(PrepareText(g, "MP: " + mpNum, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "Physical Damage: " + MobInfo.PADamage.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "Magic Damage: " + MobInfo.MADamage.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "Physical Defense: " + MobInfo.PDDamage.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "Magic Defense: " + MobInfo.MDDamage.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "PDRate: " + MobInfo.PDRate + "%", GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "MDRate: " + MobInfo.MDRate + "%", GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); if (MobInfo.HPRecovery > 0) { propBlocks.Add(PrepareText(g, "HP Recovery (periodically): " + MobInfo.HPRecovery.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (MobInfo.MPRecovery > 0) { propBlocks.Add(PrepareText(g, "MP Recovery (periodically): " + MobInfo.MPRecovery.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } propBlocks.Add(PrepareText(g, "Accuracy: " + MobInfo.Acc.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); propBlocks.Add(PrepareText(g, "EXP: " + MobInfo.Exp.ToString("N0"), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); if (MobInfo.CharismaEXP > 0) { propBlocks.Add(PrepareText(g, "Ambition EXP: " + MobInfo.CharismaEXP, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (MobInfo.SenseEXP > 0) { propBlocks.Add(PrepareText(g, "Empathy EXP: " + MobInfo.SenseEXP, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (MobInfo.InsightEXP > 0) { propBlocks.Add(PrepareText(g, "Insight EXP: " + MobInfo.InsightEXP, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (MobInfo.WillEXP > 0) { propBlocks.Add(PrepareText(g, "Willpower EXP: " + MobInfo.WillEXP, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (MobInfo.CraftEXP > 0) { propBlocks.Add(PrepareText(g, "Diligence EXP: " + MobInfo.CraftEXP, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (MobInfo.CharmEXP > 0) { propBlocks.Add(PrepareText(g, "Charm EXP: " + MobInfo.CharmEXP, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (MobInfo.WP > 0) { propBlocks.Add(PrepareText(g, "Weapon Points (for Zero): " + MobInfo.WP, GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } if (GetElemAttrString(MobInfo.ElemAttr) != "") { propBlocks.Add(PrepareText(g, "Elements: " + GetElemAttrString(MobInfo.ElemAttr), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); } propBlocks.Add(PrepareText(g, "Category: " + GetMobCategoryName(MobInfo.Category), GearGraphics.ItemDetailFont, Brushes.White, 0, picY += 16)); picY += 28; if (MobInfo.Revive.Count > 0) { Dictionary <int, int> reviveCounts = new Dictionary <int, int>(); foreach (var reviveID in MobInfo.Revive) { int count = 0; reviveCounts.TryGetValue(reviveID, out count); reviveCounts[reviveID] = count + 1; } StringBuilder sb = new StringBuilder(); sb.Append("Summons upon death: "); int rowCount = 0; foreach (var kv in reviveCounts) { if (rowCount++ > 0) { sb.AppendLine().Append(" "); } string mobName = GetMobName(kv.Key); sb.AppendFormat("{0}({1:D7})", mobName, kv.Key); if (kv.Value > 1) { sb.Append(" * " + kv.Value); } } propBlocks.Add(PrepareText(g, sb.ToString(), GearGraphics.ItemDetailFont, Brushes.GreenYellow, 0, picY)); } g.Dispose(); bmp.Dispose(); //计算大小 Rectangle titleRect = Measure(titleBlocks); Rectangle imgRect = Rectangle.Empty; Rectangle textRect = Measure(propBlocks); Bitmap mobImg = MobInfo.Default.Bitmap; if (mobImg != null) { if (mobImg.Width > 250 || mobImg.Height > 300) //进行缩放 { double scale = Math.Min((double)250 / mobImg.Width, (double)300 / mobImg.Height); imgRect = new Rectangle(0, 0, (int)(mobImg.Width * scale), (int)(mobImg.Height * scale)); } else { imgRect = new Rectangle(0, 0, mobImg.Width, mobImg.Height); } } //布局 //水平排列 int width = 0; if (!imgRect.IsEmpty) { textRect.X = imgRect.Width + 4; } width = Math.Max(titleRect.Width, Math.Max(imgRect.Right, textRect.Right)); titleRect.X = (width - titleRect.Width) / 2; //垂直居中 int height = Math.Max(imgRect.Height, textRect.Height); imgRect.Y = (height - imgRect.Height) / 2; textRect.Y = (height - textRect.Height) / 2; if (!titleRect.IsEmpty) { height += titleRect.Height + 4; imgRect.Y += titleRect.Bottom + 4; textRect.Y += titleRect.Bottom + 4; } //绘制 bmp = new Bitmap(width + 20, height + 20); titleRect.Offset(10, 10); imgRect.Offset(10, 10); textRect.Offset(10, 10); g = Graphics.FromImage(bmp); //绘制背景 GearGraphics.DrawNewTooltipBack(g, 0, 0, bmp.Width, bmp.Height); //绘制标题 foreach (var item in titleBlocks) { DrawText(g, item, titleRect.Location); } //绘制图像 if (mobImg != null && !imgRect.IsEmpty) { g.DrawImage(mobImg, imgRect); } //绘制文本 foreach (var item in propBlocks) { DrawText(g, item, textRect.Location); } g.Dispose(); return(bmp); }