mirror of
				https://e.coding.net/circlecloud/YumCore.git
				synced 2025-11-03 23:06:02 +00:00 
			
		
		
		
	
							
								
								
									
										16
									
								
								.classpath
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								.classpath
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<classpath>
 | 
			
		||||
	<classpathentry kind="src" path="src/main/java"/>
 | 
			
		||||
	<classpathentry kind="src" path="src/main/resources"/>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
 | 
			
		||||
	<classpathentry kind="output" path="bin"/>
 | 
			
		||||
</classpath>
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<classpath>
 | 
			
		||||
	<classpathentry kind="src" path="src/main/java"/>
 | 
			
		||||
	<classpathentry kind="src" path="src/main/resources"/>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
 | 
			
		||||
	<classpathentry kind="output" path="target/classes"/>
 | 
			
		||||
</classpath>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										216
									
								
								src/main/java/pw/yumc/YumCore/tellraw/ItemSerialize.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								src/main/java/pw/yumc/YumCore/tellraw/ItemSerialize.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,216 @@
 | 
			
		||||
package pw.yumc.YumCore.tellraw;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.enchantments.Enchantment;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
import org.bukkit.inventory.meta.ItemMeta;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年9月9日 下午3:47:17
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public abstract class ItemSerialize {
 | 
			
		||||
    static ItemSerialize itemSerialize;
 | 
			
		||||
    static {
 | 
			
		||||
        try {
 | 
			
		||||
            itemSerialize = new Automatic();
 | 
			
		||||
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) {
 | 
			
		||||
            itemSerialize = new Manual();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String $(final ItemStack item) {
 | 
			
		||||
        return itemSerialize.parse(item);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public abstract String parse(final ItemStack item);
 | 
			
		||||
 | 
			
		||||
    static class Automatic extends ItemSerialize {
 | 
			
		||||
        Method asNMSCopyMethod;
 | 
			
		||||
        Method nmsSaveNBTMethod;
 | 
			
		||||
        Class<?> nmsNBTTagCompound;
 | 
			
		||||
        String ver = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
 | 
			
		||||
 | 
			
		||||
        public Automatic() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
 | 
			
		||||
            final Class<?> cis = getOBCClass("inventory.CraftItemStack");
 | 
			
		||||
            asNMSCopyMethod = cis.getMethod("asNMSCopy", ItemStack.class);
 | 
			
		||||
            final Class<?> nmsItemStack = getNMSClass("ItemStack");
 | 
			
		||||
            nmsNBTTagCompound = getNMSClass("NBTTagCompound");
 | 
			
		||||
            nmsSaveNBTMethod = nmsItemStack.getMethod("save", nmsNBTTagCompound);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Class<?> getNMSClass(final String cname) throws ClassNotFoundException {
 | 
			
		||||
            return Class.forName("net.minecraft.server" + ver + "." + cname);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Class<?> getOBCClass(final String cname) throws ClassNotFoundException {
 | 
			
		||||
            return Class.forName("org.bukkit.craftbukkit." + ver + "." + cname);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String parse(final ItemStack item) {
 | 
			
		||||
            try {
 | 
			
		||||
                return nmsSaveNBTMethod.invoke(asNMSCopyMethod.invoke(null, item), nmsNBTTagCompound.newInstance()).toString();
 | 
			
		||||
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
 | 
			
		||||
                itemSerialize = new Manual();
 | 
			
		||||
                return itemSerialize.parse(item);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static class JsonBuilder {
 | 
			
		||||
        public static final String[] REPLACEMENT_CHARS;
 | 
			
		||||
        static {
 | 
			
		||||
            REPLACEMENT_CHARS = new String[128];
 | 
			
		||||
            for (int i = 0; i <= 0x1f; i++) {
 | 
			
		||||
                REPLACEMENT_CHARS[i] = String.format("\\u%04x", i);
 | 
			
		||||
            }
 | 
			
		||||
            REPLACEMENT_CHARS['"'] = "\\\"";
 | 
			
		||||
            REPLACEMENT_CHARS['\\'] = "\\\\";
 | 
			
		||||
            REPLACEMENT_CHARS['\t'] = "\\t";
 | 
			
		||||
            REPLACEMENT_CHARS['\b'] = "\\b";
 | 
			
		||||
            REPLACEMENT_CHARS['\n'] = "\\n";
 | 
			
		||||
            REPLACEMENT_CHARS['\r'] = "\\r";
 | 
			
		||||
            REPLACEMENT_CHARS['\f'] = "\\f";
 | 
			
		||||
        }
 | 
			
		||||
        StringBuffer json;
 | 
			
		||||
 | 
			
		||||
        public JsonBuilder() {
 | 
			
		||||
            json = new StringBuffer();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void append(final String value) {
 | 
			
		||||
            int last = 0;
 | 
			
		||||
            final int length = value.length();
 | 
			
		||||
            for (int i = 0; i < length; i++) {
 | 
			
		||||
                final char c = value.charAt(i);
 | 
			
		||||
                String replacement;
 | 
			
		||||
                if (c < 128) {
 | 
			
		||||
                    replacement = REPLACEMENT_CHARS[c];
 | 
			
		||||
                    if (replacement == null) {
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                } else if (c == '\u2028') {
 | 
			
		||||
                    replacement = "\\u2028";
 | 
			
		||||
                } else if (c == '\u2029') {
 | 
			
		||||
                    replacement = "\\u2029";
 | 
			
		||||
                } else {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                if (last < i) {
 | 
			
		||||
                    json.append(value, last, i - last);
 | 
			
		||||
                }
 | 
			
		||||
                json.append(replacement);
 | 
			
		||||
                last = i + 1;
 | 
			
		||||
            }
 | 
			
		||||
            if (last < length) {
 | 
			
		||||
                json.append(value, last, length - last);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void deleteCharAt(final int length) {
 | 
			
		||||
            json.deleteCharAt(length);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int length() {
 | 
			
		||||
            return json.length();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static class Manual extends ItemSerialize {
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String parse(final ItemStack item) {
 | 
			
		||||
            return serialize(item);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 显示序列化
 | 
			
		||||
         *
 | 
			
		||||
         * @param im
 | 
			
		||||
         *            物品属性
 | 
			
		||||
         * @return 获取显示序列化
 | 
			
		||||
         */
 | 
			
		||||
        private String getDisplay(final ItemMeta im) {
 | 
			
		||||
            final JsonBuilder display = new JsonBuilder();
 | 
			
		||||
            display.append("{");
 | 
			
		||||
            if (im.hasDisplayName()) {
 | 
			
		||||
                display.append(String.format("Name:\"%s\",", im.getDisplayName()));
 | 
			
		||||
            }
 | 
			
		||||
            if (im.hasLore()) {
 | 
			
		||||
                display.append("Lore:[");
 | 
			
		||||
                for (final String line : im.getLore()) {
 | 
			
		||||
                    display.append(String.format("\"%s\",", line));
 | 
			
		||||
                }
 | 
			
		||||
                display.deleteCharAt(display.length());
 | 
			
		||||
                display.append("],");
 | 
			
		||||
            }
 | 
			
		||||
            display.deleteCharAt(display.length());
 | 
			
		||||
            display.append("}");
 | 
			
		||||
            return display.toString();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 附魔序列化
 | 
			
		||||
         *
 | 
			
		||||
         * @param set
 | 
			
		||||
         *            附魔集合
 | 
			
		||||
         * @return 获得附魔序列化
 | 
			
		||||
         */
 | 
			
		||||
        private String getEnch(final Set<Entry<Enchantment, Integer>> set) {
 | 
			
		||||
            final StringBuffer enchs = new StringBuffer();
 | 
			
		||||
            for (final Map.Entry<Enchantment, Integer> ench : set) {
 | 
			
		||||
                enchs.append(String.format("{id:%s,lvl:%s},", ench.getKey().getId(), ench.getValue()));
 | 
			
		||||
            }
 | 
			
		||||
            enchs.deleteCharAt(enchs.length());
 | 
			
		||||
            return enchs.toString();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 属性序列化
 | 
			
		||||
         *
 | 
			
		||||
         * @param im
 | 
			
		||||
         *            物品属性
 | 
			
		||||
         * @return 获得属性序列化
 | 
			
		||||
         */
 | 
			
		||||
        private String getTag(final ItemMeta im) {
 | 
			
		||||
            final StringBuffer meta = new StringBuffer();
 | 
			
		||||
            if (im.hasEnchants()) {
 | 
			
		||||
                meta.append(String.format("ench:[%s],", getEnch(im.getEnchants().entrySet())));
 | 
			
		||||
            }
 | 
			
		||||
            im.getItemFlags();
 | 
			
		||||
            if (im.hasDisplayName() || im.hasLore()) {
 | 
			
		||||
                meta.append(String.format("display:%s,", getDisplay(im)));
 | 
			
		||||
            }
 | 
			
		||||
            meta.deleteCharAt(meta.length());
 | 
			
		||||
            return meta.toString();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 序列化物品
 | 
			
		||||
         *
 | 
			
		||||
         * @param item
 | 
			
		||||
         *            {@link ItemStack}
 | 
			
		||||
         * @return 物品字符串
 | 
			
		||||
         */
 | 
			
		||||
        private String serialize(final ItemStack item) {
 | 
			
		||||
            final StringBuffer json = new StringBuffer("{");
 | 
			
		||||
            json.append(String.format("id:\"%s\",Damage:\"%s\"", item.getTypeId(), item.getDurability()));
 | 
			
		||||
            if (item.getAmount() > 1) {
 | 
			
		||||
                json.append(String.format(",Count:\"%s\"", item.getAmount()));
 | 
			
		||||
            }
 | 
			
		||||
            if (item.hasItemMeta()) {
 | 
			
		||||
                json.append(String.format(",tag:%s", getTag(item.getItemMeta())));
 | 
			
		||||
            }
 | 
			
		||||
            json.append("}");
 | 
			
		||||
            return json.toString();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,13 +1,12 @@
 | 
			
		||||
package pw.yumc.YumCore.tellraw;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
@@ -22,14 +21,6 @@ import pw.yumc.YumCore.bukkit.compatible.C;
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class Tellraw {
 | 
			
		||||
    static ItemSerialize is;
 | 
			
		||||
    static {
 | 
			
		||||
        try {
 | 
			
		||||
            is = new Automatic();
 | 
			
		||||
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) {
 | 
			
		||||
            is = new Manual();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    List<MessagePart> messageParts = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    public Tellraw(final String text) {
 | 
			
		||||
@@ -57,7 +48,8 @@ public class Tellraw {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void main(final String[] args) {
 | 
			
		||||
        System.out.println(Tellraw.create("命令").command("yum list").tip("点击查看插件列表").toJsonString());
 | 
			
		||||
        final ItemStack item = new ItemStack(Material.DIAMOND_SWORD);
 | 
			
		||||
        System.out.println(Tellraw.create("命令").command("yum list").item(item).toJsonString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -117,7 +109,7 @@ public class Tellraw {
 | 
			
		||||
     * @return {@link Tellraw}
 | 
			
		||||
     */
 | 
			
		||||
    public Tellraw item(final ItemStack item) {
 | 
			
		||||
        return item(is.$(item));
 | 
			
		||||
        return item(ItemSerialize.$(item));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -351,48 +343,4 @@ public class Tellraw {
 | 
			
		||||
        }
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static class Automatic implements ItemSerialize {
 | 
			
		||||
        Method asNMSCopyMethod;
 | 
			
		||||
        Method nmsSaveNBTMethod;
 | 
			
		||||
        Class<?> nmsNBTTagCompound;
 | 
			
		||||
        String ver = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
 | 
			
		||||
 | 
			
		||||
        public Automatic() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
 | 
			
		||||
            final Class<?> cis = getOBCClass("inventory.CraftItemStack");
 | 
			
		||||
            asNMSCopyMethod = cis.getMethod("asNMSCopy", ItemStack.class);
 | 
			
		||||
            final Class<?> nmsItemStack = getNMSClass("ItemStack");
 | 
			
		||||
            nmsNBTTagCompound = getNMSClass("NBTTagCompound");
 | 
			
		||||
            nmsSaveNBTMethod = nmsItemStack.getMethod("save", nmsNBTTagCompound);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String $(final ItemStack item) {
 | 
			
		||||
            try {
 | 
			
		||||
                return nmsSaveNBTMethod.invoke(asNMSCopyMethod.invoke(null, item), nmsNBTTagCompound.newInstance()).toString();
 | 
			
		||||
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
 | 
			
		||||
                is = new Manual();
 | 
			
		||||
                return is.$(item);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Class<?> getNMSClass(final String cname) throws ClassNotFoundException {
 | 
			
		||||
            return Class.forName("net.minecraft.server" + ver + "." + cname);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Class<?> getOBCClass(final String cname) throws ClassNotFoundException {
 | 
			
		||||
            return Class.forName("org.bukkit.craftbukkit." + ver + "." + cname);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static interface ItemSerialize {
 | 
			
		||||
        public String $(ItemStack item);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static class Manual implements ItemSerialize {
 | 
			
		||||
        @Override
 | 
			
		||||
        public String $(final ItemStack item) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user