Skip to content

Commit

Permalink
Support for Fabric 1.20.5, drop support for all prior versions
Browse files Browse the repository at this point in the history
  • Loading branch information
2008Choco committed May 8, 2024
1 parent b2d7521 commit dcc06fa
Show file tree
Hide file tree
Showing 10 changed files with 145 additions and 24 deletions.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
16 changes: 15 additions & 1 deletion networking-fabric/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id("fabric-loom") version "1.5-SNAPSHOT"
id("fabric-loom") version "1.6-SNAPSHOT"
id("com.github.johnrengelman.shadow") version "8.1.1"
}

Expand All @@ -18,7 +18,21 @@ dependencies {
modImplementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_version")}")
}

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
}

withJavadocJar()
withSourcesJar()
}

tasks {
withType<JavaCompile> {
options.release = 21
options.encoding = Charsets.UTF_8.name()
}

processResources {
inputs.property("version", project.version)
filesMatching("fabric.mod.json") {
Expand Down
6 changes: 3 additions & 3 deletions networking-fabric/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
minecraft_version=1.18
fabric_version=0.46.6+1.18
loader_version=0.15.6
minecraft_version=1.20.5
fabric_version=0.97.8+1.20.5
loader_version=0.15.11
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import com.google.common.base.Preconditions;

import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
Expand Down Expand Up @@ -71,21 +73,23 @@ public FabricChannelRegistrar(@NotNull MessageProtocol<S, C> protocol, @NotNull

@Override
public void registerClientboundMessageHandler(@NotNull NamespacedKey channel, @NotNull MessageRegistry<C> registry) {
var payloadType = registerClientboundPayload(channel);

if (!registerClientboundReceiver) {
return;
}

ResourceLocation channelKey = new ResourceLocation(channel.namespace(), channel.key());
ClientPlayNetworking.registerGlobalReceiver(channelKey, (client, handler, buf, responseSender) -> {
MessageByteBuffer buffer = new MessageByteBuffer(protocol, buf.nioBuffer());
ClientPlayNetworking.registerGlobalReceiver(payloadType, (payload, context) -> {
MessageByteBuffer buffer = new MessageByteBuffer(protocol, payload.data());

try {
int messageId = buffer.readVarInt();
Message<C> message = registry.createMessage(messageId, buffer);

// Ignore any unknown messages
if (message == null) {
this.onUnknownClientboundMessage(channelKey, buf.array(), messageId);
this.onUnknownClientboundMessage(channelKey, payload.data(), messageId);
return;
}

Expand All @@ -94,37 +98,41 @@ public void registerClientboundMessageHandler(@NotNull NamespacedKey channel, @N
message.handle(listener);
}
} catch (Exception e) {
this.onClientboundMessageReadException(channelKey, buf.array(), e);
this.onClientboundMessageReadException(channelKey, payload.data(), e);
}
});
}

@Override
public void registerServerboundMessageHandler(@NotNull NamespacedKey channel, @NotNull MessageRegistry<S> registry) {
var payloadType = registerServerboundPayload(channel);

if (!registerServerboundReceiver) {
return;
}

ResourceLocation channelKey = new ResourceLocation(channel.namespace(), channel.key());
ServerPlayNetworking.registerGlobalReceiver(channelKey, (server, player, handler, buf, responseSender) -> {
MessageByteBuffer buffer = new MessageByteBuffer(protocol, buf.nioBuffer());
ServerPlayNetworking.registerGlobalReceiver(payloadType, (payload, context) -> {
MessageByteBuffer buffer = new MessageByteBuffer(protocol, payload.data());

ServerPlayer player = context.player();

try {
int messageId = buffer.readVarInt();
Message<S> message = registry.createMessage(messageId, buffer);

// Ignore any unknown messages
if (message == null) {
this.onUnknownServerboundMessage(server, player, channelKey, buf.array(), messageId);
this.onUnknownServerboundMessage(player.server, player, channelKey, payload.data(), messageId);
return;
}

S listener = onSuccessfulServerboundMessage(server, player, channelKey, message);
S listener = onSuccessfulServerboundMessage(player.server, player, channelKey, message);
if (listener != null) {
message.handle(listener);
}
} catch (Exception e) {
this.onServerboundMessageReadException(server, player, channelKey, buf.array(), e);
this.onServerboundMessageReadException(player.server, player, channelKey, payload.data(), e);
}
});
}
Expand Down Expand Up @@ -303,4 +311,24 @@ protected S onSuccessfulServerboundMessage(@NotNull MinecraftServer server, @Not
return null;
}

private CustomPacketPayload.Type<RawDataPayload> initTypeIfNecessary(NamespacedKey channel) {
CustomPacketPayload.Type<RawDataPayload> type = RawDataPayload.getType();
if (type == null) {
RawDataPayload.setType(type = CustomPacketPayload.createType(channel.toString()));
}
return type;
}

protected CustomPacketPayload.Type<RawDataPayload> registerClientboundPayload(NamespacedKey channel) {
var payloadType = initTypeIfNecessary(channel);
PayloadTypeRegistry.playS2C().register(payloadType, RawDataPayload.CODEC);
return payloadType;
}

protected CustomPacketPayload.Type<RawDataPayload> registerServerboundPayload(NamespacedKey channel) {
var payloadType = initTypeIfNecessary(channel);
PayloadTypeRegistry.playC2S().register(payloadType, RawDataPayload.CODEC);
return payloadType;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ public FabricClientChannelRegistrar(MessageProtocol<S, C> protocol, Logger logge

// Overriding and finalizing serverbound methods
@Override
public final void registerServerboundMessageHandler(@NotNull NamespacedKey channel, @NotNull MessageRegistry<S> registry) { }
public final void registerServerboundMessageHandler(@NotNull NamespacedKey channel, @NotNull MessageRegistry<S> registry) {
this.registerServerboundPayload(channel);
}

@Override
protected final void onUnknownServerboundMessage(@NotNull MinecraftServer server, @NotNull ServerPlayer sender, @NotNull ResourceLocation channel, byte @NotNull [] data, int messageId) { }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package wtf.choco.network.fabric;

import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.minecraft.network.FriendlyByteBuf;

import org.jetbrains.annotations.NotNull;

import wtf.choco.network.data.NamespacedKey;
import wtf.choco.network.receiver.MessageReceiver;

public interface FabricMessageReceiver extends MessageReceiver {

public void sendMessage(@NotNull RawDataPayload payload);

/**
* {@inheritDoc}
*
* @deprecated you don't need to implement this for Fabric types. Implement
* {@link #sendMessage(RawDataPayload)} instead
*/
@Deprecated
@Override
default void sendMessage(@NotNull NamespacedKey channel, byte @NotNull [] message) {
FriendlyByteBuf byteBuf = PacketByteBufs.create();
byteBuf.writeBytes(message);
this.sendMessage(new RawDataPayload(byteBuf.array()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
Expand All @@ -13,7 +12,6 @@

import wtf.choco.network.MessageProtocol;
import wtf.choco.network.ProtocolConfiguration;
import wtf.choco.network.data.NamespacedKey;

/**
* A {@link ProtocolConfiguration} implementation for Fabric-based clients and servers
Expand Down Expand Up @@ -77,7 +75,7 @@ protected void configureServer(@NotNull MessageProtocol<?, ?> protocol) {
return;
}

this.sendMessageToServerPlayer(serverPlayer, channel, message);
this.sendMessageToServerPlayer(serverPlayer, message);
});

protocol.registerProxiedReceiver(Level.class, (receiver, channel, message) -> {
Expand All @@ -86,19 +84,19 @@ protected void configureServer(@NotNull MessageProtocol<?, ?> protocol) {
return;
}

this.sendMessageToServerPlayer(serverPlayer, channel, message);
this.sendMessageToServerPlayer(serverPlayer, message);
});
});

protocol.registerProxiedReceiver(MinecraftServer.class, (receiver, channel, message) -> {
receiver.getPlayerList().getPlayers().forEach(player -> sendMessageToServerPlayer(player, channel, message));
receiver.getPlayerList().getPlayers().forEach(player -> sendMessageToServerPlayer(player, message));
});
}

private void sendMessageToServerPlayer(ServerPlayer player, NamespacedKey channel, byte[] message) {
private void sendMessageToServerPlayer(ServerPlayer player, byte[] message) {
FriendlyByteBuf byteBuf = PacketByteBufs.create();
byteBuf.writeBytes(message);
ServerPlayNetworking.send(player, new ResourceLocation(channel.namespace(), channel.key()), byteBuf);
ServerPlayNetworking.send(player, new RawDataPayload(byteBuf.array()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ public FabricServerChannelRegistrar(MessageProtocol<S, C> protocol, Logger logge

// Overriding and finalizing clientbound methods
@Override
public final void registerClientboundMessageHandler(@NotNull NamespacedKey channel, @NotNull MessageRegistry<C> registry) { }
public final void registerClientboundMessageHandler(@NotNull NamespacedKey channel, @NotNull MessageRegistry<C> registry) {
this.registerClientboundPayload(channel);
}

@Override
protected final void onUnknownClientboundMessage(@NotNull ResourceLocation channel, byte @NotNull [] data, int messageId) { }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package wtf.choco.network.fabric;

import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;

import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

public final class RawDataPayload implements CustomPacketPayload {

public static final StreamCodec<FriendlyByteBuf, RawDataPayload> CODEC = StreamCodec.ofMember(
(payload, buffer) -> buffer.writeBytes(payload.data()),
buffer -> {
byte[] bytes = new byte[buffer.readableBytes()];
buffer.readBytes(bytes);
return new RawDataPayload(bytes);
}
);

private static CustomPacketPayload.Type<RawDataPayload> type;

@ApiStatus.Internal
static void setType(@NotNull CustomPacketPayload.Type<RawDataPayload> type) {
RawDataPayload.type = type;
}

@ApiStatus.Internal
static CustomPacketPayload.Type<RawDataPayload> getType() {
return type;
}

private final byte[] data;

public RawDataPayload(byte[] data) {
this.data = data;
}

public byte[] data() {
return data;
}

@Override
public Type<? extends CustomPacketPayload> type() {
return type;
}

}
2 changes: 1 addition & 1 deletion networking-fabric/src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

"depends": {
"fabricloader": ">=${loader_version}",
"fabric-api": "*",
"fabric-api": ">=0.97",
"minecraft": ">=${minecraft_version}",
"java": ">=17"
}
Expand Down

0 comments on commit dcc06fa

Please sign in to comment.