Skip to content

Commit eeccd5b

Browse files
authored
Packet fixes - disable neoforge splitter and send minecraft:register (#170)
* Disable NeoForge packet splitting for Fabric packets * Send minecraft:register for Fabric packets * Remove unused import
1 parent 220dc0d commit eeccd5b

File tree

6 files changed

+85
-11
lines changed

6 files changed

+85
-11
lines changed

fabric-networking-api-v1/src/client/java/net/fabricmc/fabric/mixin/networking/client/ClientPlayNetworkHandlerMixin.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,35 @@
2323
import net.minecraft.client.multiplayer.CommonListenerCookie;
2424
import net.minecraft.network.Connection;
2525
import net.minecraft.network.protocol.game.ClientboundLoginPacket;
26+
import net.minecraft.resources.ResourceLocation;
27+
import net.neoforged.neoforge.network.registration.ChannelAttributes;
28+
import org.sinytra.fabric.networking_api.client.NeoClientCommonNetworking;
2629
import org.sinytra.fabric.networking_api.client.NeoClientPlayNetworking;
2730
import org.sinytra.fabric.networking_api.NeoListenableNetworkHandler;
2831
import org.spongepowered.asm.mixin.Mixin;
32+
import org.spongepowered.asm.mixin.Shadow;
2933
import org.spongepowered.asm.mixin.injection.At;
3034
import org.spongepowered.asm.mixin.injection.Inject;
3135
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
3236

37+
import java.util.List;
38+
import java.util.Set;
39+
3340
// We want to apply a bit earlier than other mods which may not use us in order to prevent refCount issues
3441
@Mixin(value = ClientPacketListener.class, priority = 999)
3542
abstract class ClientPlayNetworkHandlerMixin extends ClientCommonPacketListenerImpl implements NeoListenableNetworkHandler {
43+
@Shadow
44+
public abstract Connection getConnection();
45+
3646
protected ClientPlayNetworkHandlerMixin(Minecraft client, Connection connection, CommonListenerCookie connectionState) {
3747
super(client, connection, connectionState);
3848
}
3949

4050
@Inject(method = "<init>", at = @At("RETURN"))
4151
private void initAddon(CallbackInfo ci) {
52+
Set<ResourceLocation> channels = ChannelAttributes.getOrCreateCommonChannels(this.getConnection(), this.protocol());
53+
NeoClientCommonNetworking.onRegisterPacket((ClientPacketListener) (Object) this, channels);
54+
4255
NeoClientPlayNetworking.setTempPacketListener((ClientPacketListener) (Object) this);
4356
ClientPlayConnectionEvents.INIT.invoker().onPlayInit((ClientPacketListener) (Object) this, this.minecraft);
4457
}

fabric-networking-api-v1/src/client/java/org/sinytra/fabric/networking_api/client/NeoClientCommonNetworking.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,21 @@
1515
public class NeoClientCommonNetworking {
1616
public static void onRegisterPacket(ICommonPacketListener listener, Set<ResourceLocation> ids) {
1717
ConnectionProtocol protocol = listener.protocol();
18+
List<ResourceLocation> listIds = List.copyOf(ids);
1819
if (protocol == ConnectionProtocol.CONFIGURATION) {
19-
listener.getMainThreadEventLoop().execute(() -> C2SConfigurationChannelEvents.REGISTER.invoker().onChannelRegister((ClientConfigurationPacketListenerImpl) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), List.copyOf(ids)));
20+
listener.getMainThreadEventLoop().execute(() -> C2SConfigurationChannelEvents.REGISTER.invoker().onChannelRegister((ClientConfigurationPacketListenerImpl) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), listIds));
2021
} else if (protocol == ConnectionProtocol.PLAY) {
21-
listener.getMainThreadEventLoop().execute(() -> C2SPlayChannelEvents.REGISTER.invoker().onChannelRegister((ClientPacketListener) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), List.copyOf(ids)));
22+
listener.getMainThreadEventLoop().execute(() -> C2SPlayChannelEvents.REGISTER.invoker().onChannelRegister((ClientPacketListener) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), listIds));
2223
}
2324
}
2425

