From 45f1df9617728c23c19c64a43a01cfd0450bed2a Mon Sep 17 00:00:00 2001 From: Privatech38 Date: Thu, 10 Apr 2025 19:58:27 +0200 Subject: [PATCH 1/5] Added [saturation] argument to RainbowTag and implemented it to color() --- .../minimessage/tag/standard/RainbowTag.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java index df990a87a1..a360607595 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java @@ -51,12 +51,14 @@ final class RainbowTag extends AbstractColorChangingTag { private final boolean reversed; private final double dividedPhase; + private final float saturation; private int colorIndex = 0; static Tag create(final ArgumentQueue args, final Context ctx) { boolean reversed = false; int phase = 0; + float saturation = 1f; if (args.hasNext()) { String value = args.pop().value(); @@ -71,15 +73,26 @@ static Tag create(final ArgumentQueue args, final Context ctx) { throw ctx.newException("Expected phase, got " + value); } } - } - - return new RainbowTag(reversed, phase, ctx); + if (args.hasNext()) { + final String saturationValue = args.pop().value(); + try { + saturation = Float.parseFloat(saturationValue); + } catch (final NumberFormatException ex) { + throw ctx.newException("Expected saturation, got " + saturationValue); + } + } + if (saturation < 0f || saturation > 1f) { + throw ctx.newException(String.format("Rainbow saturation is out of range (%s). Must be in the range [0.0, 1.0] (inclusive).", saturation)); + } + } + return new RainbowTag(reversed, phase, saturation, ctx); } - private RainbowTag(final boolean reversed, final int phase, final Context ctx) { + private RainbowTag(final boolean reversed, final int phase, final float saturation, final Context ctx) { super(ctx); this.reversed = reversed; this.dividedPhase = ((double) phase) / 10d; + this.saturation = saturation; } @Override @@ -106,7 +119,7 @@ protected void advanceColor() { protected TextColor color() { final float index = this.colorIndex; final float hue = (float) ((index / this.size() + this.dividedPhase) % 1f); - return TextColor.color(HSVLike.hsvLike(hue, 1f, 1f)); + return TextColor.color(HSVLike.hsvLike(hue, this.saturation, 1f)); } @Override From 4575de6d64c76d0fbea74336063fcd03e6522e9c Mon Sep 17 00:00:00 2001 From: Privatech38 Date: Thu, 10 Apr 2025 20:06:18 +0200 Subject: [PATCH 2/5] [saturation] argument is now allowed to replace [phase] argument in RainbowTag --- .../minimessage/tag/standard/RainbowTag.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java index a360607595..11b5b82813 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java @@ -67,18 +67,27 @@ static Tag create(final ArgumentQueue args, final Context ctx) { value = value.substring(REVERSE.length()); } if (value.length() > 0) { - try { - phase = Integer.parseInt(value); - } catch (final NumberFormatException ex) { - throw ctx.newException("Expected phase, got " + value); - } - } - if (args.hasNext()) { - final String saturationValue = args.pop().value(); - try { - saturation = Float.parseFloat(saturationValue); - } catch (final NumberFormatException ex) { - throw ctx.newException("Expected saturation, got " + saturationValue); + // Check if the value is a float or an int + if (value.endsWith("f") || value.endsWith("F") || value.contains(".")) { + try { + saturation = Float.parseFloat(value); + } catch (final NumberFormatException ex) { + throw ctx.newException("Expected saturation, got " + value); + } + } else { + try { + phase = Integer.parseInt(value); + } catch (final NumberFormatException ex) { + throw ctx.newException("Expected phase, got " + value); + } + if (args.hasNext()) { + final String saturationValue = args.pop().value(); + try { + saturation = Float.parseFloat(saturationValue); + } catch (final NumberFormatException ex) { + throw ctx.newException("Expected saturation, got " + saturationValue); + } + } } } if (saturation < 0f || saturation > 1f) { From 874378d4fee388546d351e346a92121d04d78c2f Mon Sep 17 00:00:00 2001 From: Privatech38 Date: Thu, 10 Apr 2025 21:22:47 +0200 Subject: [PATCH 3/5] Removed the ability to replace [phase] with [saturation] in rainbow tag. You are now required to provide [phase] or [!] argument before specifying [saturation] argument --- .../minimessage/tag/standard/RainbowTag.java | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java index 11b5b82813..48a18c924e 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java @@ -67,32 +67,25 @@ static Tag create(final ArgumentQueue args, final Context ctx) { value = value.substring(REVERSE.length()); } if (value.length() > 0) { - // Check if the value is a float or an int - if (value.endsWith("f") || value.endsWith("F") || value.contains(".")) { - try { - saturation = Float.parseFloat(value); - } catch (final NumberFormatException ex) { - throw ctx.newException("Expected saturation, got " + value); - } - } else { + try { + phase = Integer.parseInt(value); + } catch (final NumberFormatException ex) { + throw ctx.newException("Expected phase, got " + value); + } + } + if (args.hasNext()) { + final String saturationValue = args.pop().value(); + if (!saturationValue.isEmpty()) { try { - phase = Integer.parseInt(value); + saturation = Float.parseFloat(saturationValue); } catch (final NumberFormatException ex) { - throw ctx.newException("Expected phase, got " + value); + throw ctx.newException("Expected saturation, got " + saturationValue); } - if (args.hasNext()) { - final String saturationValue = args.pop().value(); - try { - saturation = Float.parseFloat(saturationValue); - } catch (final NumberFormatException ex) { - throw ctx.newException("Expected saturation, got " + saturationValue); - } + if (saturation < 0f || saturation > 1f) { + throw ctx.newException(String.format("Rainbow saturation is out of range (%s). Must be in the range [0.0, 1.0] (inclusive).", saturation)); } } } - if (saturation < 0f || saturation > 1f) { - throw ctx.newException(String.format("Rainbow saturation is out of range (%s). Must be in the range [0.0, 1.0] (inclusive).", saturation)); - } } return new RainbowTag(reversed, phase, saturation, ctx); } From 5118ed872a83c11d30cf8702932f9e28d1feb742 Mon Sep 17 00:00:00 2001 From: Privatech38 Date: Thu, 10 Apr 2025 21:55:10 +0200 Subject: [PATCH 4/5] Added tests for saturation argument in rainbow tag --- .../tag/standard/RainbowTagTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTagTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTagTest.java index 980d39d366..51698cc06c 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTagTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTagTest.java @@ -401,4 +401,39 @@ void testDisabledVirtualComponentEmission() { input ); } + + @Test + void testSaturation() { + final String input = "Woo: ||||||||||||||||||||||||!"; + final Component expected = empty().color(YELLOW) + .append(text("Woo: ")) + .append(virtualOfChildren(textOfChildren( + text("|", color(0xFF5959)), + text("|", color(0xff8259)), + text("|", color(0xffac59)), + text("|", color(0xffd559)), + text("|", color(0xffff59)), + text("|", color(0xd5ff59)), + text("|", color(0xacff59)), + text("|", color(0x82ff59)), + text("|", color(0x59FF59)), + text("|", color(0x59ff82)), + text("|", color(0x59ffac)), + text("|", color(0x59ffd5)), + text("|", color(0x59ffff)), + text("|", color(0x59d5ff)), + text("|", color(0x59acff)), + text("|", color(0x5982ff)), + text("|", color(0x5959FF)), + text("|", color(0x8259ff)), + text("|", color(0xac59ff)), + text("|", color(0xd559ff)), + text("|", color(0xff59ff)), + text("|", color(0xff59d5)), + text("|", color(0xff59ac)), + text("|", color(0xFF5982)) + ) + )).append(text("!")); + this.assertParsedEquals(expected, input); + } } From 90ca99d6384491a4325d9111af205959b2033ff8 Mon Sep 17 00:00:00 2001 From: Privatech38 Date: Thu, 10 Apr 2025 22:00:29 +0200 Subject: [PATCH 5/5] Fixed style check error for curly bracket position --- .../adventure/text/minimessage/tag/standard/RainbowTag.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java index 48a18c924e..18bd84cf0a 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java @@ -86,7 +86,7 @@ static Tag create(final ArgumentQueue args, final Context ctx) { } } } - } + } return new RainbowTag(reversed, phase, saturation, ctx); }