mirror of
https://github.com/Auxilor/EcoEnchants.git
synced 2025-02-15 04:21:20 +01:00
Added support for displaying items in chat
This commit is contained in:
parent
098e2496ee
commit
c2948525d4
@ -0,0 +1,5 @@
|
||||
package com.willfp.ecoenchants.nms.API;
|
||||
|
||||
public interface ChatComponentWrapper {
|
||||
Object modifyComponent(Object object);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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<Object[]>(){}.getType();
|
||||
Object[] objects = gson.fromJson(json, objectArrayType);
|
||||
List<Object> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user