Skip to content

Commit

Permalink
- Add access to ClientConfigurationNetworkHandler in context
Browse files Browse the repository at this point in the history
- Account for configuration channels in NetworkRegistryMixin#preserveSendableChannels ([Sinytra/ForgifiedFabricAPI#171](Sinytra/ForgifiedFabricAPI#171))
  • Loading branch information
TexBlock committed Jan 30, 2025
1 parent ef0ab51 commit 4671423
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package net.fabricmc.fabric.api.client.networking.v1;

import java.util.Set;

import net.minecraft.client.network.ClientConfigurationNetworkHandler;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
Expand Down Expand Up @@ -234,6 +236,11 @@ public interface Context {
*/
MinecraftClient client();

/**
* @return The ClientConfigurationNetworkHandler instance
*/
ClientConfigurationNetworkHandler networkHandler();

/**
* @return The packet sender
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.fabricmc.fabric.impl.networking.PayloadTypeRegistryImpl;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientConfigurationNetworkHandler;
import net.minecraft.network.NetworkPhase;
import net.minecraft.network.NetworkSide;
import net.minecraft.network.packet.CustomPayload;
Expand Down Expand Up @@ -84,6 +85,11 @@ public MinecraftClient client() {
return MinecraftClient.getInstance();
}

@Override
public ClientConfigurationNetworkHandler networkHandler() {
return (ClientConfigurationNetworkHandler) configurationPacketListener;
}

@Override
public PacketSender responseSender() {
return new NeoClientPacketSender(context.connection());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,24 @@ private static boolean includeFabricChannels(ICommonPacketListener listener, Ide
return original.call(listener, location) || NeoNetworkRegistrar.hasCodecFor(listener.getPhase(), listener.getSide() == NetworkSide.SERVERBOUND ? NetworkSide.CLIENTBOUND : NetworkSide.SERVERBOUND, location);
}

@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)
@ModifyVariable(method = "initializeNeoForgeConnection(Lnet/minecraft/network/listener/ServerConfigurationPacketListener;Ljava/util/Map;)V", at = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/network/registration/NetworkPayloadSetup;from(Ljava/util/Map;)Lnet/neoforged/neoforge/network/registration/NetworkPayloadSetup;"), ordinal = 1)
private static Map<NetworkPhase, NegotiationResult> preserveSendableChannels(Map<NetworkPhase, NegotiationResult> results, ServerConfigurationPacketListener listener, Map<NetworkPhase, Set<ModdedNetworkQueryComponent>> clientChannels) {
Set<ModdedNetworkQueryComponent> channels = clientChannels.get(NetworkPhase.PLAY);
if (channels != null && !channels.isEmpty()) {
Set<ModdedNetworkQueryComponent> configChannels = clientChannels.get(NetworkPhase.CONFIGURATION);
if (configChannels != null && !configChannels.isEmpty()) {
NegotiationResult negotiation = results.get(NetworkPhase.CONFIGURATION);
List<NegotiatedNetworkComponent> components = new ArrayList<>(negotiation.components());
configChannels.stream()
.filter(c -> components.stream().noneMatch(d -> c.id().equals(d.id())) && PayloadTypeRegistryImpl.CONFIGURATION_S2C.get(c.id()) != null)
.forEach(c -> components.add(new NegotiatedNetworkComponent(c.id(), c.version())));
results.put(NetworkPhase.CONFIGURATION, new NegotiationResult(components, negotiation.success(), negotiation.failureReasons()));
}
Set<ModdedNetworkQueryComponent> playChannels = clientChannels.get(NetworkPhase.PLAY);
if (playChannels != null && !playChannels.isEmpty()) {
NegotiationResult negotiation = results.get(NetworkPhase.PLAY);
List<NegotiatedNetworkComponent> components = new ArrayList<>(negotiation.components());
channels.stream()
.filter(c -> components.stream().noneMatch(d -> c.id().equals(d.id())) && PayloadTypeRegistryImpl.PLAY_S2C.get(c.id()) != null)
.forEach(c -> components.add(new NegotiatedNetworkComponent(c.id(), c.version())));
playChannels.stream()
.filter(c -> components.stream().noneMatch(d -> c.id().equals(d.id())) && PayloadTypeRegistryImpl.PLAY_S2C.get(c.id()) != null)
.forEach(c -> components.add(new NegotiatedNetworkComponent(c.id(), c.version())));
results.put(NetworkPhase.PLAY, new NegotiationResult(components, negotiation.success(), negotiation.failureReasons()));
}
return results;
Expand Down

0 comments on commit 4671423

Please sign in to comment.