diff --git a/build.gradle b/build.gradle index f2bdbf0..3b8fe57 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { } group = 'me.skymc' -version = '5.14' +version = '5.15' sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/src/main/scala/io/izzel/taboolib/common/listener/ListenerPlayerCommand.java b/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java similarity index 72% rename from src/main/scala/io/izzel/taboolib/common/listener/ListenerPlayerCommand.java rename to src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java index e52ba06..b58160e 100644 --- a/src/main/scala/io/izzel/taboolib/common/listener/ListenerPlayerCommand.java +++ b/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java @@ -2,34 +2,35 @@ package io.izzel.taboolib.common.listener; import io.izzel.taboolib.TabooLibAPI; import io.izzel.taboolib.Version; -import io.izzel.taboolib.common.plugin.InternalPluginBridge; import io.izzel.taboolib.module.db.local.Local; import io.izzel.taboolib.module.db.local.LocalPlayer; import io.izzel.taboolib.module.inject.TListener; import io.izzel.taboolib.module.locale.TLocale; import io.izzel.taboolib.module.locale.logger.TLogger; import io.izzel.taboolib.module.tellraw.TellrawJson; -import io.izzel.taboolib.util.ArrayUtil; +import io.izzel.taboolib.util.Files; import io.izzel.taboolib.util.item.Items; import io.izzel.taboolib.util.lite.Signs; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.server.ServerCommandEvent; +import java.io.File; import java.util.Arrays; /** * @author sky */ @TListener -public class ListenerPlayerCommand implements Listener { +public class ListenerCommand implements Listener { @EventHandler public void cmd(PlayerCommandPreprocessEvent e) { if (e.getMessage().equalsIgnoreCase("/tabooLib")) { e.setCancelled(true); - TLocale.Display.sendTitle(e.getPlayer(), "§fTabooLib", "§7TabooLib is enabled."); + TLocale.Display.sendTitle(e.getPlayer(), "§fTabooLib", "§7TabooLib Enabled."); } if (e.getMessage().equalsIgnoreCase("/tellrawTest") && e.getPlayer().hasPermission("*")) { e.setCancelled(true); @@ -39,13 +40,9 @@ public class ListenerPlayerCommand implements Listener { .append("§f]") .send(e.getPlayer()); } - if (e.getMessage().equalsIgnoreCase("/placeholderTest") && e.getPlayer().hasPermission("*")) { + if (e.getMessage().equalsIgnoreCase("/fakesignTest") && e.getPlayer().hasPermission("*")) { e.setCancelled(true); - e.getPlayer().sendMessage(InternalPluginBridge.handle().setPlaceholders(e.getPlayer(), "§8[§3§lTabooLib§8] §7PlaceholderAPI Test: §f%player_name%")); - } - if (e.getMessage().equalsIgnoreCase("/fakesignTest") && e.getPlayer().hasPermission("&")) { - e.setCancelled(true); - Signs.fakeSign(e.getPlayer(), ArrayUtil.asArray("§nFakeSign Test"), lines -> { + Signs.fakeSign(e.getPlayer(), lines -> { e.getPlayer().sendMessage("§8[§3§lTabooLib§8] §7FakeSign Lines: §f" + Arrays.toString(lines)); }); } @@ -71,6 +68,19 @@ public class ListenerPlayerCommand implements Listener { TabooLibAPI.debug(true); TLogger.getGlobalLogger().info("&aEnabled."); } + } else if (e.getCommand().equalsIgnoreCase("libUpdateConfirm")) { + if (Version.isAfter(Version.v1_8)) { + e.setCancelled(true); + } + Bukkit.getConsoleSender().sendMessage("§f[TabooLib] §7正在下载资源文件..."); + Files.downloadFile("https://skymc.oss-cn-shanghai.aliyuncs.com/plugins/TabooLib.jar", new File("libs/TabooLib.jar")); + Bukkit.getConsoleSender().sendMessage("§f[TabooLib] §7资源文件下载完成! 服务器即将重启..."); + try { + Thread.sleep(3000L); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + Bukkit.shutdown(); } } } diff --git a/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java b/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java index 992803c..21149bd 100644 --- a/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java +++ b/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java @@ -195,8 +195,7 @@ public class NMSImpl extends NMS { return "entity.Villager." + name; } return "entity." + entity.getType().getEntityClass().getSimpleName() + ".name"; - } catch (Throwable t) { - t.printStackTrace(); + } catch (Throwable ignore) { } return "entity.null"; } diff --git a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTBase.java b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTBase.java index 90dfb0d..5fa5c53 100644 --- a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTBase.java +++ b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTBase.java @@ -80,7 +80,7 @@ public class NBTBase { } public String toJsonSimplified(int index) { - return data instanceof String ? "\"" + data + "\"" : String.valueOf(data); + return data instanceof String ? "\"" + data + "\"" : toString(); } public String asString() { @@ -152,6 +152,10 @@ public class NBTBase { return new NBTBase((long) obj); } else if (obj instanceof Byte) { return new NBTBase((byte) obj); + } else if (obj instanceof byte[]) { + return new NBTBase((byte[]) obj); + } else if (obj instanceof int[]) { + return new NBTBase((int[]) obj); } else if (obj instanceof List) { return translateList(new NBTList(), (List) obj); } else if (obj instanceof Map) { diff --git a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java index d803188..3ff8b0a 100644 --- a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java +++ b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java @@ -1,8 +1,7 @@ package io.izzel.taboolib.module.nms.nbt; import com.google.common.collect.Maps; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import com.google.gson.*; import io.izzel.taboolib.module.nms.NMS; import io.izzel.taboolib.util.Strings; import org.bukkit.inventory.ItemStack; @@ -64,7 +63,67 @@ public class NBTCompound extends NBTBase implements Map { } public static NBTCompound fromJson(String json) { - return new Gson().fromJson(json, NBTCompound.class); + return (NBTCompound) fromJson(new JsonParser().parse(json)); + } + + static NBTBase fromJson(JsonElement element) { + if (element instanceof JsonObject) { + JsonObject json = (JsonObject) element; + // base + if (json.has("type") && json.has("data") && json.size() == 2) { + switch (NBTType.parse(json.get("type").getAsString())) { + case BYTE: + return new NBTBase(json.get("data").getAsByte()); + case SHORT: + return new NBTBase(json.get("data").getAsShort()); + case INT: + return new NBTBase(json.get("data").getAsInt()); + case LONG: + return new NBTBase(json.get("data").getAsLong()); + case FLOAT: + return new NBTBase(json.get("data").getAsFloat()); + case DOUBLE: + return new NBTBase(json.get("data").getAsDouble()); + case STRING: + return new NBTBase(json.get("data").getAsString()); + case BYTE_ARRAY: { + JsonArray array = json.get("data").getAsJsonArray(); + byte[] bytes = new byte[array.size()]; + for (int i = 0; i < array.size(); i++) { + bytes[i] = array.get(i).getAsByte(); + } + return new NBTBase(bytes); + } + case INT_ARRAY: { + JsonArray array = json.get("data").getAsJsonArray(); + int[] ints = new int[array.size()]; + for (int i = 0; i < array.size(); i++) { + ints[i] = array.get(i).getAsInt(); + } + return new NBTBase(ints); + } + default: + return new NBTBase("error: " + element); + } + } + // compound + else { + NBTCompound compound = new NBTCompound(); + for (Entry elementEntry : json.entrySet()) { + compound.put(elementEntry.getKey(), fromJson(elementEntry.getValue())); + } + return compound; + } + } + // list + else if (element instanceof JsonArray) { + NBTList list = new NBTList(); + for (JsonElement jsonElement : (JsonArray) element) { + list.add(fromJson(jsonElement)); + } + return list; + } + return new NBTBase("error: " + element); } @Override diff --git a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTType.java b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTType.java index 21f06d1..53b4a92 100644 --- a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTType.java +++ b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTType.java @@ -1,5 +1,7 @@ package io.izzel.taboolib.module.nms.nbt; +import com.google.common.base.Enums; + /** * @Author 坏黑 * @Since 2019-05-24 17:46 @@ -39,4 +41,8 @@ public enum NBTType { public int getId() { return this.id; } + + public static NBTType parse(String in) { + return Enums.getIfPresent(NBTType.class, in).or(END); + } } diff --git a/src/main/scala/io/izzel/taboolib/util/Files.java b/src/main/scala/io/izzel/taboolib/util/Files.java index d28d66a..a6d5f93 100644 --- a/src/main/scala/io/izzel/taboolib/util/Files.java +++ b/src/main/scala/io/izzel/taboolib/util/Files.java @@ -10,11 +10,13 @@ import org.bukkit.plugin.Plugin; import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; import java.io.*; +import java.math.BigInteger; import java.net.URISyntaxException; import java.net.URL; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.jar.JarFile; @@ -347,6 +349,22 @@ public class Files { return new YamlConfiguration(); } + public static String getFileHash(File file, String algorithm) { + try(FileInputStream fileInputStream = new FileInputStream(file)) { + MessageDigest digest = MessageDigest.getInstance(algorithm); + byte[] buffer = new byte[1024]; + int length; + while ((length = fileInputStream.read(buffer, 0, 1024)) != -1) { + digest.update(buffer, 0, length); + } + byte[] md5Bytes = digest.digest(); + return new BigInteger(1, md5Bytes).toString(16); + } catch (Throwable t) { + t.printStackTrace(); + } + return null; + } + private static Class getCaller(Class obj) { try { return Class.forName(Thread.currentThread().getStackTrace()[3].getClassName(), false, obj.getClassLoader());