From bd11c98e456ec9afddda8f65e25c53f0be9e31c5 Mon Sep 17 00:00:00 2001 From: Myles Date: Wed, 26 Oct 2016 17:34:09 +0100 Subject: [PATCH] Better support for ChannelInitializer detection (incase they do something funny, fixes latest PS dev) --- .../bukkit/platform/BukkitViaInjector.java | 17 ++++++++++++++++- .../sponge/platform/SpongeViaInjector.java | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java index ef06a642e..0140d28ee 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java @@ -72,7 +72,22 @@ public class BukkitViaInjector implements ViaInjector { private void injectChannelFuture(ChannelFuture future) throws Exception { try { - ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); + List names = future.channel().pipeline().names(); + ChannelHandler bootstrapAcceptor = null; + // Pick best + for (String name : names) { + ChannelHandler handler = future.channel().pipeline().get(name); + try { + ReflectionUtil.get(handler, "childHandler", ChannelInitializer.class); + bootstrapAcceptor = handler; + } catch (Exception e) { + // Not this one + } + } + // Default to first (Also allows blame to work) + if (bootstrapAcceptor == null) { + bootstrapAcceptor = future.channel().pipeline().first(); + } try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); ChannelInitializer newInit = new BukkitChannelInitializer(oldInit); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java index 3e7a5545a..da86deb48 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java @@ -71,7 +71,22 @@ public class SpongeViaInjector implements ViaInjector { private void injectChannelFuture(ChannelFuture future) throws Exception { try { - ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); + List names = future.channel().pipeline().names(); + ChannelHandler bootstrapAcceptor = null; + // Pick best + for (String name : names) { + ChannelHandler handler = future.channel().pipeline().get(name); + try { + ReflectionUtil.get(handler, "childHandler", ChannelInitializer.class); + bootstrapAcceptor = handler; + } catch (Exception e) { + // Not this one + } + } + // Default to first (Also allows blame to work) + if (bootstrapAcceptor == null) { + bootstrapAcceptor = future.channel().pipeline().first(); + } try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); ChannelInitializer newInit = new SpongeChannelInitializer(oldInit);