From 60131c4f913faec299a0db77c9a9c8dbf485f994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9D=8F=E9=BB=91?= Date: Wed, 18 Sep 2019 22:15:55 +0800 Subject: [PATCH] + update SimpleVersionControl --- .../io/izzel/taboolib/TabooLibLoader.java | 6 +- src/main/scala/io/izzel/taboolib/Version.java | 4 +- .../io/izzel/taboolib/cronus/CronusUtils.java | 2 +- .../module/command/base/BaseMainCommand.java | 16 ++-- .../module/lite/SimpleVersionControl.java | 82 +++++++++++++++++-- .../taboolib/module/locale/TLocaleLoader.java | 4 +- .../scala/io/izzel/taboolib/util/Files.java | 44 ++++++++++ src/main/scala/io/izzel/taboolib/util/KV.java | 63 ++++++++++++++ .../io/izzel/taboolib/util/item/Items.java | 2 +- .../izzel/taboolib/util/lite/Particles.java | 2 +- 10 files changed, 200 insertions(+), 25 deletions(-) create mode 100644 src/main/scala/io/izzel/taboolib/util/KV.java diff --git a/src/main/scala/io/izzel/taboolib/TabooLibLoader.java b/src/main/scala/io/izzel/taboolib/TabooLibLoader.java index b14337e..cc620f9 100644 --- a/src/main/scala/io/izzel/taboolib/TabooLibLoader.java +++ b/src/main/scala/io/izzel/taboolib/TabooLibLoader.java @@ -181,13 +181,13 @@ public class TabooLibLoader { public interface Loader { - default void preLoad(org.bukkit.plugin.Plugin plugin, Class pluginClass) { + default void preLoad(Plugin plugin, Class pluginClass) { } - default void postLoad(org.bukkit.plugin.Plugin plugin, Class pluginClass) { + default void postLoad(Plugin plugin, Class pluginClass) { } - default void activeLoad(org.bukkit.plugin.Plugin plugin, Class pluginClass) { + default void activeLoad(Plugin plugin, Class pluginClass) { } default void unload(Plugin plugin, Class pluginClass) { diff --git a/src/main/scala/io/izzel/taboolib/Version.java b/src/main/scala/io/izzel/taboolib/Version.java index 38d0fee..2e7ff9c 100644 --- a/src/main/scala/io/izzel/taboolib/Version.java +++ b/src/main/scala/io/izzel/taboolib/Version.java @@ -8,7 +8,7 @@ import org.bukkit.Bukkit; */ public enum Version { - v1_7(10700), v1_8(10800), v1_9(10900), v1_10(11000), v1_11(11100), v1_12(11200), v1_13(11300), v1_14(11400), vNull(0); + v1_7(10700), v1_8(10800), v1_9(10900), v1_10(11000), v1_11(11100), v1_12(11200), v1_13(11300), v1_14(11400), v1_15(11500), vNull(0); private int versionInt; @@ -50,6 +50,8 @@ public enum Version { return v1_13; } else if (nmsVersion.startsWith("v1_14")) { return v1_14; + } else if (nmsVersion.startsWith("v1_15")) { + return v1_15; } else { return vNull; } diff --git a/src/main/scala/io/izzel/taboolib/cronus/CronusUtils.java b/src/main/scala/io/izzel/taboolib/cronus/CronusUtils.java index e5d8710..8618588 100644 --- a/src/main/scala/io/izzel/taboolib/cronus/CronusUtils.java +++ b/src/main/scala/io/izzel/taboolib/cronus/CronusUtils.java @@ -26,7 +26,7 @@ public class CronusUtils { return Optional.ofNullable(itemStack).orElse(new ItemStack(Material.STONE)); } - public static org.bukkit.inventory.ItemStack getUsingItem(Player player, Material material) { + public static ItemStack getUsingItem(Player player, Material material) { return player.getItemInHand().getType() == material ? player.getItemInHand() : player.getInventory().getItemInOffHand(); } diff --git a/src/main/scala/io/izzel/taboolib/module/command/base/BaseMainCommand.java b/src/main/scala/io/izzel/taboolib/module/command/base/BaseMainCommand.java index 290e5d0..5cc388c 100644 --- a/src/main/scala/io/izzel/taboolib/module/command/base/BaseMainCommand.java +++ b/src/main/scala/io/izzel/taboolib/module/command/base/BaseMainCommand.java @@ -60,13 +60,13 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor { } }); } - baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getAnnotation(SubCommand.class) != null && field.getType().equals(io.izzel.taboolib.module.command.base.BaseSubCommand.class)).forEach(field -> fields.add(new CommandField(field, clazz)))); + baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getAnnotation(SubCommand.class) != null && field.getType().equals(BaseSubCommand.class)).forEach(field -> fields.add(new CommandField(field, clazz)))); if (fields.size() > 0) { fields.sort(Comparator.comparingDouble(commandField -> commandField.getField().getAnnotation(SubCommand.class).priority())); fields.forEach(commandField -> { try { commandField.getField().setAccessible(true); - io.izzel.taboolib.module.command.base.BaseSubCommand subCommand = (io.izzel.taboolib.module.command.base.BaseSubCommand) commandField.getField().get(commandField.getParent().newInstance()); + BaseSubCommand subCommand = (BaseSubCommand) commandField.getField().get(commandField.getParent().newInstance()); subCommand.setLabel(commandField.getField().getName()); baseMainCommand.registerSubCommand(subCommand); } catch (Exception ignored) { @@ -90,11 +90,11 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor { return linkClasses; } - public List getSubCommands() { + public List getSubCommands() { return subCommands; } - public void registerSubCommand(io.izzel.taboolib.module.command.base.BaseSubCommand subCommand) { + public void registerSubCommand(BaseSubCommand subCommand) { if (subCommand != null) { Preconditions.checkArgument(subCommand.getLabel() != null, "Command label can not be null"); Preconditions.checkArgument(subCommand.getArguments() != null, "Command arguments can not be null"); @@ -122,7 +122,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor { }); return label.stream().filter(l -> args[0].isEmpty() || l.toLowerCase().startsWith(args[0].toLowerCase())).collect(Collectors.toList()); } - for (io.izzel.taboolib.module.command.base.BaseSubCommand subCommand : subCommands) { + for (BaseSubCommand subCommand : subCommands) { Argument[] arguments = subCommand.getArguments(); if (args[0].equalsIgnoreCase(subCommand.getLabel()) && args.length - 1 <= arguments.length) { CommandTab commandTab = arguments[args.length - 2].getTab(); @@ -139,7 +139,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor { if (args.length == 0) { onCommandHelp(sender, command, label, args); } else { - for (io.izzel.taboolib.module.command.base.BaseSubCommand subCommand : subCommands) { + for (BaseSubCommand subCommand : subCommands) { if (subCommand == null || !(args[0].equalsIgnoreCase(subCommand.getLabel()) || java.util.Arrays.stream(subCommand.getAliases()).anyMatch(args[0]::equalsIgnoreCase)) || !hasPermission(sender, subCommand)) { continue; } @@ -159,7 +159,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor { @Override public void run() { - List commandCompute = subCommands.stream().filter(x -> x != null && hasPermission(sender, x)).sorted((b, a) -> Double.compare(Strings.similarDegree(args[0], a.getLabel()), Strings.similarDegree(args[0], b.getLabel()))).collect(Collectors.toList()); + List commandCompute = subCommands.stream().filter(x -> x != null && hasPermission(sender, x)).sorted((b, a) -> Double.compare(Strings.similarDegree(args[0], a.getLabel()), Strings.similarDegree(args[0], b.getLabel()))).collect(Collectors.toList()); if (commandCompute.size() > 0) { TLocale.sendTo(sender, "COMMANDS.INTERNAL.ERROR-COMMAND", args[0], commandCompute.get(0).getCommandString(label).trim()); } @@ -223,7 +223,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor { } } - private boolean hideInHelp(io.izzel.taboolib.module.command.base.BaseSubCommand baseSubCommand) { + private boolean hideInHelp(BaseSubCommand baseSubCommand) { return baseSubCommand != null && baseSubCommand.hideInHelp(); } diff --git a/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java b/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java index 259a95b..7cc2848 100644 --- a/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java +++ b/src/main/scala/io/izzel/taboolib/module/lite/SimpleVersionControl.java @@ -7,6 +7,7 @@ import io.izzel.taboolib.common.plugin.InternalPlugin; import io.izzel.taboolib.common.plugin.bridge.BridgeLoader; import io.izzel.taboolib.util.Files; import io.izzel.taboolib.util.IO; +import io.izzel.taboolib.util.KV; import io.izzel.taboolib.util.Ref; import io.izzel.taboolib.util.asm.AsmClassLoader; import org.bukkit.plugin.Plugin; @@ -21,6 +22,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * @Author sky @@ -35,6 +38,9 @@ public class SimpleVersionControl { private Plugin plugin; private boolean useCache; private boolean useNMS; + private boolean mapping; + private List> mappingList = Lists.newArrayList(); + private ExecutorService executorService = Executors.newSingleThreadExecutor(); SimpleVersionControl() { useCache = false; @@ -112,6 +118,14 @@ public class SimpleVersionControl { return this; } + /** + * 将转换结果打印至 plugins/TabooLib/asm-mapping + */ + public SimpleVersionControl mapping() { + this.mapping = true; + return this; + } + public Class translate() throws IOException { return translate(plugin); } @@ -133,6 +147,10 @@ public class SimpleVersionControl { classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES); classWriter.visitEnd(); classVisitor.visitEnd(); + // 打印 + if (mapping || plugin instanceof InternalPlugin) { + executorService.submit(this::printMapping); + } // 因第三方插件调用该方法时会出现找不到类,所以第三方插件使用 BridgeLoader 加载类 return plugin instanceof InternalPlugin ? AsmClassLoader.createNewClass(target, classWriter.toByteArray()) : BridgeLoader.createNewClass(target, classWriter.toByteArray()); } @@ -148,9 +166,47 @@ public class SimpleVersionControl { classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES); classWriter.visitEnd(); classVisitor.visitEnd(); + if (mapping || plugin instanceof InternalPlugin) { + executorService.submit(this::printMapping); + } return BridgeLoader.createNewClass(target, classWriter.toByteArray()); } + public String replace(String origin) { + String replace = origin; + if (useNMS) { + replace = replace + .replaceAll("net/minecraft/server/.*?/", "net/minecraft/server/" + to + "/") + .replaceAll("org/bukkit/craftbukkit/.*?/", "org/bukkit/craftbukkit/" + to + "/"); + } + for (String from : from) { + replace = replace.replace("/" + from + "/", "/" + to + "/"); + } + if ((mapping || plugin instanceof InternalPlugin) && !replace.equals(origin)) { + mappingList.add(new KV<>(origin, replace)); + } + return replace; + } + + public void printMapping() { + if (mappingList.isEmpty()) { + return; + } + List> list = Lists.newArrayList(mappingList); + list.sort((b, a) -> Integer.compare(a.getKey().length(), b.getKey().length())); + int length = list.get(0).getKey().length(); + Files.write(Files.file(TabooLib.getPlugin().getDataFolder(), "asm-mapping/" + target.replace("/", ".") + ".txt"), b -> { + for (KV kv : mappingList) { + StringBuilder builder = new StringBuilder(kv.getKey()); + for (int i = kv.getKey().length(); i < length; i++) { + builder.append(" "); + } + b.write(builder.toString() + " -> " + kv.getValue()); + b.newLine(); + } + }); + } + // ********************************* // // Getter and Setter @@ -169,13 +225,23 @@ public class SimpleVersionControl { return to; } - public String replace(String origin) { - if (useNMS) { - origin = origin.replaceAll("net/minecraft/server/.*?/", "net/minecraft/server/" + to + "/").replaceAll("org/bukkit/craftbukkit/.*?/", "org/bukkit/craftbukkit/" + to + "/"); - } - for (String from : from) { - origin = origin.replace("/" + from + "/", "/" + to + "/"); - } - return origin; + public Plugin getPlugin() { + return plugin; + } + + public boolean isUseCache() { + return useCache; + } + + public boolean isUseNMS() { + return useNMS; + } + + public boolean isMapping() { + return mapping; + } + + public List> getMappingList() { + return mappingList; } } \ No newline at end of file diff --git a/src/main/scala/io/izzel/taboolib/module/locale/TLocaleLoader.java b/src/main/scala/io/izzel/taboolib/module/locale/TLocaleLoader.java index 4b94d12..7bb1d77 100644 --- a/src/main/scala/io/izzel/taboolib/module/locale/TLocaleLoader.java +++ b/src/main/scala/io/izzel/taboolib/module/locale/TLocaleLoader.java @@ -116,11 +116,11 @@ public class TLocaleLoader { } private static void infoLogger(String path, String... args) { - TLogger.getGlobalLogger().info(Strings.replaceWithOrder(io.izzel.taboolib.TabooLib.getInst().getInternal().getString(path), args)); + TLogger.getGlobalLogger().info(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString(path), args)); } private static void errorLogger(String path, String... args) { - TLogger.getGlobalLogger().error(Strings.replaceWithOrder(io.izzel.taboolib.TabooLib.getInst().getInternal().getString(path), args)); + TLogger.getGlobalLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString(path), args)); } private static File getLocaleFile(Plugin plugin) { diff --git a/src/main/scala/io/izzel/taboolib/util/Files.java b/src/main/scala/io/izzel/taboolib/util/Files.java index 17e0359..663d496 100644 --- a/src/main/scala/io/izzel/taboolib/util/Files.java +++ b/src/main/scala/io/izzel/taboolib/util/Files.java @@ -287,6 +287,40 @@ public class Files { return null; } + public static void read(File file, ReadHandle readHandle) { + try (FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader)) { + readHandle.read(bufferedReader); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + public static void read(InputStream in, ReadHandle readHandle) { + try (InputStreamReader inputStreamReader = new InputStreamReader(in); BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { + readHandle.read(bufferedReader); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + public static void write(File file, WriteHandle writeHandle) { + try (FileWriter fileWriter = new FileWriter(file); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) { + writeHandle.write(bufferedWriter); + bufferedWriter.flush(); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + public static void write(OutputStream out, WriteHandle writeHandle) { + try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out); BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter)) { + writeHandle.write(bufferedWriter); + bufferedWriter.flush(); + } catch (Throwable t) { + t.printStackTrace(); + } + } + public static String encodeYAML(FileConfiguration file) { return Base64Coder.encodeLines(file.saveToString().getBytes()).replaceAll("\\s+", ""); } @@ -315,4 +349,14 @@ public class Files { } return null; } + + public interface ReadHandle { + + void read(BufferedReader reader) throws IOException; + } + + public interface WriteHandle { + + void write(BufferedWriter writer) throws IOException; + } } diff --git a/src/main/scala/io/izzel/taboolib/util/KV.java b/src/main/scala/io/izzel/taboolib/util/KV.java new file mode 100644 index 0000000..448440f --- /dev/null +++ b/src/main/scala/io/izzel/taboolib/util/KV.java @@ -0,0 +1,63 @@ +package io.izzel.taboolib.util; + +import java.util.Objects; + +/** + * @Author sky + * @Since 2019-09-18 21:23 + */ +public class KV { + + private K key; + private V value; + + public KV() { + } + + public KV(K key, V value) { + this.key = key; + this.value = value; + } + + public K getKey() { + return key; + } + + public void setKey(K key) { + this.key = key; + } + + public V getValue() { + return value; + } + + public void setValue(V value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof KV)) { + return false; + } + KV kv = (KV) o; + return Objects.equals(key, kv.key) && + Objects.equals(value, kv.value); + } + + @Override + public int hashCode() { + return Objects.hash(key, value); + } + + @Override + public String toString() { + return "KV{" + + "key=" + key + + ", value=" + value + + '}'; + } +} diff --git a/src/main/scala/io/izzel/taboolib/util/item/Items.java b/src/main/scala/io/izzel/taboolib/util/item/Items.java index 3989451..491016d 100644 --- a/src/main/scala/io/izzel/taboolib/util/item/Items.java +++ b/src/main/scala/io/izzel/taboolib/util/item/Items.java @@ -173,7 +173,7 @@ public class Items { public static boolean hasItem(Inventory inventory, Matcher matcher, int amount) { int checkAmount = amount; - for (org.bukkit.inventory.ItemStack itemStack : inventory.getContents()) { + for (ItemStack itemStack : inventory.getContents()) { if (!isNull(itemStack) && matcher.match(itemStack)) { checkAmount -= itemStack.getAmount(); if (checkAmount <= 0) { diff --git a/src/main/scala/io/izzel/taboolib/util/lite/Particles.java b/src/main/scala/io/izzel/taboolib/util/lite/Particles.java index 66c3fb5..3baebad 100644 --- a/src/main/scala/io/izzel/taboolib/util/lite/Particles.java +++ b/src/main/scala/io/izzel/taboolib/util/lite/Particles.java @@ -649,7 +649,7 @@ public enum Particles { effect.display(color, offX, offY, offZ, amount, lc, p); break; case 2: - Particles.NOTE.display(new Particles.NoteColor(random.nextInt(24)), offX, offY, offZ, amount, lc, /*p.getPlayer(),*/ p); + Particles.NOTE.display(new NoteColor(random.nextInt(24)), offX, offY, offZ, amount, lc, /*p.getPlayer(),*/ p); break; case 0: effect.display(offX, offY, offZ, 0.001, amount, lc, p);