diff --git a/Paper-MojangAPI/src/main/java/io/papermc/paper/brigadier/PaperBrigadier.java b/Paper-MojangAPI/src/main/java/io/papermc/paper/brigadier/PaperBrigadier.java new file mode 100644 index 0000000000..1ed5a6d271 --- /dev/null +++ b/Paper-MojangAPI/src/main/java/io/papermc/paper/brigadier/PaperBrigadier.java @@ -0,0 +1,42 @@ +package io.papermc.paper.brigadier; + +import com.mojang.brigadier.Message; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.TextComponent; +import org.checkerframework.checker.nullness.qual.NonNull; + +/** + * Helper methods to bridge the gaps between Brigadier and Paper-MojangAPI. + */ +public final class PaperBrigadier { + private PaperBrigadier() { + throw new RuntimeException("PaperBrigadier is not to be instantiated!"); + } + + /** + * Create a new Brigadier {@link Message} from a {@link ComponentLike}. + * + *
Mostly useful for creating rich suggestion tooltips in combination with other Paper-MojangAPI APIs.
+ * + * @param componentLike The {@link ComponentLike} to use for the {@link Message} contents + * @return A new Brigadier {@link Message} + */ + public static @NonNull Message message(final @NonNull ComponentLike componentLike) { + return PaperBrigadierProvider.instance().message(componentLike); + } + + /** + * Create a new {@link Component} from a Brigadier {@link Message}. + * + *If the {@link Message} was created from a {@link Component}, it will simply be + * converted back, otherwise a new {@link TextComponent} will be created with the + * content of {@link Message#getString()}
+ * + * @param message The {@link Message} to create a {@link Component} from + * @return The created {@link Component} + */ + public static @NonNull Component componentFromMessage(final @NonNull Message message) { + return PaperBrigadierProvider.instance().componentFromMessage(message); + } +} diff --git a/Paper-MojangAPI/src/main/java/io/papermc/paper/brigadier/PaperBrigadierProvider.java b/Paper-MojangAPI/src/main/java/io/papermc/paper/brigadier/PaperBrigadierProvider.java new file mode 100644 index 0000000000..7f24806384 --- /dev/null +++ b/Paper-MojangAPI/src/main/java/io/papermc/paper/brigadier/PaperBrigadierProvider.java @@ -0,0 +1,30 @@ +package io.papermc.paper.brigadier; + +import com.mojang.brigadier.Message; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.NonNull; + +import static java.util.Objects.requireNonNull; + +interface PaperBrigadierProvider { + final class Holder { + private static @MonotonicNonNull PaperBrigadierProvider INSTANCE; + } + + static @NonNull PaperBrigadierProvider instance() { + return requireNonNull(Holder.INSTANCE, "PaperBrigadierProvider has not yet been initialized!"); + } + + static void initialize(final @NonNull PaperBrigadierProvider instance) { + if (Holder.INSTANCE != null) { + throw new IllegalStateException("PaperBrigadierProvider has already been initialized!"); + } + Holder.INSTANCE = instance; + } + + @NonNull Message message(@NonNull ComponentLike componentLike); + + @NonNull Component componentFromMessage(@NonNull Message message); +} diff --git a/Spigot-Server-Patches/0716-Implement-methods-to-convert-between-Component-and-B.patch b/Spigot-Server-Patches/0716-Implement-methods-to-convert-between-Component-and-B.patch new file mode 100644 index 0000000000..73865ff763 --- /dev/null +++ b/Spigot-Server-Patches/0716-Implement-methods-to-convert-between-Component-and-B.patch @@ -0,0 +1,55 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: jmp