Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        /**
         * 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());
        }