2526
public static void onUnregisterPacket(ICommonPacketListener listener, Set<ResourceLocation> ids) {
2627
ConnectionProtocol protocol = listener.protocol();
28+
List<ResourceLocation> listIds = List.copyOf(ids);
2729
if (protocol == ConnectionProtocol.CONFIGURATION) {
28-
listener.getMainThreadEventLoop().execute(() -> C2SConfigurationChannelEvents.UNREGISTER.invoker().onChannelUnregister((ClientConfigurationPacketListenerImpl) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), List.copyOf(ids)));
30+
listener.getMainThreadEventLoop().execute(() -> C2SConfigurationChannelEvents.UNREGISTER.invoker().onChannelUnregister((ClientConfigurationPacketListenerImpl) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), listIds));
2931
} else if (protocol == ConnectionProtocol.PLAY) {
30-
listener.getMainThreadEventLoop().execute(() -> C2SPlayChannelEvents.UNREGISTER.invoker().onChannelUnregister((ClientPacketListener) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), List.copyOf(ids)));
32+
listener.getMainThreadEventLoop().execute(() -> C2SPlayChannelEvents.UNREGISTER.invoker().onChannelUnregister((ClientPacketListener) listener, new NeoClientPacketSender(listener.getConnection()), Minecraft.getInstance(), listIds));
3133
}
3234
}
3335
}

fabric-networking-api-v1/src/client/java/org/sinytra/fabric/networking_api/client/NeoClientPlayNetworking.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.minecraft.resources.ResourceLocation;
1515
import net.neoforged.neoforge.common.extensions.ICommonPacketListener;
1616
import net.neoforged.neoforge.network.handling.IPayloadContext;
17+
import net.neoforged.neoforge.network.payload.MinecraftRegisterPayload;
1718
import net.neoforged.neoforge.network.registration.NetworkRegistry;
1819
import org.jetbrains.annotations.Nullable;
1920
import org.sinytra.fabric.networking_api.NeoCommonNetworking;
@@ -70,11 +71,15 @@ public static PacketSender getSender() {
7071
}
7172

7273
public static void onServerReady(ClientPacketListener handler, Minecraft client) {
74+
NeoClientPacketSender packetSender = new NeoClientPacketSender(handler.getConnection());
7375
try {
74-
ClientPlayConnectionEvents.JOIN.invoker().onPlayReady(handler, new NeoClientPacketSender(handler.getConnection()), client);
76+
ClientPlayConnectionEvents.JOIN.invoker().onPlayReady(handler, packetSender, client);
7577
} catch (RuntimeException e) {
7678
LOGGER.error("Exception thrown while invoking ClientPlayConnectionEvents.JOIN", e);
7779
}
80+
81+
MinecraftRegisterPayload registerPacket = new MinecraftRegisterPayload(NeoCommonNetworking.PLAY_REGISTRY.getGlobalReceivers(PacketFlow.CLIENTBOUND));
82+
packetSender.sendPacket(registerPacket);
7883
}
7984

8085
@Nullable
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package net.fabricmc.fabric.mixin.networking;
2+
3+
import io.netty.channel.ChannelHandlerContext;
4+
import net.minecraft.network.HandlerNames;
5+
import net.minecraft.network.PacketEncoder;
6+
import net.minecraft.network.protocol.Packet;
7+
import net.minecraft.network.protocol.PacketFlow;
8+
import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
9+
import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket;
10+
import net.neoforged.neoforge.network.filters.GenericPacketSplitter;
11+
import net.neoforged.neoforge.network.payload.SplitPacketPayload;
12+
import org.sinytra.fabric.networking_api.NeoNetworkRegistrar;
13+
import org.spongepowered.asm.mixin.Mixin;
14+
import org.spongepowered.asm.mixin.injection.At;
15+
import org.spongepowered.asm.mixin.injection.Inject;
16+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
17+
18+
import java.util.List;
19+
20+
@Mixin(GenericPacketSplitter.class)
21+
public class GenericPacketSplitterMixin {
22+
23+
/*
24+
* Disable NeoForge packet splitting for Fabric packets
25+
*/
26+
27+
@Inject(method = "encode(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/protocol/Packet;Ljava/util/List;)V", at = @At("HEAD"), cancellable = true)
28+
public void encode(ChannelHandlerContext ctx, Packet<?> packet, List<Object> out, CallbackInfo ci) {
29+
if (packet instanceof ClientboundCustomPayloadPacket clientboundCustomPayloadPacket) {
30+
if (ctx.pipeline().get(HandlerNames.ENCODER) instanceof PacketEncoder<?> encoder) {
31+
var registry = NeoNetworkRegistrar.getPayloadRegistry(encoder.getProtocolInfo().id(), PacketFlow.CLIENTBOUND);
32+
if (registry.get(clientboundCustomPayloadPacket.payload().type()) != null) {
33+
out.add(packet);
34+
ci.cancel();
35+
}
36+
}
37+
} else if (packet instanceof ServerboundCustomPayloadPacket serverboundCustomPayloadPacket) {
38+
if (ctx.pipeline().get(HandlerNames.ENCODER) instanceof PacketEncoder<?> encoder) {
39+
var registry = NeoNetworkRegistrar.getPayloadRegistry(encoder.getProtocolInfo().id(), PacketFlow.SERVERBOUND);
40+
if (registry.get(serverboundCustomPayloadPacket.payload().type()) != null) {
41+
out.add(packet);
42+
ci.cancel();
43+
}
44+
}
45+
}
46+
}
47+
48+
}

