internal static int CreateRectangleArea(Gump g, int startx, int starty, int width, int height, int topage = 0, uint linecolor = 0xAFAFAF, int linewidth = 1, string toplabel = null, ushort textcolor = 999, byte textfont = 0xFF) { if (!string.IsNullOrEmpty(toplabel)) { Label l = new Label(toplabel, true, textcolor, font: textfont); int rwidth = (width - l.Width) >> 1; l.X = startx + rwidth + 2; l.Y = Math.Max(0, starty - ((l.Height + 1) >> 1)); g.Add(l, topage); if (rwidth > 0) { g.Add(new Line(startx, starty, rwidth, linewidth, linecolor), topage); g.Add(new Line(startx + width - rwidth, starty, rwidth, linewidth, linecolor), topage); } } else { g.Add(new Line(startx, starty, width, linewidth, linecolor), topage); } g.Add(new Line(startx, starty, linewidth, height, linecolor), topage); g.Add(new Line(startx + width - 1, starty, linewidth, height, linecolor), topage); g.Add(new Line(startx, starty + height - 1, width, linewidth, linecolor), topage); return(starty + height); }
public static Control Create(uint sender, uint gumpID, int x, int y, string layout, string[] lines) { Gump gump = null; bool mustBeAdded = true; if (GetGumpCachePosition(gumpID, out Point pos)) { x = pos.X; y = pos.Y; for (var last = Gumps.Last; last != null; last = last.Previous) { var g = last.Value; if (!g.IsDisposed && g.LocalSerial == sender && g.ServerSerial == gumpID) { g.Clear(); gump = g as Gump; mustBeAdded = false; break; } } } else { SavePosition(gumpID, new Point(x, y)); } if (gump == null) { gump = new Gump(sender, gumpID) { X = x, Y = y, CanMove = true, CanCloseWithRightClick = true, CanCloseWithEsc = true } } ; int group = 0; int page = 0; List <string> cmdlist = _parser.GetTokens(layout); int cmdlen = cmdlist.Count; bool applyCheckerTrans = false; bool textBoxFocused = false; for (int cnt = 0; cnt < cmdlen; cnt++) { List <string> gparams = _cmdparser.GetTokens(cmdlist[cnt], false); if (gparams.Count == 0) { continue; } switch (gparams[0].ToLower()) { case "button": gump.Add(new Button(gparams), page); break; case "buttontileart": gump.Add(new ButtonTileArt(gparams), page); break; case "checkertrans": applyCheckerTrans = true; gump.Add(new CheckerTrans(gparams), page); break; case "croppedtext": gump.Add(new CroppedText(gparams, lines), page); break; case "gumppic": GumpPic pic = new GumpPic(gparams); if (gparams.Count >= 6 && gparams[5].ToLower().Contains("virtuegumpitem")) { pic.ContainsByBounds = true; pic.IsVirtue = true; string s, lvl; switch (pic.Hue) { case 2403: lvl = ""; break; case 1154: case 1547: case 2213: case 235: case 18: case 2210: case 1348: lvl = "Seeker of "; break; case 2404: case 1552: case 2216: case 2302: case 2118: case 618: case 2212: case 1352: lvl = "Follower of "; break; case 43: case 53: case 1153: case 33: case 318: case 67: case 98: lvl = "Knight of "; break; case 2406: if (pic.Graphic == 0x6F) { lvl = "Seeker of "; } else { lvl = "Knight of "; } break; default: lvl = ""; break; } switch (pic.Graphic) { case 0x69: s = ClilocLoader.Instance.GetString(1051000 + 2); break; case 0x6A: s = ClilocLoader.Instance.GetString(1051000 + 7); break; case 0x6B: s = ClilocLoader.Instance.GetString(1051000 + 5); break; case 0x6D: s = ClilocLoader.Instance.GetString(1051000 + 6); break; case 0x6E: s = ClilocLoader.Instance.GetString(1051000 + 1); break; case 0x6F: s = ClilocLoader.Instance.GetString(1051000 + 3); break; case 0x70: s = ClilocLoader.Instance.GetString(1051000 + 4); break; case 0x6C: default: s = ClilocLoader.Instance.GetString(1051000); break; } if (string.IsNullOrEmpty(s)) { s = "Unknown virtue"; } pic.SetTooltip(lvl + s, 100); } gump.Add(pic, page); break; case "gumppictiled": gump.Add(new GumpPicTiled(gparams), page); break; case "htmlgump": gump.Add(new HtmlControl(gparams, lines), page); break; case "xmfhtmlgump": gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", ClilocLoader.Instance.GetString(int.Parse(gparams[5])), 0, true), page); break; case "xmfhtmlgumpcolor": int color = int.Parse(gparams[8]); if (color == 0x7FFF) { color = 0x00FFFFFF; } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", ClilocLoader.Instance.GetString(int.Parse(gparams[5])), color, true), page); break; case "xmfhtmltok": color = int.Parse(gparams[7]); if (color == 0x7FFF) { color = 0x00FFFFFF; } StringBuilder sb = null; if (gparams.Count > 9) { sb = new StringBuilder(); sb.Append(gparams[9]); for (int i = 10; i < gparams.Count; i++) { sb.Append(' '); sb.Append(gparams[i]); } } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[5]) == 1, int.Parse(gparams[6]) != 0, gparams[5] != "0" && gparams[6] == "2", sb == null ? ClilocLoader.Instance.GetString(int.Parse(gparams[8])) : ClilocLoader.Instance.Translate(ClilocLoader.Instance.GetString(int.Parse(gparams[8])), sb.ToString().Trim('@').Replace('@', '\t')), color, true), page); break; case "page": if (gparams.Count >= 2) { page = int.Parse(gparams[1]); } break; case "resizepic": gump.Add(new ResizePic(gparams), page); break; case "text": if (gparams.Count >= 5) { gump.Add(new Label(gparams, lines), page); } break; case "textentrylimited": case "textentry": TextBox textBox = new TextBox(gparams, lines); if (!textBoxFocused) { textBox.SetKeyboardFocus(); textBoxFocused = true; } gump.Add(textBox, page); break; case "tilepichue": case "tilepic": gump.Add(new StaticPic(gparams), page); break; case "noclose": gump.CanCloseWithRightClick = false; break; case "nodispose": gump.CanCloseWithEsc = false; break; case "nomove": gump.BlockMovement = true; break; case "group": case "endgroup": group++; break; case "radio": gump.Add(new RadioButton(group, gparams, lines), page); break; case "checkbox": gump.Add(new Checkbox(gparams, lines), page); break; case "tooltip": if (World.ClientFeatures.TooltipsEnabled) { string text = ClilocLoader.Instance.GetString(int.Parse(gparams[1])); if (gparams.Count > 2 && gparams[2].Length != 0) { string args = gparams[2]; if (args.Length > 1) { text = ClilocLoader.Instance.Translate(text, args); } else { Log.Error($"String '{args}' too short, something wrong with gump tooltip: {text}"); } } gump.Children.LastOrDefault()?.SetTooltip(text); } break; case "itemproperty": if (World.ClientFeatures.TooltipsEnabled) { gump.Children.LastOrDefault()?.SetTooltip(SerialHelper.Parse(gparams[1])); } break; case "noresize": break; case "mastergump": Log.Warn("Gump part 'mastergump' not handled."); break; default: Log.Warn(gparams[0]); break; } } if (applyCheckerTrans) { bool applyTrans(int ii, int current_page) { bool transparent = false; for (; ii < gump.Children.Count; ii++) { var child = gump.Children[ii]; if (current_page == 0) { current_page = child.Page; } bool canDraw = /*current_page == 0 || child.Page == 0 ||*/ current_page == child.Page; if (canDraw && child.IsVisible && child is CheckerTrans) { transparent = true; continue; } child.Alpha = transparent ? 0.5f : 0; } return(transparent); } bool trans = applyTrans(0, 0); float alpha = trans ? 0.5f : 0; for (int i = 0; i < gump.Children.Count; i++) { var cc = gump.Children[i]; if (cc is CheckerTrans) { trans = applyTrans(i + 1, cc.Page); alpha = trans ? 0.5f : 0; } else { cc.Alpha = alpha; } } } if (mustBeAdded) { Add(gump); } gump.Update(Time.Ticks, 0); gump.SetInScreen(); return(gump); }
public Control Create(Serial sender, Serial gumpID, int x, int y, string layout, string[] lines) { if (GetGumpCachePosition(gumpID, out Point pos)) { x = pos.X; y = pos.Y; } else { SavePosition(gumpID, new Point(x, y)); } Gump gump = new Gump(sender, gumpID) { X = x, Y = y, CanMove = true, CanCloseWithRightClick = true, CanCloseWithEsc = true }; int group = 0; int page = 0; List <string> cmdlist = _parser.GetTokens(layout); int cmdlen = cmdlist.Count; for (int cnt = 0; cnt < cmdlen; cnt++) { List <string> gparams = _cmdparser.GetTokens(cmdlist[cnt], false); if (gparams.Count == 0) { continue; } switch (gparams[0].ToLower()) { case "button": gump.Add(new Button(gparams), page); break; case "buttontileart": gump.Add(new Button(gparams) { ContainsByBounds = true }, page); gump.Add(new StaticPic(Graphic.Parse(gparams[8]), Hue.Parse(gparams[9])) { X = int.Parse(gparams[1]) + int.Parse(gparams[10]), Y = int.Parse(gparams[2]) + int.Parse(gparams[11]), AcceptMouseInput = true }, page); break; case "checkertrans": CheckerTrans t = new CheckerTrans(gparams); for (int i = gump.Children.Count - 1; i >= 0; i--) { Control c = gump.Children[i]; c.Initialize(); if (c is CheckerTrans) { break; } if (t.Bounds.Intersects(c.Bounds)) { if (c.CanUseAlpha) { c.IsTransparent = true; c.Alpha = 0.6f; } } } //float[] alpha = { 0, 0.5f }; //bool checkTransparent(Control c, int start) //{ // bool transparent = false; // for (int i = start; i < c.Children.Count; i++) // { // var control = c.Children[i]; // bool canDraw = c.Page == 0 || control.Page == 0 || c.Page == control.Page; // if (canDraw && control is CheckerTrans) // { // transparent = true; // } // } // return transparent; //} //bool trans = checkTransparent(gump, 0); //for (int i = gump.Children.Count - 1; i >= 0; i--) //{ // Control g = gump.Children[i]; // g.IsTransparent = true; // if (g is CheckerTrans) // { // trans = checkTransparent(gump, i + 1); // continue; // } // g.Alpha = alpha[trans ? 1 : 0]; //} gump.Add(t, page); break; case "croppedtext": gump.Add(new CroppedText(gparams, lines), page); break; case "gumppic": GumpPic pic = new GumpPic(gparams); if (gparams.Count >= 6 && gparams[5].ToLower().Contains("virtuegumpitem")) { pic.ContainsByBounds = true; pic.IsVirtue = true; } gump.Add(pic, page); break; case "gumppictiled": gump.Add(new GumpPicTiled(gparams), page); break; case "htmlgump": gump.Add(new HtmlControl(gparams, lines), page); break; case "xmfhtmlgump": gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", FileManager.Cliloc.GetString(int.Parse(gparams[5])), 0, true), page); break; case "xmfhtmlgumpcolor": int color = int.Parse(gparams[8]); if (color == 0x7FFF) { color = 0x00FFFFFF; } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", FileManager.Cliloc.GetString(int.Parse(gparams[5])), color, true), page); break; case "xmfhtmltok": color = int.Parse(gparams[7]); if (color == 0x7FFF) { color = 0x00FFFFFF; } StringBuilder sb = null; if (gparams.Count > 9) { sb = new StringBuilder(); sb.Append(gparams[9]); for (int i = 10; i < gparams.Count; i++) { sb.Append(' '); sb.Append(gparams[i]); } } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[5]) == 1, int.Parse(gparams[6]) != 0, gparams[5] != "0" && gparams[6] == "2", sb == null ? FileManager.Cliloc.GetString(int.Parse(gparams[8])) : FileManager.Cliloc.Translate(FileManager.Cliloc.GetString(int.Parse(gparams[8])), sb.ToString().Trim('@')), color, true), page); break; case "page": page = int.Parse(gparams[1]); break; case "resizepic": gump.Add(new ResizePic(gparams), page); break; case "text": gump.Add(new Label(gparams, lines), page); break; case "textentrylimited": case "textentry": gump.Add(new TextBox(gparams, lines), page); break; case "tilepichue": case "tilepic": gump.Add(new StaticPic(gparams), page); break; case "noclose": gump.CanCloseWithRightClick = false; break; case "nodispose": gump.CanCloseWithEsc = false; break; case "nomove": gump.BlockMovement = true; break; case "group": case "endgroup": group++; break; case "radio": gump.Add(new RadioButton(group, gparams, lines), page); break; case "checkbox": gump.Add(new Checkbox(gparams, lines), page); break; case "tooltip": if (World.ClientFeatures.TooltipsEnabled) { string cliloc = FileManager.Cliloc.GetString(int.Parse(gparams[1])); if (gparams.Count > 2 && gparams[2][0] == '@') { string args = gparams[2]; //Convert tooltip args format to standard cliloc format args = args.Trim('@').Replace('@', '\t'); if (args.Length > 1) { cliloc = FileManager.Cliloc.Translate(cliloc, args); } else { Log.Message(LogTypes.Error, $"String '{args}' too short, something wrong with gump tooltip: {cliloc}"); } } gump.Children.Last()?.SetTooltip(cliloc); } break; case "itemproperty": if (World.ClientFeatures.TooltipsEnabled) { var entity = World.Get(Serial.Parse(gparams[1])); var lastControl = gump.Children.LastOrDefault(); if (lastControl != default(Control) && entity != default(Entity)) { lastControl.SetTooltip(entity); } } break; case "noresize": break; case "mastergump": Log.Message(LogTypes.Warning, "Gump part 'mastergump' not handled."); break; } } Add(gump); return(gump); }
public static Control Create(Serial sender, Serial gumpID, int x, int y, string layout, string[] lines) { if (GetGumpCachePosition(gumpID, out Point pos)) { x = pos.X; y = pos.Y; } else { SavePosition(gumpID, new Point(x, y)); } Gump gump = new Gump(sender, gumpID) { X = x, Y = y, CanMove = true, CanCloseWithRightClick = true, CanCloseWithEsc = true }; int group = 0; int page = 0; List <string> cmdlist = _parser.GetTokens(layout); int cmdlen = cmdlist.Count; bool applyCheckerTrans = false; for (int cnt = 0; cnt < cmdlen; cnt++) { List <string> gparams = _cmdparser.GetTokens(cmdlist[cnt], false); if (gparams.Count == 0) { continue; } switch (gparams[0].ToLower()) { case "button": gump.Add(new Button(gparams), page); break; case "buttontileart": gump.Add(new Button(gparams) { ContainsByBounds = true }, page); gump.Add(new StaticPic(Graphic.Parse(gparams[8]), Hue.Parse(gparams[9])) { X = int.Parse(gparams[1]) + int.Parse(gparams[10]), Y = int.Parse(gparams[2]) + int.Parse(gparams[11]), AcceptMouseInput = true }, page); break; case "checkertrans": CheckerTrans t = new CheckerTrans(gparams); applyCheckerTrans = true; //bool applyTrans(int ii, int current_page) //{ // bool transparent = false; // for (; ii < gump.Children.Count; ii++) // { // var child = gump.Children[ii]; // bool canDraw = /*current_page == 0 || child.Page == 0 ||*/ // current_page == child.Page; // if (canDraw && child.IsVisible && child is CheckerTrans) // { // transparent = true; // } // } // return transparent; //} //void checkerContains(int ii, float tr) //{ // var master = gump.Children[ii]; // for (int i = 0; i < ii; i++) // { // var cc = gump.Children[i]; // if (master.Bounds.Contains(cc.Bounds)) // { // cc.Alpha = 1f; // } // } //} //Rectangle bounds = t.Bounds; //bool trans = false; //for (int i = gump.Children.Count - 1; i >= 0; i--) //{ // var cc = gump.Children[i]; // if (cc is CheckerTrans) // { // trans = applyTrans(i, cc.Page); // bounds = cc.Bounds; // continue; // } // if (bounds.Contains(cc.Bounds)) // { // cc.Alpha = 1f; // } // else // cc.Alpha = trans ? 1 : 0.5f; //} gump.Add(t, page); // int j = 0; // bool trans = applyTrans(j, page, null); // float alpha = trans ? 1 : 0.5f; //// checkerContains(j, alpha); // for (; j < gump.Children.Count; j++) // { // var child = gump.Children[j]; // if (child is CheckerTrans tt) // { // trans = applyTrans(j, child.Page, tt); // alpha = trans ? 1 : .5f; // checkerContains(j, alpha); // } // else // { // child.Alpha = alpha != 1 ? 0.5f : alpha; // } // } //float[] alpha = { 1f, 0.5f }; //bool checkTransparent(Control c, int start) //{ // bool transparent = false; // for (int i = start; i < c.Children.Count; i++) // //for (int i = start; i >= 0; i--) // { // var control = c.Children[i]; // bool canDraw = /*c.Page == 0 || control.Page == 0 || c.Page == control.Page ||*/ control.Page == page; // if (canDraw && control is CheckerTrans) // { // transparent = true; // } // } // return transparent; //} //bool trans = checkTransparent(gump, 0); //for (int i = gump.Children.Count - 1; i >= 0; i--) //{ // Control g = gump.Children[i]; // g.Initialize(); // g.IsTransparent = true; // if (g is CheckerTrans) // { // trans = checkTransparent(gump, i + 1); // continue; // } // g.Alpha = alpha[trans ? 0 : 1]; //} break; case "croppedtext": gump.Add(new CroppedText(gparams, lines), page); break; case "gumppic": GumpPic pic = new GumpPic(gparams); if (gparams.Count >= 6 && gparams[5].ToLower().Contains("virtuegumpitem")) { pic.ContainsByBounds = true; pic.IsVirtue = true; string s, lvl; switch (pic.Hue) { case 2403: lvl = ""; break; case 1154: case 1547: case 2213: case 235: case 18: case 2210: case 1348: lvl = "Seeker of "; break; case 2404: case 1552: case 2216: case 2302: case 2118: case 618: case 2212: case 1352: lvl = "Follower of "; break; case 43: case 53: case 1153: case 33: case 318: case 67: case 98: lvl = "Knight of "; break; case 2406: if (pic.Graphic == 0x6F) { lvl = "Seeker of "; } else { lvl = "Knight of "; } break; default: lvl = ""; break; } switch (pic.Graphic) { case 0x69: s = UOFileManager.Cliloc.GetString(1051000 + 2); break; case 0x6A: s = UOFileManager.Cliloc.GetString(1051000 + 7); break; case 0x6B: s = UOFileManager.Cliloc.GetString(1051000 + 5); break; case 0x6D: s = UOFileManager.Cliloc.GetString(1051000 + 6); break; case 0x6E: s = UOFileManager.Cliloc.GetString(1051000 + 1); break; case 0x6F: s = UOFileManager.Cliloc.GetString(1051000 + 3); break; case 0x70: s = UOFileManager.Cliloc.GetString(1051000 + 4); break; case 0x6C: default: s = UOFileManager.Cliloc.GetString(1051000); break; } if (string.IsNullOrEmpty(s)) { s = "Unknown virtue"; } pic.SetTooltip(lvl + s, 100); } gump.Add(pic, page); break; case "gumppictiled": gump.Add(new GumpPicTiled(gparams), page); break; case "htmlgump": gump.Add(new HtmlControl(gparams, lines), page); break; case "xmfhtmlgump": gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", UOFileManager.Cliloc.GetString(int.Parse(gparams[5])), 0, true), page); break; case "xmfhtmlgumpcolor": int color = int.Parse(gparams[8]); if (color == 0x7FFF) { color = 0x00FFFFFF; } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", UOFileManager.Cliloc.GetString(int.Parse(gparams[5])), color, true), page); break; case "xmfhtmltok": color = int.Parse(gparams[7]); if (color == 0x7FFF) { color = 0x00FFFFFF; } StringBuilder sb = null; if (gparams.Count > 9) { sb = new StringBuilder(); sb.Append(gparams[9]); for (int i = 10; i < gparams.Count; i++) { sb.Append(' '); sb.Append(gparams[i]); } } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[5]) == 1, int.Parse(gparams[6]) != 0, gparams[5] != "0" && gparams[6] == "2", sb == null ? UOFileManager.Cliloc.GetString(int.Parse(gparams[8])) : UOFileManager.Cliloc.Translate(UOFileManager.Cliloc.GetString(int.Parse(gparams[8])), sb.ToString().Trim('@')), color, true), page); break; case "page": if (gparams.Count >= 1) { page = int.Parse(gparams[1]); } break; case "resizepic": gump.Add(new ResizePic(gparams), page); break; case "text": if (gparams.Count >= 5) { gump.Add(new Label(gparams, lines), page); } break; case "textentrylimited": case "textentry": gump.Add(new TextBox(gparams, lines), page); break; case "tilepichue": case "tilepic": gump.Add(new StaticPic(gparams), page); break; case "noclose": gump.CanCloseWithRightClick = false; break; case "nodispose": gump.CanCloseWithEsc = false; break; case "nomove": gump.BlockMovement = true; break; case "group": case "endgroup": group++; break; case "radio": gump.Add(new RadioButton(group, gparams, lines), page); break; case "checkbox": gump.Add(new Checkbox(gparams, lines), page); break; case "tooltip": if (World.ClientFeatures.TooltipsEnabled) { string cliloc = UOFileManager.Cliloc.GetString(int.Parse(gparams[1])); if (gparams.Count > 2 && gparams[2][0] == '@') { string args = gparams[2]; //Convert tooltip args format to standard cliloc format args = args.Trim('@').Replace('@', '\t'); if (args.Length > 1) { cliloc = UOFileManager.Cliloc.Translate(cliloc, args); } else { Log.Error($"String '{args}' too short, something wrong with gump tooltip: {cliloc}"); } } gump.Children.Last()?.SetTooltip(cliloc); } break; case "itemproperty": if (World.ClientFeatures.TooltipsEnabled) { var entity = World.Get(Serial.Parse(gparams[1])); var lastControl = gump.Children.LastOrDefault(); if (lastControl != default(Control) && entity != default(Entity)) { lastControl.SetTooltip(entity); } } break; case "noresize": break; case "mastergump": Log.Warn("Gump part 'mastergump' not handled."); break; } } if (applyCheckerTrans) { bool applyTrans(int ii, int current_page) { bool transparent = false; for (; ii < gump.Children.Count; ii++) { var child = gump.Children[ii]; if (current_page == 0) { current_page = child.Page; } bool canDraw = /*current_page == 0 || child.Page == 0 ||*/ current_page == child.Page; if (canDraw && child.IsVisible && child is CheckerTrans) { transparent = true; continue; } child.Alpha = transparent ? 0.5f : 0; } return(transparent); } bool trans = applyTrans(0, 0); float alpha = trans ? 0.5f : 0; for (int i = 0; i < gump.Children.Count; i++) { var cc = gump.Children[i]; if (cc is CheckerTrans) { trans = applyTrans(i + 1, cc.Page); alpha = trans ? 0.5f : 0; } else { cc.Alpha = alpha; } } } Add(gump); gump.Initialize(); gump.Update(Time.Ticks, 0); gump.SetInScreen(); return(gump); }
public Control Create(Serial sender, Serial gumpID, int x, int y, string layout, string[] lines) { if (GetGumpCachePosition(gumpID, out Point pos)) { x = pos.X; y = pos.Y; } else { SavePosition(gumpID, new Point(x, y)); } Gump gump = new Gump(sender, gumpID) { X = x, Y = y, CanMove = true, CanCloseWithRightClick = true, CanCloseWithEsc = true }; int group = 0; int page = 0; int index = 0; while (index < layout.Length) { if (layout.Substring(index) == "\0") { break; } int begin = layout.IndexOf("{", index, StringComparison.Ordinal); int end = layout.IndexOf("}", index + 1, StringComparison.Ordinal); if (begin != -1 && end != -1) { string sub = layout.Substring(begin + 1, end - begin - 1).Trim(); index = end; string[] gparams = Regex.Split(sub, @"\s+"); switch (gparams[0].ToLower()) { case "button": gump.Add(new Button(gparams), page); break; case "buttontileart": gump.Add(new Button(gparams), page); gump.Add(new StaticPic(Graphic.Parse(gparams[8]), Hue.Parse(gparams[9])) { X = int.Parse(gparams[1]) + int.Parse(gparams[10]), Y = int.Parse(gparams[2]) + int.Parse(gparams[11]) }, page); break; case "checkertrans": CheckerTrans t = new CheckerTrans(gparams); //for (int i = 0; i < gump.Children.Count; i++) for (int i = gump.Children.Count - 1; i >= 0; i--) { Control c = gump.Children[i]; c.Initialize(); if (c is CheckerTrans) { break; } c.IsTransparent = true; c.Alpha = 0.5f; if (t.Bounds.Intersects(c.Bounds)) { //if (t.Bounds.Contains(c.Bounds)) //{ // c.IsEnabled = false; //} if (c is Button) { c.IsVisible = false; } //else // c.IsEnabled = false; } } //float[] alpha = { 0, 0.5f }; //bool checkTransparent(Control c, int start) //{ // bool transparent = false; // for (int i = start; i < c.Children.Count; i++) // { // var control = c.Children[i]; // bool canDraw = c.Page == 0 || control.Page == 0 || c.Page == control.Page; // if (canDraw && control is CheckerTrans) // { // transparent = true; // } // } // return transparent; //} //bool trans = checkTransparent(gump, 0); //for (int i = gump.Children.Count - 1; i >= 0; i--) //{ // Control g = gump.Children[i]; // g.IsTransparent = true; // if (g is CheckerTrans) // { // trans = checkTransparent(gump, i + 1); // continue; // } // g.Alpha = alpha[trans ? 1 : 0]; //} gump.Add(t, page); break; case "croppedtext": gump.Add(new CroppedText(gparams, lines), page); break; case "gumppic": gump.Add(new GumpPic(gparams), page); break; case "gumppictiled": gump.Add(new GumpPicTiled(gparams), page); break; case "htmlgump": gump.Add(new HtmlControl(gparams, lines), page); break; case "xmfhtmlgump": gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", FileManager.Cliloc.GetString(int.Parse(gparams[5])), 0, true), page); break; case "xmfhtmlgumpcolor": int color = int.Parse(gparams[8]); if (color == 0x7FFF) { color = 0x00FFFFFF; } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[6]) == 1, int.Parse(gparams[7]) != 0, gparams[6] != "0" && gparams[7] == "2", FileManager.Cliloc.GetString(int.Parse(gparams[5])), color, true), page); break; case "xmfhtmltok": color = int.Parse(gparams[7]); if (color == 0x7FFF) { color = 0x00FFFFFF; } StringBuilder sb = null; if (gparams.Length > 9) { sb = new StringBuilder(); sb.Append(gparams[9]); for (int i = 10; i < gparams.Length; i++) { sb.Append('\t'); sb.Append(gparams[i]); } } gump.Add(new HtmlControl(int.Parse(gparams[1]), int.Parse(gparams[2]), int.Parse(gparams[3]), int.Parse(gparams[4]), int.Parse(gparams[5]) == 1, int.Parse(gparams[6]) != 0, gparams[5] != "0" && gparams[6] == "2", sb == null ? FileManager.Cliloc.GetString(int.Parse(gparams[8])) : FileManager.Cliloc.Translate(FileManager.Cliloc.GetString(int.Parse(gparams[8])), sb.ToString().Trim('@')), color, true), page); break; case "page": page = int.Parse(gparams[1]); break; case "resizepic": gump.Add(new ResizePic(gparams), page); break; case "text": gump.Add(new Label(gparams, lines), page); break; case "textentrylimited": case "textentry": gump.Add(new TextBox(gparams, lines), page); break; case "tilepichue": case "tilepic": gump.Add(new StaticPic(gparams), page); break; case "noclose": gump.CanCloseWithRightClick = false; break; case "nodispose": gump.CanCloseWithEsc = false; break; case "nomove": gump.BlockMovement = true; break; case "group": case "endgroup": group++; break; case "radio": gump.Add(new RadioButton(group, gparams, lines), page); break; case "checkbox": gump.Add(new Checkbox(gparams, lines), page); break; case "tooltip": if (World.ClientFlags.TooltipsEnabled) { string cliloc = FileManager.Cliloc.GetString(int.Parse(gparams[1])); if (gparams.Length > 2 && gparams[2][0] == '@') { string l = gparams[gparams.Length - 1]; if (l.Length > 2) { if (l[l.Length - 1] == '\'' && l[l.Length - 2] == '@') { sb = new StringBuilder(); for (int i = 2; i < gparams.Length - 1; i++) { sb.Append(i == 2 ? gparams[i].Substring(1, gparams[i].Length - 1) : gparams[i]); sb.Append(' '); } cliloc = FileManager.Cliloc.Translate(cliloc, sb.ToString()); } else { Log.Message(LogTypes.Error, $"Missing final ''@' into gump tooltip: {cliloc}"); } } else { Log.Message(LogTypes.Error, $"String '{l}' too short, something wrong with gump tooltip: {cliloc}"); } } gump.Children.Last()?.SetTooltip(cliloc); } break; case "itemproperty": if (World.ClientFlags.TooltipsEnabled) { var entity = World.Get(Serial.Parse(gparams[1])); var lastControl = gump.Children.LastOrDefault(); if (lastControl != default(Control) && entity != default(Entity)) { lastControl.SetTooltip(entity); } } break; case "noresize": break; case "mastergump": Log.Message(LogTypes.Warning, "Gump part 'mastergump' not handled."); break; } } else { break; } } Add(gump); return(gump); }