From 24fbd50c620cd2b400f9b918a31a7736414d1400 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Fri, 27 Sep 2024 18:02:24 +0200
Subject: [PATCH 1/2] added appendWithSpace component util

---
 .../spawn/appliances/chatMention/ChatMentionListener.java     | 3 ++-
 .../eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java    | 4 ++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMention/ChatMentionListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMention/ChatMentionListener.java
index d9dff2f..7f9a0ba 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMention/ChatMentionListener.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMention/ChatMentionListener.java
@@ -2,6 +2,7 @@ package eu.mhsl.craftattack.spawn.appliances.chatMention;
 
 import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
 import eu.mhsl.craftattack.spawn.appliances.settings.Settings;
+import eu.mhsl.craftattack.spawn.util.text.ComponentUtil;
 import io.papermc.paper.event.player.AsyncChatDecorateEvent;
 import net.kyori.adventure.text.Component;
 import net.kyori.adventure.text.format.NamedTextColor;
@@ -36,7 +37,7 @@ public class ChatMentionListener extends ApplianceListener<ChatMention> {
                     return Component.text(word);
                 }
             })
-            .reduce((a, b) -> a.append(Component.text(" ")).append(b))
+            .reduce(ComponentUtil::appendWithSpace)
             .orElseThrow();
 
         getAppliance().notifyPlayers(mentioned);
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java b/src/main/java/eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java
index 613585c..978ddd5 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java
@@ -22,6 +22,10 @@ public class ComponentUtil {
         return Component.text().append(a.appendNewline().append(b)).build();
     }
 
+    public static TextComponent appendWithSpace(Component a, Component b) {
+        return Component.text().append(a).append(Component.text(" ")).append(b).build();
+    }
+
     public static Stream<String> lineBreak(String text) {
         return lineBreak(text, 50);
     }

From 70a1740644875a06975fc6f6bf46c191aa3fd9b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Fri, 27 Sep 2024 18:16:42 +0200
Subject: [PATCH 2/2] fixed rainbowComponent not folding back on end of color
 spectrum, ensuring no sudden color switch

---
 .../spawn/util/text/RainbowComponent.java     | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/RainbowComponent.java b/src/main/java/eu/mhsl/craftattack/spawn/util/text/RainbowComponent.java
index da974b5..eb74d36 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/RainbowComponent.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/util/text/RainbowComponent.java
@@ -6,12 +6,12 @@ import net.kyori.adventure.text.format.TextColor;
 import java.awt.*;
 
 public class RainbowComponent {
-    private int hueOffset = 0;
+    private float hueOffset = 0;
     private final String text;
     private final int density;
-    private final int speed;
+    private final float speed;
 
-    public RainbowComponent(String text, int density, int speed) {
+    public RainbowComponent(String text, int density, float speed) {
         this.text = text;
         this.density = density;
         this.speed = speed;
@@ -19,15 +19,16 @@ public class RainbowComponent {
 
     public Component getRainbowState() {
         Component builder = Component.empty();
-        int hue = this.hueOffset;
-        for(char c : text.toCharArray()) {
-            TextColor color = TextColor.color(Color.getHSBColor((float) hue / 360, 1, 1).getRGB());
+        float hue = this.hueOffset;
+        for (char c : text.toCharArray()) {
+            float normalizedHue = (hue % 360) / 360;
+            TextColor color = TextColor.color(Color.getHSBColor(normalizedHue, 1, 1).getRGB());
             builder = builder.append(Component.text(c).color(color));
             hue += density;
         }
 
-        if(this.hueOffset > Byte.MAX_VALUE - speed) this.hueOffset = 0;
-        this.hueOffset += (byte) speed;
+        this.hueOffset = (this.hueOffset + speed) % 360;
+
         return builder;
     }
-}
+}
\ No newline at end of file