diff --git a/src/main/java/com/comphenix/protocol/ProtocolLib.java b/src/main/java/com/comphenix/protocol/ProtocolLib.java index 84138a10..04e18069 100644 --- a/src/main/java/com/comphenix/protocol/ProtocolLib.java +++ b/src/main/java/com/comphenix/protocol/ProtocolLib.java @@ -38,6 +38,7 @@ import com.comphenix.protocol.updater.Updater; import com.comphenix.protocol.updater.Updater.UpdateType; import com.comphenix.protocol.utility.ChatExtensions; import com.comphenix.protocol.utility.ByteBuddyFactory; +import com.comphenix.protocol.utility.NettyVersion; import com.comphenix.protocol.utility.MinecraftVersion; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; @@ -170,7 +171,11 @@ public class ProtocolLib extends JavaPlugin { // Print the state of the debug mode if (config.isDebug()) { logger.warning("Debug mode is enabled!"); + logger.info("Detected netty version: " + NettyVersion.getVersion()); + } else { + NettyVersion.getVersion(); // this will cache the version } + // And the state of the error reporter if (config.isDetailedErrorReporting()) { detailedReporter.setDetailedReporting(true); diff --git a/src/main/java/com/comphenix/protocol/injector/netty/ProtocolInjector.java b/src/main/java/com/comphenix/protocol/injector/netty/ProtocolInjector.java index ae2fd65d..e87549c9 100644 --- a/src/main/java/com/comphenix/protocol/injector/netty/ProtocolInjector.java +++ b/src/main/java/com/comphenix/protocol/injector/netty/ProtocolInjector.java @@ -46,6 +46,7 @@ import com.comphenix.protocol.injector.player.PlayerInjectionHandler; import com.comphenix.protocol.injector.server.TemporaryPlayerFactory; import com.comphenix.protocol.reflect.FuzzyReflection; import com.comphenix.protocol.reflect.VolatileField; +import com.comphenix.protocol.utility.NettyVersion; import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.utility.MinecraftVersion; import com.google.common.collect.Lists; @@ -146,10 +147,15 @@ public class ProtocolInjector implements ChannelListener { protected void initChannel(final Channel channel) throws Exception { try { synchronized (networkManagers) { - // For some reason it needs to be delayed on 1.12, but the delay breaks 1.11 and below + // For some reason it needs to be delayed when using netty 4.1.24 (minecraft 1.12) or newer, + // but the delay breaks older minecraft versions // TODO I see this more as a temporary hotfix than a permanent solution - if (MinecraftVersion.getCurrentVersion().getMinor() >= 12) { - channel.eventLoop().submit(() -> + + // Check if the netty version is greater than 4.1.24, that's the version bundled with spigot 1.12 + NettyVersion ver = NettyVersion.getVersion(); + if ((ver.isValid() && ver.isGreaterThan(4,1,24)) || + MinecraftVersion.getCurrentVersion().getMinor() >= 12) { // fallback if netty version couldn't be detected + channel.eventLoop().submit(() -> injectionFactory.fromChannel(channel, ProtocolInjector.this, playerFactory).inject()); } else { injectionFactory.fromChannel(channel, ProtocolInjector.this, playerFactory).inject(); diff --git a/src/main/java/com/comphenix/protocol/utility/NettyVersion.java b/src/main/java/com/comphenix/protocol/utility/NettyVersion.java new file mode 100644 index 00000000..0e31a421 --- /dev/null +++ b/src/main/java/com/comphenix/protocol/utility/NettyVersion.java @@ -0,0 +1,83 @@ +package com.comphenix.protocol.utility; + +import com.comphenix.protocol.ProtocolLibrary; +import io.netty.util.Version; + +import java.util.Map; + +public class NettyVersion { + private final static String NETTY_ARTIFACT_ID = "netty-common"; + private static NettyVersion version; + + public static NettyVersion getVersion() { + if(version == null) { + version = detectVersion(); + } + return version; + } + + private static NettyVersion detectVersion() { + Map nettyArtifacts = Version.identify(); + Version version = nettyArtifacts.get(NETTY_ARTIFACT_ID); + if(version != null) { + return new NettyVersion(version.artifactVersion()); + } + return new NettyVersion(null); + } + + private boolean valid = false; + private int major, minor, revision; + + public NettyVersion(String s) { + if(s == null) { + return; + } + String[] split = s.split( "\\."); + try { + this.major = Integer.parseInt(split[0]); + this.minor = Integer.parseInt(split[1]); + this.revision = Integer.parseInt(split[2]); + this.valid = true; + } catch (Throwable t) { + ProtocolLibrary.getPlugin().getLogger().warning("Could not detect netty version: '" + s + "'"); + } + } + + @Override + public String toString() { + if(!valid) { + return "(invalid)"; + } + return major + "." + minor + "." + revision; + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof NettyVersion)) { + return false; + } + NettyVersion v = (NettyVersion) obj; + return v.major == major && v.minor == minor && v.revision == revision; + } + + public int getMajor() { + return major; + } + + public int getMinor() { + return minor; + } + + public int getRevision() { + return revision; + } + + public boolean isValid() { + return this.valid; + } + + public boolean isGreaterThan(int major, int minor, int rev) { + return this.major > major || this.minor > minor || this.revision > rev; + } + +}