Added support for displaying items in chat

This commit is contained in:
Auxilor 2020-12-02 22:11:21 +00:00
parent 098e2496ee
commit c2948525d4
11 changed files with 226 additions and 129 deletions

View File

@ -0,0 +1,5 @@
package com.willfp.ecoenchants.nms.API;
public interface ChatComponentWrapper {
Object modifyComponent(Object object);
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}

View File

@ -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);
}
}
}

View File

@ -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();