Skip to content

Commit e92819e

Browse files
committed
Networking part 3
1 parent d68e1dc commit e92819e

35 files changed

Lines changed: 208 additions & 919 deletions

fabric-events-interaction-v0/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
version = getSubprojectVersion(project)
22

3-
moduleDependencies(project, ['fabric-api-base'])
3+
moduleDependencies(project, ['fabric-api-base', 'fabric-networking-api-v1'])
44

55
testDependencies(project, [
66
'fabric-client-gametest-api-v1'

fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/interaction/FakePlayerPacketListener.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package net.fabricmc.fabric.impl.event.interaction;
1818

1919
import io.netty.channel.ChannelFutureListener;
20+
21+
import net.fabricmc.fabric.impl.networking.UntrackedPacketListener;
22+
2023
import org.jspecify.annotations.Nullable;
2124

2225
import net.minecraft.network.Connection;
@@ -26,7 +29,7 @@
2629
import net.minecraft.server.network.CommonListenerCookie;
2730
import net.minecraft.server.network.ServerGamePacketListenerImpl;
2831

29-
public final class FakePlayerPacketListener extends ServerGamePacketListenerImpl {
32+
public final class FakePlayerPacketListener extends ServerGamePacketListenerImpl implements UntrackedPacketListener {
3033
private static final Connection FAKE_CONNECTION = new FakeConnection();
3134

3235
public FakePlayerPacketListener(ServerPlayer player) {

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99
import net.minecraft.network.protocol.common.ClientCommonPacketListener;
1010
import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
1111

12+
import net.fabricmc.fabric.impl.networking.NetworkingImpl;
13+
1214
@Mixin(ClientNetworkRegistry.class)
1315
public class ClientNetworkRegistryMixin {
14-
@Inject(method = "handleModdedPayload", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;disconnect(Lnet/minecraft/network/chat/Component;)V"), cancellable = true)
16+
@Inject(method = "handleModdedPayload", at = @At(value = "INVOKE", target = "Ljava/util/Map;containsKey(Ljava/lang/Object;)Z"), cancellable = true)
1517
private static void preventDisconnect(ClientCommonPacketListener listener, ClientboundCustomPayloadPacket packet, CallbackInfo ci) {
16-
ci.cancel();
18+
if (NetworkingImpl.getCodec(packet.payload().type().id(), listener.protocol(), listener.flow()) != null) {
19+
ci.cancel();
20+
}
1721
}
1822
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package net.fabricmc.fabric.mixin.networking.client;
2+
3+
import net.neoforged.neoforge.network.registration.NetworkRegistry;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
9+
import net.minecraft.network.ConnectionProtocol;
10+
import net.minecraft.network.protocol.Packet;
11+
import net.minecraft.network.protocol.common.ClientCommonPacketListener;
12+
import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket;
13+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload.Type;
14+
15+
import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking;
16+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
17+
import net.fabricmc.fabric.impl.networking.NetworkingImpl;
18+
19+
@Mixin(NetworkRegistry.class)
20+
public class NetworkRegistryClientMixin {
21+
@Inject(
22+
method = "checkPacket(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/protocol/common/ClientCommonPacketListener;)V",
23+
at = @At(
24+
value = "INVOKE",
25+
target = "Lnet/neoforged/neoforge/network/registration/NetworkRegistry;hasChannel(Lnet/neoforged/neoforge/common/extensions/ICommonPacketListener;Lnet/minecraft/resources/Identifier;)Z"
26+
),
27+
cancellable = true
28+
)
29+
private static void checkFabricClientPacket(Packet<?> packet, ClientCommonPacketListener listener, CallbackInfo ci) {
30+
ServerboundCustomPayloadPacket customPayloadPacket = (ServerboundCustomPayloadPacket) packet;
31+
Type<?> type = customPayloadPacket.payload().type();
32+
33+
if (listener.protocol() == ConnectionProtocol.CONFIGURATION && ClientConfigurationNetworking.canSend(type)) {
34+
ci.cancel();
35+
}
36+
37+
if (listener.protocol() == ConnectionProtocol.PLAY && ClientPlayNetworking.canSend(type)) {
38+
ci.cancel();
39+
}
40+
41+
if (NetworkingImpl.getCodec(type.id(), listener.protocol(), listener.flow()) != null) {
42+
ci.cancel();
43+
}
44+
}
45+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"ClientHandshakePacketListenerImplMixin",
1313
"ClientPacketListenerMixin",
1414
"LocalPlayerMixin",
15-
"ClientNetworkRegistryMixin"
15+
"ClientNetworkRegistryMixin",
16+
"NetworkRegistryClientMixin"
1617
],
1718
"injectors": {
1819
"defaultRequire": 1

fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/AbstractChanneledNetworkAddon.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,23 @@ public boolean handle(CustomPacketPayload payload) {
8181
if (payload instanceof MinecraftRegisterPayload registrationPayload) {
8282
this.receiveRegistration(true, new RegistrationPayload(RegistrationPayload.REGISTER,
8383
new ArrayList<>(registrationPayload.newChannels())));
84-
return true;
84+
return false; // Propagate to Neo
8585
}
8686

8787
if (payload instanceof MinecraftUnregisterPayload unregisterPayload) {
8888
this.receiveRegistration(false, new RegistrationPayload(RegistrationPayload.UNREGISTER,
8989
new ArrayList<>(unregisterPayload.forgottenChannels())));
90-
return true;
90+
return false; // Propagate to Neo
9191
}
9292

9393
@Nullable H handler = this.getHandler(channelName);
9494

9595
if (handler == null) {
96+
// FFAPI: Prevent Neo from panicking
97+
if (this.receiver.getPayloadTypeRegistry().get(channelName) != null) {
98+
return true;
99+
}
100+
96101
return false;
97102
}
98103

@@ -156,13 +161,19 @@ private void registerChannel(Identifier id) {
156161
}
157162

158163
this.sendableChannels.add(id);
164+
onUpdateSendableChannels();
159165
}
160166

161167
void unregister(List<Identifier> ids) {
162168
this.sendableChannels.removeAll(ids);
169+
onUpdateSendableChannels();
163170
schedule(() -> this.invokeUnregisterEvent(ids));
164171
}
165172

173+
protected void onUpdateSendableChannels() {
174+
175+
}
176+
166177
@Override
167178
public void sendPacket(Packet<?> packet, ChannelFutureListener callback) {
168179
Objects.requireNonNull(packet, "Packet cannot be null");

fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/CustomPayloadTypeProvider.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/FabricCustomPayloadStreamCodec.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/GenericPayloadAccessor.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/GlobalReceiverRegistry.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,8 @@ public void assertPayloadType(Identifier channelName) {
231231
public ConnectionProtocol getProtocol() {
232232
return protocol;
233233
}
234+
235+
public @Nullable PayloadTypeRegistryImpl<?> getPayloadTypeRegistry() {
236+
return payloadTypeRegistry;
237+
}
234238
}

0 commit comments

Comments
 (0)