diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/BukkitJsonMessageHandler.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/BukkitJsonMessageHandler.java index 00347a28a..4437ab37b 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/BukkitJsonMessageHandler.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/BukkitJsonMessageHandler.java @@ -22,7 +22,6 @@ package me.lucko.luckperms.bukkit.compat; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.lang.reflect.Constructor; @@ -58,7 +57,7 @@ public class BukkitJsonMessageHandler { } } - Class packetChatClass = Class.forName(getVersionedClassName("PacketPlayOutChat")); + Class packetChatClass = ReflectionUtil.nmsClass("PacketPlayOutChat"); Constructor[] packetConstructors = packetChatClass.getDeclaredConstructors(); for (Constructor c : packetConstructors) { Class[] parameters = c.getParameterTypes(); @@ -68,30 +67,19 @@ public class BukkitJsonMessageHandler { } } - Class baseComponentClass = Class.forName(getVersionedClassName("IChatBaseComponent")); - Class chatSerializerClass = baseComponentClass.getClasses()[0]; + Class baseComponentClass = ReflectionUtil.nmsClass("IChatBaseComponent"); + Class chatSerializerClass; + + if (baseComponentClass.getClasses().length > 0) { + chatSerializerClass = baseComponentClass.getClasses()[0]; + } else { + // 1.7 class is here instead. + chatSerializerClass = ReflectionUtil.nmsClass("ChatSerializer"); + } SERIALIZE_METHOD = chatSerializerClass.getDeclaredMethod("a", String.class); } - private static String getVersionedClassName(String className) { - Class server = Bukkit.getServer().getClass(); - if (!server.getSimpleName().equals("CraftServer")) { - throw new RuntimeException("Couldn't reflect into server " + server); - } - - String version; - if (server.getName().equals("org.bukkit.craftbukkit.CraftServer")) { - // Non versioned class - version = "."; - } else { - version = server.getName().substring("org.bukkit.craftbukkit".length()); - version = version.substring(0, version.length() - "CraftServer".length()); - } - - return "net.minecraft.server" + version + className; - } - private static synchronized boolean trySetup(Object player) { if (setup) return true; if (triedAndFailed) return false; diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/MessageHandler.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/MessageHandler.java index aa937f60f..2749d4458 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/MessageHandler.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/MessageHandler.java @@ -37,7 +37,7 @@ public class MessageHandler { } public void sendJsonMessage(CommandSender sender, FancyMessage message) { - if (sender instanceof Player) { + if (ReflectionUtil.isChatCompatible() && sender instanceof Player) { Player player = (Player) sender; String json = message.toJSONString(); diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/ReflectionUtil.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/ReflectionUtil.java new file mode 100644 index 000000000..ee7546f87 --- /dev/null +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/compat/ReflectionUtil.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016 Lucko (Luck) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.bukkit.compat; + +import lombok.experimental.UtilityClass; + +import org.bukkit.Bukkit; + +@UtilityClass +public class ReflectionUtil { + private static final String SERVER_VERSION = _getServerVersion(); + private static final boolean CHAT_COMPATIBLE = !SERVER_VERSION.startsWith(".v1_7_"); + + private static String _getServerVersion() { + Class server = Bukkit.getServer().getClass(); + if (!server.getSimpleName().equals("CraftServer")) { + return "."; + } + if (server.getName().equals("org.bukkit.craftbukkit.CraftServer")) { + // Non versioned class + return "."; + } else { + String version = server.getName().substring("org.bukkit.craftbukkit".length()); + return version.substring(0, version.length() - "CraftServer".length()); + } + } + + public static String getServerVersion() { + return SERVER_VERSION; + } + + public static boolean isChatCompatible() { + return CHAT_COMPATIBLE; + } + + public static String nms(String className) { + return "net.minecraft.server" + getServerVersion() + className; + } + + public static Class nmsClass(String className) throws ClassNotFoundException { + return Class.forName(nms(className)); + } + + public static String obc(String className) { + return "org.bukkit.craftbukkit" + getServerVersion() + className; + } + + public static Class obcClass(String className) throws ClassNotFoundException { + return Class.forName(obc(className)); + } +}