+ fix JSON
This commit is contained in:
		
							
								
								
									
										14
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								pom.xml
									
									
									
									
									
								
							@@ -237,6 +237,20 @@
 | 
				
			|||||||
            <scope>system</scope>
 | 
					            <scope>system</scope>
 | 
				
			||||||
            <systemPath>${basedir}/libs/BossBarAPI.jar</systemPath>
 | 
					            <systemPath>${basedir}/libs/BossBarAPI.jar</systemPath>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>viaversion</groupId>
 | 
				
			||||||
 | 
					            <artifactId>viaversion</artifactId>
 | 
				
			||||||
 | 
					            <version>1</version>
 | 
				
			||||||
 | 
					            <scope>system</scope>
 | 
				
			||||||
 | 
					            <systemPath>${basedir}/libs/ViaVersion.jar</systemPath>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>protocolsupport</groupId>
 | 
				
			||||||
 | 
					            <artifactId>protocolsupport</artifactId>
 | 
				
			||||||
 | 
					            <version>1</version>
 | 
				
			||||||
 | 
					            <scope>system</scope>
 | 
				
			||||||
 | 
					            <systemPath>${basedir}/libs/ProtocolSupport.jar</systemPath>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>deprecated</groupId>
 | 
					            <groupId>deprecated</groupId>
 | 
				
			||||||
            <artifactId>deprecated</artifactId>
 | 
					            <artifactId>deprecated</artifactId>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,6 @@ package com.ilummc.tlib.resources;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.ilummc.tlib.TLib;
 | 
					import com.ilummc.tlib.TLib;
 | 
				
			||||||
import com.ilummc.tlib.bungee.api.ChatColor;
 | 
					import com.ilummc.tlib.bungee.api.ChatColor;
 | 
				
			||||||
import com.ilummc.tlib.bungee.api.chat.BaseComponent;
 | 
					 | 
				
			||||||
import com.ilummc.tlib.bungee.api.chat.TextComponent;
 | 
					import com.ilummc.tlib.bungee.api.chat.TextComponent;
 | 
				
			||||||
import com.ilummc.tlib.bungee.chat.ComponentSerializer;
 | 
					import com.ilummc.tlib.bungee.chat.ComponentSerializer;
 | 
				
			||||||
import com.ilummc.tlib.inject.TLoggerManager;
 | 
					import com.ilummc.tlib.inject.TLoggerManager;
 | 
				
			||||||
@@ -10,15 +9,11 @@ import com.ilummc.tlib.util.Ref;
 | 
				
			|||||||
import com.ilummc.tlib.util.Strings;
 | 
					import com.ilummc.tlib.util.Strings;
 | 
				
			||||||
import me.clip.placeholderapi.PlaceholderAPI;
 | 
					import me.clip.placeholderapi.PlaceholderAPI;
 | 
				
			||||||
import me.skymc.taboolib.Main;
 | 
					import me.skymc.taboolib.Main;
 | 
				
			||||||
import me.skymc.taboolib.nms.NMSUtil19;
 | 
					import me.skymc.taboolib.json.tellraw.TellrawCreator;
 | 
				
			||||||
import me.skymc.taboolib.nms.NMSUtils;
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
import org.bukkit.command.CommandSender;
 | 
					import org.bukkit.command.CommandSender;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.reflect.Constructor;
 | 
					 | 
				
			||||||
import java.lang.reflect.Field;
 | 
					 | 
				
			||||||
import java.lang.reflect.Method;
 | 
					 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
