diff --git a/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/ChatComponentWrapper.java b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/ChatComponentWrapper.java new file mode 100644 index 00000000..0bfd346f --- /dev/null +++ b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/ChatComponentWrapper.java @@ -0,0 +1,5 @@ +package com.willfp.ecoenchants.nms.API; + +public interface ChatComponentWrapper { + Object modifyComponent(Object object); +} diff --git a/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/JsonStackWrapper.java b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/JsonStackWrapper.java deleted file mode 100644 index 4b232c90..00000000 --- a/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/JsonStackWrapper.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.willfp.ecoenchants.nms.API; - -import org.bukkit.inventory.ItemStack; - -public interface JsonStackWrapper { - ItemStack getFromTag(String jsonTag, String id); - String toJson(ItemStack itemStack); -} diff --git a/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/ChatComponent.java b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/ChatComponent.java new file mode 100644 index 00000000..5a847a04 --- /dev/null +++ b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/ChatComponent.java @@ -0,0 +1,10 @@ +package com.willfp.ecoenchants.v1_15_R1; + +import com.willfp.ecoenchants.nms.API.ChatComponentWrapper; + +public class ChatComponent implements ChatComponentWrapper { + @Override + public Object modifyComponent(Object object) { + return object; + } +} diff --git a/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/JsonStack.java b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/JsonStack.java deleted file mode 100644 index 28e57871..00000000 --- a/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/JsonStack.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.willfp.ecoenchants.v1_15_R1; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.willfp.ecoenchants.nms.API.JsonStackWrapper; -import net.minecraft.server.v1_15_R1.MojangsonParser; -import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; - -public class JsonStack implements JsonStackWrapper { - @Override - public ItemStack getFromTag(String jsonTag, String id) { - id = id.replaceAll("minecraft:", "").toUpperCase(); - Material material = Material.getMaterial(id); - - assert material != null; - ItemStack itemStack = new ItemStack(material); - net.minecraft.server.v1_15_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); - - try { - nmsStack.setTag(MojangsonParser.parse(jsonTag)); - } catch (CommandSyntaxException e) { - e.printStackTrace(); - } - return CraftItemStack.asBukkitCopy(nmsStack); - } - - @Override - public String toJson(ItemStack itemStack) { - return CraftItemStack.asNMSCopy(itemStack).getOrCreateTag().toString(); - } -} diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/ChatComponent.java b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/ChatComponent.java new file mode 100644 index 00000000..3c92d504 --- /dev/null +++ b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/ChatComponent.java @@ -0,0 +1,98 @@ +package com.willfp.ecoenchants.v1_16_R1; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.willfp.ecoenchants.nms.API.ChatComponentWrapper; +import net.minecraft.server.v1_16_R1.ChatBaseComponent; +import net.minecraft.server.v1_16_R1.ChatHoverable; +import net.minecraft.server.v1_16_R1.ChatMessage; +import net.minecraft.server.v1_16_R1.ChatModifier; +import net.minecraft.server.v1_16_R1.IChatBaseComponent; +import net.minecraft.server.v1_16_R1.MojangsonParser; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; + +public class ChatComponent implements ChatComponentWrapper { + @Override + public Object modifyComponent(Object object) { + if(!(object instanceof IChatBaseComponent)) { + return object; + } + + IChatBaseComponent chatComponent = (IChatBaseComponent) object; + chatComponent.stream().forEach(this::modifyBaseComponent); + + return chatComponent; + } + + public void modifyBaseComponent(IChatBaseComponent component) { + component.getSiblings().forEach(this::modifyBaseComponent); + if(component instanceof ChatMessage) { + Arrays.stream(((ChatMessage) component).getArgs()) + .filter(o -> o instanceof IChatBaseComponent) + .map(o -> (IChatBaseComponent) o) + .forEach(this::modifyBaseComponent); + } + + ChatHoverable hoverable = component.getChatModifier().getHoverEvent(); + + if(hoverable == null) + return; + + JsonObject jsonObject = hoverable.b(); + JsonElement json = hoverable.b().get("contents"); + if(json.getAsJsonObject().get("id") == null) return; + if(json.getAsJsonObject().get("tag") == null) return; + String id = json.getAsJsonObject().get("id").toString(); + String tag = json.getAsJsonObject().get("tag").toString(); + ItemStack itemStack = getFromTag(tag, id); + try { + itemStack = (ItemStack) Class.forName("com.willfp.ecoenchants.display.EnchantDisplay").getMethod("displayEnchantments", ItemStack.class).invoke(null, itemStack); + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | ClassNotFoundException e) { + e.printStackTrace(); + } + + json.getAsJsonObject().remove("tag"); + String newTag = toJson(itemStack); + json.getAsJsonObject().add("tag", new JsonPrimitive(newTag)); + + jsonObject.remove("contents"); + jsonObject.add("contents", json); + ChatHoverable newHoverable = ChatHoverable.a(jsonObject); + ChatModifier modifier = component.getChatModifier(); + modifier = modifier.setChatHoverable(newHoverable); + + ((ChatBaseComponent) component).setChatModifier(modifier); + } + + private static ItemStack getFromTag(String jsonTag, String id) { + id = id.replaceAll("minecraft:", ""); + id = id.toUpperCase(); + id = id.replaceAll("\"", ""); + jsonTag = jsonTag.substring( 1, jsonTag.length() - 1 ); + jsonTag = jsonTag.replaceAll("id:", "\"id\":"); + jsonTag = jsonTag.replace("\\", ""); + Material material = Material.getMaterial(id); + + assert material != null; + ItemStack itemStack = new ItemStack(material); + net.minecraft.server.v1_16_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + + try { + nmsStack.setTag(MojangsonParser.parse(jsonTag)); + } catch (CommandSyntaxException e) { + e.printStackTrace(); + } + return CraftItemStack.asBukkitCopy(nmsStack); + } + + private static String toJson(ItemStack itemStack) { + return CraftItemStack.asNMSCopy(itemStack).getOrCreateTag().toString(); + } +} diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/JsonStack.java b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/JsonStack.java deleted file mode 100644 index 98c1a52b..00000000 --- a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/JsonStack.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.willfp.ecoenchants.v1_16_R1; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.willfp.ecoenchants.nms.API.JsonStackWrapper; -import net.minecraft.server.v1_16_R1.MojangsonParser; -import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; - -public class JsonStack implements JsonStackWrapper { - @Override - public ItemStack getFromTag(String jsonTag, String id) { - id = id.replaceAll("minecraft:", "").toUpperCase(); - Material material = Material.getMaterial(id); - - assert material != null; - ItemStack itemStack = new ItemStack(material); - net.minecraft.server.v1_16_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); - - try { - nmsStack.setTag(MojangsonParser.parse(jsonTag)); - } catch (CommandSyntaxException e) { - e.printStackTrace(); - } - return CraftItemStack.asBukkitCopy(nmsStack); - } - - @Override - public String toJson(ItemStack itemStack) { - return CraftItemStack.asNMSCopy(itemStack).getOrCreateTag().toString(); - } -} diff --git a/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/ChatComponent.java b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/ChatComponent.java new file mode 100644 index 00000000..2a641b66 --- /dev/null +++ b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/ChatComponent.java @@ -0,0 +1,98 @@ +package com.willfp.ecoenchants.v1_16_R2; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.willfp.ecoenchants.nms.API.ChatComponentWrapper; +import net.minecraft.server.v1_16_R2.ChatBaseComponent; +import net.minecraft.server.v1_16_R2.ChatHoverable; +import net.minecraft.server.v1_16_R2.ChatMessage; +import net.minecraft.server.v1_16_R2.ChatModifier; +import net.minecraft.server.v1_16_R2.IChatBaseComponent; +import net.minecraft.server.v1_16_R2.MojangsonParser; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; + +public class ChatComponent implements ChatComponentWrapper { + @Override + public Object modifyComponent(Object object) { + if(!(object instanceof IChatBaseComponent)) { + return object; + } + + IChatBaseComponent chatComponent = (IChatBaseComponent) object; + chatComponent.stream().forEach(this::modifyBaseComponent); + + return chatComponent; + } + + public void modifyBaseComponent(IChatBaseComponent component) { + component.getSiblings().forEach(this::modifyBaseComponent); + if(component instanceof ChatMessage) { + Arrays.stream(((ChatMessage) component).getArgs()) + .filter(o -> o instanceof IChatBaseComponent) + .map(o -> (IChatBaseComponent) o) + .forEach(this::modifyBaseComponent); + } + + ChatHoverable hoverable = component.getChatModifier().getHoverEvent(); + + if(hoverable == null) + return; + + JsonObject jsonObject = hoverable.b(); + JsonElement json = hoverable.b().get("contents"); + if(json.getAsJsonObject().get("id") == null) return; + if(json.getAsJsonObject().get("tag") == null) return; + String id = json.getAsJsonObject().get("id").toString(); + String tag = json.getAsJsonObject().get("tag").toString(); + ItemStack itemStack = getFromTag(tag, id); + try { + itemStack = (ItemStack) Class.forName("com.willfp.ecoenchants.display.EnchantDisplay").getMethod("displayEnchantments", ItemStack.class).invoke(null, itemStack); + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | ClassNotFoundException e) { + e.printStackTrace(); + } + + json.getAsJsonObject().remove("tag"); + String newTag = toJson(itemStack); + json.getAsJsonObject().add("tag", new JsonPrimitive(newTag)); + + jsonObject.remove("contents"); + jsonObject.add("contents", json); + ChatHoverable newHoverable = ChatHoverable.a(jsonObject); + ChatModifier modifier = component.getChatModifier(); + modifier = modifier.setChatHoverable(newHoverable); + + ((ChatBaseComponent) component).setChatModifier(modifier); + } + + private static ItemStack getFromTag(String jsonTag, String id) { + id = id.replaceAll("minecraft:", ""); + id = id.toUpperCase(); + id = id.replaceAll("\"", ""); + jsonTag = jsonTag.substring( 1, jsonTag.length() - 1 ); + jsonTag = jsonTag.replaceAll("id:", "\"id\":"); + jsonTag = jsonTag.replace("\\", ""); + Material material = Material.getMaterial(id); + + assert material != null; + ItemStack itemStack = new ItemStack(material); + net.minecraft.server.v1_16_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + + try { + nmsStack.setTag(MojangsonParser.parse(jsonTag)); + } catch (CommandSyntaxException e) { + e.printStackTrace(); + } + return CraftItemStack.asBukkitCopy(nmsStack); + } + + private static String toJson(ItemStack itemStack) { + return CraftItemStack.asNMSCopy(itemStack).getOrCreateTag().toString(); + } +} diff --git a/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/JsonStack.java b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/JsonStack.java deleted file mode 100644 index 5213cdbb..00000000 --- a/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/JsonStack.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.willfp.ecoenchants.v1_16_R2; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.willfp.ecoenchants.nms.API.JsonStackWrapper; -import net.minecraft.server.v1_16_R2.MojangsonParser; -import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; - -public class JsonStack implements JsonStackWrapper { - @Override - public ItemStack getFromTag(String jsonTag, String id) { - id = id.replaceAll("minecraft:", "").toUpperCase(); - Material material = Material.getMaterial(id); - - assert material != null; - ItemStack itemStack = new ItemStack(material); - net.minecraft.server.v1_16_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); - - try { - nmsStack.setTag(MojangsonParser.parse(jsonTag)); - } catch (CommandSyntaxException e) { - e.printStackTrace(); - } - return CraftItemStack.asBukkitCopy(nmsStack); - } - - @Override - public String toJson(ItemStack itemStack) { - return CraftItemStack.asNMSCopy(itemStack).getOrCreateTag().toString(); - } -} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java b/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java index 4ab9e6a2..741347af 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/config/ConfigManager.java @@ -1,6 +1,10 @@ package com.willfp.ecoenchants.config; -import com.willfp.ecoenchants.config.configs.*; +import com.willfp.ecoenchants.config.configs.Config; +import com.willfp.ecoenchants.config.configs.EnchantmentConfig; +import com.willfp.ecoenchants.config.configs.Lang; +import com.willfp.ecoenchants.config.configs.Rarity; +import com.willfp.ecoenchants.config.configs.Target; import java.util.HashMap; import java.util.HashSet; @@ -25,8 +29,8 @@ public class ConfigManager { public static void updateConfigs() { LANG.update(); CONFIG.update(); - TARGET.reload(); - RARITY.reload(); + TARGET.update(); + RARITY.update(); updateEnchantmentConfigs(); } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketChat.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketChat.java index d72da978..b15b79af 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketChat.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketChat.java @@ -4,15 +4,8 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedChatComponent; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import com.willfp.ecoenchants.display.AbstractPacketAdapter; -import com.willfp.ecoenchants.util.internal.Logger; - -import java.lang.reflect.Type; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; +import com.willfp.ecoenchants.nms.ChatComponent; public class PacketChat extends AbstractPacketAdapter { public PacketChat() { @@ -23,15 +16,8 @@ public class PacketChat extends AbstractPacketAdapter { public void onSend(PacketContainer packet) { for(int i = 0; i < packet.getChatComponents().size(); i++) { WrappedChatComponent component = packet.getChatComponents().read(i); - String json = component.getJson(); - - Gson gson = new Gson(); - Type objectArrayType = new TypeToken(){}.getType(); - Object[] objects = gson.fromJson(json, objectArrayType); - List objectsList = Arrays.stream(objects).map(Object::toString).collect(Collectors.toList()); - Logger.info(objectsList + ""); - Logger.info(packet.getChatComponents().read(0) - .getJson()); + WrappedChatComponent newComponent = WrappedChatComponent.fromHandle(ChatComponent.modifyComponent(component.getHandle())); + packet.getChatComponents().write(i, newComponent); } } } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/util/internal/Loader.java b/Plugin/src/main/java/com/willfp/ecoenchants/util/internal/Loader.java index 4847f005..67ef6e7b 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/util/internal/Loader.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/util/internal/Loader.java @@ -49,8 +49,8 @@ import com.willfp.ecoenchants.integrations.mcmmo.plugins.McmmoIntegrationImpl; import com.willfp.ecoenchants.integrations.placeholder.PlaceholderManager; import com.willfp.ecoenchants.integrations.placeholder.plugins.PlaceholderIntegrationPAPI; import com.willfp.ecoenchants.nms.BlockBreak; +import com.willfp.ecoenchants.nms.ChatComponent; import com.willfp.ecoenchants.nms.Cooldown; -import com.willfp.ecoenchants.nms.JsonStack; import com.willfp.ecoenchants.nms.OpenInventory; import com.willfp.ecoenchants.nms.RepairCost; import com.willfp.ecoenchants.nms.TridentStack; @@ -109,7 +109,6 @@ public class Loader { new PacketSetCreativeSlot().register(); new PacketSetSlot().register(); new PacketWindowItems().register(); - new PacketChat().register(); Logger.info(""); @@ -159,10 +158,10 @@ public class Loader { Bukkit.getPluginManager().disablePlugin(EcoEnchantsPlugin.getInstance()); } - if (JsonStack.init()) { - Logger.info("Json Stack: &aSUCCESS"); + if (ChatComponent.init()) { + Logger.info("Chat Component: &aSUCCESS"); } else { - Logger.info("Json Stack: &cFAILURE"); + Logger.info("Chat Component: &cFAILURE"); Logger.error("&cAborting..."); Bukkit.getPluginManager().disablePlugin(EcoEnchantsPlugin.getInstance()); } @@ -420,6 +419,7 @@ public class Loader { Logger.info(""); Logger.info("Updating cache..."); + new PacketChat().register(); EcoEnchants.getAll().forEach(EcoEnchant::update); EnchantmentCache.update(); EssentialsManager.registerEnchantments();