Skip to content

Commit e02edae

Browse files
committed
Fix server missing sendable channels from Fabric mods
1 parent 077ba95 commit e02edae

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/mixin/networking/NetworkRegistryMixin.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,36 @@
1313
import net.minecraft.network.protocol.common.ServerCommonPacketListener;
1414
import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket;
1515
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
16+
import net.minecraft.network.protocol.configuration.ServerConfigurationPacketListener;
1617
import net.minecraft.resources.ResourceLocation;
1718
import net.neoforged.neoforge.common.extensions.ICommonPacketListener;
19+
import net.neoforged.neoforge.network.negotiation.NegotiatedNetworkComponent;
20+
import net.neoforged.neoforge.network.negotiation.NegotiationResult;
21+
import net.neoforged.neoforge.network.payload.ModdedNetworkQueryComponent;
1822
import net.neoforged.neoforge.network.registration.NetworkRegistry;
1923
import org.sinytra.fabric.networking_api.NeoNetworkRegistrar;
2024
import org.spongepowered.asm.mixin.Mixin;
2125
import org.spongepowered.asm.mixin.injection.At;
2226
import org.spongepowered.asm.mixin.injection.Inject;
27+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
2328
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
29+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
30+
31+
import java.util.ArrayList;
32+
import java.util.List;
33+
import java.util.Map;
34+
import java.util.Set;
2435

2536
@Mixin(NetworkRegistry.class)
2637
public class NetworkRegistryMixin {
2738

28-
@ModifyReturnValue(method = "getCodec", at = @At(value = "RETURN", ordinal = 1))
29-
private static StreamCodec<? super FriendlyByteBuf, ? extends CustomPacketPayload> getCodec(StreamCodec<? super FriendlyByteBuf, ? extends CustomPacketPayload> codec, ResourceLocation id, ConnectionProtocol protocol, PacketFlow flow) {
39+
@Inject(method = "getCodec", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", ordinal = 0), cancellable = true)
40+
private static void getCodec(ResourceLocation id, ConnectionProtocol protocol, PacketFlow flow, CallbackInfoReturnable<StreamCodec<? super FriendlyByteBuf, ? extends CustomPacketPayload>> cir) {
3041
PayloadTypeRegistryImpl<? extends FriendlyByteBuf> registry = NeoNetworkRegistrar.getPayloadRegistry(protocol, flow);
3142
CustomPacketPayload.TypeAndCodec<? extends FriendlyByteBuf, ? extends CustomPacketPayload> fabricCodec = registry.get(id);
32-
return fabricCodec != null ? (StreamCodec) fabricCodec.codec() : codec;
43+
if (fabricCodec != null) {
44+
cir.setReturnValue((StreamCodec) fabricCodec.codec());
45+
}
3346
}
3447

3548
@ModifyReturnValue(method = "getCodec", at = @At(value = "RETURN", ordinal = 3))
@@ -69,4 +82,18 @@ private static boolean includeFabricChannels(ICommonPacketListener listener, Res
6982
// TODO Use original args that include the packet
7083
return original.call(listener, location) || NeoNetworkRegistrar.hasCodecFor(listener.protocol(), listener.flow() == PacketFlow.SERVERBOUND ? PacketFlow.CLIENTBOUND : PacketFlow.SERVERBOUND, location);
7184
}
85+
86+
@ModifyVariable(method = "initializeNeoForgeConnection", at = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/network/registration/NetworkPayloadSetup;from(Ljava/util/Map;)Lnet/neoforged/neoforge/network/registration/NetworkPayloadSetup;"), ordinal = 1)
87+
private static Map<ConnectionProtocol, NegotiationResult> preserveSendableChannels(Map<ConnectionProtocol, NegotiationResult> results, ServerConfigurationPacketListener listener, Map<ConnectionProtocol, Set<ModdedNetworkQueryComponent>> clientChannels) {
88+
Set<ModdedNetworkQueryComponent> channels = clientChannels.get(ConnectionProtocol.PLAY);
89+
if (channels != null && !channels.isEmpty()) {
90+
NegotiationResult negotiation = results.get(ConnectionProtocol.PLAY);
91+
List<NegotiatedNetworkComponent> components = new ArrayList<>(negotiation.components());
92+
channels.stream()
93+
.filter(c -> PayloadTypeRegistryImpl.PLAY_S2C.get(c.id()) != null)
94+
.forEach(c -> components.add(new NegotiatedNetworkComponent(c.id(), c.version())));
95+
results.put(ConnectionProtocol.PLAY, new NegotiationResult(components, negotiation.success(), negotiation.failureReasons()));
96+
}
97+
return results;
98+
}
7299
}

ffapi.gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
loom.platform=neoforge
22
fabric.loom.dontRemap=true
33

4-
implementationVersion=2.0.16
4+
implementationVersion=2.0.17
55

66
versionMc=1.21.1
77
versionForge=21.1.57

0 commit comments

Comments
 (0)