From aa5e06db66985dcf8fd327258b4bc914b53ec48f Mon Sep 17 00:00:00 2001 From: matthewperiut Date: Wed, 11 Feb 2026 05:54:12 -0500 Subject: [PATCH] [Networking] More reliable fix to prevent null networkhandler --- .../osl/networking/impl/Networking.java | 4 ---- .../osl/networking/impl/Networking.java | 4 ---- .../osl/networking/impl/Networking.java | 4 ---- .../impl/client/ClientPlayNetworkingImpl.java | 24 ++++++++++++++++--- .../impl/client/ClientPlayNetworkingImpl.java | 24 ++++++++++++++++--- .../impl/client/ClientPlayNetworkingImpl.java | 24 ++++++++++++++++--- .../impl/client/ClientPlayNetworkingImpl.java | 24 ++++++++++++++++--- 7 files changed, 84 insertions(+), 24 deletions(-) diff --git a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index df5a55ff..513996c4 100644 --- a/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -22,10 +22,6 @@ public void initClient() { MinecraftClientEvents.STOP.register(ClientPlayNetworkingImpl::destroy); ClientPlayNetworkingImpl.setUpPacketFactory(CustomPayloadPacket::new); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - // ensure the handshake is processed on the main thread, - // where the network handler is guaranteed to be set - context.ensureOnMainThread(); - // send channel registration data as a response to receiving server channel registration data ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); diff --git a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 85d0270a..5a4bf01d 100644 --- a/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mcb1.0-mcb1.4_01/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -25,10 +25,6 @@ public void initClient() { MinecraftClientEvents.STOP.register(ClientPlayNetworkingImpl::destroy); ClientPlayNetworkingImpl.setUpPacketFactory(CustomPayloadPacket::new); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - // ensure the handshake is processed on the main thread, - // where the network handler is guaranteed to be set - context.ensureOnMainThread(); - // send channel registration data as a response to receiving server channel registration data ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); diff --git a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java index 2bb2cf19..14dadd05 100644 --- a/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java +++ b/libraries/networking-impl/networking-impl-mcb1.5-mc11w48a/src/main/java/net/ornithemc/osl/networking/impl/Networking.java @@ -25,10 +25,6 @@ public void initClient() { MinecraftClientEvents.STOP.register(ClientPlayNetworkingImpl::destroy); ClientPlayNetworkingImpl.setUpPacketFactory(CustomPayloadPacket::new); ClientPlayNetworkingImpl.registerListener(HandshakePayload.CHANNEL, HandshakePayload::new, (context, payload) -> { - // ensure the handshake is processed on the main thread, - // where the network handler is guaranteed to be set - context.ensureOnMainThread(); - // send channel registration data as a response to receiving server channel registration data ClientPlayNetworkingImpl.sendNoCheck(HandshakePayload.CHANNEL, HandshakePayload.client()); diff --git a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java index 8aa40704..6e31560f 100644 --- a/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java +++ b/libraries/networking/networking-mc13w41a-mc18w30b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java @@ -30,6 +30,7 @@ public final class ClientPlayNetworkingImpl { private static final Logger LOGGER = LogManager.getLogger("OSL|Client Play Networking"); + private static final ThreadLocal currentHandler = new ThreadLocal<>(); private static PacketFactory packetFactory; private static Minecraft minecraft; private static Thread thread; @@ -111,7 +112,7 @@ public static boolean handlePacket(Minecraft minecraft, ClientPlayNetworkHandler ChannelListener listener = CHANNEL_LISTENERS.get(channel); if (listener != null) { - ChannelListener.Context ctx = new ChannelListener.Context(); + ChannelListener.Context ctx = new ChannelListener.Context(handler); PacketBuffer data = p.osl$networking$getData(); try { @@ -127,10 +128,13 @@ public static boolean handlePacket(Minecraft minecraft, ClientPlayNetworkHandler } private static void handlePayload(NamespacedIdentifier channel, ChannelListener listener, ChannelListener.Context ctx, PacketBuffer data) { + currentHandler.set(ctx.networkHandler()); try { listener.handle(ctx, data); } catch (IOException e) { LOGGER.warn("error handling custom payload on channel \'" + channel + "\'", e); + } finally { + currentHandler.remove(); } } @@ -212,7 +216,15 @@ private static void sendPacket(NamespacedIdentifier channel, PacketBuffer data) ChannelSettings settings = ChannelRegistryImpl.getSettings(channel); if (settings != null && settings.isServerbound()) { - minecraft.getNetworkHandler().sendPacket(packetFactory.create(channel, data)); + ClientPlayNetworkHandler handler = currentHandler.get(); + if (handler == null) { + handler = minecraft.getNetworkHandler(); + } + if (handler != null) { + handler.sendPacket(packetFactory.create(channel, data)); + } else { + LOGGER.warn("dropping packet on channel '{}': no network handler available", channel); + } } } @@ -223,6 +235,12 @@ private interface ChannelListener { class Context implements ClientPacketListener.Context { + private final ClientPlayNetworkHandler handler; + + Context(ClientPlayNetworkHandler handler) { + this.handler = handler; + } + @Override public Minecraft minecraft() { return minecraft; @@ -230,7 +248,7 @@ public Minecraft minecraft() { @Override public ClientPlayNetworkHandler networkHandler() { - return minecraft.getNetworkHandler(); + return handler; } @Override diff --git a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java index e9ba1661..bae7b8aa 100644 --- a/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java +++ b/libraries/networking/networking-mc18w31a-mc1.14.4/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java @@ -30,6 +30,7 @@ public final class ClientPlayNetworkingImpl { private static final Logger LOGGER = LogManager.getLogger("OSL|Client Play Networking"); + private static final ThreadLocal currentHandler = new ThreadLocal<>(); private static PacketFactory packetFactory; private static Minecraft minecraft; private static Thread thread; @@ -109,7 +110,7 @@ public static boolean handlePacket(Minecraft minecraft, ClientPlayNetworkHandler ChannelListener listener = CHANNEL_LISTENERS.get(channel); if (listener != null) { - ChannelListener.Context ctx = new ChannelListener.Context(); + ChannelListener.Context ctx = new ChannelListener.Context(handler); PacketBuffer data = p.osl$networking$getData(); try { @@ -125,10 +126,13 @@ public static boolean handlePacket(Minecraft minecraft, ClientPlayNetworkHandler } private static void handlePayload(NamespacedIdentifier channel, ChannelListener listener, ChannelListener.Context ctx, PacketBuffer data) { + currentHandler.set(ctx.networkHandler()); try { listener.handle(ctx, data); } catch (IOException e) { LOGGER.warn("error handling custom payload on channel \'" + channel + "\'", e); + } finally { + currentHandler.remove(); } } @@ -210,7 +214,15 @@ private static void sendPacket(NamespacedIdentifier channel, PacketBuffer data) ChannelSettings settings = ChannelRegistryImpl.getSettings(channel); if (settings != null && settings.isServerbound()) { - minecraft.getNetworkHandler().sendPacket(packetFactory.create(channel, data)); + ClientPlayNetworkHandler handler = currentHandler.get(); + if (handler == null) { + handler = minecraft.getNetworkHandler(); + } + if (handler != null) { + handler.sendPacket(packetFactory.create(channel, data)); + } else { + LOGGER.warn("dropping packet on channel '{}': no network handler available", channel); + } } } @@ -221,6 +233,12 @@ private interface ChannelListener { class Context implements ClientPacketListener.Context { + private final ClientPlayNetworkHandler handler; + + Context(ClientPlayNetworkHandler handler) { + this.handler = handler; + } + @Override public Minecraft minecraft() { return minecraft; @@ -228,7 +246,7 @@ public Minecraft minecraft() { @Override public ClientPlayNetworkHandler networkHandler() { - return minecraft.getNetworkHandler(); + return handler; } @Override diff --git a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java index 7972bac3..2379db78 100644 --- a/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java +++ b/libraries/networking/networking-mca1.0.16-mca1.2.6/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java @@ -31,6 +31,7 @@ public final class ClientPlayNetworkingImpl { private static final Logger LOGGER = LogManager.getLogger("OSL|Client Play Networking"); + private static final ThreadLocal currentHandler = new ThreadLocal<>(); private static PacketFactory packetFactory; private static Minecraft minecraft; private static Thread thread; @@ -110,7 +111,7 @@ public static boolean handlePacket(Minecraft minecraft, ClientNetworkHandler han ChannelListener listener = CHANNEL_LISTENERS.get(channel); if (listener != null) { - ChannelListener.Context ctx = new ChannelListener.Context(); + ChannelListener.Context ctx = new ChannelListener.Context(handler); byte[] data = p.osl$networking$getData(); try { @@ -126,10 +127,13 @@ public static boolean handlePacket(Minecraft minecraft, ClientNetworkHandler han } private static void handlePayload(NamespacedIdentifier channel, ChannelListener listener, ChannelListener.Context ctx, byte[] data) { + currentHandler.set(ctx.networkHandler()); try { listener.handle(ctx, data); } catch (IOException e) { LOGGER.warn("error handling custom payload on channel \'" + channel + "\'", e); + } finally { + currentHandler.remove(); } } @@ -216,7 +220,15 @@ private static void sendPacket(NamespacedIdentifier channel, byte[] data) { ChannelSettings settings = ChannelRegistryImpl.getSettings(channel); if (settings != null && settings.isServerbound()) { - networkHandler().sendPacket(packetFactory.create(channel, data)); + ClientNetworkHandler handler = currentHandler.get(); + if (handler == null) { + handler = networkHandler(); + } + if (handler != null) { + handler.sendPacket(packetFactory.create(channel, data)); + } else { + LOGGER.warn("dropping packet on channel '{}': no network handler available", channel); + } } } @@ -227,6 +239,12 @@ private interface ChannelListener { class Context implements ClientPacketListener.Context { + private final ClientNetworkHandler handler; + + Context(ClientNetworkHandler handler) { + this.handler = handler; + } + @Override public Minecraft minecraft() { return minecraft; @@ -234,7 +252,7 @@ public Minecraft minecraft() { @Override public ClientNetworkHandler networkHandler() { - return ClientPlayNetworkingImpl.networkHandler(); + return handler; } @Override diff --git a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java index 1421579f..3798a3f3 100644 --- a/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java +++ b/libraries/networking/networking-mcb1.0-mc13w39b/src/main/java/net/ornithemc/osl/networking/impl/client/ClientPlayNetworkingImpl.java @@ -30,6 +30,7 @@ public final class ClientPlayNetworkingImpl { private static final Logger LOGGER = LogManager.getLogger("OSL|Client Play Networking"); + private static final ThreadLocal currentHandler = new ThreadLocal<>(); private static PacketFactory packetFactory; private static Minecraft minecraft; private static Thread thread; @@ -109,7 +110,7 @@ public static boolean handlePacket(Minecraft minecraft, ClientNetworkHandler han ChannelListener listener = CHANNEL_LISTENERS.get(channel); if (listener != null) { - ChannelListener.Context ctx = new ChannelListener.Context(); + ChannelListener.Context ctx = new ChannelListener.Context(handler); byte[] data = p.osl$networking$getData(); try { @@ -125,10 +126,13 @@ public static boolean handlePacket(Minecraft minecraft, ClientNetworkHandler han } private static void handlePayload(NamespacedIdentifier channel, ChannelListener listener, ChannelListener.Context ctx, byte[] data) { + currentHandler.set(ctx.networkHandler()); try { listener.handle(ctx, data); } catch (IOException e) { LOGGER.warn("error handling custom payload on channel \'" + channel + "\'", e); + } finally { + currentHandler.remove(); } } @@ -210,7 +214,15 @@ private static void sendPacket(NamespacedIdentifier channel, byte[] data) { ChannelSettings settings = ChannelRegistryImpl.getSettings(channel); if (settings != null && settings.isServerbound()) { - minecraft.getNetworkHandler().sendPacket(packetFactory.create(channel, data)); + ClientNetworkHandler handler = currentHandler.get(); + if (handler == null) { + handler = minecraft.getNetworkHandler(); + } + if (handler != null) { + handler.sendPacket(packetFactory.create(channel, data)); + } else { + LOGGER.warn("dropping packet on channel '{}': no network handler available", channel); + } } } @@ -221,6 +233,12 @@ private interface ChannelListener { class Context implements ClientPacketListener.Context { + private final ClientNetworkHandler handler; + + Context(ClientNetworkHandler handler) { + this.handler = handler; + } + @Override public Minecraft minecraft() { return minecraft; @@ -228,7 +246,7 @@ public Minecraft minecraft() { @Override public ClientNetworkHandler networkHandler() { - return minecraft.getNetworkHandler(); + return handler; } @Override