diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index 0cb61bde3..c0727f609 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.font; import io.papermc.paper.event.player.AsyncChatCommandDecorateEvent; import io.papermc.paper.event.player.AsyncChatDecorateEvent; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.font.AbstractFontManager; import net.momirealms.craftengine.core.font.FontManager; @@ -21,17 +22,10 @@ import java.util.function.Consumer; public class BukkitFontManager extends AbstractFontManager implements Listener { private final BukkitCraftEngine plugin; - private final Object serializer; public BukkitFontManager(BukkitCraftEngine plugin) { super(plugin); this.plugin = plugin; - try { - Object builder = Reflections.method$GsonComponentSerializer$builder.invoke(null); - this.serializer = Reflections.method$GsonComponentSerializer$Builder$build.invoke(builder); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } } @Override @@ -79,16 +73,15 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { } try { Object originalMessage = Reflections.field$AsyncChatDecorateEvent$originalMessage.get(event); - String jsonMessage = (String) Reflections.method$ComponentSerializer$serialize.invoke(serializer, originalMessage); - runIfContainsIllegalCharacter(jsonMessage, (json) -> { + runIfContainsIllegalCharacter(ComponentUtils.paperAdventureToJson(originalMessage), (json) -> { + Object component = ComponentUtils.jsonToPaperAdventure(json); try { - Object component = Reflections.method$ComponentSerializer$deserialize.invoke(serializer, json); Reflections.method$AsyncChatDecorateEvent$result.invoke(event, component); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } }); - } catch (IllegalAccessException | InvocationTargetException e) { + } catch (IllegalAccessException e) { throw new RuntimeException(e); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java index b8785432b..b145c20d5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java @@ -1,6 +1,8 @@ package net.momirealms.craftengine.bukkit.item; import com.saicone.rtag.RtagItem; +import net.kyori.adventure.Adventure; +import net.kyori.adventure.text.NBTComponent; import net.momirealms.craftengine.core.item.ItemWrapper; import org.bukkit.inventory.ItemStack; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java index cf78f9964..6ebfac1b8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java @@ -11,7 +11,6 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; @SuppressWarnings("UnstableApiUsage") diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java index 13268c802..426e456ff 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.util; import com.google.gson.JsonElement; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.AdventureHelper; public class ComponentUtils { @@ -24,4 +25,21 @@ public class ComponentUtils { public static String minecraftToJson(Object component) { return FastNMS.INSTANCE.method$Component$Serializer$toJson(component); } + + public static String paperAdventureToJson(Object component) { + try { + return (String) Reflections.method$ComponentSerializer$serialize.invoke(Reflections.instance$GsonComponentSerializer, component); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to serialize paper adventure component " + component, e); + return AdventureHelper.EMPTY_COMPONENT; + } + } + + public static Object jsonToPaperAdventure(String json) { + try { + return Reflections.method$ComponentSerializer$deserialize.invoke(Reflections.instance$GsonComponentSerializer, json); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to deserialize paper component from json", e); + } + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index b4e53aa50..d3a6a99f2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -6146,4 +6146,15 @@ public class Reflections { public static final Method method$PacketReport$serializePackets = Optional.ofNullable(clazz$PacketReport) .map(it -> ReflectionUtils.getDeclaredMethod(it, JsonElement.class)) .orElse(null); + + public static final Object instance$GsonComponentSerializer; + + static { + try { + Object builder = Reflections.method$GsonComponentSerializer$builder.invoke(null); + instance$GsonComponentSerializer = Reflections.method$GsonComponentSerializer$Builder$build.invoke(builder); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 7d4239f5c..6074ad0e5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -18,7 +18,9 @@ public abstract class AbstractFontManager implements FontManager { private final CraftEngine plugin; // namespace:font font private final Map fonts = new HashMap<>(); - // namespace:id image + // namespace:id emoji + private final Map emojis = new HashMap<>(); + // namespace:id image private final Map images = new HashMap<>(); private final Set illegalChars = new HashSet<>(); private final ImageParser imageParser; diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/Emoji.java b/core/src/main/java/net/momirealms/craftengine/core/font/Emoji.java new file mode 100644 index 000000000..3b76f27f7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/Emoji.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.util.Key; + +import javax.annotation.Nullable; + +public class Emoji { + private final Key font; + private final String image; + private final String permission; + + public Emoji(Key font, String image, String permission) { + this.font = font; + this.image = image; + this.permission = permission; + } + + public Key font() { + return font; + } + + public String image() { + return image; + } + + @Nullable + public String permission() { + return permission; + } +}