fabric-networking-api-v1/src/main/java/org/sinytra/fabric/networking_api/server/NeoServerPlayNetworking.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.minecraft.server.level.ServerPlayer;
1313
import net.minecraft.server.network.ServerGamePacketListenerImpl;
1414
import net.neoforged.neoforge.network.handling.IPayloadContext;
15+
import net.neoforged.neoforge.network.payload.MinecraftRegisterPayload;
1516
import net.neoforged.neoforge.network.registration.NetworkRegistry;
1617
import org.sinytra.fabric.networking_api.NeoCommonNetworking;
1718

@@ -57,7 +58,11 @@ public static PacketSender getSender(ServerGamePacketListenerImpl handler) {
5758
}
5859

5960
public static void onClientReady(ServerPlayer player) {
60-
ServerPlayConnectionEvents.JOIN.invoker().onPlayReady(player.connection, new NeoServerPacketSender(player.connection.getConnection()), player.server);
61+
NeoServerPacketSender packetSender = new NeoServerPacketSender(player.connection.getConnection());
62+
ServerPlayConnectionEvents.JOIN.invoker().onPlayReady(player.connection,packetSender, player.server);
63+
64+
MinecraftRegisterPayload registerPacket = new MinecraftRegisterPayload(NeoCommonNetworking.PLAY_REGISTRY.getGlobalReceivers(PacketFlow.SERVERBOUND));
65+
packetSender.sendPacket(registerPacket);
6166
}
6267

6368
private record ServerNeoContextWrapper(IPayloadContext context) implements ServerPlayNetworking.Context {

fabric-networking-api-v1/src/main/resources/fabric-networking-api-v1.mixins.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@
55
"mixins": [
66
"ClientConnectionMixin",
77
"EntityTrackerEntryMixin",
8+
"GenericPacketSplitterMixin",
89
"LoginQueryRequestS2CPacketMixin",
910
"LoginQueryResponseC2SPacketMixin",
11+
"NetworkRegistryMixin",
12+
"ServerCommonNetworkHandlerMixin",
1013
"ServerConfigurationNetworkHandlerMixin",
1114
"ServerLoginNetworkHandlerMixin",
1215
"ServerPlayNetworkHandlerMixin",
13-
"NetworkRegistryMixin",
14-
"ServerCommonNetworkHandlerMixin",
1516
"accessor.EntityTrackerAccessor",
16-
"accessor.ServerCommonNetworkHandlerAccessor",
17-
"accessor.ServerLoginNetworkHandlerAccessor",
17+
"accessor.NetworkRegistryAccessor",
1818
"accessor.ServerChunkLoadingManagerAccessor",
19-
"accessor.NetworkRegistryAccessor"
19+
"accessor.ServerCommonNetworkHandlerAccessor",
20+
"accessor.ServerLoginNetworkHandlerAccessor"
2021
],
2122
"injectors": {
2223
"defaultRequire": 1

0 commit comments

Comments
 (0)