public static TextColor FindLastColor(string message) { TextColor last = TextColor.White; for (int i = 0; i < message.Length - 1; i++) { if (message[i] == '§') { last = TextColor.GetColor(message[i + 1]); i++; } } return(last); }
public void DrawString(SpriteBatch sb, string text, Vector2 position, TextColor color, FontStyle style = FontStyle.None, Vector2?scale = null, float opacity = 1f, float rotation = 0f, Vector2?origin = null, SpriteEffects effects = SpriteEffects.None, float layerDepth = 0f) { if (string.IsNullOrEmpty(text)) { return; } var originVal = origin ?? Vector2.Zero; var scaleVal = scale ?? Vector2.One; //scaleVal *= Scale; originVal *= scaleVal; var flipAdjustment = Vector2.Zero; var flippedVert = (effects & SpriteEffects.FlipVertically) == SpriteEffects.FlipVertically; var flippedHorz = (effects & SpriteEffects.FlipHorizontally) == SpriteEffects.FlipHorizontally; if (flippedVert || flippedHorz) { Vector2 size; MeasureString(text, out size); if (flippedHorz) { originVal.X *= -1; flipAdjustment.X = -size.X; } if (flippedVert) { originVal.Y *= -1; flipAdjustment.Y = LineSpacing - size.Y; } } Matrix transformation = Matrix.Identity; float cos = 0, sin = 0; if (rotation == 0) { transformation.M11 = (flippedHorz ? -scaleVal.X : scaleVal.X); transformation.M22 = (flippedVert ? -scaleVal.Y : scaleVal.Y); transformation.M41 = ((flipAdjustment.X - originVal.X) * transformation.M11) + position.X; transformation.M42 = ((flipAdjustment.Y - originVal.Y) * transformation.M22) + position.Y; } else { cos = (float)Math.Cos(rotation); sin = (float)Math.Sin(rotation); transformation.M11 = (flippedHorz ? -scaleVal.X : scaleVal.X) * cos; transformation.M12 = (flippedHorz ? -scaleVal.X : scaleVal.X) * sin; transformation.M21 = (flippedVert ? -scaleVal.Y : scaleVal.Y) * (-sin); transformation.M22 = (flippedVert ? -scaleVal.Y : scaleVal.Y) * cos; transformation.M41 = (((flipAdjustment.X - originVal.X) * transformation.M11) + (flipAdjustment.Y - originVal.Y) * transformation.M21) + position.X; transformation.M42 = (((flipAdjustment.X - originVal.X) * transformation.M12) + (flipAdjustment.Y - originVal.Y) * transformation.M22) + position.Y; } var offset = Vector2.Zero; var firstGlyphOfLine = true; TextColor styleColor = color; bool styleRandom = false, styleBold = style.HasFlag(FontStyle.Bold), styleItalic = style.HasFlag(FontStyle.Italic), styleUnderline = style.HasFlag(FontStyle.Underline), styleStrikethrough = style.HasFlag(FontStyle.StrikeThrough), dropShadow = style.HasFlag(FontStyle.DropShadow); var blendFactor = sb.GraphicsDevice.BlendFactor; sb.GraphicsDevice.BlendFactor = Color.White * opacity; for (int i = 0; i < text.Length; i++) { char c = text[i]; if (c == '\r') { continue; } if (c == '\n') { offset.X = 0.0f; offset.Y += LineSpacing; firstGlyphOfLine = true; styleRandom = false; styleBold = false; styleStrikethrough = false; styleUnderline = false; styleItalic = false; styleColor = color; } else if (c == '\x00A7') { // Formatting // Get next character if (i + 1 >= text.Length) { continue; } i++; var formatChar = text.ToLower()[i]; if ("0123456789abcdef".IndexOf(formatChar) > 0) { styleColor = TextColor.GetColor(formatChar); } else if (formatChar == 'k') { styleRandom = true; } else if (formatChar == 'l') { styleBold = true; } else if (formatChar == 'm') { styleStrikethrough = true; } else if (formatChar == 'n') { styleUnderline = true; } else if (formatChar == 'o') { styleItalic = true; } else if (formatChar == 'r') { styleRandom = false; styleBold = false; styleStrikethrough = false; styleUnderline = false; styleItalic = false; styleColor = color; } } else { var glyph = GetGlyphOrDefault(c); if (firstGlyphOfLine) { // offset.X += CharacterSpacing; firstGlyphOfLine = false; } //if (styleRandom) //{ // c = //} var p = offset; var width = glyph.Width + (styleBold ? 1 : 0) + CharacterSpacing; if (dropShadow) { var shadowP = p + Vector2.One; if (styleBold) { var boldShadowP = Vector2.Transform(shadowP + Vector2.UnitX, transformation); sb.Draw(glyph.Texture, boldShadowP, styleColor.BackgroundColor * opacity, rotation, originVal, scaleVal * Scale, effects, layerDepth); } shadowP = Vector2.Transform(shadowP, transformation); sb.Draw(glyph.Texture, shadowP, styleColor.BackgroundColor * opacity, rotation, originVal, scaleVal * Scale, effects, layerDepth); } if (styleBold) { var boldP = Vector2.Transform(p + Vector2.UnitX, transformation); sb.Draw(glyph.Texture, boldP, styleColor.ForegroundColor * opacity, rotation, originVal, scaleVal * Scale, effects, layerDepth); } /* if (styleUnderline) * { * var lineStart = Vector2.Transform(p + new Vector2(0, 8), transformation); * * sb.DrawLine(2, lineStart, new Vector2(lineStart.X + width, lineStart.Y), styleColor.ForegroundColor * opacity, scaleVal * Scale, layerDepth); * }*/ p = Vector2.Transform(p, transformation); sb.Draw(glyph.Texture, p, styleColor.ForegroundColor * opacity, rotation, originVal, scaleVal * Scale, effects, layerDepth); offset.X += width; } } sb.GraphicsDevice.BlendFactor = blendFactor; }
public override BaseComponent ReadJson(JsonReader reader, Type objectType, BaseComponent component, bool hasExistingValue, JsonSerializer serializer) { Console.WriteLine($"TokenType: " + reader.TokenType); if (reader.TokenType == JsonToken.StartObject) { ComponentBuilder builder = new ComponentBuilder(""); JObject @object = JObject.Load(reader); Console.WriteLine("Object: " + @object.ToString(Formatting.Indented)); if (@object.Has("text")) { builder = new ComponentBuilder(@object["text"].Value <string>()); } else if (@object.Has("translate")) { } if (@object.Has("color")) { builder.Color(TextColor.GetColor(@object["color"].Value <string>())); // component.Color = TextColor.GetColor(@object["color"].Value<string>()); //component.setColor(ChatColor.valueOf(@object["color"].getAsString().toUpperCase(Locale.ROOT))); } if (@object.Has("bold")) { builder.Bold(@object["bold"].Value <bool>()); //component.Bold = @object["bold"].Value<bool>(); } if (@object.Has("italic")) { builder.Italic(@object["italic"].Value <bool>()); //component.Italic = @object["italic"].Value<bool>(); } if (@object.Has("underlined")) { builder.Underlined(@object["underlined"].Value <bool>()); //component.Underlined = @object["underlined"].Value<bool>(); //component.setUnderlined(object.get("underlined").getAsBoolean()); } if (@object.Has("strikethrough")) { builder.Strikethrough(@object["strikethrough"].Value <bool>()); //component.Strikethrough = @object["strikethrough"].Value<bool>(); //component.setStrikethrough(object.get("strikethrough").getAsBoolean()); } if (@object.Has("obfuscated")) { builder.Obfuscated(@object["obfuscated"].Value <bool>()); // component.Obfuscated = @object["obfuscated"].Value<bool>(); //.setObfuscated(object.get("obfuscated").getAsBoolean()); } if (@object.Has("insertion")) { builder.Insertion(@object["insertion"].Value <string>()); //component.Insertion = @object["insertion"].Value<string>(); } if (@object.Has("extra")) { foreach (var extra in @object["extra"].Value <BaseComponent[]>()) { builder.Append(extra); //component.AddExtra(extra); } //component.setExtra(Arrays.<BaseComponent>asList(context.< BaseComponent[] > deserialize(@object.get("extra"), BaseComponent[].class ) ) ); } //Events if (@object.Has("clickEvent")) { var @event = @object["clickEvent"]; string rawAction = @event["action"].Value <string>(); string rawValue = @event["value"].Value <string>(); if (Enum.TryParse(rawAction, true, out ClickEvent.Action action)) { builder.ClickEvent(new ClickEvent(action, rawValue)); //component.ClickEvent = new ClickEvent(action, rawValue); } //ClickEvent e = @object.Value<ClickEvent>("clickComponent"); // e.value //ClickEvent.Action a = @event["action"].ToObject<ClickEvent.Action>(); //ClickEvent.Action a = @event["action"].tos<ClickEvent.Action>(); //string v = @event["value"].getAsString(); //component.ClickEvent = } if (@object.Has("hoverEvent")) { var @event = @object["hoverEvent"]; BaseComponent[] res; if (@event["value"].Type == JTokenType.Array) { res = @event["value"].Value <BaseComponent[]>(); } else { res = new BaseComponent[] { @event["value"].Value <BaseComponent>() }; } string rawAction = @event["action"].Value <string>(); if (Enum.TryParse(rawAction, true, out HoverEvent.Action action)) { builder.HoverEvent(new HoverEvent() { value = res, action = action }); /*component.HoverEvent = new HoverEvent() * { * value = res, * action = action * };*/ } //HoverEvent //component = he; //component = (new HoverEvent(HoverEvent.Action.valueOf( event.get("action").getAsString() // .toUpperCase(Locale.ROOT) ), res ) ); // component = builder.Create(); } component = builder.Create().First(); foreach (var c in builder.Create()) { Console.WriteLine($"{c}"); } Console.WriteLine($"Returning component: {component}"); return(component); } Console.WriteLine($"Returning null!"); // This should not happen. Perhaps better to throw exception at this point? return(null); }
/** * Converts the old formatting system that used * {@link net.md_5.bungee.api.ChatColor#COLOR_CHAR} into the new json based * system. * * @param message the text to convert * @param defaultColor color to use when no formatting is to be applied * (i.e. after ChatColor.RESET). * @return the components needed to print the message to the client */ public static BaseComponent[] FromLegacyText(String message, TextColor defaultColor) { List <BaseComponent> components = new List <BaseComponent>(); StringBuilder builder = new StringBuilder(); TextComponent component = new TextComponent(); MatchCollection matcher = _urlRegex.Matches(message); TextComponent old; for (int i = 0; i < message.Length; i++) { char c = message[i]; if (c == '§') { if (++i >= message.Length) { break; } c = message[i]; if (c >= 'A' && c <= 'Z') { c += (char)32; } TextColor format = TextColor.GetColor(c); if (format == null) { continue; } if (builder.Length > 0) { old = component; component = new TextComponent(old); old.Text = builder.ToString(); //old.setText(builder.toString()); builder = new StringBuilder(); components.Add(old); } switch (format.ToString()) { case ChatFormatting.Bold: component.Bold = true; break; case ChatFormatting.Italic: component.Italic = true; break; case ChatFormatting.Underline: component.Underlined = true; break; case ChatFormatting.Strikethrough: component.Strikethrough = true; break; case ChatFormatting.Obfuscated: component.Obfuscated = true; break; default: format = defaultColor; component = new TextComponent(format.ToString()); break; } continue; } int pos = message.IndexOf(' ', i); if (pos == -1) { pos = message.Length; } if (_urlRegex.Match(message, i, pos).Success) { //Web link handling if (builder.Length > 0) { old = component; component = new TextComponent(old); old.Text = builder.ToString(); builder = new StringBuilder(); components.Add(old); } old = component; component = new TextComponent(old); string urlString = message.Substring(i, pos); component.Text = urlString; component.ClickEvent = new ClickEvent(ClickEvent.Action.OpenUrl, urlString.StartsWith("http") ? urlString : "http://" + urlString); components.Add(component); i += pos - i - 1; component = old; continue; } builder.Append(c); } component.Text = builder.ToString(); // .setText(builder.toString()); components.Add(component); return(components.ToArray()); }