From 51e9d5f267f03b36ceef75fac6945b98ad26562d Mon Sep 17 00:00:00 2001 From: Phoenix616 Date: Tue, 1 Dec 2020 19:48:26 +0100 Subject: [PATCH] Use adventure text api in order to fix hover issues This also has the side-effect of restoring CraftBukkit compatibility Also move all libraries into a dedicated Libs package --- pom.xml | 43 +++++++++++++++---- .../Acrobot/Breeze/Utils/MaterialUtil.java | 24 ++++------- .../java/com/Acrobot/ChestShop/ChestShop.java | 16 ++++++- .../ChestShop/Configuration/Messages.java | 21 ++++++--- 4 files changed, 72 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index 8e00bcf..8706960 100644 --- a/pom.xml +++ b/pom.xml @@ -83,11 +83,31 @@ de.themoep - minedown - 1.6.1-SNAPSHOT + minedown-adventure + 1.6.2-SNAPSHOT compile + + net.kyori + adventure-platform-bukkit + 4.0.0-SNAPSHOT + compile + + + + net.kyori + adventure-text-serializer-gson + 4.2.0 + compile + + + com.google.code.gson + gson + + + + org.apache.logging.log4j @@ -312,7 +332,7 @@ de.themoep.showitem api - 1.2.24 + 1.6.3 provided @@ -375,6 +395,7 @@ de.themoep:* de.themoep.utils:* + net.kyori:* org.bstats:* net.gravitydevelopment.updater com.j256.ormlite @@ -385,11 +406,15 @@ de.themoep.utils.lang - com.Acrobot.ChestShop.Lang + com.Acrobot.ChestShop.Libs.Lang - de.themoep.minedown - com.Acrobot.ChestShop.MineDown + de.themoep.minedown.adventure + com.Acrobot.ChestShop.Libs.MineDown + + + net.kyori + com.Acrobot.ChestShop.Libs.Kyori org.bstats @@ -401,11 +426,11 @@ com.j256.ormlite - com.Acrobot.ChestShop.ORMlite + com.Acrobot.ChestShop.Libs.ORMlite javax.persistence - com.Acrobot.ChestShop.javax.persistence + com.Acrobot.ChestShop.Libs.javax.persistence @@ -506,7 +531,7 @@ com.destroystokyo.paper paper-api - 1.16.1-R0.1-SNAPSHOT + 1.16.4-R0.1-SNAPSHOT provided diff --git a/src/main/java/com/Acrobot/Breeze/Utils/MaterialUtil.java b/src/main/java/com/Acrobot/Breeze/Utils/MaterialUtil.java index 827bdda..0440720 100644 --- a/src/main/java/com/Acrobot/Breeze/Utils/MaterialUtil.java +++ b/src/main/java/com/Acrobot/Breeze/Utils/MaterialUtil.java @@ -6,12 +6,10 @@ import com.Acrobot.ChestShop.Configuration.Messages; import com.Acrobot.ChestShop.Configuration.Properties; import com.Acrobot.ChestShop.Events.ItemParseEvent; import com.Acrobot.ChestShop.Events.MaterialParseEvent; -import com.google.common.collect.ImmutableMap; import de.themoep.ShowItem.api.ShowItem; -import de.themoep.minedown.Replacer; +import de.themoep.minedown.adventure.Replacer; import info.somethingodd.OddItem.OddItem; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.file.YamlConstructor; @@ -21,7 +19,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.Plugin; -import org.json.simple.JSONObject; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.nodes.Tag; @@ -35,7 +32,6 @@ import java.util.Map; import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import static com.Acrobot.Breeze.Utils.StringUtil.getMinecraftCharWidth; import static com.Acrobot.Breeze.Utils.StringUtil.getMinecraftStringWidth; @@ -541,29 +537,27 @@ public class MaterialUtil { return false; } - List itemJson = new ArrayList<>(); + Component itemComponent = Component.empty(); for (ItemStack item : InventoryUtil.mergeSimilarStacks(stock)) { try { - itemJson.add(showItem.getItemConverter().createComponent(item, Level.FINE).toJsonString(player)); + itemComponent.append(showItem.getItemConverter().createComponent(item, Level.FINE).toTextComponent(player)); } catch (Exception e) { ChestShop.getPlugin().getLogger().log(Level.WARNING, "Error while trying to send message '" + message + "' to player " + player.getName() + ": " + e.getMessage()); return false; } } - String joinedItemJson = itemJson.stream().collect(Collectors.joining("," + new JSONObject(ImmutableMap.of("text", " ")).toJSONString() + ", ")); - Map newMap = new LinkedHashMap<>(replacementMap); newMap.put("material", "item"); - BaseComponent[] components = new Replacer() + Component component = new Replacer() .placeholderSuffix("") - .replace("item", ComponentSerializer.parse("[" + joinedItemJson + "]")) - .replaceIn(message.getComponents(player, true, newMap, replacements)); + .replace("item",itemComponent) + .replaceIn(message.getComponent(player, true, newMap, replacements)); if (player != null) { - player.spigot().sendMessage(components); + ChestShop.getAudiences().player(player).sendMessage(component); return true; } else if (playerName != null) { - ChestShop.sendBungeeMessage(playerName, components); + ChestShop.sendBungeeMessage(playerName, component); return true; } diff --git a/src/main/java/com/Acrobot/ChestShop/ChestShop.java b/src/main/java/com/Acrobot/ChestShop/ChestShop.java index ace82e1..13e1c59 100644 --- a/src/main/java/com/Acrobot/ChestShop/ChestShop.java +++ b/src/main/java/com/Acrobot/ChestShop/ChestShop.java @@ -47,6 +47,9 @@ import com.google.common.collect.ImmutableMap; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; import org.apache.logging.log4j.Level; @@ -93,6 +96,8 @@ public class ChestShop extends JavaPlugin { private static Server server; private static PluginDescriptionFile description; + private static BukkitAudiences audiences; + private static File dataFolder; private static ItemDatabase itemDatabase; @@ -116,6 +121,7 @@ public class ChestShop extends JavaPlugin { @Override public void onEnable() { + audiences = BukkitAudiences.create(this); turnOffDatabaseLogging(); if (!handleMigrations()) { return; @@ -518,6 +524,10 @@ public class ChestShop extends JavaPlugin { return plugin; } + public static BukkitAudiences getAudiences() { + return audiences; + } + public static void registerListener(Listener listener) { plugin.registerEvent(listener); } @@ -527,7 +537,7 @@ public class ChestShop extends JavaPlugin { } public static void sendBungeeMessage(String playerName, Messages.Message message, Map replacementMap, String... replacements) { - sendBungeeMessage(playerName, message.getComponents(null, true, replacementMap, replacements)); + sendBungeeMessage(playerName, message.getComponent(null, true, replacementMap, replacements)); } public static void sendBungeeMessage(String playerName, String message) { @@ -538,6 +548,10 @@ public class ChestShop extends JavaPlugin { sendBungeeMessage(playerName, "MessageRaw", ComponentSerializer.toString(message)); } + public static void sendBungeeMessage(String playerName, Component message) { + sendBungeeMessage(playerName, "MessageRaw", GsonComponentSerializer.gson().serialize(message)); + } + private static void sendBungeeMessage(String playerName, String channel, String message) { if (Properties.BUNGEECORD_MESSAGES && !Bukkit.getOnlinePlayers().isEmpty()) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); diff --git a/src/main/java/com/Acrobot/ChestShop/Configuration/Messages.java b/src/main/java/com/Acrobot/ChestShop/Configuration/Messages.java index 612a8fa..62fe5ce 100644 --- a/src/main/java/com/Acrobot/ChestShop/Configuration/Messages.java +++ b/src/main/java/com/Acrobot/ChestShop/Configuration/Messages.java @@ -2,11 +2,13 @@ package com.Acrobot.ChestShop.Configuration; import com.Acrobot.Breeze.Configuration.Configuration; import com.Acrobot.ChestShop.ChestShop; -import de.themoep.minedown.MineDown; +import de.themoep.minedown.adventure.MineDown; import de.themoep.utils.lang.bukkit.BukkitLanguageConfig; import de.themoep.utils.lang.bukkit.LanguageManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.command.CommandSender; import java.io.File; @@ -154,22 +156,27 @@ public class Messages { } public void sendWithPrefix(CommandSender sender, Map replacementMap, String... replacements) { - sender.spigot().sendMessage(getComponents(sender, true, replacementMap, replacements)); + ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, true, replacementMap, replacements)); } public void sendWithPrefix(CommandSender sender, Map replacements) { - sender.spigot().sendMessage(getComponents(sender, true, replacements)); + ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, true, replacements)); } public void sendWithPrefix(CommandSender sender, String... replacements) { - sender.spigot().sendMessage(getComponents(sender, true, Collections.emptyMap(), replacements)); + ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, true, Collections.emptyMap(), replacements)); } public void send(CommandSender sender, String... replacements) { - sender.spigot().sendMessage(getComponents(sender, false, Collections.emptyMap(), replacements)); + ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, false, Collections.emptyMap(), replacements)); } + @Deprecated public BaseComponent[] getComponents(CommandSender sender, boolean prefixSuffix, Map replacementMap, String... replacements) { + return BungeeComponentSerializer.get().serialize(getComponent(sender, prefixSuffix, replacementMap, replacements)); + } + + public Component getComponent(CommandSender sender, boolean prefixSuffix, Map replacementMap, String... replacements) { MineDown mineDown = new MineDown("%prefix" + getLang(sender)); mineDown.placeholderSuffix(""); mineDown.replace("prefix", prefixSuffix ? prefix.getLang(sender) : ""); @@ -183,7 +190,7 @@ public class Messages { } public String getTextWithPrefix(CommandSender sender, Map replacementMap, String... replacements) { - return TextComponent.toLegacyText(getComponents(sender, true, replacementMap, replacements)); + return LegacyComponentSerializer.legacySection().serialize(getComponent(sender, true, replacementMap, replacements)); } public String getTextWithPrefix(CommandSender sender, String... replacements) {