@@ -139,23 +134,12 @@ public class TLocale {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public static class Tellraw extends TLocale {
 | 
					    public static class Tellraw extends TLocale {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private static final Class<?> chatSerializer = NMSUtils.getNMSClassSilent("ChatSerializer", "IChatBaseComponent");
 | 
					 | 
				
			||||||
        private static final Method chatSerializerA = NMSUtils.getMethodSilent(chatSerializer, "a", String.class);
 | 
					 | 
				
			||||||
        private static final Field playerConnection = NMSUtils.getFieldSilent(NMSUtil19.class_EntityPlayer, "playerConnection");
 | 
					 | 
				
			||||||
        private static final Method sendPacket = NMSUtils.getMethodSilent(NMSUtil19.class_PlayerConnection, "sendPacket", NMSUtil19.class_Packet);
 | 
					 | 
				
			||||||
        private static final Constructor<?> PacketPlayOutChat = NMSUtils.getConstructorSilent(NMSUtil19.class_PacketPlayOutChat, NMSUtil19.class_IChatBaseComponent);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public static void send(CommandSender sender, String rawMessage) {
 | 
					        public static void send(CommandSender sender, String rawMessage) {
 | 
				
			||||||
            if (sender instanceof Player) {
 | 
					            if (sender instanceof Player) {
 | 
				
			||||||
                try {
 | 
					                TellrawCreator.getAbstractTellraw().sendRawMessage((Player) sender, rawMessage);
 | 
				
			||||||
                    sendPacket.invoke(playerConnection.get(NMSUtils.getHandle(sender)), PacketPlayOutChat.newInstance(chatSerializerA.invoke(null, rawMessage)));
 | 
					 | 
				
			||||||
                } catch (Exception e) {
 | 
					 | 
				
			||||||
                    Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "tellraw " + sender.getName() + " " + rawMessage);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                sender.sendMessage(TextComponent.toLegacyText(ComponentSerializer.parse(rawMessage)));
 | 
					                sender.sendMessage(TextComponent.toLegacyText(ComponentSerializer.parse(rawMessage)));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,85 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.common.util;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.collect.Maps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.lang.reflect.Field;
 | 
				
			||||||
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-10-25 22:51
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class SimpleReflection {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static Map<String, Map<String, Field>> fieldCached = Maps.newHashMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void saveFiled(Class<?> nmsClass) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Arrays.stream(nmsClass.getDeclaredFields()).forEach(declaredField -> saveFiled(nmsClass, declaredField.getName()));
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void saveFiled(Class<?> nmsClass, String fieldName) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Field declaredField = nmsClass.getDeclaredField(fieldName);
 | 
				
			||||||
 | 
					            declaredField.setAccessible(true);
 | 
				
			||||||
 | 
					            fieldCached.computeIfAbsent(nmsClass.getName(), name -> Maps.newHashMap()).put(fieldName, declaredField);
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void setFieldValue(Class<?> nmsClass, Object instance, String fieldName, Object value) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Map<String, Field> fields = fieldCached.get(nmsClass.getName());
 | 
				
			||||||
 | 
					            if (fields == null) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Field field = fields.get(fieldName);
 | 
				
			||||||
 | 
					            if (value == null) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            field.set(instance, value);
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static Object getFieldValue(Class<?> nmsClass, Object instance, String fieldName) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Map<String, Field> fields = fieldCached.get(nmsClass.getName());
 | 
				
			||||||
 | 
					            if (fields == null) {
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Field field = fields.get(fieldName);
 | 
				
			||||||
 | 
					            if (field == null) {
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return field.get(instance);
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static <T> T getFieldValue(Class<?> nmsClass, Object instance, String fieldName, T def) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Map<String, Field> fields = fieldCached.get(nmsClass.getName());
 | 
				
			||||||
 | 
					            if (fields == null) {
 | 
				
			||||||
 | 
					                return def;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Field field = fields.get(fieldName);
 | 
				
			||||||
 | 
					            if (field == null) {
 | 
				
			||||||
 | 
					                return def;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return (T) field.get(instance);
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return def;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.json.tellraw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.loader.Instantiable;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.versioncontrol.SimpleVersionControl;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.json.tellraw.internal.AbstractTellraw;
 | 
				
			||||||
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-11-07 22:58
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Instantiable("TabooLib|TellrawCreator")
 | 
				
			||||||
 | 
					public class TellrawCreator {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static AbstractTellraw abstractTellraw;
 | 
				
			||||||
 | 
					    private static boolean viaVersionLoaded;
 | 
				
			||||||
 | 
					    private static boolean protocolSupportLoaded;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public TellrawCreator() {
 | 
				
			||||||
 | 
					        viaVersionLoaded = Bukkit.getPluginManager().getPlugin("ViaVersion") != null;
 | 
				
			||||||
 | 
					        protocolSupportLoaded = Bukkit.getPluginManager().getPlugin("ProtocolSupport") != null;
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            abstractTellraw = (AbstractTellraw) SimpleVersionControl.create()
 | 
				
			||||||
 | 
					                    .from("v1_8_R3")
 | 
				
			||||||
 | 
					                    .target("me.skymc.taboolib.json.tellraw.internal.InternalTellraw")
 | 
				
			||||||
 | 
					                    .translate()
 | 
				
			||||||
 | 
					                    .newInstance();
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // *********************************
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    //        Getter and Setter
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // *********************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static AbstractTellraw getAbstractTellraw() {
 | 
				
			||||||
 | 
					        return abstractTellraw;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static boolean isViaVersionLoaded() {
 | 
				
			||||||
 | 
					        return viaVersionLoaded;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static boolean isProtocolSupportLoaded() {
 | 
				
			||||||
 | 
					        return protocolSupportLoaded;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,17 +2,20 @@ package me.skymc.taboolib.json.tellraw;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.ilummc.tlib.bungee.api.chat.*;
 | 
					import com.ilummc.tlib.bungee.api.chat.*;
 | 
				
			||||||
import com.ilummc.tlib.bungee.chat.ComponentSerializer;
 | 
					import com.ilummc.tlib.bungee.chat.ComponentSerializer;
 | 
				
			||||||
import com.ilummc.tlib.logger.TLogger;
 | 
					 | 
				
			||||||
import com.ilummc.tlib.resources.TLocale;
 | 
					import com.ilummc.tlib.resources.TLocale;
 | 
				
			||||||
import me.skymc.taboolib.methods.ReflectionUtils;
 | 
					import com.ilummc.tlib.util.Strings;
 | 
				
			||||||
import me.skymc.taboolib.nms.NMSUtils;
 | 
					import me.skymc.taboolib.TabooLib;
 | 
				
			||||||
import me.skymc.taboolib.string.ArrayUtils;
 | 
					import me.skymc.taboolib.string.ArrayUtils;
 | 
				
			||||||
import org.bukkit.command.CommandSender;
 | 
					import org.bukkit.command.CommandSender;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					import org.bukkit.inventory.ItemStack;
 | 
				
			||||||
 | 
					import protocolsupport.api.ProtocolSupportAPI;
 | 
				
			||||||
 | 
					import us.myles.ViaVersion.api.Via;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.reflect.Method;
 | 
					 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -24,10 +27,8 @@ public class TellrawJson {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private List<BaseComponent> components = new ArrayList<>();
 | 
					    private List<BaseComponent> components = new ArrayList<>();
 | 
				
			||||||
    private List<BaseComponent> componentsLatest = new ArrayList<>();
 | 
					    private List<BaseComponent> componentsLatest = new ArrayList<>();
 | 
				
			||||||
    private static final Class<?> craftItemStackClazz = NMSUtils.getOBCClass("inventory.CraftItemStack");
 | 
					    private Map<String, String[]> itemTag = new HashMap<>();
 | 
				
			||||||
    private static final Class<?> nmsItemStackClazz = NMSUtils.getNMSClass("ItemStack");
 | 
					    private int bukkitVersion = TabooLib.getVersionNumber();
 | 
				
			||||||
    private static final Class<?> nbtTagCompoundClazz = NMSUtils.getNMSClass("NBTTagCompound");
 | 
					 | 
				
			||||||
    private static final String INVALID_ITEM = "{id:stone,tag:{display:{Name:§c* Invalid ItemStack *}}}";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TellrawJson() {
 | 
					    TellrawJson() {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -37,13 +38,38 @@ public class TellrawJson {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void send(CommandSender sender) {
 | 
					    public void send(CommandSender sender) {
 | 
				
			||||||
        TLocale.Tellraw.send(sender, toRawMessage());
 | 
					        send(sender, new String[0]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void send(CommandSender sender, String... args) {
 | 
				
			||||||
 | 
					        if (sender instanceof Player) {
 | 
				
			||||||
 | 
					            if (TellrawCreator.isViaVersionLoaded()) {
 | 
				
			||||||
 | 
					                TLocale.Tellraw.send(sender, Strings.replaceWithOrder(toRawMessage(Via.getAPI().getPlayerVersion(sender) > 316 ? TellrawVersion.HIGH_VERSION : TellrawVersion.LOW_VERSION), args));
 | 
				
			||||||
 | 
					            } else if (TellrawCreator.isProtocolSupportLoaded()) {
 | 
				
			||||||
 | 
					                TLocale.Tellraw.send(sender, Strings.replaceWithOrder(toRawMessage(ProtocolSupportAPI.getProtocolVersion((Player) sender).getId() > 316 ? TellrawVersion.HIGH_VERSION : TellrawVersion.LOW_VERSION), args));
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                TLocale.Tellraw.send(sender, Strings.replaceWithOrder(toRawMessage(), args));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            TLocale.Tellraw.send(sender, Strings.replaceWithOrder(toRawMessage(), args));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public String toRawMessage() {
 | 
					    public String toRawMessage() {
 | 
				
			||||||
        return ComponentSerializer.toString(getComponentsAll());
 | 
					        return ComponentSerializer.toString(getComponentsAll());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String toRawMessage(TellrawVersion version) {
 | 
				
			||||||
 | 
					        String rawMessage = toRawMessage();
 | 
				
			||||||
 | 
					        if (version == TellrawVersion.CURRENT_VERSION) {
 | 
				
			||||||
 | 
					            return rawMessage;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        for (Map.Entry<String, String[]> stringEntry : itemTag.entrySet()) {
 | 
				
			||||||
 | 
					            rawMessage = rawMessage.replace(stringEntry.getKey(), version == TellrawVersion.HIGH_VERSION ? stringEntry.getValue()[1] : stringEntry.getValue()[0]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return rawMessage;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public String toLegacyText() {
 | 
					    public String toLegacyText() {
 | 
				
			||||||
        return TextComponent.toLegacyText(getComponentsAll());
 | 
					        return TextComponent.toLegacyText(getComponentsAll());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -61,6 +87,7 @@ public class TellrawJson {
 | 
				
			|||||||
    public TellrawJson append(TellrawJson json) {
 | 
					    public TellrawJson append(TellrawJson json) {
 | 
				
			||||||
        appendComponents();
 | 
					        appendComponents();
 | 
				
			||||||
        componentsLatest.addAll(ArrayUtils.asList(json.getComponentsAll()));
 | 
					        componentsLatest.addAll(ArrayUtils.asList(json.getComponentsAll()));
 | 
				
			||||||
 | 
					        itemTag.putAll(json.itemTag);
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,7 +97,18 @@ public class TellrawJson {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public TellrawJson hoverItem(ItemStack itemStack) {
 | 
					    public TellrawJson hoverItem(ItemStack itemStack) {
 | 
				
			||||||
        getLatestComponent().forEach(component -> component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new ComponentBuilder(getItemComponent(itemStack)).create())));
 | 
					        return hoverItem(itemStack, true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public TellrawJson hoverItem(ItemStack itemStack, boolean supportVersion) {
 | 
				
			||||||
 | 
					        BaseComponent[] itemComponentCurrentVersion = new ComponentBuilder(TellrawCreator.getAbstractTellraw().getItemComponent(itemStack, TellrawVersion.CURRENT_VERSION)).create();
 | 
				
			||||||
 | 
					        getLatestComponent().forEach(component -> component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, itemComponentCurrentVersion)));
 | 
				
			||||||
 | 
					        if (supportVersion) {
 | 
				
			||||||
 | 
					            itemTag.put(ComponentSerializer.toString(itemComponentCurrentVersion), new String[] {
 | 
				
			||||||
 | 
					                    ComponentSerializer.toString(new ComponentBuilder(TellrawCreator.getAbstractTellraw().getItemComponent(itemStack, TellrawVersion.LOW_VERSION)).create()),
 | 
				
			||||||
 | 
					                    ComponentSerializer.toString(new ComponentBuilder(TellrawCreator.getAbstractTellraw().getItemComponent(itemStack, TellrawVersion.HIGH_VERSION)).create())
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -100,19 +138,6 @@ public class TellrawJson {
 | 
				
			|||||||
        return components.toArray(new BaseComponent[0]);
 | 
					        return components.toArray(new BaseComponent[0]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public String getItemComponent(ItemStack itemStack) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            Method asNMSCopyMethod = ReflectionUtils.getMethod(craftItemStackClazz, "asNMSCopy", ItemStack.class);
 | 
					 | 
				
			||||||
            Method saveNmsItemStackMethod = ReflectionUtils.getMethod(nmsItemStackClazz, "save", nbtTagCompoundClazz);
 | 
					 | 
				
			||||||
            Object nmsNbtTagCompoundObj = nbtTagCompoundClazz.newInstance();
 | 
					 | 
				
			||||||
            Object nmsItemStackObj = asNMSCopyMethod.invoke(null, itemStack);
 | 
					 | 
				
			||||||
            return saveNmsItemStackMethod.invoke(nmsItemStackObj, nmsNbtTagCompoundObj).toString();
 | 
					 | 
				
			||||||
        } catch (Throwable t) {
 | 
					 | 
				
			||||||
            TLogger.getGlobalLogger().error("failed to serialize bukkit item to nms item: " + t.toString());
 | 
					 | 
				
			||||||
            return INVALID_ITEM;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // *********************************
 | 
					    // *********************************
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    //         Private Methods
 | 
					    //         Private Methods
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.json.tellraw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-11-07 22:53
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public enum TellrawVersion {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LOW_VERSION, HIGH_VERSION, CURRENT_VERSION
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.json.tellraw.internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import me.skymc.taboolib.json.tellraw.TellrawVersion;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					import org.bukkit.inventory.ItemStack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-11-07 22:52
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface AbstractTellraw {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void sendRawMessage(Player player, String rawMessage);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    String getItemComponent(ItemStack itemStack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    String getItemComponent(ItemStack itemStack, TellrawVersion version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,81 @@
 | 
				
			|||||||
 | 
					package me.skymc.taboolib.json.tellraw.internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import me.skymc.taboolib.TabooLib;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.packet.TPacketHandler;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.common.util.SimpleReflection;
 | 
				
			||||||
 | 
					import me.skymc.taboolib.json.tellraw.TellrawVersion;
 | 
				
			||||||
 | 
					import net.minecraft.server.v1_8_R3.IChatBaseComponent;
 | 
				
			||||||
 | 
					import net.minecraft.server.v1_8_R3.NBTTagCompound;
 | 
				
			||||||
 | 
					import net.minecraft.server.v1_8_R3.NBTTagList;
 | 
				
			||||||
 | 
					import net.minecraft.server.v1_8_R3.PacketPlayOutChat;
 | 
				
			||||||
 | 
					import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					import org.bukkit.inventory.ItemStack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @Author 坏黑
 | 
				
			||||||
 | 
					 * @Since 2018-11-07 22:54
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class InternalTellraw implements AbstractTellraw {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int bukkitVersion = TabooLib.getVersionNumber();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public InternalTellraw() {
 | 
				
			||||||
 | 
					        SimpleReflection.saveFiled(NBTTagCompound.class, "map");
 | 
				
			||||||
 | 
					        SimpleReflection.saveFiled(NBTTagList.class, "list");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void sendRawMessage(Player player, String rawMessage) {
 | 
				
			||||||
 | 
					        TPacketHandler.sendPacket(player, new PacketPlayOutChat(IChatBaseComponent.ChatSerializer.a(rawMessage)));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String getItemComponent(ItemStack itemStack) {
 | 
				
			||||||
 | 
					        return getItemComponent(itemStack, TellrawVersion.CURRENT_VERSION);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String getItemComponent(ItemStack itemStack, TellrawVersion version) {
 | 
				
			||||||
 | 
					        return nbtToString(CraftItemStack.asNMSCopy(itemStack).save(new NBTTagCompound()), version);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String nbtToString(Object nbtTagCompound, TellrawVersion version) {
 | 
				
			||||||
 | 
					        StringBuilder builder = new StringBuilder("{");
 | 
				
			||||||
 | 
					        Map map = (Map) SimpleReflection.getFieldValue(NBTTagCompound.class, nbtTagCompound, "map");
 | 
				
			||||||
 | 
					        int index = 0;
 | 
				
			||||||
 | 
					        for (Object nbtBaseEntry : map.entrySet()) {
 | 
				
			||||||
 | 
					            if (index++ != 0) {
 | 
				
			||||||
 | 
					                builder.append(",");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Object value = ((Map.Entry) nbtBaseEntry).getValue();
 | 
				
			||||||
 | 
					            if (value instanceof NBTTagList ) {
 | 
				
			||||||
 | 
					                builder.append(((Map.Entry) nbtBaseEntry).getKey()).append(":").append(nbtListToString(value, version));
 | 
				
			||||||
 | 
					            } else if (value instanceof NBTTagCompound) {
 | 
				
			||||||
 | 
					                builder.append(((Map.Entry) nbtBaseEntry).getKey()).append(":").append(nbtToString(value, version));
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                builder.append(((Map.Entry) nbtBaseEntry).getKey()).append(":").append(value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return builder.append('}').toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String nbtListToString(Object nbtTagList, TellrawVersion version) {
 | 
				
			||||||
 | 
					        StringBuilder builder = new StringBuilder("[");
 | 
				
			||||||
 | 
					        List list = (List) SimpleReflection.getFieldValue(NBTTagList.class, nbtTagList, "list");
 | 
				
			||||||
 | 
					        for (int i = 0; i < list.size(); ++i) {
 | 
				
			||||||
 | 
					            if (i != 0) {
 | 
				
			||||||
 | 
					                builder.append(',');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (version == TellrawVersion.HIGH_VERSION || (this.bukkitVersion >= 11200 && version == TellrawVersion.CURRENT_VERSION)) {
 | 
				
			||||||
 | 
					                builder.append(list.get(i));
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                builder.append(i).append(':').append(list.get(i));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return builder.append(']').toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user