From 13c94e40ad73be7ff7a1b740cfd2637e93013028 Mon Sep 17 00:00:00 2001
From: 96DarkCode96 <76725766+96DarkCode96@users.noreply.github.com>
Date: Fri, 27 Dec 2024 22:04:17 +0100
Subject: [PATCH] Updated adventure to 4.18.0 (#11809)

---
 paper-api/build.gradle.kts                                | 2 +-
 paper-server/build.gradle.kts                             | 2 +-
 .../java/io/papermc/paper/adventure/AdventureCodecs.java  | 8 ++++++--
 .../io/papermc/paper/adventure/AdventureCodecsTest.java   | 2 ++
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/paper-api/build.gradle.kts b/paper-api/build.gradle.kts
index 9a03c630be..3ea140477c 100644
--- a/paper-api/build.gradle.kts
+++ b/paper-api/build.gradle.kts
@@ -11,7 +11,7 @@ java {
 
 val annotationsVersion = "24.1.0"
 val bungeeCordChatVersion = "1.20-R0.2"
-val adventureVersion = "4.17.0"
+val adventureVersion = "4.18.0"
 val slf4jVersion = "2.0.9"
 val log4jVersion = "2.17.1"
 
diff --git a/paper-server/build.gradle.kts b/paper-server/build.gradle.kts
index baa638e0dd..09554e3ac8 100644
--- a/paper-server/build.gradle.kts
+++ b/paper-server/build.gradle.kts
@@ -128,7 +128,7 @@ dependencies {
     implementation("org.jline:jline-terminal-ffm:3.27.1") // use ffm on java 22+
     implementation("org.jline:jline-terminal-jni:3.27.1") // fall back to jni on java 21
     implementation("net.minecrell:terminalconsoleappender:1.3.0")
-    implementation("net.kyori:adventure-text-serializer-ansi:4.17.0") // Keep in sync with adventureVersion from Paper-API build file
+    implementation("net.kyori:adventure-text-serializer-ansi:4.18.0") // Keep in sync with adventureVersion from Paper-API build file
 
     /*
       Required to add the missing Log4j2Plugins.dat file from log4j-core
diff --git a/paper-server/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java b/paper-server/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java
index 2c5702a42c..7a47f0fda0 100644
--- a/paper-server/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java
+++ b/paper-server/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java
@@ -11,7 +11,6 @@ import com.mojang.serialization.DynamicOps;
 import com.mojang.serialization.JsonOps;
 import com.mojang.serialization.MapCodec;
 import com.mojang.serialization.codecs.RecordCodecBuilder;
-import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -37,6 +36,7 @@ import net.kyori.adventure.text.event.ClickEvent;
 import net.kyori.adventure.text.event.DataComponentValue;
 import net.kyori.adventure.text.event.HoverEvent;
 import net.kyori.adventure.text.format.NamedTextColor;
+import net.kyori.adventure.text.format.ShadowColor;
 import net.kyori.adventure.text.format.Style;
 import net.kyori.adventure.text.format.TextColor;
 import net.kyori.adventure.text.format.TextDecoration;
@@ -79,6 +79,8 @@ public final class AdventureCodecs {
     public static final Codec<Component> COMPONENT_CODEC = recursive("adventure Component",  AdventureCodecs::createCodec);
     public static final StreamCodec<RegistryFriendlyByteBuf, Component> STREAM_COMPONENT_CODEC = ByteBufCodecs.fromCodecWithRegistriesTrusted(COMPONENT_CODEC);
 
+    static final Codec<ShadowColor> SHADOW_COLOR_CODEC = ExtraCodecs.ARGB_COLOR_CODEC.xmap(ShadowColor::shadowColor, ShadowColor::value);
+
     static final Codec<TextColor> TEXT_COLOR_CODEC = Codec.STRING.comapFlatMap(s -> {
         if (s.startsWith("#")) {
             @Nullable TextColor value = TextColor.fromHexString(s);
@@ -220,6 +222,7 @@ public final class AdventureCodecs {
     public static final MapCodec<Style> STYLE_MAP_CODEC = mapCodec((instance) -> {
         return instance.group(
             TEXT_COLOR_CODEC.optionalFieldOf("color").forGetter(nullableGetter(Style::color)),
+            SHADOW_COLOR_CODEC.optionalFieldOf("shadow_color").forGetter(nullableGetter(Style::shadowColor)),
             Codec.BOOL.optionalFieldOf("bold").forGetter(decorationGetter(TextDecoration.BOLD)),
             Codec.BOOL.optionalFieldOf("italic").forGetter(decorationGetter(TextDecoration.ITALIC)),
             Codec.BOOL.optionalFieldOf("underlined").forGetter(decorationGetter(TextDecoration.UNDERLINED)),
@@ -229,9 +232,10 @@ public final class AdventureCodecs {
             HOVER_EVENT_CODEC.optionalFieldOf("hoverEvent").forGetter(nullableGetter(Style::hoverEvent)),
             Codec.STRING.optionalFieldOf("insertion").forGetter(nullableGetter(Style::insertion)),
             KEY_CODEC.optionalFieldOf("font").forGetter(nullableGetter(Style::font))
-        ).apply(instance, (textColor, bold, italic, underlined, strikethrough, obfuscated, clickEvent, hoverEvent, insertion, font) -> {
+        ).apply(instance, (textColor, shadowColor, bold, italic, underlined, strikethrough, obfuscated, clickEvent, hoverEvent, insertion, font) -> {
             return Style.style(builder -> {
                 textColor.ifPresent(builder::color);
+                shadowColor.ifPresent(builder::shadowColor);
                 bold.ifPresent(styleBooleanConsumer(builder, TextDecoration.BOLD));
                 italic.ifPresent(styleBooleanConsumer(builder, TextDecoration.ITALIC));
                 underlined.ifPresent(styleBooleanConsumer(builder, TextDecoration.UNDERLINED));
diff --git a/paper-server/src/test/java/io/papermc/paper/adventure/AdventureCodecsTest.java b/paper-server/src/test/java/io/papermc/paper/adventure/AdventureCodecsTest.java
index 074e46aa4a..b1f698a9c4 100644
--- a/paper-server/src/test/java/io/papermc/paper/adventure/AdventureCodecsTest.java
+++ b/paper-server/src/test/java/io/papermc/paper/adventure/AdventureCodecsTest.java
@@ -22,6 +22,7 @@ import net.kyori.adventure.text.Component;
 import net.kyori.adventure.text.event.ClickEvent;
 import net.kyori.adventure.text.event.HoverEvent;
 import net.kyori.adventure.text.format.NamedTextColor;
+import net.kyori.adventure.text.format.ShadowColor;
 import net.kyori.adventure.text.format.Style;
 import net.kyori.adventure.text.format.TextColor;
 import net.kyori.adventure.text.format.TextDecoration;
@@ -278,6 +279,7 @@ class AdventureCodecsTest {
             style(TextDecoration.BOLD.withState(TextDecoration.State.NOT_SET)),
             style()
                 .font(key("kyori", "kittens"))
+                .shadowColor(ShadowColor.fromHexString("#FF00AAFF"))
                 .color(NamedTextColor.RED)
                 .decoration(TextDecoration.BOLD, true)
                 .clickEvent(openUrl("https://github.com"))