From 6a2e1a8114df760228a6fc28fbdf977a7cfde5d0 Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Fri, 15 Feb 2019 13:51:54 -0200 Subject: [PATCH] Support ViaBackwards 1.13 with Velocity modern forwarding --- .../platform/VelocityViaInjector.java | 20 +++++++++++++ .../providers/VelocityVersionProvider.java | 29 ++++++++++++------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaInjector.java b/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaInjector.java index daa63940d..64c7c4f6e 100644 --- a/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaInjector.java +++ b/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaInjector.java @@ -4,11 +4,25 @@ import io.netty.channel.ChannelInitializer; import us.myles.ViaVersion.VelocityPlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; +import us.myles.ViaVersion.api.protocol.ProtocolVersion; import us.myles.ViaVersion.util.ReflectionUtil; import us.myles.ViaVersion.velocity.handlers.VelocityChannelInitializer; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + public class VelocityViaInjector implements ViaInjector { + public static Method getPlayerInfoForwardingMode; + + static { + try { + getPlayerInfoForwardingMode = Class.forName("com.velocitypowered.proxy.config.VelocityConfiguration").getMethod("getPlayerInfoForwardingMode"); + } catch (NoSuchMethodException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + @Override public void inject() throws Exception { Object connectionManager = ReflectionUtil.get(VelocityPlugin.PROXY, "cm", Object.class); @@ -30,6 +44,12 @@ public class VelocityViaInjector implements ViaInjector { } public static int getLowestSupportedProtocolVersion() { + try { + if (getPlayerInfoForwardingMode != null + && ((Enum) getPlayerInfoForwardingMode.invoke(VelocityPlugin.PROXY.getConfiguration())) + .name().equals("MODERN")) return ProtocolVersion.v1_13.getId(); + } catch (IllegalAccessException | InvocationTargetException ignored) { + } return com.velocitypowered.api.network.ProtocolVersion.MINIMUM_VERSION.getProtocol(); } diff --git a/velocity/src/main/java/us/myles/ViaVersion/velocity/providers/VelocityVersionProvider.java b/velocity/src/main/java/us/myles/ViaVersion/velocity/providers/VelocityVersionProvider.java index 04939df8b..7f7f786c9 100644 --- a/velocity/src/main/java/us/myles/ViaVersion/velocity/providers/VelocityVersionProvider.java +++ b/velocity/src/main/java/us/myles/ViaVersion/velocity/providers/VelocityVersionProvider.java @@ -1,6 +1,6 @@ package us.myles.ViaVersion.velocity.providers; -import com.google.common.collect.Lists; +import us.myles.ViaVersion.VelocityPlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolVersion; @@ -8,32 +8,41 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.base.VersionProvider; import us.myles.ViaVersion.velocity.platform.VelocityViaInjector; -import java.util.*; -import java.util.stream.Collectors; +import java.util.Arrays; +import java.util.stream.IntStream; public class VelocityVersionProvider extends VersionProvider { - private static final List VELOCITY_PROTOCOLS = com.velocitypowered.api.network.ProtocolVersion.SUPPORTED_VERSIONS.stream() - .map(com.velocitypowered.api.network.ProtocolVersion::getProtocol) - .collect(Collectors.toList()); @Override public int getServerProtocol(UserConnection user) throws Exception { int playerVersion = user.get(ProtocolInfo.class).getProtocolVersion(); + IntStream versions = com.velocitypowered.api.network.ProtocolVersion.SUPPORTED_VERSIONS.stream() + .mapToInt(com.velocitypowered.api.network.ProtocolVersion::getProtocol); + + // Modern forwarding mode needs 1.13 Login plugin message + if (VelocityViaInjector.getPlayerInfoForwardingMode != null + && ((Enum) VelocityViaInjector.getPlayerInfoForwardingMode.invoke(VelocityPlugin.PROXY.getConfiguration())) + .name().equals("MODERN")) { + versions = versions.filter(ver -> ver >= ProtocolVersion.v1_13.getId()); + } + int[] compatibleProtocols = versions.toArray(); + // Bungee supports it - if (Collections.binarySearch(VELOCITY_PROTOCOLS, playerVersion) >= 0) + if (Arrays.binarySearch(compatibleProtocols, playerVersion) >= 0) return playerVersion; // Older than bungee supports, get the lowest version - if (playerVersion < VELOCITY_PROTOCOLS.get(0)) { - return VelocityViaInjector.getLowestSupportedProtocolVersion(); + if (playerVersion < compatibleProtocols[0]) { + return compatibleProtocols[0]; } // Loop through all protocols to get the closest protocol id that bungee supports (and that viaversion does too) // TODO: This needs a better fix, i.e checking ProtocolRegistry to see if it would work. // This is more of a workaround for snapshot support by bungee. - for (Integer protocol : Lists.reverse(VELOCITY_PROTOCOLS)) { + for (int i = compatibleProtocols.length - 1; i >= 0; i--) { + int protocol = compatibleProtocols[i]; if (playerVersion > protocol && ProtocolVersion.isRegistered(protocol)) return protocol; }