diff --git a/bukkit/src/main/java/com/viaversion/viaversion/ViaVersionPlugin.java b/bukkit/src/main/java/com/viaversion/viaversion/ViaVersionPlugin.java index ae02a1054..d50177afa 100644 --- a/bukkit/src/main/java/com/viaversion/viaversion/ViaVersionPlugin.java +++ b/bukkit/src/main/java/com/viaversion/viaversion/ViaVersionPlugin.java @@ -34,7 +34,6 @@ import com.viaversion.viaversion.bukkit.platform.BukkitViaConfig; import com.viaversion.viaversion.bukkit.platform.BukkitViaInjector; import com.viaversion.viaversion.bukkit.platform.BukkitViaLoader; import com.viaversion.viaversion.bukkit.platform.BukkitViaTask; -import com.viaversion.viaversion.bukkit.util.NMSUtil; import com.viaversion.viaversion.dump.PluginInfo; import com.viaversion.viaversion.unsupported.UnsupportedPlugin; import com.viaversion.viaversion.unsupported.UnsupportedServerSoftware; @@ -50,6 +49,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.UUID; +import java.util.logging.Level; public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform { private static ViaVersionPlugin instance; @@ -59,8 +59,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform private final List queuedTasks = new ArrayList<>(); private final List asyncQueuedTasks = new ArrayList<>(); private final boolean protocolSupport; - private boolean compatSpigotBuild; - private boolean spigot = true; private boolean lateBind; public ViaVersionPlugin() { @@ -88,33 +86,19 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform @Override public void onLoad() { - // Spigot detector - try { - Class.forName("org.spigotmc.SpigotConfig"); - } catch (ClassNotFoundException e) { - spigot = false; - } - - // Check if it's a spigot build with a protocol mod - try { - NMSUtil.nms( - "PacketEncoder", - "net.minecraft.network.PacketEncoder" - ).getDeclaredField("version"); - compatSpigotBuild = true; - } catch (Exception e) { - compatSpigotBuild = false; - } - if (getServer().getPluginManager().getPlugin("ViaBackwards") != null) { MappingDataLoader.enableMappingsCache(); } - // Generate classes needed (only works if it's compat or ps) - ClassGenerator.generate(); + try { + ClassGenerator.generate(); + } catch (Exception e) { + getLogger().log(Level.WARNING, "Error generating classes for compatibility layer", e); + } + lateBind = !((BukkitViaInjector) Via.getManager().getInjector()).isBinded(); - getLogger().info("ViaVersion " + getDescription().getVersion() + (compatSpigotBuild ? "compat" : "") + " is now loaded" + (lateBind ? ", waiting for boot. (late-bind)" : ", injecting!")); + getLogger().info("ViaVersion " + getDescription().getVersion() + " is now loaded" + (lateBind ? ", waiting for boot. (late-bind)" : ", injecting!")); if (!lateBind) { ((ViaManagerImpl) Via.getManager()).init(); } @@ -130,7 +114,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform getCommand("viaversion").setTabCompleter(commandHandler); // Warn them if they have anti-xray on and they aren't using spigot - if (conf.isAntiXRay() && !spigot) { + if (conf.isAntiXRay() && !isSpigot()) { getLogger().info("You have anti-xray on in your config, since you're not using spigot it won't fix xray!"); } @@ -300,18 +284,19 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform return lateBind; } - public boolean isCompatSpigotBuild() { - return compatSpigotBuild; - } - - public boolean isSpigot() { - return this.spigot; - } - public boolean isProtocolSupport() { return protocolSupport; } + private boolean isSpigot() { + try { + Class.forName("org.spigotmc.SpigotConfig"); + } catch (ClassNotFoundException e) { + return false; + } + return true; + } + public static ViaVersionPlugin getInstance() { return instance; } diff --git a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/classgenerator/ClassGenerator.java b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/classgenerator/ClassGenerator.java index 921c4a31e..dd6fabb68 100644 --- a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/classgenerator/ClassGenerator.java @@ -18,21 +18,16 @@ package com.viaversion.viaversion.bukkit.classgenerator; import com.viaversion.viaversion.ViaVersionPlugin; -import com.viaversion.viaversion.bukkit.handlers.BukkitDecodeHandler; -import com.viaversion.viaversion.bukkit.handlers.BukkitEncodeHandler; +import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.bukkit.util.NMSUtil; import com.viaversion.viaversion.classgenerator.generated.HandlerSupplier; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtField; -import javassist.CtMethod; import javassist.CtNewConstructor; import javassist.CtNewMethod; import javassist.LoaderClassPath; -import javassist.NotFoundException; -import javassist.expr.ConstructorCall; -import javassist.expr.ExprEditor; import org.bukkit.Bukkit; import org.bukkit.event.Event; import org.bukkit.event.EventException; @@ -47,93 +42,18 @@ import java.lang.reflect.Method; //TODO maybe clean this up a bit 👀 public final class ClassGenerator { private static final boolean useModules = hasModuleMethod(); - private static HandlerSupplier constructor = new HandlerSupplier.DefaultHandlerSupplier(); private static Class psConnectListener; - public static HandlerSupplier handlerSupplier() { - return constructor; - } - public static void generate() { - if (ViaVersionPlugin.getInstance().isCompatSpigotBuild() || ViaVersionPlugin.getInstance().isProtocolSupport()) { - try { - ClassPool pool = ClassPool.getDefault(); - pool.insertClassPath(new LoaderClassPath(Bukkit.class.getClassLoader())); - for (Plugin p : Bukkit.getPluginManager().getPlugins()) { - pool.insertClassPath(new LoaderClassPath(p.getClass().getClassLoader())); - } - - if (ViaVersionPlugin.getInstance().isCompatSpigotBuild()) { - Class decodeSuper = NMSUtil.nms("PacketDecoder", "net.minecraft.network.PacketDecoder"); - Class encodeSuper = NMSUtil.nms("PacketEncoder", "net.minecraft.network.PacketEncoder"); - // Generate the classes - addSpigotCompatibility(pool, BukkitDecodeHandler.class, decodeSuper); - addSpigotCompatibility(pool, BukkitEncodeHandler.class, encodeSuper); - } else { - // ProtocolSupport compatibility - if (isMultiplatformPS()) { - psConnectListener = makePSConnectListener(pool); - return; - } - } - - - // Implement Constructor - CtClass generated = pool.makeClass("com.viaversion.viaversion.classgenerator.generated.GeneratedConstructor"); - CtClass handlerInterface = pool.get(HandlerSupplier.class.getName()); - - generated.setInterfaces(new CtClass[]{handlerInterface}); - // Import required classes - pool.importPackage("com.viaversion.viaversion.classgenerator.generated"); - pool.importPackage("com.viaversion.viaversion.classgenerator"); - pool.importPackage("com.viaversion.viaversion.api.connection"); - pool.importPackage("io.netty.handler.codec"); - // Implement Methods - generated.addMethod(CtMethod.make("public MessageToMessageEncoder newEncodeHandler(UserConnection connection) {\n" + - " return new BukkitEncodeHandler(connection);\n" + - " }", generated)); - generated.addMethod(CtMethod.make("public MessageToMessageDecoder newDecodeHandler(UserConnection connection) {\n" + - " return new BukkitDecodeHandler(connection);\n" + - " }", generated)); - - constructor = (HandlerSupplier) toClass(generated).getConstructor().newInstance(); - } catch (ReflectiveOperationException | CannotCompileException | NotFoundException e) { - e.printStackTrace(); + if (ViaVersionPlugin.getInstance().isProtocolSupport() && isMultiplatformPS()) { + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new LoaderClassPath(Bukkit.class.getClassLoader())); + for (Plugin p : Bukkit.getPluginManager().getPlugins()) { + pool.insertClassPath(new LoaderClassPath(p.getClass().getClassLoader())); } - } - } - private static void addSpigotCompatibility(ClassPool pool, Class input, Class superclass) { - String newName = "com.viaversion.viaversion.classgenerator.generated." + input.getSimpleName(); - - try { - CtClass generated = pool.getAndRename(input.getName(), newName); - if (superclass != null) { - CtClass toExtend = pool.get(superclass.getName()); - generated.setSuperclass(toExtend); - - // If it's NMS satisfy constructor. - if (superclass.getName().startsWith("net.minecraft")) { - // Modify constructor to call super - if (generated.getConstructors().length != 0) { - generated.getConstructors()[0].instrument(new ExprEditor() { - @Override - public void edit(ConstructorCall c) throws CannotCompileException { - if (c.isSuper()) { - // Constructor for both has a stats thing. - c.replace("super(null);"); - } - super.edit(c); - } - }); - } - } - } - toClass(generated); - } catch (NotFoundException e) { - e.printStackTrace(); - } catch (CannotCompileException e) { - e.printStackTrace(); + Via.getPlatform().getLogger().info("Generating ProtocolSupport compatibility connect listener..."); + psConnectListener = makePSConnectListener(pool); } } diff --git a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitChannelInitializer.java b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitChannelInitializer.java index aa72c5664..133c6de43 100644 --- a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitChannelInitializer.java +++ b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitChannelInitializer.java @@ -18,7 +18,6 @@ package com.viaversion.viaversion.bukkit.handlers; import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.bukkit.classgenerator.ClassGenerator; import com.viaversion.viaversion.bukkit.platform.PaperViaInjector; import com.viaversion.viaversion.connection.UserConnectionImpl; import com.viaversion.viaversion.platform.WrappedChannelInitializer; @@ -87,8 +86,8 @@ public final class BukkitChannelInitializer extends ChannelInitializer // Add our transformers final ChannelPipeline pipeline = channel.pipeline(); - pipeline.addBefore(MINECRAFT_ENCODER, VIA_ENCODER, ClassGenerator.handlerSupplier().newEncodeHandler(connection)); - pipeline.addBefore(MINECRAFT_DECODER, VIA_DECODER, ClassGenerator.handlerSupplier().newDecodeHandler(connection)); + pipeline.addBefore(MINECRAFT_ENCODER, VIA_ENCODER, new BukkitEncodeHandler(connection)); + pipeline.addBefore(MINECRAFT_DECODER, VIA_DECODER, new BukkitDecodeHandler(connection)); } @Override diff --git a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaAPI.java b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaAPI.java index 327cf9715..50fbdcf36 100644 --- a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaAPI.java +++ b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/platform/BukkitViaAPI.java @@ -58,16 +58,6 @@ public class BukkitViaAPI extends ViaAPIBase { sendRawPacket(player.getUniqueId(), packet); } - /** - * Returns if this version is a compatibility build for spigot. - * Eg. 1.9.1 / 1.9.2 allow certain versions to connect - * - * @return true if compat Spigot build - */ - public boolean isCompatSpigotBuild() { - return plugin.isCompatSpigotBuild(); - } - /** * Returns if ProtocolSupport is also being used. *