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"))