Skip to content

Commit

Permalink
Update Adveture releated methods
Browse files Browse the repository at this point in the history
- Fix incompatible types when setting item name and lore.
- Fix replaceLegacy method replacing characters that should not be replaced.
- Add methods to convert shaded Adventure library to the non shaded form if the server is above 1.18.2
  • Loading branch information
ceze88 committed Feb 9, 2024
1 parent cc59a82 commit c59884b
Showing 1 changed file with 125 additions and 33 deletions.
158 changes: 125 additions & 33 deletions Core/src/main/java/com/craftaro/core/chat/AdventureUtils.java
Original file line number Diff line number Diff line change
@@ -1,111 +1,191 @@
package com.craftaro.core.chat;

import com.bekvon.bukkit.residence.commands.list;
import com.craftaro.core.compatibility.ServerProject;
import com.craftaro.core.compatibility.ServerVersion;
import com.gamingmesh.jobs.commands.list.placeholders;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class AdventureUtils {

private static Method displayNameMethod = null;
private static Method loreMethod = null;
private static Class<?> componentClass;
private static Object gsonComponentSerializer;
private static Method gsonDeserializeMethod;

static {
if (ServerProject.isServer(ServerProject.PAPER) && ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) {
if (ServerProject.isServer(ServerProject.PAPER) && ServerVersion.isServerVersionAtLeast(ServerVersion.V1_18)) {
try {
displayNameMethod = ItemMeta.class.getDeclaredMethod("displayName", Component.class);
componentClass = Class.forName("net;kyori;adventure;text;Component".replace(";", "."));
displayNameMethod = ItemMeta.class.getDeclaredMethod("displayName", componentClass);
loreMethod = ItemMeta.class.getDeclaredMethod("lore", List.class);
gsonComponentSerializer = Class.forName("net;kyori;adventure;text;serializer;gson;GsonComponentSerializer".replace(";", ".")).getDeclaredMethod("gson").invoke(null);
gsonDeserializeMethod = gsonComponentSerializer.getClass().getDeclaredMethod("deserialize", String.class);
gsonDeserializeMethod.setAccessible(true);

} catch (Exception ignored) {}
}
}

//Send message
/**
* Convert a shaded component to a json string
* @param component The shaded Component to convert
* @return Json string
*/
public static String convertToJson(Component component) {
return GsonComponentSerializer.gson().serialize(component);
}

/**
* Convert a json string to the non-shaded component
* Cast it to the correct type
* @param json Json string
* @return Non-shaded component
*/
public static Object convertToOriginalComponent(String json) {
try {
return gsonDeserializeMethod.invoke(gsonComponentSerializer, json);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

/**
* Convert the shaded Component to the original one
* Cast it to the correct type
* @param component Shaded component
* @return Original component
*/
public static Object convertToOriginalComponent(Component component) {
try {
return gsonDeserializeMethod.invoke(gsonComponentSerializer, convertToJson(component));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

/**
* Convert a list of shaded components to a list of original components
* Cast it to the correct type
* @param component List of shaded components
* @return List of original components
*/
public static Object convertToOriginalComponent(List<Component> component) {
try {
LinkedList<Object> list = new LinkedList<>();
for (Component c : component) {
list.add(convertToOriginalComponent(c));
}
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

/**
* Convert a list of shaded components to a list of original components
* Cast it to the correct type
* @param component List of shaded components
* @return List of original components
*/
public static Object convertToOriginalComponent(Component... component) {
try {
LinkedList<Object> list = new LinkedList<>();
for (Component c : component) {
list.add(convertToOriginalComponent(c));
}
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public static void sendMessage(Plugin plugin, Component message, CommandSender... target) {
try (BukkitAudiences bukkitAudiences = BukkitAudiences.create(plugin)){
try (BukkitAudiences bukkitAudiences = BukkitAudiences.create(plugin)) {
for (CommandSender sender : target) {
bukkitAudiences.sender(sender).sendMessage(message);
}
}
}

//Items
public static ItemStack formatItemName(ItemStack item, String name) {
return formatItemName(item, formatComponent(name));
public static void formatItemName(ItemStack item, String name) {
formatItemName(item, formatComponent(name));
}

public static ItemStack formatItemLore(ItemStack item, List<String> lore) {
return formatItemLore(item, lore.toArray(new String[0]));
public static void formatItemLore(ItemStack item, List<String> lore) {
formatItemLore(item, lore.toArray(new String[0]));
}

public static ItemStack formatItemLore(ItemStack item, String... lore) {
return formatItemLore(item, formatComponent(lore));
public static void formatItemLore(ItemStack item, String... lore) {
formatItemLore(item, formatComponent(lore));
}

public static ItemStack formatItemLore(ItemStack item, List<Component> lore, String... unused) {
return formatItemLore(item, lore.toArray(new Component[0]));
public static void formatItemLore(ItemStack item, List<Component> lore, String... unused) {
formatItemLore(item, lore.toArray(new Component[0]));
}

public static ItemStack formatItemName(ItemStack item, Component name) {
return setItemName(item, name);
public static void formatItemName(ItemStack item, Component name) {
setItemName(item, name);
}

public static ItemStack formatItemLore(ItemStack item, Component... lore) {
return setItemLore(item, lore);
public static void formatItemLore(ItemStack item, Component... lore) {
setItemLore(item, lore);
}

public static boolean isMiniMessageEnabled() {
return ServerProject.isServer(ServerProject.PAPER) && ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16) && displayNameMethod != null && loreMethod != null;
}

private static ItemStack setItemName(ItemStack item, Component name) {
private static void setItemName(ItemStack item, Component name) {
ItemMeta meta = item.getItemMeta();
if (meta == null) return item;
if (meta == null) return;
if (isMiniMessageEnabled()) {
//Set names as component
//Set name as component
try {
displayNameMethod.invoke(meta, name);
displayNameMethod.invoke(meta, convertToOriginalComponent(name));
item.setItemMeta(meta);
return item;
return;
} catch (Exception ignored) {}
}
meta.setDisplayName(toLegacy(name));
item.setItemMeta(meta);
return item;
}

private static ItemStack setItemLore(ItemStack item, Component... lore) {
private static void setItemLore(ItemStack item, Component... lore) {
ItemMeta meta = item.getItemMeta();
if (meta == null) return item;
if (meta == null) return;
if (isMiniMessageEnabled()) {
//Set names as component
//Set lore as component
try {
loreMethod.invoke(meta, Arrays.asList(lore));
loreMethod.invoke(meta, convertToOriginalComponent(lore));
item.setItemMeta(meta);
return item;
return;
} catch (Exception ignored) {}
}
meta.setLore(toLegacy(lore));
item.setItemMeta(meta);
return item;
}

//Formatting stuff
Expand All @@ -131,6 +211,10 @@ public static Component formatComponent(String text, MiniMessagePlaceholder...pl
return component;
}

public static Component formatComponent(String text, List<MiniMessagePlaceholder> placeholders) {
return formatComponent(text, placeholders.toArray(new MiniMessagePlaceholder[0]));
}

public static List<Component> formatComponent(List<String> list) {
List<Component> result = new ArrayList<>();
for (String line : list) {
Expand All @@ -156,6 +240,10 @@ public static List<Component> formatComponent(List<String> list, MiniMessagePlac
return result;
}

public static List<Component> formatComponent(List<String> list, List<MiniMessagePlaceholder> placeholders) {
return formatComponent(list, placeholders.toArray(new MiniMessagePlaceholder[0]));
}

public static String formatLegacy(String text) {
return ChatColor.translateAlternateColorCodes('&',
LegacyComponentSerializer.legacyAmpersand().serialize(MiniMessage.miniMessage().deserialize(replaceLegacy(text))));
Expand Down Expand Up @@ -217,6 +305,10 @@ public static String replaceLegacy(String legacy) {
continue;
}
String color = getColor(next);
if (color == null) {
builder.append(current);
continue;
}
builder.append(color);
i++;
} else {
Expand Down Expand Up @@ -275,7 +367,7 @@ public static String getColor(char c) {
case 'r':
return "<reset>";
default:
return "";
return null;
}
}

Expand Down

0 comments on commit c59884b

Please sign in to comment.